Merge "Fixed deserialization of IdentityRefs in Restconf URI."
[controller.git] / opendaylight / netconf / config-netconf-connector / src / main / java / org / opendaylight / controller / netconf / confignetconfconnector / mapping / attributes / AttributeIfcSwitchStatement.java
index 1ef2ae375e723f3fb49e4890c3b0a1f1022e8d44..697b811d51c90c9b7cab4f05f266292d25d2a260 100644 (file)
@@ -12,30 +12,84 @@ import org.opendaylight.controller.config.yangjmxgenerator.attribute.AttributeIf
 import org.opendaylight.controller.config.yangjmxgenerator.attribute.DependencyAttribute;
 import org.opendaylight.controller.config.yangjmxgenerator.attribute.JavaAttribute;
 import org.opendaylight.controller.config.yangjmxgenerator.attribute.ListAttribute;
+import org.opendaylight.controller.config.yangjmxgenerator.attribute.ListDependenciesAttribute;
 import org.opendaylight.controller.config.yangjmxgenerator.attribute.TOAttribute;
+import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
+
+import javax.management.openmbean.ArrayType;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
 
 public abstract class AttributeIfcSwitchStatement<T> {
 
+    protected AttributeIfc lastAttribute;
+
     public T switchAttribute(AttributeIfc attributeIfc) {
 
+        this.lastAttribute = attributeIfc;
+
         if (attributeIfc instanceof JavaAttribute) {
-            return caseJavaAttribute((JavaAttribute) attributeIfc);
+            try {
+                if(((JavaAttribute)attributeIfc).getTypeDefinition() instanceof BinaryTypeDefinition) {
+                    return caseJavaBinaryAttribute(attributeIfc.getOpenType());
+                } else
+                    return caseJavaAttribute(attributeIfc.getOpenType());
+            } catch (UnknownOpenTypeException e) {
+                throw getIllegalArgumentException(attributeIfc);
+            }
+
         } else if (attributeIfc instanceof DependencyAttribute) {
-            return caseDependencyAttribute((DependencyAttribute) attributeIfc);
+            return caseDependencyAttribute(((DependencyAttribute) attributeIfc).getOpenType());
         } else if (attributeIfc instanceof ListAttribute) {
-            return caseListAttribute((ListAttribute) attributeIfc);
+            return caseListAttribute((ArrayType<?>) attributeIfc.getOpenType());
+        } else if (attributeIfc instanceof ListDependenciesAttribute) {
+            return caseListDependeciesAttribute((ArrayType<?>) attributeIfc.getOpenType());
         } else if (attributeIfc instanceof TOAttribute) {
-            return caseTOAttribute((TOAttribute) attributeIfc);
+            return caseTOAttribute(((TOAttribute) attributeIfc).getOpenType());
+        }
+
+        throw getIllegalArgumentException(attributeIfc);
+    }
+
+    protected T caseJavaBinaryAttribute(OpenType<?> openType) {
+        return caseJavaAttribute(openType);
+    }
+
+    private IllegalArgumentException getIllegalArgumentException(AttributeIfc attributeIfc) {
+        return new IllegalArgumentException("Unknown attribute type " + attributeIfc.getClass() + ", " + attributeIfc
+                + " with open type:" + attributeIfc.getOpenType());
+    }
+
+    public final T caseJavaAttribute(OpenType<?> openType) {
+        if (openType instanceof SimpleType<?>) {
+            return caseJavaSimpleAttribute((SimpleType<?>) openType);
+        } else if (openType instanceof ArrayType<?>) {
+            return caseJavaArrayAttribute((ArrayType<?>) openType);
+        } else if (openType instanceof CompositeType) {
+            return caseJavaCompositeAttribute((CompositeType) openType);
         }
 
-        throw new IllegalArgumentException("Unknown attribute type " + attributeIfc.getClass() + ", " + attributeIfc);
+        throw new UnknownOpenTypeException("Unknown attribute open type " + openType);
     }
 
-    protected abstract T caseJavaAttribute(JavaAttribute attributeIfc);
+    protected abstract T caseJavaSimpleAttribute(SimpleType<?> openType);
+
+    protected abstract T caseJavaArrayAttribute(ArrayType<?> openType);
+
+    protected abstract T caseJavaCompositeAttribute(CompositeType openType);
 
-    protected abstract T caseDependencyAttribute(DependencyAttribute attributeIfc);
+    protected abstract T caseDependencyAttribute(SimpleType<?> attributeIfc);
 
-    protected abstract T caseTOAttribute(TOAttribute attributeIfc);
+    protected abstract T caseTOAttribute(CompositeType openType);
 
-    protected abstract T caseListAttribute(ListAttribute attributeIfc);
+    protected abstract T caseListAttribute(ArrayType<?> openType);
+
+    protected abstract T caseListDependeciesAttribute(ArrayType<?> openType);
+
+    private static class UnknownOpenTypeException extends RuntimeException {
+        public UnknownOpenTypeException(String message) {
+            super(message);
+        }
+    }
 }