ATLAS-1825: updated import to support optional transformation of attribute values

Signed-off-by: Madhan Neethiraj <madhan@apache.org>
diff --git a/intg/src/main/java/org/apache/atlas/model/impexp/AtlasImportRequest.java b/intg/src/main/java/org/apache/atlas/model/impexp/AtlasImportRequest.java
index 7530196..4f2c1fb 100644
--- a/intg/src/main/java/org/apache/atlas/model/impexp/AtlasImportRequest.java
+++ b/intg/src/main/java/org/apache/atlas/model/impexp/AtlasImportRequest.java
@@ -39,21 +39,18 @@
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.PROPERTY)
 public class AtlasImportRequest implements Serializable {
-    private static final long serialVersionUID = 1L;
+    private static final long   serialVersionUID = 1L;
+    public  static final String TRANSFORMS_KEY   = "transforms";
 
-    private Map<String, Object> options;
+    private Map<String, String> options;
 
     public AtlasImportRequest() {
         this.options = new HashMap<>();
     }
 
-    public AtlasImportRequest(Map<String, Object> options) {
-        this.options = options;
-    }
+    public Map<String, String> getOptions() { return options; }
 
-    public Map<String, Object> getOptions() { return options; }
-
-    public void setOptions(Map<String, Object> options) { this.options = options; }
+    public void setOptions(Map<String, String> options) { this.options = options; }
 
     public StringBuilder toString(StringBuilder sb) {
         if (sb == null) {
diff --git a/pom.xml b/pom.xml
index 4360604..ebc07e2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -960,6 +960,12 @@
             </dependency>
 
             <dependency>
+                <groupId>com.sun.jersey.contribs</groupId>
+                <artifactId>jersey-multipart</artifactId>
+                <version>${jersey.version}</version>
+            </dependency>
+
+            <dependency>
                 <groupId>javax.servlet.jsp</groupId>
                 <artifactId>jsp-api</artifactId>
                 <version>2.0</version>
diff --git a/repository/src/main/java/org/apache/atlas/repository/impexp/ImportService.java b/repository/src/main/java/org/apache/atlas/repository/impexp/ImportService.java
index 9ec15e0..8a7e358 100644
--- a/repository/src/main/java/org/apache/atlas/repository/impexp/ImportService.java
+++ b/repository/src/main/java/org/apache/atlas/repository/impexp/ImportService.java
@@ -30,6 +30,7 @@
 import org.apache.atlas.repository.store.graph.AtlasEntityStore;
 import org.apache.atlas.store.AtlasTypeDefStore;
 import org.apache.atlas.type.AtlasTypeRegistry;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -44,7 +45,7 @@
     private static final Logger LOG = LoggerFactory.getLogger(ImportService.class);
 
     private final AtlasTypeDefStore typeDefStore;
-    private final AtlasEntityStore  entityStore;
+    private final AtlasEntityStore entityStore;
     private final AtlasTypeRegistry typeRegistry;
 
     private long startTimestamp;
@@ -53,7 +54,7 @@
 
     public ImportService(final AtlasTypeDefStore typeDefStore, final AtlasEntityStore entityStore, AtlasTypeRegistry typeRegistry) {
         this.typeDefStore = typeDefStore;
-        this.entityStore  = entityStore;
+        this.entityStore = entityStore;
         this.typeRegistry = typeRegistry;
     }
 
@@ -62,8 +63,12 @@
         AtlasImportResult result = new AtlasImportResult(request, userName, requestingIP, hostName, System.currentTimeMillis());
 
         try {
+
             LOG.info("==> import(user={}, from={})", userName, requestingIP);
 
+            String transforms = MapUtils.isNotEmpty(request.getOptions()) ? request.getOptions().get(AtlasImportRequest.TRANSFORMS_KEY) : null;
+
+            source.setImportTransform(ImportTransforms.fromJson(transforms));
             startTimestamp = System.currentTimeMillis();
             processTypes(source.getTypesDef(), result);
             processEntities(source, result);
@@ -86,8 +91,8 @@
     }
 
     public AtlasImportResult run(AtlasImportRequest request, String userName, String hostName, String requestingIP)
-                                                                                            throws AtlasBaseException {
-        String fileName = (String)request.getOptions().get("FILENAME");
+            throws AtlasBaseException {
+        String fileName = (String) request.getOptions().get("FILENAME");
 
         if (StringUtils.isBlank(fileName)) {
             throw new AtlasBaseException(AtlasErrorCode.INVALID_PARAMETERS, "FILENAME parameter not found");
@@ -98,8 +103,9 @@
         try {
             LOG.info("==> import(user={}, from={}, fileName={})", userName, requestingIP, fileName);
 
-            File      file   = new File(fileName);
-            ZipSource source = new ZipSource(new ByteArrayInputStream(FileUtils.readFileToByteArray(file)));
+            String transforms = MapUtils.isNotEmpty(request.getOptions()) ? request.getOptions().get(AtlasImportRequest.TRANSFORMS_KEY) : null;
+            File file = new File(fileName);
+            ZipSource source = new ZipSource(new ByteArrayInputStream(FileUtils.readFileToByteArray(file)), ImportTransforms.fromJson(transforms));
 
             result = run(source, request, userName, hostName, requestingIP);
         } catch (AtlasBaseException excp) {
@@ -116,7 +122,7 @@
             throw new AtlasBaseException(excp);
         } finally {
             LOG.info("<== import(user={}, from={}, fileName={}): status={}", userName, requestingIP, fileName,
-                     (result == null ? AtlasImportResult.OperationStatus.FAIL : result.getOperationStatus()));
+                    (result == null ? AtlasImportResult.OperationStatus.FAIL : result.getOperationStatus()));
         }
 
         return result;
@@ -142,19 +148,19 @@
     }
 
     private void setGuidToEmpty(AtlasTypesDef typesDef) {
-        for (AtlasEntityDef def: typesDef.getEntityDefs()) {
+        for (AtlasEntityDef def : typesDef.getEntityDefs()) {
             def.setGuid(null);
         }
 
-        for (AtlasClassificationDef def: typesDef.getClassificationDefs()) {
+        for (AtlasClassificationDef def : typesDef.getClassificationDefs()) {
             def.setGuid(null);
         }
 
-        for (AtlasEnumDef def: typesDef.getEnumDefs()) {
+        for (AtlasEnumDef def : typesDef.getEnumDefs()) {
             def.setGuid(null);
         }
 
-        for (AtlasStructDef def: typesDef.getStructDefs()) {
+        for (AtlasStructDef def : typesDef.getStructDefs()) {
             def.setGuid(null);
         }
     }
diff --git a/repository/src/main/java/org/apache/atlas/repository/impexp/ImportTransformer.java b/repository/src/main/java/org/apache/atlas/repository/impexp/ImportTransformer.java
new file mode 100644
index 0000000..1b9305c
--- /dev/null
+++ b/repository/src/main/java/org/apache/atlas/repository/impexp/ImportTransformer.java
@@ -0,0 +1,124 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.repository.impexp;
+
+import org.apache.atlas.AtlasErrorCode;
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.commons.lang.StringUtils;
+
+
+public abstract class ImportTransformer {
+    private static final String TRANSFORMER_PARAMETER_SEPARATOR = "\\:";
+
+    private final String transformType;
+
+
+    public static ImportTransformer getTransformer(String transformerSpec) throws AtlasBaseException {
+        String[] params = StringUtils.split(transformerSpec, TRANSFORMER_PARAMETER_SEPARATOR);
+        String   key    = (params == null || params.length < 1) ? transformerSpec : params[0];
+
+        final ImportTransformer ret;
+
+        if (StringUtils.isEmpty(key)) {
+            throw new AtlasBaseException(AtlasErrorCode.INVALID_VALUE, "Error creating ImportTransformer. Invalid transformer-specification: {}.", transformerSpec);
+        } else if (key.equals("replace")) {
+            String toFindStr  = (params == null || params.length < 2) ? "" : params[1];
+            String replaceStr = (params == null || params.length < 3) ? "" : params[2];
+
+            ret = new Replace(toFindStr, replaceStr);
+        } else if (key.equals("lowercase")) {
+            ret = new Lowercase();
+        } else if (key.equals("uppercase")) {
+            ret = new Uppercase();
+        } else {
+            throw new AtlasBaseException(AtlasErrorCode.INVALID_VALUE, "Error creating ImportTransformer. Unknown transformer: {}.", transformerSpec);
+        }
+
+        return ret;
+    }
+
+    public String getTransformType() { return transformType; }
+
+    public abstract Object apply(Object o) throws AtlasBaseException;
+
+
+    protected ImportTransformer(String transformType) {
+        this.transformType = transformType;
+    }
+
+    static class Replace extends ImportTransformer {
+        private final String toFindStr;
+        private final String replaceStr;
+
+        public Replace(String toFindStr, String replaceStr) {
+            super("replace");
+
+            this.toFindStr  = toFindStr;
+            this.replaceStr = replaceStr;
+        }
+
+        public String getToFindStr() { return toFindStr; }
+
+        public String getReplaceStr() { return replaceStr; }
+
+        @Override
+        public Object apply(Object o) throws AtlasBaseException {
+            Object ret = o;
+
+            if(o instanceof String) {
+                ret = StringUtils.replace((String) o, toFindStr, replaceStr);
+            }
+
+            return ret;
+        }
+    }
+
+    static class Lowercase extends ImportTransformer {
+        public Lowercase() {
+            super("lowercase");
+        }
+
+        @Override
+        public Object apply(Object o) {
+            Object ret = o;
+
+            if(o instanceof String) {
+                ret = StringUtils.lowerCase((String) o);
+            }
+
+            return ret;
+        }
+    }
+
+    static class Uppercase extends ImportTransformer {
+        public Uppercase() {
+            super("uppercase");
+        }
+
+        @Override
+        public Object apply(Object o) {
+            Object ret = o;
+
+            if(o instanceof String) {
+                ret = StringUtils.upperCase((String) o);
+            }
+
+            return ret;
+        }
+    }
+}
diff --git a/repository/src/main/java/org/apache/atlas/repository/impexp/ImportTransforms.java b/repository/src/main/java/org/apache/atlas/repository/impexp/ImportTransforms.java
new file mode 100644
index 0000000..63e53c5
--- /dev/null
+++ b/repository/src/main/java/org/apache/atlas/repository/impexp/ImportTransforms.java
@@ -0,0 +1,160 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.repository.impexp;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.type.AtlasType;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ImportTransforms {
+    private static final Logger LOG = LoggerFactory.getLogger(ImportTransforms.class);
+
+    private Map<String, Map<String, List<ImportTransformer>>> transforms;
+
+
+    public static ImportTransforms fromJson(String jsonString) {
+        ImportTransforms ret = null;
+
+        if (StringUtils.isNotBlank(jsonString)) {
+            ret = new ImportTransforms(jsonString);
+        }
+
+        return ret;
+    }
+
+    public Map<String, Map<String, List<ImportTransformer>>> getTransforms() {
+        return transforms;
+    }
+
+    public Map<String, List<ImportTransformer>> getTransforms(String typeName) { return transforms.get(typeName); }
+
+    public AtlasEntity.AtlasEntityWithExtInfo apply(AtlasEntity.AtlasEntityWithExtInfo entityWithExtInfo) throws AtlasBaseException {
+        if (entityWithExtInfo != null) {
+            apply(entityWithExtInfo.getEntity());
+
+            if(MapUtils.isNotEmpty(entityWithExtInfo.getReferredEntities())) {
+                for (AtlasEntity e : entityWithExtInfo.getReferredEntities().values()) {
+                    apply(e);
+                }
+            }
+        }
+
+        return entityWithExtInfo;
+    }
+
+    public  AtlasEntity apply(AtlasEntity entity) throws AtlasBaseException {
+        if(entity != null) {
+            Map<String, List<ImportTransformer>> entityTransforms = getTransforms(entity.getTypeName());
+
+            if (MapUtils.isNotEmpty(entityTransforms)) {
+                for (Map.Entry<String, List<ImportTransformer>> entry : entityTransforms.entrySet()) {
+                    String                   attributeName  = entry.getKey();
+                    List<ImportTransformer> attrTransforms = entry.getValue();
+
+                    if (!entity.hasAttribute(attributeName)) {
+                        continue;
+                    }
+
+                    Object transformedValue = entity.getAttribute(attributeName);
+
+                    for (ImportTransformer attrTransform : attrTransforms) {
+                        transformedValue = attrTransform.apply(transformedValue);
+                    }
+
+                    entity.setAttribute(attributeName, transformedValue);
+                }
+            }
+        }
+
+        return entity;
+    }
+
+    private ImportTransforms() {
+        transforms = new HashMap<>();
+    }
+
+    private ImportTransforms(String jsonString) {
+        this();
+
+        if(jsonString != null) {
+            Map typeTransforms = AtlasType.fromJson(jsonString, Map.class);
+
+            if (MapUtils.isNotEmpty(typeTransforms)) {
+                for (Object key : typeTransforms.keySet()) {
+                    Object              value               = typeTransforms.get(key);
+                    String              entityType          = (String) key;
+                    Map<String, Object> attributeTransforms = (Map<String, Object>)value;
+
+                    if (MapUtils.isNotEmpty(attributeTransforms)) {
+                        for (Map.Entry<String, Object> e : attributeTransforms.entrySet()) {
+                            String       attributeName = e.getKey();
+                            List<String> transforms    = (List<String>)e.getValue();
+
+                            if (CollectionUtils.isNotEmpty(transforms)) {
+                                for (String transform : transforms) {
+                                    ImportTransformer transformers = null;
+
+                                    try {
+                                        transformers = ImportTransformer.getTransformer(transform);
+                                    } catch (AtlasBaseException ex) {
+                                        LOG.error("Error converting string to ImportTransformer: {}", transform, ex);
+                                    }
+
+                                    if (transformers != null) {
+                                        add(entityType, attributeName, transformers);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void add(String typeName, String attributeName, ImportTransformer transformer) {
+        Map<String, List<ImportTransformer>> attrMap;
+
+        if(transforms.containsKey(typeName)) {
+            attrMap = transforms.get(typeName);
+        } else {
+            attrMap = new HashMap<>();
+            transforms.put(typeName, attrMap);
+        }
+
+        List<ImportTransformer> list;
+        if(attrMap.containsKey(attributeName)) {
+            list = attrMap.get(attributeName);
+        } else {
+            list = new ArrayList<>();
+            attrMap.put(attributeName, list);
+        }
+
+        list.add(transformer);
+    }
+}
diff --git a/repository/src/main/java/org/apache/atlas/repository/impexp/ZipSource.java b/repository/src/main/java/org/apache/atlas/repository/impexp/ZipSource.java
index 87c9f0e..76451c9 100644
--- a/repository/src/main/java/org/apache/atlas/repository/impexp/ZipSource.java
+++ b/repository/src/main/java/org/apache/atlas/repository/impexp/ZipSource.java
@@ -44,17 +44,29 @@
 public class ZipSource implements EntityImportStream {
     private static final Logger LOG = LoggerFactory.getLogger(ZipSource.class);
 
-    private final InputStream                   inputStream;
-    private List<String>                        creationOrder;
-    private Iterator<String>                    iterator;
-    private Map<String, String>                 guidEntityJsonMap;
+    private final InputStream    inputStream;
+    private List<String>         creationOrder;
+    private Iterator<String>     iterator;
+    private Map<String, String>  guidEntityJsonMap;
+    private ImportTransforms     importTransform;
 
     public ZipSource(InputStream inputStream) throws IOException {
-        this.inputStream = inputStream;
-        guidEntityJsonMap = new HashMap<>();
+        this(inputStream, null);
+    }
+
+    public ZipSource(InputStream inputStream, ImportTransforms importTransform) throws IOException {
+        this.inputStream       = inputStream;
+        this.guidEntityJsonMap = new HashMap<>();
+        this.importTransform   = importTransform;
 
         updateGuidZipEntryMap();
-        this.setCreationOrder();
+        setCreationOrder();
+    }
+
+    public ImportTransforms getImportTransform() { return this.importTransform; }
+
+    public void setImportTransform(ImportTransforms importTransform) {
+        this.importTransform = importTransform;
     }
 
     public AtlasTypesDef getTypesDef() throws AtlasBaseException {
@@ -113,8 +125,13 @@
     }
 
     public AtlasEntity.AtlasEntityWithExtInfo getEntityWithExtInfo(String guid) throws AtlasBaseException {
-        String s = (String) getFromCache(guid);
+        String s = getFromCache(guid);
         AtlasEntity.AtlasEntityWithExtInfo entityWithExtInfo = convertFromJson(AtlasEntity.AtlasEntityWithExtInfo.class, s);
+
+        if (importTransform != null) {
+            entityWithExtInfo = importTransform.apply(entityWithExtInfo);
+        }
+
         return entityWithExtInfo;
     }
 
@@ -193,7 +210,8 @@
     @Override
     public AtlasEntity getByGuid(String guid)  {
         try {
-            return getEntity(guid);
+            AtlasEntity entity = getEntity(guid);
+            return entity;
         } catch (AtlasBaseException e) {
             e.printStackTrace();
             return null;
diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/AtlasImportRequestTest.java b/repository/src/test/java/org/apache/atlas/repository/impexp/AtlasImportRequestTest.java
new file mode 100644
index 0000000..0844bf0
--- /dev/null
+++ b/repository/src/test/java/org/apache/atlas/repository/impexp/AtlasImportRequestTest.java
@@ -0,0 +1,104 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.repository.impexp;
+
+import org.apache.atlas.model.impexp.AtlasImportRequest;
+import org.apache.atlas.type.AtlasType;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.*;
+
+public class AtlasImportRequestTest {
+    @Test
+    public void serializeAtlasImportRequstFromJsonWithEmptyOptions() {
+        String jsonData = "{ \"options\": {} }";
+
+        AtlasImportRequest request = AtlasType.fromJson(jsonData, AtlasImportRequest.class);
+
+        assertNotNull(request);
+        assertNotNull(request.getOptions());
+        assertNull(request.getOptions().get(AtlasImportRequest.TRANSFORMS_KEY));
+
+        ImportTransforms tr = ImportTransforms.fromJson(request.getOptions().get(AtlasImportRequest.TRANSFORMS_KEY));
+
+        assertNull(tr);
+    }
+
+    @Test
+    public void serializeAtlasImportRequstFromJsonWithEmptyTransforms() {
+        String jsonData = "{ \"options\": { \"transforms\": \"{ }\" } }";
+
+        AtlasImportRequest request = AtlasType.fromJson(jsonData, AtlasImportRequest.class);
+
+        assertNotNull(request);
+        assertNotNull(request.getOptions());
+        assertNotNull(request.getOptions().get(AtlasImportRequest.TRANSFORMS_KEY));
+
+        ImportTransforms tr = ImportTransforms.fromJson(request.getOptions().get(AtlasImportRequest.TRANSFORMS_KEY));
+
+        assertNotNull(tr);
+        assertNotNull(tr.getTransforms());
+        assertEquals(tr.getTransforms().size(), 0);
+    }
+
+    @Test
+    public void serializeAtlasImportRequstFromJsonWith1Transform() {
+        String jsonData = "{ \"options\": { \"transforms\": \"{ \\\"hive_db\\\": { \\\"qualifiedName\\\": [ \\\"replace:@cl1:@cl2\\\" ] } }\" } }";
+
+        AtlasImportRequest request = AtlasType.fromJson(jsonData, AtlasImportRequest.class);
+
+        assertNotNull(request);
+        assertNotNull(request.getOptions());
+        assertNotNull(request.getOptions().get(AtlasImportRequest.TRANSFORMS_KEY));
+
+        ImportTransforms tr = ImportTransforms.fromJson(request.getOptions().get(AtlasImportRequest.TRANSFORMS_KEY));
+
+        assertNotNull(tr);
+        assertNotNull(tr.getTransforms());
+        assertEquals(tr.getTransforms().size(), 1);
+        assertTrue(tr.getTransforms().containsKey("hive_db"));
+        assertEquals(tr.getTransforms("hive_db").entrySet().size(), 1);
+        assertTrue(tr.getTransforms("hive_db").containsKey("qualifiedName"));
+        assertEquals(tr.getTransforms("hive_db").get("qualifiedName").size(), 1);
+    }
+
+    @Test
+    public void serializeAtlasImportRequstFromJson() {
+        String jsonData = "{ \"options\": { \"transforms\": \"{ \\\"hive_db\\\": { \\\"qualifiedName\\\": [ \\\"replace:@cl1:@cl2\\\" ] }, \\\"hive_table\\\": { \\\"qualifiedName\\\": [ \\\"lowercase\\\", \\\"replace:@cl1:@cl2\\\" ] } }\" } } }";
+
+        AtlasImportRequest request = AtlasType.fromJson(jsonData, AtlasImportRequest.class);
+
+        assertNotNull(request);
+        assertNotNull(request.getOptions());
+        assertNotNull(request.getOptions().get(AtlasImportRequest.TRANSFORMS_KEY));
+
+        ImportTransforms tr = ImportTransforms.fromJson(request.getOptions().get(AtlasImportRequest.TRANSFORMS_KEY));
+
+        assertNotNull(tr);
+        assertNotNull(tr.getTransforms());
+        assertEquals(tr.getTransforms().size(), 2);
+        assertTrue(tr.getTransforms().containsKey("hive_db"));
+        assertEquals(tr.getTransforms("hive_db").entrySet().size(), 1);
+        assertTrue(tr.getTransforms("hive_db").containsKey("qualifiedName"));
+        assertEquals(tr.getTransforms("hive_db").get("qualifiedName").size(), 1);
+        assertTrue(tr.getTransforms().containsKey("hive_table"));
+        assertEquals(tr.getTransforms("hive_table").entrySet().size(), 1);
+        assertTrue(tr.getTransforms("hive_table").containsKey("qualifiedName"));
+        assertEquals(tr.getTransforms("hive_table").get("qualifiedName").size(), 2);
+    }
+}
diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/ImportServiceReportingTest.java b/repository/src/test/java/org/apache/atlas/repository/impexp/ImportServiceReportingTest.java
deleted file mode 100644
index 0aaaa70..0000000
--- a/repository/src/test/java/org/apache/atlas/repository/impexp/ImportServiceReportingTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.atlas.repository.impexp;
-
-import com.google.inject.Inject;
-import org.apache.atlas.TestModules;
-import org.apache.atlas.repository.store.graph.AtlasEntityStore;
-import org.apache.atlas.store.AtlasTypeDefStore;
-import org.apache.atlas.type.AtlasTypeRegistry;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.annotations.Guice;
-
-@Guice(modules = TestModules.TestOnlyModule.class)
-public class ImportServiceReportingTest {
-    private static final Logger LOG = LoggerFactory.getLogger(ImportServiceReportingTest.class);
-
-    @Inject
-    AtlasTypeRegistry typeRegistry;
-
-    @Inject
-    private AtlasTypeDefStore typeDefStore;
-
-    @Inject
-    private AtlasEntityStore entityStore;
-
-
-}
diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/ImportServiceTest.java b/repository/src/test/java/org/apache/atlas/repository/impexp/ImportServiceTest.java
index 08e9ee8..a6fed62 100644
--- a/repository/src/test/java/org/apache/atlas/repository/impexp/ImportServiceTest.java
+++ b/repository/src/test/java/org/apache/atlas/repository/impexp/ImportServiceTest.java
@@ -81,5 +81,4 @@
         loadModelFromJson("0010-base_model.json", typeDefStore, typeRegistry);
         runAndVerifyQuickStart_v1_Import(new ImportService(typeDefStore, entityStore, typeRegistry), zipSource);
     }
-
 }
diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/ImportTransformerJSONTest.java b/repository/src/test/java/org/apache/atlas/repository/impexp/ImportTransformerJSONTest.java
new file mode 100644
index 0000000..7044e71
--- /dev/null
+++ b/repository/src/test/java/org/apache/atlas/repository/impexp/ImportTransformerJSONTest.java
@@ -0,0 +1,47 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.repository.impexp;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+
+import static org.testng.Assert.*;
+
+public class ImportTransformerJSONTest {
+
+
+    @Test
+    public void createAtlasImportTransformFromJson() throws Exception {
+        String hiveTableType  = "hive_table";
+        String qualifiedName  = "qualifiedName";
+        String jsonTransforms = "{ \"hive_table\": { \"qualifiedName\":[ \"lowercase\", \"replace:@cl1:@cl2\" ] } }";
+
+        ImportTransforms transforms = ImportTransforms.fromJson(jsonTransforms);
+
+        assertNotNull(transforms);
+        assertEquals(transforms.getTransforms().entrySet().size(), 1);
+        assertEquals(transforms.getTransforms().get(hiveTableType).entrySet().size(), 1);
+        assertEquals(transforms.getTransforms().get(hiveTableType).get(qualifiedName).size(), 2);
+        Assert.assertEquals(transforms.getTransforms().get(hiveTableType).get(qualifiedName).get(0).getTransformType(), "lowercase");
+        assertEquals(transforms.getTransforms().get(hiveTableType).get(qualifiedName).get(1).getTransformType(), "replace");
+        assertTrue(transforms.getTransforms().get(hiveTableType).get(qualifiedName).get(1) instanceof ImportTransformer.Replace);
+        assertEquals(((ImportTransformer.Replace)transforms.getTransforms().get(hiveTableType).get(qualifiedName).get(1)).getToFindStr(), "@cl1");
+        assertEquals(((ImportTransformer.Replace)transforms.getTransforms().get(hiveTableType).get(qualifiedName).get(1)).getReplaceStr(), "@cl2");
+    }
+}
diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/ImportTransformerTest.java b/repository/src/test/java/org/apache/atlas/repository/impexp/ImportTransformerTest.java
new file mode 100644
index 0000000..7ce34c8
--- /dev/null
+++ b/repository/src/test/java/org/apache/atlas/repository/impexp/ImportTransformerTest.java
@@ -0,0 +1,131 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.repository.impexp;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+public class ImportTransformerTest {
+
+    @Test
+    public void createWithCorrectParameters() throws AtlasBaseException, IllegalAccessException {
+        String param1 = "@cl1";
+        String param2 = "@cl2";
+
+        ImportTransformer e = ImportTransformer.getTransformer(String.format("%s:%s:%s", "replace", param1, param2));
+
+        assertTrue(e instanceof ImportTransformer.Replace);
+        assertEquals(((ImportTransformer.Replace)e).getToFindStr(), param1);
+        assertEquals(((ImportTransformer.Replace)e).getReplaceStr(), param2);
+    }
+
+    @Test
+    public void createSeveralWithCorrectParameters() throws AtlasBaseException, IllegalAccessException {
+        String param1 = "@cl1";
+        String param2 = "@cl2";
+
+        ImportTransformer e1 = ImportTransformer.getTransformer(String.format("%s:%s:%s", "replace", param1, param2));
+        ImportTransformer e2 = ImportTransformer.getTransformer(String.format("replace:tt1:tt2"));
+
+        assertTrue(e1 instanceof ImportTransformer.Replace);
+        assertEquals(((ImportTransformer.Replace)e1).getToFindStr(), param1);
+        assertEquals(((ImportTransformer.Replace)e1).getReplaceStr(), param2);
+
+        assertTrue(e2 instanceof ImportTransformer.Replace);
+        assertEquals(((ImportTransformer.Replace)e2).getToFindStr(), "tt1");
+        assertEquals(((ImportTransformer.Replace)e2).getReplaceStr(), "tt2");
+    }
+
+    @Test
+    public void createWithDefaultParameters() throws AtlasBaseException {
+        ImportTransformer e1 = ImportTransformer.getTransformer("replace:@cl1");
+        ImportTransformer e2 = ImportTransformer.getTransformer("replace");
+
+        assertTrue(e1 instanceof ImportTransformer.Replace);
+        assertEquals(((ImportTransformer.Replace)e1).getToFindStr(), "@cl1");
+        assertEquals(((ImportTransformer.Replace)e1).getReplaceStr(), "");
+
+        assertTrue(e2 instanceof ImportTransformer.Replace);
+        assertEquals(((ImportTransformer.Replace)e2).getToFindStr(), "");
+        assertEquals(((ImportTransformer.Replace)e2).getReplaceStr(), "");
+    }
+
+    @Test
+    public void applyLowercaseTransformer() throws AtlasBaseException {
+        ImportTransformer e = ImportTransformer.getTransformer("lowercase");
+
+        assertEquals(e.apply("@CL1"), "@cl1");
+        assertEquals(e.apply("@cl1"), "@cl1");
+        assertEquals(e.apply(""), ""); // empty string
+        assertEquals(e.apply(null), null); // null value: no change
+        assertEquals(e.apply(Integer.valueOf(5)), Integer.valueOf(5)); // non-string value: no change
+    }
+
+    @Test
+    public void applyUppercaseTransformer() throws AtlasBaseException {
+        ImportTransformer e = ImportTransformer.getTransformer("uppercase");
+
+        assertEquals(e.apply("@CL1"), "@CL1");
+        assertEquals(e.apply("@cl1"), "@CL1");
+        assertEquals(e.apply(""), ""); // empty string
+        assertEquals(e.apply(null), null); // null value: no change
+        assertEquals(e.apply(Integer.valueOf(5)), Integer.valueOf(5)); // non-string value: no change
+    }
+
+    @Test
+    public void applyReplaceTransformer1() throws AtlasBaseException {
+        ImportTransformer e = ImportTransformer.getTransformer("replace:@cl1:@cl2");
+
+        assertEquals(e.apply("@cl1"), "@cl2");
+        assertEquals(e.apply("default@cl1"), "default@cl2");
+        assertEquals(e.apply("@cl11"), "@cl21");
+        assertEquals(e.apply("@cl2"), "@cl2");
+        assertEquals(e.apply(""), ""); // empty string
+        assertEquals(e.apply(null), null); // null value
+        assertEquals(e.apply(Integer.valueOf(5)), Integer.valueOf(5)); // non-string value: no change
+    }
+
+    @Test
+    public void applyReplaceTransformer2() throws AtlasBaseException {
+        ImportTransformer e = ImportTransformer.getTransformer("replace:@cl1");
+
+        assertEquals(e.apply("@cl1"), "");
+        assertEquals(e.apply("default@cl1"), "default");
+        assertEquals(e.apply("@cl11"), "1");
+        assertEquals(e.apply("@cl2"), "@cl2");
+        assertEquals(e.apply(""), ""); // empty string
+        assertEquals(e.apply(null), null); // null value
+        assertEquals(e.apply(Integer.valueOf(5)), Integer.valueOf(5)); // non-string value: no change
+    }
+
+    @Test
+    public void applyReplaceTransformer3() throws AtlasBaseException {
+        ImportTransformer e = ImportTransformer.getTransformer("replace");
+
+        assertEquals(e.apply("@cl1"), "@cl1");
+        assertEquals(e.apply("default@cl1"), "default@cl1");
+        assertEquals(e.apply("@cl11"), "@cl11");
+        assertEquals(e.apply("@cl2"), "@cl2");
+        assertEquals(e.apply(""), ""); // empty string
+        assertEquals(e.apply(null), null); // null value
+        assertEquals(e.apply(Integer.valueOf(5)), Integer.valueOf(5)); // non-string value: no change
+    }
+}
diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/ImportTransformsTest.java b/repository/src/test/java/org/apache/atlas/repository/impexp/ImportTransformsTest.java
new file mode 100644
index 0000000..ccedeb1
--- /dev/null
+++ b/repository/src/test/java/org/apache/atlas/repository/impexp/ImportTransformsTest.java
@@ -0,0 +1,151 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.atlas.repository.impexp;
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+public class ImportTransformsTest {
+    private final String qualifiedName  = "qualifiedName";
+    private final String lowerCaseCL1   = "@cl1";
+    private final String lowerCaseCL2   = "@cl2";
+    private final String jsonTransforms = "{ \"hive_table\": { \"qualifiedName\":[ \"lowercase\", \"replace:@cl1:@cl2\" ] } }";
+
+    private ImportTransforms transform;
+
+    @BeforeTest
+    public void setup() throws AtlasBaseException {
+        transform = ImportTransforms.fromJson(jsonTransforms);
+    }
+
+    @Test
+    public void transformEntityWith2Transforms() throws AtlasBaseException {
+        AtlasEntity entity    = getHiveTableAtlasEntity();
+        String      attrValue = (String) entity.getAttribute(qualifiedName);
+
+        transform.apply(entity);
+
+        assertEquals(entity.getAttribute(qualifiedName), applyDefaultTransform(attrValue));
+    }
+
+    @Test
+    public void transformEntityWithExtInfo() throws AtlasBaseException {
+        addColumnTransform(transform);
+
+        AtlasEntityWithExtInfo entityWithExtInfo = getAtlasEntityWithExtInfo();
+        AtlasEntity            entity            = entityWithExtInfo.getEntity();
+        String                 attrValue         = (String) entity.getAttribute(qualifiedName);
+        String[]               expectedValues    = getExtEntityExpectedValues(entityWithExtInfo);
+
+        transform.apply(entityWithExtInfo);
+
+        assertEquals(entityWithExtInfo.getEntity().getAttribute(qualifiedName), applyDefaultTransform(attrValue));
+
+        for (int i = 0; i < expectedValues.length; i++) {
+            assertEquals(entityWithExtInfo.getReferredEntities().get(Integer.toString(i)).getAttribute(qualifiedName), expectedValues[i]);
+        }
+    }
+
+    @Test
+    public void transformEntityWithExtInfoNullCheck() throws AtlasBaseException {
+        addColumnTransform(transform);
+
+        AtlasEntityWithExtInfo entityWithExtInfo = getAtlasEntityWithExtInfo();
+
+        entityWithExtInfo.setReferredEntities(null);
+
+        AtlasEntityWithExtInfo transformedEntityWithExtInfo = transform.apply(entityWithExtInfo);
+
+        assertNotNull(transformedEntityWithExtInfo);
+        assertEquals(entityWithExtInfo.getEntity().getGuid(), transformedEntityWithExtInfo.getEntity().getGuid());
+    }
+
+    private String[] getExtEntityExpectedValues(AtlasEntityWithExtInfo entityWithExtInfo) {
+        String[] ret = new String[entityWithExtInfo.getReferredEntities().size()];
+
+        for (int i = 0; i < ret.length; i++) {
+            String attrValue = (String) entityWithExtInfo.getReferredEntities().get(Integer.toString(i)).getAttribute(qualifiedName);
+
+            ret[i] = attrValue.replace(lowerCaseCL1, lowerCaseCL2);
+        }
+
+        return ret;
+    }
+
+    private void addColumnTransform(ImportTransforms transform) throws AtlasBaseException {
+        Map<String, List<ImportTransformer>> tr     = new HashMap<>();
+        List<ImportTransformer>              trList = new ArrayList<>();
+
+        trList.add(ImportTransformer.getTransformer(String.format("replace:%s:%s", lowerCaseCL1, lowerCaseCL2)));
+
+        tr.put(qualifiedName, trList);
+
+        transform.getTransforms().put("hive_column", tr);
+    }
+
+    private String applyDefaultTransform(String attrValue) {
+        return attrValue.toLowerCase().replace(lowerCaseCL1, lowerCaseCL2);
+    }
+
+    private AtlasEntity getHiveTableAtlasEntity() {
+        AtlasEntity entity = new AtlasEntity("hive_table");
+
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(qualifiedName, "TABLE1.default" + lowerCaseCL1);
+        attributes.put("dbname", "someDB");
+        attributes.put("name", "somename");
+
+        entity.setAttributes(attributes);
+        return entity;
+    }
+
+    private AtlasEntity getHiveColumnAtlasEntity(int index) {
+        AtlasEntity entity = new AtlasEntity("hive_column");
+
+        Map<String, Object> attributes = new HashMap<>();
+        attributes.put(qualifiedName, String.format("col%s.TABLE1.default@cl1", index));
+        attributes.put("name", "col" + index);
+
+        entity.setAttributes(attributes);
+        return entity;
+    }
+
+    private AtlasEntityWithExtInfo getAtlasEntityWithExtInfo() {
+        AtlasEntityWithExtInfo ret = new AtlasEntityWithExtInfo(getHiveTableAtlasEntity());
+
+        Map<String, AtlasEntity> referredEntities = new HashMap<>();
+        referredEntities.put("0", getHiveColumnAtlasEntity(1));
+        referredEntities.put("1", getHiveColumnAtlasEntity(2));
+        referredEntities.put("2", getHiveColumnAtlasEntity(3));
+
+        ret.setReferredEntities(referredEntities);
+
+        return ret;
+    }
+}
diff --git a/repository/src/test/java/org/apache/atlas/repository/impexp/ZipSourceTest.java b/repository/src/test/java/org/apache/atlas/repository/impexp/ZipSourceTest.java
index 8b042d7..be9c20b 100644
--- a/repository/src/test/java/org/apache/atlas/repository/impexp/ZipSourceTest.java
+++ b/repository/src/test/java/org/apache/atlas/repository/impexp/ZipSourceTest.java
@@ -29,6 +29,10 @@
 import java.io.IOException;
 import java.util.List;
 
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.AssertJUnit.assertTrue;
+
 public class ZipSourceTest {
     @DataProvider(name = "zipFileStocks")
     public static Object[][] getDataFromZipFile() throws IOException {
@@ -50,12 +54,12 @@
     public void examineContents_BehavesAsExpected(ZipSource zipSource) throws IOException, AtlasBaseException {
         List<String> creationOrder = zipSource.getCreationOrder();
 
-        Assert.assertNotNull(creationOrder);
-        Assert.assertEquals(creationOrder.size(), 4);
+        assertNotNull(creationOrder);
+        assertEquals(creationOrder.size(), 4);
 
         AtlasTypesDef typesDef = zipSource.getTypesDef();
-        Assert.assertNotNull(typesDef);
-        Assert.assertEquals(typesDef.getEntityDefs().size(), 6);
+        assertNotNull(typesDef);
+        assertEquals(typesDef.getEntityDefs().size(), 6);
 
         useCreationOrderToFetchEntitiesWithExtInfo(zipSource, creationOrder);
         useCreationOrderToFetchEntities(zipSource, creationOrder);
@@ -66,13 +70,13 @@
     private void useCreationOrderToFetchEntities(ZipSource zipSource, List<String> creationOrder) {
         for (String guid : creationOrder) {
             AtlasEntity e = zipSource.getByGuid(guid);
-            Assert.assertNotNull(e);
+            assertNotNull(e);
         }
     }
 
     private void verifyGuidRemovalOnImportComplete(ZipSource zipSource, String guid) {
         AtlasEntity e = zipSource.getByGuid(guid);
-        Assert.assertNotNull(e);
+        assertNotNull(e);
 
         zipSource.onImportComplete(guid);
 
@@ -88,7 +92,7 @@
     private void useCreationOrderToFetchEntitiesWithExtInfo(ZipSource zipSource, List<String> creationOrder) throws AtlasBaseException {
         for (String guid : creationOrder) {
             AtlasEntity.AtlasEntityExtInfo e = zipSource.getEntityWithExtInfo(guid);
-            Assert.assertNotNull(e);
+            assertNotNull(e);
         }
     }
 
@@ -100,10 +104,35 @@
         for (int i = 0; i < creationOrder.size(); i++) {
             AtlasEntity e = zipSource.next();
 
-            Assert.assertNotNull(e);
-            Assert.assertEquals(e.getGuid(), creationOrder.get(i));
+            assertNotNull(e);
+            assertEquals(e.getGuid(), creationOrder.get(i));
         }
 
         Assert.assertFalse(zipSource.hasNext());
     }
+
+    @Test(dataProvider = "zipFileStocks")
+    public void applyTransformation(ZipSource zipSource) throws IOException, AtlasBaseException {
+        ImportTransforms transforms = getTransformForHiveDB();
+        zipSource.setImportTransform(transforms);
+
+        Assert.assertTrue(zipSource.hasNext());
+        List<String> creationOrder = zipSource.getCreationOrder();
+        for (int i = 0; i < creationOrder.size(); i++) {
+            AtlasEntity e = zipSource.next();
+            if(e.getTypeName().equals("hive_db")) {
+                Object o = e.getAttribute("qualifiedName");
+                String s = (String) o;
+                assertNotNull(e);
+                assertTrue(s.contains("@cl2"));
+                break;
+            }
+        }
+    }
+
+    private ImportTransforms getTransformForHiveDB() {
+        ImportTransforms tr = ImportTransforms.fromJson("{ \"hive_db\": { \"qualifiedName\": [ \"replace:@cl1:@cl2\" ] } }");
+
+        return tr;
+    }
 }
diff --git a/webapp/pom.xml b/webapp/pom.xml
index 4132912..4cc0112 100755
--- a/webapp/pom.xml
+++ b/webapp/pom.xml
@@ -261,6 +261,11 @@
         </dependency>
 
         <dependency>
+            <groupId>com.sun.jersey.contribs</groupId>
+            <artifactId>jersey-multipart</artifactId>
+        </dependency>
+
+        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
         </dependency>
diff --git a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
index 01f9a86..8c5623f 100755
--- a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
+++ b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
@@ -18,6 +18,7 @@
 
 package org.apache.atlas.web.resources;
 
+import com.sun.jersey.multipart.FormDataParam;
 import org.apache.atlas.ApplicationProperties;
 import org.apache.atlas.AtlasClient;
 import org.apache.atlas.AtlasErrorCode;
@@ -37,6 +38,7 @@
 import org.apache.atlas.repository.store.graph.AtlasEntityStore;
 import org.apache.atlas.services.MetricsService;
 import org.apache.atlas.store.AtlasTypeDefStore;
+import org.apache.atlas.type.AtlasType;
 import org.apache.atlas.type.AtlasTypeRegistry;
 import org.apache.atlas.web.filters.AtlasCSRFPreventionFilter;
 import org.apache.atlas.web.service.ServiceState;
@@ -69,8 +71,8 @@
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import java.io.ByteArrayInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
@@ -362,10 +364,11 @@
     @POST
     @Path("/import")
     @Produces(Servlets.JSON_MEDIA_TYPE)
-    @Consumes(Servlets.BINARY)
-    public AtlasImportResult importData(byte[] bytes) throws AtlasBaseException {
+    @Consumes(MediaType.MULTIPART_FORM_DATA)
+    public AtlasImportResult importData(@FormDataParam("request") String jsonData,
+                                        @FormDataParam("data") InputStream inputStream) throws AtlasBaseException {
         if (LOG.isDebugEnabled()) {
-            LOG.debug("==> AdminResource.importData(bytes.length={})", bytes.length);
+            LOG.debug("==> AdminResource.importData(jsonData={}, inputStream={})", jsonData, (inputStream != null));
         }
 
         acquireExportImportLock("import");
@@ -373,15 +376,13 @@
         AtlasImportResult result;
 
         try {
-            AtlasImportRequest   request       = new AtlasImportRequest(Servlets.getParameterMap(httpServletRequest));
-            ByteArrayInputStream inputStream   = new ByteArrayInputStream(bytes);
+            AtlasImportRequest request = AtlasType.fromJson(jsonData, AtlasImportRequest.class);
             ImportService importService = new ImportService(this.typesDefStore, this.entityStore, this.typeRegistry);
-
             ZipSource zipSource = new ZipSource(inputStream);
 
             result = importService.run(zipSource, request, Servlets.getUserName(httpServletRequest),
-                                       Servlets.getHostName(httpServletRequest),
-                                       AtlasAuthorizationUtils.getRequestIpAddress(httpServletRequest));
+                    Servlets.getHostName(httpServletRequest),
+                    AtlasAuthorizationUtils.getRequestIpAddress(httpServletRequest));
         } catch (Exception excp) {
             LOG.error("importData(binary) failed", excp);
 
@@ -400,7 +401,7 @@
     @POST
     @Path("/importfile")
     @Produces(Servlets.JSON_MEDIA_TYPE)
-    public AtlasImportResult importFile() throws AtlasBaseException {
+    public AtlasImportResult importFile(String jsonData) throws AtlasBaseException {
         if (LOG.isDebugEnabled()) {
             LOG.debug("==> AdminResource.importFile()");
         }
@@ -410,9 +411,8 @@
         AtlasImportResult result;
 
         try {
-            AtlasImportRequest request       = new AtlasImportRequest(Servlets.getParameterMap(httpServletRequest));
-            ImportService      importService = new ImportService(this.typesDefStore, this.entityStore, this.typeRegistry);
-
+            AtlasImportRequest request = AtlasType.fromJson(jsonData, AtlasImportRequest.class);
+            ImportService importService = new ImportService(this.typesDefStore, this.entityStore, this.typeRegistry);
             result = importService.run(request, Servlets.getUserName(httpServletRequest),
                                        Servlets.getHostName(httpServletRequest),
                                        AtlasAuthorizationUtils.getRequestIpAddress(httpServletRequest));