You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2016/11/24 01:51:47 UTC

incubator-atlas git commit: ATLAS-1319: fix converters between v1 and v2 to handle struct type attributes

Repository: incubator-atlas
Updated Branches:
  refs/heads/master f694a910b -> d4efc3784


ATLAS-1319: fix converters between v1 and v2 to handle struct type attributes


Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/d4efc378
Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/d4efc378
Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/d4efc378

Branch: refs/heads/master
Commit: d4efc378437f690669a382bdd413ef9371fac568
Parents: f694a91
Author: Madhan Neethiraj <ma...@apache.org>
Authored: Wed Nov 23 00:56:48 2016 -0800
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Wed Nov 23 17:51:28 2016 -0800

----------------------------------------------------------------------
 .../java/org/apache/atlas/AtlasErrorCode.java   |   1 +
 .../atlas/repository/graph/GraphHelper.java     |   2 +-
 .../adapters/AtlasAbstractFormatConverter.java  |  41 +++++
 .../web/adapters/AtlasArrayFormatConverter.java |  80 +++++----
 .../AtlasClassificationFormatConverter.java     |  77 ++++++++
 .../adapters/AtlasEntityFormatConverter.java    | 137 +++++++++++++++
 .../web/adapters/AtlasEnumFormatConverter.java  |  16 +-
 .../atlas/web/adapters/AtlasFormatAdapter.java  |  31 ----
 .../web/adapters/AtlasFormatConverter.java      |  31 ++++
 .../web/adapters/AtlasFormatConverters.java     |  68 +++----
 .../adapters/AtlasFormatConvertersModule.java   |  48 -----
 .../web/adapters/AtlasInstanceRestAdapters.java |  33 ++--
 .../web/adapters/AtlasMapFormatConverter.java   |  90 ++++++----
 .../adapters/AtlasPrimitiveFormatConverter.java |  23 +--
 .../adapters/AtlasStructFormatConverter.java    | 176 +++++++++++++++++++
 .../v1/ReferenceableToAtlasEntityConverter.java | 111 ------------
 .../v1/StructToAtlasStructConverter.java        | 114 ------------
 .../v1/TraitToAtlasClassificationConverter.java |  64 -------
 .../v2/AtlasClassificationToTraitConverter.java |  53 ------
 .../v2/AtlasEntityToReferenceableConverter.java | 108 ------------
 .../v2/AtlasStructToStructConverter.java        | 124 -------------
 .../atlas/web/listeners/GuiceServletConfig.java |   3 +-
 .../atlas/web/adapters/TestEntitiesREST.java    |   2 +-
 .../atlas/web/adapters/TestEntityREST.java      |   3 +-
 24 files changed, 628 insertions(+), 808 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
