BUG-2453 (De)Serialize enum values as defined in yang
[controller.git] / opendaylight / config / yang-jmx-generator / src / main / java / org / opendaylight / controller / config / yangjmxgenerator / attribute / JavaAttribute.java
index e13c22a2ab77cf02267cac1e9a088a03ad36d090..d830e97678db5d7f4f5b26c8db70daf212472d48 100644 (file)
@@ -21,6 +21,7 @@ import org.opendaylight.yangtools.sal.binding.model.api.Type;
 import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
 
@@ -60,6 +61,11 @@ public class JavaAttribute extends AbstractAttribute implements TypedAttribute {
         return base instanceof UnionTypeDefinition;
     }
 
+    public boolean isEnum() {
+        TypeDefinition<?> base = getBaseType(typeProviderWrapper, typeDefinition);
+        return base instanceof EnumTypeDefinition;
+    }
+
     public TypeDefinition<?> getTypeDefinition() {
         return typeDefinition;
     }
@@ -149,8 +155,8 @@ public class JavaAttribute extends AbstractAttribute implements TypedAttribute {
 
         if (isArray()) {
             return getArrayType();
-        } else if (isEnum(baseType)) {
-            return getSimpleType(baseType);
+        } else if (isEnum()) {
+            return getEnumType(baseTypeDefinition);
         } else if (isUnion()) {
             return getCompositeTypeForUnion(baseTypeDefinition);
         } else if (isDerivedType(baseType, getType())) {
@@ -162,6 +168,18 @@ public class JavaAttribute extends AbstractAttribute implements TypedAttribute {
         return getSimpleType(getType());
     }
 
+    private OpenType<?> getEnumType(final TypeDefinition<?> baseType) {
+        final String fullyQualifiedName = typeProviderWrapper.getType(node, getTypeDefinition()).getFullyQualifiedName();
+        final String[] items = {"instance"};
+        String description = getNullableDescription() == null ? getAttributeYangName() : getNullableDescription();
+
+        try {
+            return new CompositeType(fullyQualifiedName, description, items, items, new OpenType[]{SimpleType.STRING});
+        } catch (OpenDataException e) {
+            throw new RuntimeException("Unable to create enum type" + fullyQualifiedName + " as open type", e);
+        }
+    }
+
     public boolean isIdentityRef() {
         return typeDefinition instanceof IdentityrefTypeDefinition;
     }
@@ -201,7 +219,7 @@ public class JavaAttribute extends AbstractAttribute implements TypedAttribute {
             itemTypes[i++] = innerCompositeType;
         }
 
-        String[] descriptions = Arrays.copyOf(itemNames, itemNames.length);
+        String[] descriptions = itemNames.clone();
         descriptions[0] = DESCRIPTION_OF_VALUE_ATTRIBUTE_FOR_UNION;
 
         try {
@@ -223,10 +241,6 @@ public class JavaAttribute extends AbstractAttribute implements TypedAttribute {
         itemTypes[0] = artificialPropertyType;
     }
 
-    private boolean isEnum(Type baseType) {
-        return baseType.getFullyQualifiedName().equals(Enum.class.getName());
-    }
-
     private OpenType<?> getSimpleType(Type type) {
         SimpleType<?> simpleType = SimpleTypeResolver.getSimpleType(type);
         return simpleType;
@@ -281,8 +295,9 @@ public class JavaAttribute extends AbstractAttribute implements TypedAttribute {
 
     // TODO verify
     private boolean isPrimitive(String innerTypeFullyQName) {
-        if (innerTypeFullyQName.contains("."))
+        if (innerTypeFullyQName.contains(".")) {
             return false;
+        }
 
         return true;
     }