Add support for configuration attributes based on yang leaves with custom types ...
[controller.git] / opendaylight / netconf / config-netconf-connector / src / main / java / org / opendaylight / controller / netconf / confignetconfconnector / mapping / attributes / resolving / ObjectResolver.java
index 94a69477582fe379feb1e74552d7eb9a4411d362..c321164cf6b29c02548d9239787de2686d26e521 100644 (file)
@@ -8,29 +8,24 @@
 
 package org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.resolving;
 
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.management.openmbean.ArrayType;
-import javax.management.openmbean.CompositeType;
-import javax.management.openmbean.OpenType;
-import javax.management.openmbean.SimpleType;
-
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Maps;
 import org.opendaylight.controller.config.yangjmxgenerator.attribute.AttributeIfc;
-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.TOAttribute;
 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.AttributeIfcSwitchStatement;
 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Services;
 
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Maps;
+import javax.management.openmbean.ArrayType;
+import javax.management.openmbean.CompositeType;
+import javax.management.openmbean.OpenType;
+import javax.management.openmbean.SimpleType;
+import java.util.Map;
+import java.util.Map.Entry;
 
 public class ObjectResolver extends AttributeIfcSwitchStatement<AttributeResolvingStrategy<?, ? extends OpenType<?>>> {
 
     private final Services serviceTracker;
-    private OpenType<?> openType;
 
     public ObjectResolver(Services serviceTracker) {
         this.serviceTracker = serviceTracker;
@@ -42,16 +37,14 @@ public class ObjectResolver extends AttributeIfcSwitchStatement<AttributeResolvi
 
         for (Entry<String, AttributeIfc> attrEntry : configDefinition.entrySet()) {
             strategies.put(attrEntry.getKey(),
-                    prepareStrategy(attrEntry.getValue(), attrEntry.getValue().getOpenType()));
+                    prepareStrategy(attrEntry.getValue()));
         }
 
         return strategies;
     }
 
-    private AttributeResolvingStrategy<?, ? extends OpenType<?>> prepareStrategy(AttributeIfc attributeIfc,
-            OpenType<?> openType) {
+    private AttributeResolvingStrategy<?, ? extends OpenType<?>> prepareStrategy(AttributeIfc attributeIfc) {
 
-        this.openType = openType;
         return switchAttribute(attributeIfc);
     }
 
@@ -64,45 +57,56 @@ public class ObjectResolver extends AttributeIfcSwitchStatement<AttributeResolvi
     }
 
     @Override
-    protected AttributeResolvingStrategy<?, ? extends OpenType<?>> caseJavaAttribute(JavaAttribute attributeIfc) {
-        if (attributeIfc.getOpenType() instanceof SimpleType<?>)
-            return new SimpleAttributeResolvingStrategy((SimpleType<?>) openType);
-        else if (attributeIfc.getOpenType() instanceof ArrayType<?>) {
-            ArrayType<?> arrayType = (ArrayType<?>) openType;
-            SimpleType<?> innerType = (SimpleType<?>) arrayType.getElementOpenType();
-            AttributeResolvingStrategy<?, ? extends OpenType<?>> strat = new SimpleAttributeResolvingStrategy(innerType);
-            return new ArrayAttributeResolvingStrategy(strat, arrayType);
+    protected AttributeResolvingStrategy<?, ? extends OpenType<?>>  caseJavaSimpleAttribute(SimpleType<?> openType) {
+        return new SimpleAttributeResolvingStrategy(openType);
+    }
+
+    @Override
+    protected AttributeResolvingStrategy<?, ? extends OpenType<?>>  caseJavaArrayAttribute(ArrayType<?> openType) {
+        SimpleType<?> innerType = (SimpleType<?>) openType.getElementOpenType();
+        AttributeResolvingStrategy<?, ? extends OpenType<?>> strat = new SimpleAttributeResolvingStrategy(innerType);
+        return new ArrayAttributeResolvingStrategy(strat, openType);
+    }
+
+    @Override
+    protected AttributeResolvingStrategy<?, ? extends OpenType<?>>  caseJavaCompositeAttribute(CompositeType openType) {
+        Map<String, AttributeResolvingStrategy<?, ? extends OpenType<?>>> innerMap = Maps.newHashMap();
+
+        Map<String, String> yangToJmxMapping = Maps.newHashMap();
+        for (String innerAttributeKey : openType.keySet()) {
+            innerMap.put(innerAttributeKey, caseJavaAttribute(openType.getType(innerAttributeKey)));
+            yangToJmxMapping.put(innerAttributeKey, innerAttributeKey);
         }
-        throw new IllegalStateException(JavaAttribute.class + " can only provide open type " + SimpleType.class
-                + " or " + ArrayType.class);
+        return new CompositeAttributeResolvingStrategy(innerMap, openType, yangToJmxMapping);
     }
 
     @Override
     protected AttributeResolvingStrategy<?, ? extends OpenType<?>> caseDependencyAttribute(
-            DependencyAttribute attributeIfc) {
+            SimpleType<?> openType) {
         return new ObjectNameAttributeResolvingStrategy(serviceTracker);
     }
 
     @Override
-    protected AttributeResolvingStrategy<?, ? extends OpenType<?>> caseTOAttribute(TOAttribute attributeIfc) {
-        CompositeType compositeType = (CompositeType) openType;
+    protected AttributeResolvingStrategy<?, ? extends OpenType<?>> caseTOAttribute(CompositeType openType) {
+        Preconditions.checkState(lastAttribute instanceof TOAttribute);
+        TOAttribute toAttribute = (TOAttribute) lastAttribute;
+
         Map<String, AttributeResolvingStrategy<?, ? extends OpenType<?>>> innerMap = Maps.newHashMap();
-        for (String innerName : compositeType.keySet()) {
-            Preconditions.checkState(attributeIfc instanceof TOAttribute, "Unexpected state, " + attributeIfc
-                    + " should be instance of " + TOAttribute.class.getName());
-            AttributeIfc innerAttributeIfc = attributeIfc.getJmxPropertiesToTypesMap().get(innerName);
+
+        for (String innerName : openType.keySet()) {
+
+            AttributeIfc innerAttributeIfc = toAttribute.getJmxPropertiesToTypesMap().get(innerName);
             innerMap.put(innerAttributeIfc.getAttributeYangName(),
-                    prepareStrategy(innerAttributeIfc, compositeType.getType(innerName)));
+                    prepareStrategy(innerAttributeIfc));
         }
-        return new CompositeAttributeResolvingStrategy(innerMap, compositeType, createYangToJmxMapping(attributeIfc));
+        return new CompositeAttributeResolvingStrategy(innerMap, openType, createYangToJmxMapping(toAttribute));
     }
 
     @Override
-    protected AttributeResolvingStrategy<?, ? extends OpenType<?>> caseListAttribute(ListAttribute attributeIfc) {
-        ArrayType<?> arrayType = (ArrayType<?>) openType;
-        OpenType<?> innerType = arrayType.getElementOpenType();
-        AttributeIfc inner = attributeIfc.getInnerAttribute();
-        return new ArrayAttributeResolvingStrategy(prepareStrategy(inner, innerType), arrayType);
+    protected AttributeResolvingStrategy<?, ? extends OpenType<?>> caseListAttribute(ArrayType<?> openType) {
+        Preconditions.checkState(lastAttribute instanceof ListAttribute);
+        AttributeIfc innerAttribute = ((ListAttribute) lastAttribute).getInnerAttribute();
+        return new ArrayAttributeResolvingStrategy(prepareStrategy(innerAttribute), openType);
     }
 
 }