----------------------------------------------------------------------
diff --git a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
index 80a539a..65726c3 100644
--- a/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
+++ b/intg/src/main/java/org/apache/atlas/AtlasErrorCode.java
@@ -42,6 +42,7 @@ public enum AtlasErrorCode {
     CANNOT_ADD_MANDATORY_ATTRIBUTE(400, "ATLAS40012E", "{0}.{1} : can not add mandatory attribute"),
     ATTRIBUTE_DELETION_NOT_SUPPORTED(400, "ATLAS40013E", "{0}.{1} : attribute delete not supported"),
     SUPERTYPE_REMOVAL_NOT_SUPPORTED(400, "ATLAS40014E", "superType remove not supported"),
+    UNEXPECTED_TYPE(400, "ATLAS40015E", "expected type {0}; found {1}"),
 
     TYPE_NAME_NOT_FOUND(404, "ATLAS4041E", "Given typename {0} was invalid"),
     TYPE_GUID_NOT_FOUND(404, "ATLAS4042E", "Given type guid {0} was invalid"),

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
----------------------------------------------------------------------
diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java b/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
index 6cecd46..cdeb117 100755
--- a/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
+++ b/repository/src/main/java/org/apache/atlas/repository/graph/GraphHelper.java
@@ -787,7 +787,7 @@ public final class GraphHelper {
             return instanceVertex.getProperty(actualPropertyName, AtlasEdge.class);
         }
         else {
-            return instanceVertex.getProperty(actualPropertyName, String.class).toString();
+            return instanceVertex.getProperty(actualPropertyName, Object.class).toString();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasAbstractFormatConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasAbstractFormatConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasAbstractFormatConverter.java
new file mode 100644
index 0000000..f1f3d18
--- /dev/null
+++ b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasAbstractFormatConverter.java
@@ -0,0 +1,41 @@
+/**
+ * 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.web.adapters;
+
+
+import org.apache.atlas.model.TypeCategory;
+import org.apache.atlas.type.AtlasTypeRegistry;
+
+
+public abstract class AtlasAbstractFormatConverter implements AtlasFormatConverter {
+    protected final AtlasFormatConverters converterRegistry;
+    protected final AtlasTypeRegistry     typeRegistry;
+    protected final TypeCategory          typeCategory;
+
+    protected AtlasAbstractFormatConverter(AtlasFormatConverters converterRegistry, AtlasTypeRegistry typeRegistry, TypeCategory typeCategory) {
+        this.converterRegistry = converterRegistry;
+        this.typeRegistry      = typeRegistry;
+        this.typeCategory      = typeCategory;
+    }
+
+    @Override
+    public TypeCategory getTypeCategory() {
+        return typeCategory;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasArrayFormatConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasArrayFormatConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasArrayFormatConverter.java
index 5485efa..e3b4efa 100644
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasArrayFormatConverter.java
+++ b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasArrayFormatConverter.java
@@ -18,61 +18,81 @@
 package org.apache.atlas.web.adapters;
 
 
+import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.TypeCategory;
 import org.apache.atlas.type.AtlasArrayType;
 import org.apache.atlas.type.AtlasType;
 import org.apache.atlas.type.AtlasTypeRegistry;
 
-import javax.inject.Inject;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
-import static org.apache.atlas.web.adapters.AtlasFormatConverters.VERSION_V1;
-import static org.apache.atlas.web.adapters.AtlasFormatConverters.VERSION_V2;
 
-public class AtlasArrayFormatConverter implements AtlasFormatAdapter {
+public class AtlasArrayFormatConverter extends AtlasAbstractFormatConverter {
 
-    protected AtlasFormatConverters registry;
-
-    @Inject
-    public void init(AtlasFormatConverters registry) throws AtlasBaseException {
-        this.registry = registry;
-        registry.registerConverter(this, AtlasFormatConverters.VERSION_V1, AtlasFormatConverters.VERSION_V2);
-        registry.registerConverter(this, AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1);
+    public AtlasArrayFormatConverter(AtlasFormatConverters registry, AtlasTypeRegistry typeRegistry) {
+        super(registry, typeRegistry, TypeCategory.ARRAY);
     }
 
     @Override
-    public TypeCategory getTypeCategory() {
-        return TypeCategory.ARRAY;
+    public Collection fromV1ToV2(Object v1Obj, AtlasType type) throws AtlasBaseException {
+        Collection ret = null;
+
+        if (v1Obj != null) {
+            if (v1Obj instanceof List) {
+                ret = new ArrayList();
+            } else if (v1Obj instanceof Set) {
+                ret = new LinkedHashSet();
+            } else {
+                throw new AtlasBaseException(AtlasErrorCode.UNEXPECTED_TYPE, "List or Set",
+                                             v1Obj.getClass().getCanonicalName());
+            }
+
+            AtlasArrayType       arrType       = (AtlasArrayType) type;
+            AtlasType            elemType      = arrType.getElementType();
+            AtlasFormatConverter elemConverter = converterRegistry.getConverter(elemType.getTypeCategory());
+            Collection           v1List        = (Collection) v1Obj;
+
+            for (Object v1Elem : v1List) {
+                Object convertedVal = elemConverter.fromV1ToV2(v1Elem, elemType);
+
+                ret.add(convertedVal);
+            }
+        }
+
+        return ret;
     }
 
     @Override
-    public Object convert(String sourceVersion, String targetVersion, AtlasType type, final Object source) throws AtlasBaseException {
-        Collection newCollection = null;
-        if ( source != null ) {
-            if (AtlasFormatConverters.isArrayListType(source.getClass())) {
-                newCollection = new ArrayList();
-            } else if (AtlasFormatConverters.isSetType(source.getClass())) {
-                newCollection = new LinkedHashSet();
+    public Collection fromV2ToV1(Object v2Obj, AtlasType type) throws AtlasBaseException {
+        Collection ret = null;
+
+        if (v2Obj != null) {
+            if (v2Obj instanceof List) {
+                ret = new ArrayList();
+            } else if (v2Obj instanceof Set) {
+                ret = new LinkedHashSet();
+            } else {
+                throw new AtlasBaseException(AtlasErrorCode.UNEXPECTED_TYPE, "List or Set",
+                                             v2Obj.getClass().getCanonicalName());
             }
 
-            AtlasArrayType arrType = (AtlasArrayType) type;
-            AtlasType elemType = arrType.getElementType();
+            AtlasArrayType       arrType       = (AtlasArrayType) type;
+            AtlasType            elemType      = arrType.getElementType();
+            AtlasFormatConverter elemConverter = converterRegistry.getConverter(elemType.getTypeCategory());
+            Collection           v2List        = (Collection) v2Obj;
 
-            Collection originalList = (Collection) source;
-            for (Object elem : originalList) {
-                AtlasFormatAdapter elemConverter = registry.getConverter(sourceVersion, targetVersion, elemType.getTypeCategory());
-                Object convertedVal = elemConverter.convert(sourceVersion, targetVersion, elemType, elem);
+            for (Object v2Elem : v2List) {
+                Object convertedVal = elemConverter.fromV2ToV1(v2Elem, elemType);
 
-                newCollection.add(convertedVal);
+                ret.add(convertedVal);
             }
         }
-        return newCollection;
-    }
 
+        return ret;
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasClassificationFormatConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasClassificationFormatConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasClassificationFormatConverter.java
new file mode 100644
index 0000000..da71c31
--- /dev/null
+++ b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasClassificationFormatConverter.java
@@ -0,0 +1,77 @@
+/**
+ * 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.web.adapters;
+
+import org.apache.atlas.AtlasErrorCode;
+import org.apache.atlas.AtlasException;
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.TypeCategory;
+import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.type.AtlasClassificationType;
+import org.apache.atlas.type.AtlasType;
+import org.apache.atlas.type.AtlasTypeRegistry;
+import org.apache.atlas.typesystem.IStruct;
+import org.apache.commons.collections.MapUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+
+public class AtlasClassificationFormatConverter extends AtlasStructFormatConverter {
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasClassificationFormatConverter.class);
+
+    public AtlasClassificationFormatConverter(AtlasFormatConverters registry, AtlasTypeRegistry typeRegistry) {
+        super(registry, typeRegistry, TypeCategory.CLASSIFICATION);
+    }
+
+    @Override
+    public AtlasClassification fromV1ToV2(Object v1Obj, AtlasType type) throws AtlasBaseException {
+        AtlasClassification ret = null;
+
+        if (v1Obj != null) {
+            AtlasClassificationType classificationType = (AtlasClassificationType)type;
+
+            if (v1Obj instanceof Map) {
+                final Map v1Map     = (Map) v1Obj;
+                final Map v1Attribs = (Map) v1Map.get(ATTRIBUTES_PROPERTY_KEY);
+
+                if (MapUtils.isNotEmpty(v1Attribs)) {
+                    ret = new AtlasClassification(type.getTypeName(), fromV1ToV2(classificationType, v1Attribs));
+                } else {
+                    ret = new AtlasClassification(type.getTypeName());
+                }
+            } else if (v1Obj instanceof IStruct) {
+                IStruct             struct    = (IStruct) v1Obj;
+                Map<String, Object> v1Attribs = null;
+
+                try {
+                    v1Attribs = struct.getValuesMap();
+                } catch (AtlasException excp) {
+                    LOG.error("IStruct.getValuesMap() failed", excp);
+                }
+
+                ret = new AtlasClassification(type.getTypeName(), fromV1ToV2(classificationType, v1Attribs));
+            } else {
+                throw new AtlasBaseException(AtlasErrorCode.UNEXPECTED_TYPE, "Map or IStruct",
+                                             v1Obj.getClass().getCanonicalName());
+            }
+        }
+
+        return ret;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasEntityFormatConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasEntityFormatConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasEntityFormatConverter.java
new file mode 100644
index 0000000..b8537c4
--- /dev/null
+++ b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasEntityFormatConverter.java
@@ -0,0 +1,137 @@
+/**
+ * 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.web.adapters;
+
+import org.apache.atlas.AtlasErrorCode;
+import org.apache.atlas.AtlasException;
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.TypeCategory;
+import org.apache.atlas.model.instance.AtlasClassification;
+import org.apache.atlas.model.instance.AtlasEntity;
+import org.apache.atlas.model.instance.AtlasEntityWithAssociations;
+import org.apache.atlas.model.instance.AtlasObjectId;
+import org.apache.atlas.type.AtlasEntityType;
+import org.apache.atlas.type.AtlasType;
+import org.apache.atlas.type.AtlasTypeRegistry;
+import org.apache.atlas.typesystem.IReferenceableInstance;
+import org.apache.atlas.typesystem.IStruct;
+import org.apache.atlas.typesystem.Referenceable;
+import org.apache.atlas.typesystem.persistence.Id;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+public class AtlasEntityFormatConverter extends AtlasStructFormatConverter {
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasEntityFormatConverter.class);
+
+    public AtlasEntityFormatConverter(AtlasFormatConverters registry, AtlasTypeRegistry typeRegistry) {
+        super(registry, typeRegistry, TypeCategory.ENTITY);
+    }
+
+    @Override
+    public AtlasEntityWithAssociations fromV1ToV2(Object v1Obj, AtlasType type) throws AtlasBaseException {
+        AtlasEntityWithAssociations ret = null;
+
+        if (v1Obj != null) {
+            AtlasEntityType entityType = (AtlasEntityType) type;
+
+            if (v1Obj instanceof Id) {
+                Id id = (Id) v1Obj;
+
+                ret = new AtlasEntityWithAssociations(id.getTypeName());
+                ret.setGuid(id.getId()._getId());
+            } else if (v1Obj instanceof IReferenceableInstance) {
+                IReferenceableInstance entity    = (IReferenceableInstance) v1Obj;
+                Map<String, Object>    v1Attribs = null;
+
+                try {
+                    v1Attribs = entity.getValuesMap();
+                } catch (AtlasException excp) {
+                    LOG.error("IReferenceableInstance.getValuesMap() failed", excp);
+                }
+
+                ret =  new AtlasEntityWithAssociations(entity.getTypeName(), super.fromV1ToV2(entityType, v1Attribs));
+                ret.setGuid(entity.getId()._getId());
+
+                if (CollectionUtils.isNotEmpty(entity.getTraits())) {
+                    List<AtlasClassification> classifications = new ArrayList<>();
+                    AtlasFormatConverter      traitConverter  = converterRegistry.getConverter(TypeCategory.CLASSIFICATION);
+
+                    for (String traitName : entity.getTraits()) {
+                        IStruct             trait          = entity.getTrait(traitName);
+                        AtlasType           classifiType   = typeRegistry.getType(traitName);
+                        AtlasClassification classification = (AtlasClassification) traitConverter.fromV1ToV2(trait, classifiType);
+
+                        classifications.add(classification);
+                    }
+
+                    ret.setClassifications(classifications);
+                }
+            } else {
+                throw new AtlasBaseException(AtlasErrorCode.UNEXPECTED_TYPE, "Id or IReferenceableInstance",
+                                             v1Obj.getClass().getCanonicalName());
+            }
+        }
+        return ret;
+    }
+
+    @Override
+    public Object fromV2ToV1(Object v2Obj, AtlasType type) throws AtlasBaseException {
+        Object ret = null;
+
+        if (v2Obj != null) {
+            AtlasEntityType entityType = (AtlasEntityType) type;
+
+            if (v2Obj instanceof Map) {
+                Map    v2Map    = (Map) v2Obj;
+                String idStr    = (String)v2Map.get(AtlasObjectId.KEY_GUID);
+                String typeName = type.getTypeName();
+
+                if (StringUtils.isEmpty(idStr)) {
+                    throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND);
+                }
+
+                final Map v2Attribs = (Map) v2Map.get(ATTRIBUTES_PROPERTY_KEY);
+
+                if (MapUtils.isEmpty(v2Attribs)) {
+                    ret = new Id(idStr, 0, typeName);
+                } else {
+                    ret = new Referenceable(idStr, typeName, super.fromV2ToV1(entityType, v2Attribs));
+                }
+            } else if (v2Obj instanceof AtlasEntity) {
+                AtlasEntity entity = (AtlasEntity) v2Obj;
+
+                ret = new Referenceable(entity.getGuid(), entity.getTypeName(),
+                                        fromV2ToV1(entityType, entity.getAttributes()));
+            } else if (v2Obj instanceof String) { // transient-id
+                ret = new Referenceable((String) v2Obj, type.getTypeName(), null);
+            } else {
+                throw new AtlasBaseException(AtlasErrorCode.UNEXPECTED_TYPE, "Map or AtlasEntity or String",
+                                             v2Obj.getClass().getCanonicalName());
+            }
+        }
+
+        return ret;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasEnumFormatConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasEnumFormatConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasEnumFormatConverter.java
index ec0661d..4f22437 100644
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasEnumFormatConverter.java
+++ b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasEnumFormatConverter.java
@@ -23,18 +23,20 @@ import org.apache.atlas.model.TypeCategory;
 import org.apache.atlas.type.AtlasType;
 import org.apache.atlas.type.AtlasTypeRegistry;
 
-import javax.inject.Inject;
 
-public class AtlasEnumFormatConverter extends AtlasPrimitiveFormatConverter {
+public class AtlasEnumFormatConverter extends AtlasAbstractFormatConverter {
+    public AtlasEnumFormatConverter(AtlasFormatConverters registry, AtlasTypeRegistry typeRegistry) {
+        super(registry, typeRegistry, TypeCategory.ENUM);
+    }
 
-    @Inject
-    public void init(AtlasFormatConverters registry) throws AtlasBaseException {
-        super.init(registry);
+    @Override
+    public Object fromV1ToV2(Object v1Obj, AtlasType type) throws AtlasBaseException {
+        return type.getNormalizedValue(v1Obj);
     }
 
     @Override
-    public TypeCategory getTypeCategory() {
-        return TypeCategory.ENUM;
+    public Object fromV2ToV1(Object v2Obj, AtlasType type) throws AtlasBaseException {
+        return type.getNormalizedValue(v2Obj);
     }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatAdapter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatAdapter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatAdapter.java
deleted file mode 100644
index c146d72..0000000
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatAdapter.java
+++ /dev/null
@@ -1,31 +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.web.adapters;
-
-
-import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.model.TypeCategory;
-import org.apache.atlas.type.AtlasType;
-
-public interface AtlasFormatAdapter {
-
-    Object convert(String sourceVersion, String targetVersion, AtlasType type, Object source) throws AtlasBaseException;
-
-    TypeCategory getTypeCategory();
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConverter.java
new file mode 100644
index 0000000..079f3be
--- /dev/null
+++ b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConverter.java
@@ -0,0 +1,31 @@
+/**
+ * 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.web.adapters;
+
+
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.TypeCategory;
+import org.apache.atlas.type.AtlasType;
+
+public interface AtlasFormatConverter {
+    Object fromV1ToV2(Object v1Obj, AtlasType type) throws AtlasBaseException;
+
+    Object fromV2ToV1(Object v2Obj, AtlasType type) throws AtlasBaseException;
+
+    TypeCategory getTypeCategory();
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConverters.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConverters.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConverters.java
index 5238a75..7c3f536 100644
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConverters.java
+++ b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConverters.java
@@ -22,67 +22,39 @@ import com.google.inject.Singleton;
 import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.TypeCategory;
+import org.apache.atlas.type.AtlasTypeRegistry;
 
-import java.util.Date;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 @Singleton
 public class AtlasFormatConverters {
 
-    public static String VERSION_V1 = "v1";
-    public static String VERSION_V2 = "v2";
-
-    private Map<String, AtlasFormatAdapter> registry = new HashMap<>();
-
-    public void registerConverter(AtlasFormatAdapter adapter, String sourceVersion, String targetVersion) {
-        registry.put(getKey(sourceVersion, targetVersion, adapter.getTypeCategory()), adapter);
-    }
-
-    public AtlasFormatAdapter getConverter(String sourceVersion, String targetVersion, TypeCategory typeCategory) throws AtlasBaseException {
-        if (registry.containsKey(getKey(sourceVersion, targetVersion, typeCategory))) {
-            return registry.get(getKey(sourceVersion, targetVersion, typeCategory));
-        }
-        throw new AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR, "Could not find the converter for this type " + typeCategory);
-    }
-
-    public static boolean isArrayListType(Class c) {
-        return List.class.isAssignableFrom(c);
+    private final Map<TypeCategory, AtlasFormatConverter> registry = new HashMap<>();
+
+    @Inject
+    public AtlasFormatConverters(AtlasTypeRegistry typeRegistry) {
+        registerConverter(new AtlasPrimitiveFormatConverter(this, typeRegistry));
+        registerConverter(new AtlasEnumFormatConverter(this, typeRegistry));
+        registerConverter(new AtlasStructFormatConverter(this, typeRegistry));
+        registerConverter(new AtlasClassificationFormatConverter(this, typeRegistry));
+        registerConverter(new AtlasEntityFormatConverter(this, typeRegistry));
+        registerConverter(new AtlasArrayFormatConverter(this, typeRegistry));
+        registerConverter(new AtlasMapFormatConverter(this, typeRegistry));
     }
 
-    public static boolean isSetType(Class c) {
-        return Set.class.isAssignableFrom(c);
+    private void registerConverter(AtlasFormatConverter converter) {
+        registry.put(converter.getTypeCategory(), converter);
     }
 
-    public static boolean isPrimitiveType(final Class c) {
-        if (c != null) {
-            if (Number.class.isAssignableFrom(c)) {
-                return true;
-            }
+    public AtlasFormatConverter getConverter(TypeCategory typeCategory) throws AtlasBaseException {
+        AtlasFormatConverter ret = registry.get(typeCategory);
 
-            if (String.class.isAssignableFrom(c)) {
-                return true;
-            }
-
-            if (Date.class.isAssignableFrom(c)) {
-                return true;
-            }
-
-            return c.isPrimitive();
-        }
-        return false;
-    }
-
-    public static boolean isMapType(Object o) {
-        if ( o != null ) {
-            return Map.class.isAssignableFrom(o.getClass());
+        if (ret == null) {
+            throw new AtlasBaseException(AtlasErrorCode.INTERNAL_ERROR,
+                                         "Could not find the converter for this type " + typeCategory);
         }
-        return false;
-    }
 
-    String getKey(String sourceVersion, String targetVersion, TypeCategory typeCategory) {
-        return sourceVersion + "-to-" + targetVersion + "-" + typeCategory.name();
+        return ret;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConvertersModule.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConvertersModule.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConvertersModule.java
deleted file mode 100644
index c3dfb61..0000000
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasFormatConvertersModule.java
+++ /dev/null
@@ -1,48 +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.web.adapters;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.multibindings.Multibinder;
-import org.apache.atlas.web.adapters.v1.ReferenceableToAtlasEntityConverter;
-import org.apache.atlas.web.adapters.v1.StructToAtlasStructConverter;
-import org.apache.atlas.web.adapters.v1.TraitToAtlasClassificationConverter;
-import org.apache.atlas.web.adapters.v2.AtlasClassificationToTraitConverter;
-import org.apache.atlas.web.adapters.v2.AtlasEntityToReferenceableConverter;
-import org.apache.atlas.web.adapters.v2.AtlasStructToStructConverter;
-
-public class AtlasFormatConvertersModule extends AbstractModule {
-
-  protected void configure() {
-      Multibinder<AtlasFormatAdapter> multibinder
-          = Multibinder.newSetBinder(binder(), AtlasFormatAdapter.class);
-      multibinder.addBinding().to(AtlasStructToStructConverter.class).asEagerSingleton();
-      multibinder.addBinding().to(AtlasEntityToReferenceableConverter.class).asEagerSingleton();
-      multibinder.addBinding().to(AtlasClassificationToTraitConverter.class).asEagerSingleton();
-
-      multibinder.addBinding().to(AtlasPrimitiveFormatConverter.class).asEagerSingleton();
-      multibinder.addBinding().to(AtlasEnumFormatConverter.class).asEagerSingleton();
-      multibinder.addBinding().to(AtlasMapFormatConverter.class).asEagerSingleton();
-      multibinder.addBinding().to(AtlasArrayFormatConverter.class).asEagerSingleton();
-
-      multibinder.addBinding().to(ReferenceableToAtlasEntityConverter.class).asEagerSingleton();
-      multibinder.addBinding().to(StructToAtlasStructConverter.class).asEagerSingleton();
-      multibinder.addBinding().to(TraitToAtlasClassificationConverter.class).asEagerSingleton();
-  }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasInstanceRestAdapters.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasInstanceRestAdapters.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasInstanceRestAdapters.java
index dc42f10..5756adb 100644
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasInstanceRestAdapters.java
+++ b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasInstanceRestAdapters.java
@@ -72,10 +72,8 @@ public class AtlasInstanceRestAdapters {
     }
 
     public ITypedReferenceableInstance getITypedReferenceable(AtlasEntity entity) throws AtlasBaseException {
-        AtlasFormatAdapter entityFormatter = instanceFormatters.getConverter(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, TypeCategory.ENTITY);
-        AtlasType entityType = typeRegistry.getType(entity.getTypeName());
+        Referenceable ref = getReferenceable(entity);
 
-        Referenceable ref = (Referenceable) entityFormatter.convert(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, entityType, entity);
         try {
             return metadataService.getTypedReferenceableInstance(ref);
         } catch (AtlasException e) {
@@ -85,19 +83,20 @@ public class AtlasInstanceRestAdapters {
     }
 
     public Referenceable getReferenceable(AtlasEntity entity) throws AtlasBaseException {
-        AtlasFormatAdapter entityFormatter = instanceFormatters.getConverter(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, TypeCategory.ENTITY);
-        AtlasType entityType = typeRegistry.getType(entity.getTypeName());
+        AtlasFormatConverter converter  = instanceFormatters.getConverter(TypeCategory.ENTITY);
+        AtlasType            entityType = typeRegistry.getType(entity.getTypeName());
+        Referenceable        ref        = (Referenceable)converter.fromV2ToV1(entity, entityType);
 
-        return (Referenceable) entityFormatter.convert(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, entityType, entity);
+        return ref;
     }
 
     public ITypedStruct getTrait(AtlasClassification classification) throws AtlasBaseException {
-        AtlasFormatAdapter formatter = instanceFormatters.getConverter(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, TypeCategory.CLASSIFICATION);
-        AtlasType clsType = typeRegistry.getType(classification.getTypeName());
+        AtlasFormatConverter converter          = instanceFormatters.getConverter(TypeCategory.CLASSIFICATION);
+        AtlasType            classificationType = typeRegistry.getType(classification.getTypeName());
+        Struct               trait               = (Struct)converter.fromV2ToV1(classification, classificationType);
 
-        Struct ref = (Struct) formatter.convert(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, clsType, classification);
         try {
-            return metadataService.createTraitInstance(ref);
+            return metadataService.createTraitInstance(trait);
         } catch (AtlasException e) {
             LOG.error("Exception while getting a typed reference for the entity ", e);
             throw toAtlasBaseException(e);
@@ -105,17 +104,19 @@ public class AtlasInstanceRestAdapters {
     }
 
     public AtlasClassification getClassification(IStruct classification) throws AtlasBaseException {
-        AtlasFormatAdapter formatter = instanceFormatters.getConverter(AtlasFormatConverters.VERSION_V1, AtlasFormatConverters.VERSION_V2, TypeCategory.CLASSIFICATION);
-        AtlasType clsType = typeRegistry.getType(classification.getTypeName());
+        AtlasFormatConverter converter          = instanceFormatters.getConverter(TypeCategory.CLASSIFICATION);
+        AtlasType            classificationType = typeRegistry.getType(classification.getTypeName());
+        AtlasClassification  ret                = (AtlasClassification)converter.fromV1ToV2(classification, classificationType);
 
-        return (AtlasClassification) formatter.convert(AtlasFormatConverters.VERSION_V1, AtlasFormatConverters.VERSION_V2, clsType, classification);
+        return ret;
     }
 
     public AtlasEntityWithAssociations getAtlasEntity(IReferenceableInstance referenceable) throws AtlasBaseException {
-        AtlasFormatAdapter entityFormatter = instanceFormatters.getConverter(AtlasFormatConverters.VERSION_V1, AtlasFormatConverters.VERSION_V2, TypeCategory.ENTITY);
-        AtlasType entityType = typeRegistry.getType(referenceable.getTypeName());
+        AtlasFormatConverter converter  = instanceFormatters.getConverter(TypeCategory.ENTITY);
+        AtlasType            entityType = typeRegistry.getType(referenceable.getTypeName());
+        AtlasEntityWithAssociations ret = (AtlasEntityWithAssociations)converter.fromV1ToV2(referenceable, entityType);
 
-        return (AtlasEntityWithAssociations) entityFormatter.convert(AtlasFormatConverters.VERSION_V1, AtlasFormatConverters.VERSION_V2, entityType, referenceable);
+        return ret;
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasMapFormatConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasMapFormatConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasMapFormatConverter.java
index 761c8a7..f390e82 100644
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasMapFormatConverter.java
+++ b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasMapFormatConverter.java
@@ -18,57 +18,83 @@
 package org.apache.atlas.web.adapters;
 
 
+import org.apache.atlas.AtlasErrorCode;
 import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.model.TypeCategory;
 import org.apache.atlas.type.AtlasMapType;
 import org.apache.atlas.type.AtlasType;
 import org.apache.atlas.type.AtlasTypeRegistry;
 
-import javax.inject.Inject;
 import java.util.HashMap;
 import java.util.Map;
 
-public class AtlasMapFormatConverter implements AtlasFormatAdapter {
+public class AtlasMapFormatConverter extends AtlasAbstractFormatConverter {
 
-    protected AtlasFormatConverters registry;
-
-    @Inject
-    public void init(AtlasFormatConverters registry) throws AtlasBaseException {
-        this.registry = registry;
-        registry.registerConverter(this, AtlasFormatConverters.VERSION_V1, AtlasFormatConverters.VERSION_V2);
-        registry.registerConverter(this, AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1);
+    public AtlasMapFormatConverter(AtlasFormatConverters registry, AtlasTypeRegistry typeRegistry) {
+        super(registry, typeRegistry, TypeCategory.MAP);
     }
 
     @Override
-    public Map convert(String sourceVersion, String targetVersion, final AtlasType type, final Object source) throws AtlasBaseException {
-       Map newMap = new HashMap<>();
-
-        if ( source != null) {
-            Map origMap = (Map) source;
-            for (Object key : origMap.keySet()) {
-
-
-                AtlasMapType mapType = (AtlasMapType) type;
-                AtlasType keyType = mapType.getKeyType();
-                AtlasType valueType = mapType.getValueType();
-                AtlasFormatAdapter keyConverter = registry.getConverter(sourceVersion, targetVersion, keyType.getTypeCategory());
-                Object convertedKey = keyConverter.convert(sourceVersion, targetVersion, keyType, key);
-                Object val = origMap.get(key);
-
-                if (val != null) {
-                    AtlasFormatAdapter valueConverter = registry.getConverter(sourceVersion, targetVersion, valueType.getTypeCategory());
-                    newMap.put(convertedKey, valueConverter.convert(sourceVersion, targetVersion, valueType, val));
-                } else {
-                    newMap.put(convertedKey, val);
+    public Map fromV1ToV2(Object v1Obj, AtlasType type) throws AtlasBaseException {
+        Map ret = null;
+
+        if (v1Obj != null) {
+            if (v1Obj instanceof Map) {
+                AtlasMapType         mapType        = (AtlasMapType)type;
+                AtlasType            keyType        = mapType.getKeyType();
+                AtlasType            valueType      = mapType.getValueType();
+                AtlasFormatConverter keyConverter   = converterRegistry.getConverter(keyType.getTypeCategory());
+                AtlasFormatConverter valueConverter = converterRegistry.getConverter(valueType.getTypeCategory());
+                Map                  v1Map          = (Map)v1Obj;
+
+                ret = new HashMap<>();
+
+                for (Object key : v1Map.keySet()) {
+                    Object value = v1Map.get(key);
+
+                    Object v2Key   = keyConverter.fromV1ToV2(key, keyType);
+                    Object v2Value = valueConverter.fromV1ToV2(value, valueType);
+
+                    ret.put(v2Key, v2Value);
                 }
+            } else {
+                throw new AtlasBaseException(AtlasErrorCode.UNEXPECTED_TYPE, "Map", v1Obj.getClass().getCanonicalName());
             }
+
         }
-        return newMap;
+
+        return ret;
     }
 
     @Override
-    public TypeCategory getTypeCategory() {
-        return TypeCategory.MAP;
+    public Map fromV2ToV1(Object v2Obj, AtlasType type) throws AtlasBaseException {
+        Map ret = null;
+
+        if (v2Obj != null) {
+            if (v2Obj instanceof Map) {
+                AtlasMapType         mapType        = (AtlasMapType)type;
+                AtlasType            keyType        = mapType.getKeyType();
+                AtlasType            valueType      = mapType.getValueType();
+                AtlasFormatConverter keyConverter   = converterRegistry.getConverter(keyType.getTypeCategory());
+                AtlasFormatConverter valueConverter = converterRegistry.getConverter(valueType.getTypeCategory());
+                Map                  v1Map          = (Map)v2Obj;
+
+                ret = new HashMap<>();
+
+                for (Object key : v1Map.keySet()) {
+                    Object value = v1Map.get(key);
+
+                    Object v2Key   = keyConverter.fromV2ToV1(key, keyType);
+                    Object v2Value = valueConverter.fromV2ToV1(value, valueType);
+
+                    ret.put(v2Key, v2Value);
+                }
+            } else {
+                throw new AtlasBaseException(AtlasErrorCode.UNEXPECTED_TYPE, "Map", v2Obj.getClass().getCanonicalName());
+            }
+        }
+
+        return ret;
     }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasPrimitiveFormatConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasPrimitiveFormatConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasPrimitiveFormatConverter.java
index 66be58e..382d1ef 100644
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasPrimitiveFormatConverter.java
+++ b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasPrimitiveFormatConverter.java
@@ -23,29 +23,20 @@ import org.apache.atlas.model.TypeCategory;
 import org.apache.atlas.type.AtlasType;
 import org.apache.atlas.type.AtlasTypeRegistry;
 
-import javax.inject.Inject;
-import java.util.HashMap;
-import java.util.Map;
 
-public class AtlasPrimitiveFormatConverter implements AtlasFormatAdapter {
-
-    protected AtlasFormatConverters registry;
-
-    @Inject
-    public void init(AtlasFormatConverters registry) throws AtlasBaseException {
-        this.registry = registry;
-        registry.registerConverter(this, AtlasFormatConverters.VERSION_V1, AtlasFormatConverters.VERSION_V2);
-        registry.registerConverter(this, AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1);
+public class AtlasPrimitiveFormatConverter extends AtlasAbstractFormatConverter {
+    public AtlasPrimitiveFormatConverter(AtlasFormatConverters registry, AtlasTypeRegistry typeRegistry) {
+        super(registry, typeRegistry, TypeCategory.PRIMITIVE);
     }
 
     @Override
-    public Object convert(final String sourceVersion, final String targetVersion, final AtlasType type, final Object source) throws AtlasBaseException {
-       return type.getNormalizedValue(source);
+    public Object fromV1ToV2(Object v1Obj, AtlasType type) throws AtlasBaseException {
+        return type.getNormalizedValue(v1Obj);
     }
 
     @Override
-    public TypeCategory getTypeCategory() {
-        return TypeCategory.PRIMITIVE;
+    public Object fromV2ToV1(Object v2Obj, AtlasType type) throws AtlasBaseException {
+        return type.getNormalizedValue(v2Obj);
     }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasStructFormatConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasStructFormatConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasStructFormatConverter.java
new file mode 100644
index 0000000..b469f95
--- /dev/null
+++ b/webapp/src/main/java/org/apache/atlas/web/adapters/AtlasStructFormatConverter.java
@@ -0,0 +1,176 @@
+/**
+ * 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.web.adapters;
+
+import org.apache.atlas.AtlasErrorCode;
+import org.apache.atlas.AtlasException;
+import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.TypeCategory;
+import org.apache.atlas.model.instance.AtlasStruct;
+import org.apache.atlas.model.typedef.AtlasStructDef;
+import org.apache.atlas.model.typedef.AtlasStructDef.AtlasAttributeDef;
+import org.apache.atlas.type.*;
+import org.apache.atlas.typesystem.IStruct;
+import org.apache.atlas.typesystem.Struct;
+import org.apache.commons.collections.MapUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public class AtlasStructFormatConverter extends AtlasAbstractFormatConverter {
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasStructFormatConverter.class);
+
+    public static final String ATTRIBUTES_PROPERTY_KEY = "attributes";
+
+    public AtlasStructFormatConverter(AtlasFormatConverters registry, AtlasTypeRegistry typeRegistry) {
+        this(registry, typeRegistry, TypeCategory.STRUCT);
+    }
+
+    protected AtlasStructFormatConverter(AtlasFormatConverters registry, AtlasTypeRegistry typeRegistry, TypeCategory typeCategory) {
+        super(registry, typeRegistry, typeCategory);
+    }
+
+    @Override
+    public AtlasStruct fromV1ToV2(Object v1Obj, AtlasType type) throws AtlasBaseException {
+        AtlasStruct ret = null;
+
+        if (v1Obj != null) {
+            AtlasStructType structType = (AtlasStructType)type;
+
+            if (v1Obj instanceof Map) {
+                final Map v1Map     = (Map) v1Obj;
+                final Map v1Attribs = (Map) v1Map.get(ATTRIBUTES_PROPERTY_KEY);
+
+                if (MapUtils.isNotEmpty(v1Attribs)) {
+                    ret = new AtlasStruct(type.getTypeName(), fromV1ToV2(structType, v1Attribs));
+                } else {
+                    ret = new AtlasStruct(type.getTypeName());
+                }
+            } else if (v1Obj instanceof IStruct) {
+                IStruct             struct    = (IStruct) v1Obj;
+                Map<String, Object> v1Attribs = null;
+
+                try {
+                    v1Attribs = struct.getValuesMap();
+                } catch (AtlasException excp) {
+                    LOG.error("IStruct.getValuesMap() failed", excp);
+                }
+
+                ret = new AtlasStruct(type.getTypeName(), fromV1ToV2(structType, v1Attribs));
+            } else {
+                throw new AtlasBaseException(AtlasErrorCode.UNEXPECTED_TYPE, "Map or IStruct", v1Obj.getClass().getCanonicalName());
+            }
+        }
+
+        return ret;
+    }
+
+    @Override
+    public Object fromV2ToV1(Object v2Obj, AtlasType type) throws AtlasBaseException {
+        Struct ret = null;
+
+        if (v2Obj != null) {
+            AtlasStructType structType = (AtlasStructType)type;
+
+            if (v2Obj instanceof Map) {
+                final Map v2Map     = (Map) v2Obj;
+                final Map v2Attribs;
+
+                if (v2Map.containsKey(ATTRIBUTES_PROPERTY_KEY)) {
+                    v2Attribs = (Map) v2Map.get(ATTRIBUTES_PROPERTY_KEY);
+                } else {
+                    v2Attribs = v2Map;
+                }
+
+                if (MapUtils.isNotEmpty(v2Attribs)) {
+                    ret = new Struct(type.getTypeName(), fromV2ToV1(structType, v2Attribs));
+                } else {
+                    ret = new Struct(type.getTypeName());
+                }
+            } else if (v2Obj instanceof AtlasStruct) {
+                AtlasStruct struct = (AtlasStruct) v2Obj;
+
+                ret = new Struct(type.getTypeName(), fromV2ToV1(structType, struct.getAttributes()));
+            } else {
+                throw new AtlasBaseException(AtlasErrorCode.UNEXPECTED_TYPE, "Map or AtlasStruct", v2Obj.getClass().getCanonicalName());
+            }
+        }
+
+        return ret;
+    }
+
+    protected Map<String, Object> fromV2ToV1(AtlasStructType structType, Map attributes) throws AtlasBaseException {
+        Map<String, Object> ret = null;
+
+        if (MapUtils.isNotEmpty(attributes)) {
+            ret = new HashMap<>();
+
+            for (AtlasStructDef.AtlasAttributeDef attrDef : getAttributeDefs(structType)) {
+                AtlasType            attrType      = structType.getAttributeType(attrDef.getName());
+                AtlasFormatConverter attrConverter = converterRegistry.getConverter(attrType.getTypeCategory());
+
+                Object v2Value = attributes.get(attrDef.getName());
+                Object v1Value = attrConverter.fromV2ToV1(v2Value, attrType);
+
+                ret.put(attrDef.getName(), v1Value);
+            }
+        }
+
+        return ret;
+    }
+
+    protected Map<String, Object> fromV1ToV2(AtlasStructType structType, Map attributes) throws AtlasBaseException {
+        Map<String, Object> ret = null;
+
+        if (MapUtils.isNotEmpty(attributes)) {
+            ret = new HashMap<>();
+
+            for (AtlasStructDef.AtlasAttributeDef attrDef : getAttributeDefs(structType)) {
+                AtlasType            attrType      = structType.getAttributeType(attrDef.getName());
+                AtlasFormatConverter attrConverter = converterRegistry.getConverter(attrType.getTypeCategory());
+
+                Object v1Value = attributes.get(attrDef.getName());
+                Object v2Value = attrConverter.fromV1ToV2(v1Value, attrType);
+
+                ret.put(attrDef.getName(), v2Value);
+            }
+        }
+
+        return ret;
+    }
+
+    private Collection<AtlasAttributeDef> getAttributeDefs(AtlasStructType structType) {
+        Collection<AtlasAttributeDef> ret = null;
+
+        if (structType.getTypeCategory() == TypeCategory.STRUCT) {
+            ret = structType.getStructDef().getAttributeDefs();
+        } else if (structType.getTypeCategory() == TypeCategory.CLASSIFICATION) {
+            ret = ((AtlasClassificationType)structType).getAllAttributeDefs().values();
+        } else if (structType.getTypeCategory() == TypeCategory.ENTITY) {
+            ret = ((AtlasEntityType)structType).getAllAttributeDefs().values();
+        } else {
+            ret = Collections.emptyList();
+        }
+
+        return ret;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/v1/ReferenceableToAtlasEntityConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/v1/ReferenceableToAtlasEntityConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/v1/ReferenceableToAtlasEntityConverter.java
deleted file mode 100644
index ba77c67..0000000
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/v1/ReferenceableToAtlasEntityConverter.java
+++ /dev/null
@@ -1,111 +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.web.adapters.v1;
-
-import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.model.TypeCategory;
-import org.apache.atlas.model.instance.AtlasClassification;
-import org.apache.atlas.model.instance.AtlasEntity;
-import org.apache.atlas.model.instance.AtlasEntityWithAssociations;
-import org.apache.atlas.type.AtlasClassificationType;
-import org.apache.atlas.type.AtlasEntityType;
-import org.apache.atlas.type.AtlasType;
-import org.apache.atlas.type.AtlasTypeRegistry;
-import org.apache.atlas.typesystem.IReferenceableInstance;
-import org.apache.atlas.typesystem.IStruct;
-import org.apache.atlas.typesystem.persistence.Id;
-import org.apache.atlas.web.adapters.AtlasFormatAdapter;
-import org.apache.atlas.web.adapters.AtlasFormatConverters;
-
-import javax.inject.Inject;
-import java.util.ArrayList;
-import java.util.List;
-
-public class ReferenceableToAtlasEntityConverter implements AtlasFormatAdapter {
-
-    protected AtlasTypeRegistry typeRegistry;
-    protected AtlasFormatConverters registry;
-
-    @Inject
-    public ReferenceableToAtlasEntityConverter(AtlasTypeRegistry typeRegistry) {
-        this.typeRegistry = typeRegistry;
-    }
-
-    @Inject
-    public void init(AtlasFormatConverters registry) throws AtlasBaseException {
-        this.registry = registry;
-        registry.registerConverter(this, AtlasFormatConverters.VERSION_V1, AtlasFormatConverters.VERSION_V2);
-    }
-
-    @Override
-    public Object convert(final String sourceVersion, final String targetVersion, final AtlasType type, final Object source) throws AtlasBaseException {
-        AtlasEntityWithAssociations result = null;
-        if ( source != null) {
-            if ( isId(source)) {
-                Id idObj = (Id) source;
-                result = new AtlasEntityWithAssociations(idObj.getTypeName());
-                setId(idObj, result);
-            } else if (isEntityType(source) ) {
-
-                IReferenceableInstance entity = (IReferenceableInstance) source;
-
-                //Resolve attributes
-                StructToAtlasStructConverter converter = (StructToAtlasStructConverter) registry.getConverter(sourceVersion, targetVersion, TypeCategory.STRUCT);
-                result =  new AtlasEntityWithAssociations(entity.getTypeName(), converter.convertAttributes((AtlasEntityType) type, entity));
-
-                //Id
-                setId(entity, result);
-
-                //Resolve traits
-                List<AtlasClassification> classifications = new ArrayList<>();
-                for (String traitName : entity.getTraits()) {
-                    IStruct trait = entity.getTrait(traitName);
-                    AtlasClassificationType traitType = (AtlasClassificationType) typeRegistry.getType(traitName);
-                    AtlasClassification clsInstance =  new AtlasClassification(traitType.getTypeName(), converter.convertAttributes(traitType, trait));
-                    classifications.add(clsInstance);
-                }
-                result.setClassifications(classifications);
-            }
-        }
-        return result;
-    }
-
-    private boolean isEntityType(Object o) {
-        if ( o != null && o instanceof IReferenceableInstance) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean isId(Object o) {
-        if ( o != null && o instanceof Id) {
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public TypeCategory getTypeCategory() {
-        return TypeCategory.ENTITY;
-    }
-
-
-    private void setId(IReferenceableInstance entity, AtlasEntity result) {
-        result.setGuid(entity.getId()._getId());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/v1/StructToAtlasStructConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/v1/StructToAtlasStructConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/v1/StructToAtlasStructConverter.java
deleted file mode 100644
index 15c41c8..0000000
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/v1/StructToAtlasStructConverter.java
+++ /dev/null
@@ -1,114 +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.web.adapters.v1;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.apache.atlas.AtlasException;
-import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.model.TypeCategory;
-import org.apache.atlas.model.instance.AtlasStruct;
-import org.apache.atlas.model.typedef.AtlasStructDef;
-import org.apache.atlas.type.AtlasClassificationType;
-import org.apache.atlas.type.AtlasEntityType;
-import org.apache.atlas.type.AtlasStructType;
-import org.apache.atlas.type.AtlasType;
-import org.apache.atlas.type.AtlasTypeRegistry;
-import org.apache.atlas.typesystem.IStruct;
-import org.apache.atlas.web.adapters.AtlasFormatAdapter;
-import org.apache.atlas.web.adapters.AtlasFormatConverters;
-import org.apache.atlas.web.adapters.AtlasInstanceRestAdapters;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-@Singleton
-public class StructToAtlasStructConverter implements AtlasFormatAdapter {
-
-    protected AtlasFormatConverters registry;
-
-    @Inject
-    public void init(AtlasFormatConverters registry) throws AtlasBaseException {
-        this.registry = registry;
-        registry.registerConverter(this, AtlasFormatConverters.VERSION_V1, AtlasFormatConverters.VERSION_V2);
-    }
-
-    @Override
-    public Object convert(final String sourceVersion, final String targetVersion, final AtlasType type, final Object source) throws AtlasBaseException {
-
-        if (source != null) {
-            if (isStructType(source)) {
-                IStruct entity = (IStruct) source;
-                //Resolve attributes
-                StructToAtlasStructConverter converter = (StructToAtlasStructConverter) registry.getConverter(sourceVersion, targetVersion, TypeCategory.STRUCT);
-                return new AtlasStruct(type.getTypeName(), converter.convertAttributes((AtlasStructType) type, entity));
-            }
-
-        }
-        return null;
-    }
-
-    private boolean isStructType(Object o) {
-        if (o != null && o instanceof IStruct) {
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public TypeCategory getTypeCategory() {
-        return TypeCategory.STRUCT;
-    }
-
-    public Map<String, Object> convertAttributes(AtlasStructType structType, Object entity) throws AtlasBaseException {
-        Collection<AtlasStructDef.AtlasAttributeDef> attributeDefs;
-
-        if (structType.getTypeCategory() == TypeCategory.STRUCT) {
-            attributeDefs = structType.getStructDef().getAttributeDefs();
-        } else if (structType.getTypeCategory() == TypeCategory.CLASSIFICATION) {
-            attributeDefs = ((AtlasClassificationType)structType).getAllAttributeDefs().values();
-        } else if (structType.getTypeCategory() == TypeCategory.ENTITY) {
-            attributeDefs = ((AtlasEntityType)structType).getAllAttributeDefs().values();
-        } else {
-            attributeDefs = Collections.emptyList();
-        }
-
-        Map<String, Object> newAttrMap = new HashMap<>();
-        for (AtlasStructDef.AtlasAttributeDef attrDef : attributeDefs) {
-            AtlasType attrType = structType.getAttributeType(attrDef.getName());
-            AtlasFormatAdapter attrConverter = registry.getConverter(AtlasFormatConverters.VERSION_V1, AtlasFormatConverters.VERSION_V2, attrType.getTypeCategory());
-
-            Object attrVal = null;
-            if ( AtlasFormatConverters.isMapType(entity)) {
-                attrVal = ((Map)entity).get(attrDef.getName());
-            } else {
-                try {
-                    attrVal = ((IStruct)entity).get(attrDef.getName());
-                } catch (AtlasException e) {
-                    throw AtlasInstanceRestAdapters.toAtlasBaseException(e);
-                }
-            }
-            final Object convertedVal = attrConverter.convert(AtlasFormatConverters.VERSION_V1, AtlasFormatConverters.VERSION_V2, attrType, attrVal);
-            newAttrMap.put(attrDef.getName(), convertedVal);
-        }
-
-        return newAttrMap;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/v1/TraitToAtlasClassificationConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/v1/TraitToAtlasClassificationConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/v1/TraitToAtlasClassificationConverter.java
deleted file mode 100644
index 6ac9013..0000000
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/v1/TraitToAtlasClassificationConverter.java
+++ /dev/null
@@ -1,64 +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.web.adapters.v1;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.apache.atlas.AtlasException;
-import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.model.TypeCategory;
-import org.apache.atlas.model.instance.AtlasClassification;
-import org.apache.atlas.model.instance.AtlasStruct;
-import org.apache.atlas.model.typedef.AtlasStructDef;
-import org.apache.atlas.type.AtlasClassificationType;
-import org.apache.atlas.type.AtlasEntityType;
-import org.apache.atlas.type.AtlasStructType;
-import org.apache.atlas.type.AtlasType;
-import org.apache.atlas.type.AtlasTypeRegistry;
-import org.apache.atlas.typesystem.IStruct;
-import org.apache.atlas.web.adapters.AtlasFormatAdapter;
-import org.apache.atlas.web.adapters.AtlasFormatConverters;
-import org.apache.atlas.web.adapters.AtlasInstanceRestAdapters;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-@Singleton
-public class TraitToAtlasClassificationConverter extends StructToAtlasStructConverter {
-
-    @Inject
-    public void init(AtlasFormatConverters registry) throws AtlasBaseException {
-        super.init(registry);
-    }
-
-    @Override
-    public Object convert(final String sourceVersion, final String targetVersion, final AtlasType type, final Object source) throws AtlasBaseException {
-        AtlasStruct struct = (AtlasStruct) super.convert(sourceVersion, targetVersion, type, source);
-        if ( struct != null) {
-            return new AtlasClassification(struct.getTypeName(), struct.getAttributes());
-        }
-        return null;
-    }
-
-    @Override
-    public TypeCategory getTypeCategory() {
-        return TypeCategory.CLASSIFICATION;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasClassificationToTraitConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasClassificationToTraitConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasClassificationToTraitConverter.java
deleted file mode 100644
index ece483c..0000000
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasClassificationToTraitConverter.java
+++ /dev/null
@@ -1,53 +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.web.adapters.v2;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.model.TypeCategory;
-import org.apache.atlas.model.instance.AtlasClassification;
-import org.apache.atlas.model.instance.AtlasStruct;
-import org.apache.atlas.model.typedef.AtlasStructDef;
-import org.apache.atlas.type.AtlasClassificationType;
-import org.apache.atlas.type.AtlasEntityType;
-import org.apache.atlas.type.AtlasStructType;
-import org.apache.atlas.type.AtlasType;
-import org.apache.atlas.type.AtlasTypeRegistry;
-import org.apache.atlas.typesystem.Struct;
-import org.apache.atlas.web.adapters.AtlasFormatAdapter;
-import org.apache.atlas.web.adapters.AtlasFormatConverters;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-@Singleton
-public class AtlasClassificationToTraitConverter extends AtlasStructToStructConverter {
-
-    @Inject
-    public void init(AtlasFormatConverters registry) throws AtlasBaseException {
-        super.init(registry);
-    }
-
-    @Override
-    public TypeCategory getTypeCategory() {
-        return TypeCategory.CLASSIFICATION;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasEntityToReferenceableConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasEntityToReferenceableConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasEntityToReferenceableConverter.java
deleted file mode 100644
index fab051f..0000000
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasEntityToReferenceableConverter.java
+++ /dev/null
@@ -1,108 +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.web.adapters.v2;
-
-
-import org.apache.atlas.AtlasErrorCode;
-import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.model.TypeCategory;
-import org.apache.atlas.model.instance.AtlasEntity;
-import org.apache.atlas.model.instance.AtlasObjectId;
-import org.apache.atlas.type.AtlasEntityType;
-import org.apache.atlas.type.AtlasType;
-import org.apache.atlas.typesystem.Referenceable;
-import org.apache.atlas.typesystem.persistence.Id;
-import org.apache.atlas.web.adapters.AtlasFormatAdapter;
-import org.apache.atlas.web.adapters.AtlasFormatConverters;
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang3.StringUtils;
-
-import javax.inject.Inject;
-import java.util.Map;
-
-public class AtlasEntityToReferenceableConverter implements AtlasFormatAdapter {
-
-    protected AtlasFormatConverters registry;
-
-    @Inject
-    public void init(AtlasFormatConverters registry) throws AtlasBaseException {
-        this.registry = registry;
-        registry.registerConverter(this, AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1);
-    }
-
-    @Override
-    public Object convert(final String sourceVersion, final String targetVersion, final AtlasType type, final Object source) throws AtlasBaseException {
-
-        if ( source != null) {
-            //JSOn unmarshalling gives us a Map instead of AtlasObjectId or AtlasEntity
-            if ( AtlasFormatConverters.isMapType(source)) {
-                //Could be an entity or an Id
-                Map srcMap = (Map) source;
-                String idStr = (String)srcMap.get(AtlasObjectId.KEY_GUID);
-                String typeName = type.getTypeName();
-
-                if (StringUtils.isEmpty(idStr)) {
-                    throw new AtlasBaseException(AtlasErrorCode.INSTANCE_GUID_NOT_FOUND);
-                }
-
-                if (MapUtils.isEmpty((Map)srcMap.get(AtlasStructToStructConverter.ATTRIBUTES_PROPERTY_KEY))) {
-                    //Convert to Id
-                    Id id = new Id(idStr, 0, typeName);
-                    return id;
-                } else {
-                    final Map attrMap = (Map) srcMap.get(AtlasStructToStructConverter.ATTRIBUTES_PROPERTY_KEY);
-                    //Resolve attributes
-                    AtlasStructToStructConverter converter = (AtlasStructToStructConverter) registry.getConverter(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, TypeCategory.STRUCT);
-                    return new Referenceable(idStr, typeName, converter.convertAttributes((AtlasEntityType)type, attrMap));
-
-                }
-            } else {
-                if ( isEntityType(source) ) {
-                    AtlasEntity entity = (AtlasEntity) source;
-                    String id = entity.getGuid();
-                    //Resolve attributes
-                    AtlasStructToStructConverter converter = (AtlasStructToStructConverter) registry.getConverter(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, TypeCategory.STRUCT);
-                    return new Referenceable(id, entity.getTypeName(), converter.convertAttributes((AtlasEntityType)type, entity));
-
-                } else if (isTransientId(source)) {
-                    return new Referenceable((String) source, type.getTypeName(), null);
-                }
-            }
-        }
-        return null;
-    }
-
-    private boolean isEntityType(Object o) {
-        if ( o != null && (o instanceof AtlasEntity)) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean isTransientId(Object o) {
-        if ( o != null && (o instanceof String)) {
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public TypeCategory getTypeCategory() {
-        return TypeCategory.ENTITY;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasStructToStructConverter.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasStructToStructConverter.java b/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasStructToStructConverter.java
deleted file mode 100644
index f0b4b12..0000000
--- a/webapp/src/main/java/org/apache/atlas/web/adapters/v2/AtlasStructToStructConverter.java
+++ /dev/null
@@ -1,124 +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.web.adapters.v2;
-
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.model.TypeCategory;
-import org.apache.atlas.model.instance.AtlasStruct;
-import org.apache.atlas.model.typedef.AtlasStructDef;
-import org.apache.atlas.type.AtlasClassificationType;
-import org.apache.atlas.type.AtlasEntityType;
-import org.apache.atlas.type.AtlasStructType;
-import org.apache.atlas.type.AtlasType;
-import org.apache.atlas.typesystem.Struct;
-import org.apache.atlas.web.adapters.AtlasFormatAdapter;
-import org.apache.atlas.web.adapters.AtlasFormatConverters;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-@Singleton
-public class AtlasStructToStructConverter implements AtlasFormatAdapter {
-
-    protected AtlasFormatConverters registry;
-
-    public static final String ATTRIBUTES_PROPERTY_KEY = "attributes";
-
-    @Inject
-    public void init(AtlasFormatConverters registry) throws AtlasBaseException {
-        this.registry = registry;
-        registry.registerConverter(this, AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1);
-    }
-
-    @Override
-    public Object convert(final String sourceVersion, final String targetVersion, final AtlasType type, final Object source) throws AtlasBaseException {
-
-        if (source != null) {
-            //Json unmarshalling gives us a Map instead of AtlasObjectId or AtlasEntity
-            if (AtlasFormatConverters.isMapType(source)) {
-                //Could be an entity or an Id
-                Map srcMap = (Map) source;
-                final Map attrMap = (Map) srcMap.get(ATTRIBUTES_PROPERTY_KEY);
-
-                if ( attrMap != null) {
-                    //Resolve attributes
-                    AtlasStructToStructConverter converter = (AtlasStructToStructConverter) registry.getConverter(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, TypeCategory.STRUCT);
-                    return new Struct(type.getTypeName(), converter.convertAttributes((AtlasStructType)type, attrMap));
-                }
-
-            } else if (isStructType(source)) {
-
-                AtlasStruct entity = (AtlasStruct) source;
-                //Resolve attributes
-                AtlasStructToStructConverter converter = (AtlasStructToStructConverter) registry.getConverter(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, TypeCategory.STRUCT);
-                return new Struct(type.getTypeName(), converter.convertAttributes((AtlasStructType) type, entity));
-            }
-        }
-
-        return null;
-
-    }
-
-    private boolean isStructType(Object o) {
-        if (o != null && o instanceof AtlasStruct) {
-            return true;
-        }
-        return false;
-    }
-
-    @Override
-    public TypeCategory getTypeCategory() {
-        return TypeCategory.STRUCT;
-    }
-
-    public Map<String, Object> convertAttributes(AtlasStructType structType, Object entity) throws AtlasBaseException {
-        Collection<AtlasStructDef.AtlasAttributeDef> attributeDefs;
-
-        if (structType.getTypeCategory() == TypeCategory.STRUCT) {
-            attributeDefs = structType.getStructDef().getAttributeDefs();
-        } else if (structType.getTypeCategory() == TypeCategory.CLASSIFICATION) {
-            attributeDefs = ((AtlasClassificationType)structType).getAllAttributeDefs().values();
-        } else if (structType.getTypeCategory() == TypeCategory.ENTITY) {
-            attributeDefs = ((AtlasEntityType)structType).getAllAttributeDefs().values();
-        } else {
-            attributeDefs = Collections.emptyList();
-        }
-
-        Map<String, Object> newAttrMap = new HashMap<>();
-        for (AtlasStructDef.AtlasAttributeDef attrDef : attributeDefs) {
-            AtlasType attrType = structType.getAttributeType(attrDef.getName());
-
-            AtlasFormatAdapter attrConverter = registry.getConverter(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, attrType.getTypeCategory());
-
-            Object attrVal = null;
-            if ( AtlasFormatConverters.isMapType(entity)) {
-                attrVal = ((Map)entity).get(attrDef.getName());
-            } else {
-                attrVal = ((AtlasStruct)entity).getAttribute(attrDef.getName());
-            }
-            final Object convertedVal = attrConverter.convert(AtlasFormatConverters.VERSION_V2, AtlasFormatConverters.VERSION_V1, attrType, attrVal);
-            newAttrMap.put(attrDef.getName(), convertedVal);
-        }
-
-        return newAttrMap;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/main/java/org/apache/atlas/web/listeners/GuiceServletConfig.java
----------------------------------------------------------------------
diff --git a/webapp/src/main/java/org/apache/atlas/web/listeners/GuiceServletConfig.java b/webapp/src/main/java/org/apache/atlas/web/listeners/GuiceServletConfig.java
index c245596..3bab650 100755
--- a/webapp/src/main/java/org/apache/atlas/web/listeners/GuiceServletConfig.java
+++ b/webapp/src/main/java/org/apache/atlas/web/listeners/GuiceServletConfig.java
@@ -33,7 +33,6 @@ import org.apache.atlas.notification.NotificationModule;
 import org.apache.atlas.repository.graph.AtlasGraphProvider;
 import org.apache.atlas.repository.graphdb.AtlasGraph;
 import org.apache.atlas.service.Services;
-import org.apache.atlas.web.adapters.AtlasFormatConvertersModule;
 import org.apache.atlas.web.filters.ActiveServerFilter;
 import org.apache.atlas.web.filters.AuditFilter;
 import org.apache.atlas.web.service.ActiveInstanceElectorModule;
@@ -74,7 +73,7 @@ public class GuiceServletConfig extends GuiceServletContextListener {
             LoginProcessor loginProcessor = new LoginProcessor();
             loginProcessor.login();
 
-            injector = Guice.createInjector(Stage.PRODUCTION,  getRepositoryModule(), new AtlasFormatConvertersModule(), new ActiveInstanceElectorModule(),
+            injector = Guice.createInjector(Stage.PRODUCTION,  getRepositoryModule(), new ActiveInstanceElectorModule(),
                     new NotificationModule(), new ServiceModule(), new JerseyServletModule() {
 
                         private Configuration appConfiguration = null;

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntitiesREST.java
----------------------------------------------------------------------
diff --git a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntitiesREST.java b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntitiesREST.java
index f8e18bf..265b650 100644
--- a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntitiesREST.java
+++ b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntitiesREST.java
@@ -48,7 +48,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-@Guice(modules = {AtlasFormatConvertersModule.class, RepositoryMetadataModule.class})
+@Guice(modules = {RepositoryMetadataModule.class})
 public class TestEntitiesREST {
 
     private static final Logger LOG = LoggerFactory.getLogger(TestEntitiesREST.class);

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/d4efc378/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
----------------------------------------------------------------------
diff --git a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
index 6dd21d1..2a75773 100644
--- a/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
+++ b/webapp/src/test/java/org/apache/atlas/web/adapters/TestEntityREST.java
@@ -36,14 +36,13 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
-import org.testng.internal.Invoker;
 
 import javax.inject.Inject;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
-@Guice(modules = {AtlasFormatConvertersModule.class, RepositoryMetadataModule.class})
+@Guice(modules = {RepositoryMetadataModule.class})
 public class TestEntityREST {
 
     @Inject