Repository: incubator-atlas Updated Branches: refs/heads/master 485573fca -> 2904f4c42
ATLAS-1571: fix for incorrect v1->v2 conversion of enum-type value Project: http://git-wip-us.apache.org/repos/asf/incubator-atlas/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-atlas/commit/2904f4c4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-atlas/tree/2904f4c4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-atlas/diff/2904f4c4 Branch: refs/heads/master Commit: 2904f4c425d414293e6910bba7f1bac0bca4ab55 Parents: 485573f Author: Madhan Neethiraj <[email protected]> Authored: Tue Feb 21 15:49:46 2017 -0800 Committer: Madhan Neethiraj <[email protected]> Committed: Tue Feb 21 16:20:29 2017 -0800 ---------------------------------------------------------------------- .../org/apache/atlas/type/AtlasEnumType.java | 20 ++++++ .../converters/AtlasEnumFormatConverter.java | 64 +++++++++++++++++++- 2 files changed, 82 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2904f4c4/intg/src/main/java/org/apache/atlas/type/AtlasEnumType.java ---------------------------------------------------------------------- diff --git a/intg/src/main/java/org/apache/atlas/type/AtlasEnumType.java b/intg/src/main/java/org/apache/atlas/type/AtlasEnumType.java index db169d0..1cd27b3 100644 --- a/intg/src/main/java/org/apache/atlas/type/AtlasEnumType.java +++ b/intg/src/main/java/org/apache/atlas/type/AtlasEnumType.java @@ -91,4 +91,24 @@ public class AtlasEnumType extends AtlasType { return null; } + + public AtlasEnumElementDef getEnumElementDef(String value) { + if (value != null) { + return elementDefs.get(value.toLowerCase()); + } + + return null; + } + + public AtlasEnumElementDef getEnumElementDef(Number ordinal) { + if (ordinal != null) { + for (AtlasEnumElementDef elementDef : elementDefs.values()) { + if (elementDef.getOrdinal().longValue() == ordinal.longValue()) { + return elementDef; + } + } + } + + return null; + } } http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/2904f4c4/repository/src/main/java/org/apache/atlas/repository/converters/AtlasEnumFormatConverter.java ---------------------------------------------------------------------- diff --git a/repository/src/main/java/org/apache/atlas/repository/converters/AtlasEnumFormatConverter.java b/repository/src/main/java/org/apache/atlas/repository/converters/AtlasEnumFormatConverter.java index 2bf15f2..d71d543 100644 --- a/repository/src/main/java/org/apache/atlas/repository/converters/AtlasEnumFormatConverter.java +++ b/repository/src/main/java/org/apache/atlas/repository/converters/AtlasEnumFormatConverter.java @@ -20,8 +20,13 @@ package org.apache.atlas.repository.converters; import org.apache.atlas.exception.AtlasBaseException; import org.apache.atlas.model.TypeCategory; +import org.apache.atlas.model.typedef.AtlasEnumDef.AtlasEnumElementDef; +import org.apache.atlas.type.AtlasEnumType; import org.apache.atlas.type.AtlasType; import org.apache.atlas.type.AtlasTypeRegistry; +import org.apache.atlas.typesystem.types.EnumValue; + +import java.util.Map; public class AtlasEnumFormatConverter extends AtlasAbstractFormatConverter { @@ -31,12 +36,67 @@ public class AtlasEnumFormatConverter extends AtlasAbstractFormatConverter { @Override public Object fromV1ToV2(Object v1Obj, AtlasType type, ConverterContext ctx) throws AtlasBaseException { - return type.getNormalizedValue(v1Obj); + String ret = null; + + if (v1Obj == null || !(type instanceof AtlasEnumType)) { + return ret; + } + + Object v1Value = null; + + if (v1Obj instanceof EnumValue) { + EnumValue enumValue = (EnumValue)v1Obj; + + v1Value = enumValue.value; + + if (v1Value == null) { + v1Value = enumValue.ordinal; + } + } else if (v1Obj instanceof Map) { + Map mapValue = (Map)v1Obj; + + v1Value = mapValue.get("value"); + + if (v1Value == null) { + v1Value = mapValue.get("ordinal"); + } + } + + if (v1Value == null) { // could be 'value' or 'ordinal' + v1Value = v1Obj; + } + + AtlasEnumElementDef elementDef; + + if (v1Value instanceof Number) { + elementDef = ((AtlasEnumType)type).getEnumElementDef((Number) v1Value); + } else { + elementDef = ((AtlasEnumType)type).getEnumElementDef(v1Value.toString()); + } + + if (elementDef != null) { + ret = elementDef.getValue(); + } + + return ret; } @Override public Object fromV2ToV1(Object v2Obj, AtlasType type, ConverterContext ctx) throws AtlasBaseException { - return type.getNormalizedValue(v2Obj); + EnumValue ret = null; + + if (v2Obj == null || !(type instanceof AtlasEnumType)) { + return ret; + } + + AtlasEnumType enumType = (AtlasEnumType) type; + AtlasEnumElementDef elementDef = enumType.getEnumElementDef(v2Obj.toString()); + + if (elementDef != null) { + ret = new EnumValue(elementDef.getValue(), elementDef.getOrdinal()); + } + + return ret; } }
