Specialize ModuleInfoBackedContext for no fallback
[mdsal.git] / binding / mdsal-binding-generator-impl / src / main / java / org / opendaylight / mdsal / binding / generator / impl / BindingSchemaContextUtils.java
index 68c2dd18d6c4a3dee5ca2d6be2568e6caf54d3e5..cbc4d3b12d0e2ce92d990b11c4c9f03cc46be38f 100644 (file)
@@ -5,42 +5,42 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.mdsal.binding.generator.impl;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Optional;
 import java.util.Set;
+import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
+import org.opendaylight.mdsal.binding.spec.reflect.BindingReflections;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
-import org.opendaylight.yangtools.yang.binding.BindingMapping;
 import org.opendaylight.yangtools.yang.binding.ChildOf;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
-import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
-import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
 import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
+import org.opendaylight.yangtools.yang.common.QNameModule;
+import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.AugmentationTarget;
-import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
+import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
-import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public final class BindingSchemaContextUtils {
+    private static final Logger LOG = LoggerFactory.getLogger(BindingSchemaContextUtils.class);
 
     private BindingSchemaContextUtils() {
         throw new UnsupportedOperationException("Utility class should not be instantiated");
     }
 
-    // FIXME: THis method does not search in case augmentations.
+    // FIXME: This method does not search in case augmentations.
     public static Optional<DataNodeContainer> findDataNodeContainer(final SchemaContext ctx,
             final InstanceIdentifier<?> path) {
         Iterator<PathArgument> pathArguments = path.getPathArguments().iterator();
@@ -48,12 +48,12 @@ public final class BindingSchemaContextUtils {
         Preconditions.checkArgument(currentArg != null);
         QName currentQName = BindingReflections.findQName(currentArg.getType());
 
-        Optional<DataNodeContainer> currentContainer = Optional.absent();
+        Optional<DataNodeContainer> currentContainer = Optional.empty();
         if (BindingReflections.isNotification(currentArg.getType())) {
             currentContainer = findNotification(ctx, currentQName);
         } else if (BindingReflections.isRpcType(currentArg.getType())) {
             currentContainer = findFirstDataNodeContainerInRpc(ctx, currentArg.getType());
-            if(currentQName == null && currentContainer.isPresent()) {
+            if (currentQName == null && currentContainer.isPresent()) {
                 currentQName = ((DataSchemaNode) currentContainer.get()).getQName();
             }
         } else {
@@ -64,59 +64,61 @@ public final class BindingSchemaContextUtils {
             currentArg = pathArguments.next();
             if (Augmentation.class.isAssignableFrom(currentArg.getType())) {
                 currentQName = BindingReflections.findQName(currentArg.getType());
-                if(pathArguments.hasNext()) {
+                if (pathArguments.hasNext()) {
                     currentArg = pathArguments.next();
                 } else {
                     return currentContainer;
                 }
             }
-            if(ChildOf.class.isAssignableFrom(currentArg.getType()) && BindingReflections.isAugmentationChild(currentArg.getType())) {
+            if (ChildOf.class.isAssignableFrom(currentArg.getType())
+                    && BindingReflections.isAugmentationChild(currentArg.getType())) {
                 currentQName = BindingReflections.findQName(currentArg.getType());
             } else {
-                currentQName = QName.create(currentQName, BindingReflections.findQName(currentArg.getType()).getLocalName());
+                currentQName = BindingReflections.findQName(currentArg.getType()).withModule(currentQName.getModule());
             }
             Optional<DataNodeContainer> potential = findDataNodeContainer(currentContainer.get(), currentQName);
             if (potential.isPresent()) {
                 currentContainer = potential;
             } else {
-                return Optional.absent();
+                return Optional.empty();
             }
         }
         return currentContainer;
     }
 
-    private static Optional<DataNodeContainer> findNotification(final SchemaContext ctx, final QName notificationQName) {
-        for (NotificationDefinition notification : ctx.getNotifications()) {
-            if (notification.getQName().equals(notificationQName)) {
-                return Optional.<DataNodeContainer> of(notification);
-            }
-        }
-        return Optional.absent();
-    }
-
     private static Optional<DataNodeContainer> findDataNodeContainer(final DataNodeContainer ctx,
             final QName targetQName) {
 
         for (DataSchemaNode child : ctx.getChildNodes()) {
             if (child instanceof ChoiceSchemaNode) {
-                DataNodeContainer potential = findInCases(((ChoiceSchemaNode) child), targetQName);
+                DataNodeContainer potential = findInCases((ChoiceSchemaNode) child, targetQName);
                 if (potential != null) {
                     return Optional.of(potential);
                 }
-            } else if (child instanceof DataNodeContainer && child.getQName().equals(targetQName)) {
-                return Optional.of((DataNodeContainer) child);
-            } else if (child instanceof DataNodeContainer //
-                    && child.isAddedByUses() //
-                    && child.getQName().getLocalName().equals(targetQName.getLocalName())) {
-                return Optional.of((DataNodeContainer) child);
+            } else if (child instanceof DataNodeContainer) {
+                final QName qname = child.getQName();
+                if (qname.equals(targetQName)
+                        || child.isAddedByUses() && qname.getLocalName().equals(targetQName.getLocalName())) {
+                    return Optional.of((DataNodeContainer) child);
+                }
             }
 
         }
-        return Optional.absent();
+        return Optional.empty();
+    }
+
+    private static Optional<DataNodeContainer> findNotification(final SchemaContext ctx,
+            final QName notificationQName) {
+        for (NotificationDefinition notification : ctx.getNotifications()) {
+            if (notification.getQName().equals(notificationQName)) {
+                return Optional.of(notification);
+            }
+        }
+        return Optional.empty();
     }
 
     private static DataNodeContainer findInCases(final ChoiceSchemaNode choiceNode, final QName targetQName) {
-        for (ChoiceCaseNode caze : choiceNode.getCases()) {
+        for (CaseSchemaNode caze : choiceNode.getCases().values()) {
             Optional<DataNodeContainer> potential = findDataNodeContainer(caze, targetQName);
             if (potential.isPresent()) {
                 return potential.get();
@@ -125,91 +127,64 @@ public final class BindingSchemaContextUtils {
         return null;
     }
 
+    @SuppressWarnings("checkstyle:illegalCatch")
     private static Optional<DataNodeContainer> findFirstDataNodeContainerInRpc(final SchemaContext ctx,
             final Class<? extends DataObject> targetType) {
-        final YangModuleInfo moduleInfo;
+        final QNameModule targetModule;
         try {
-            moduleInfo = BindingReflections.getModuleInfo(targetType);
+            targetModule = BindingReflections.getModuleInfo(targetType).getName().getModule();
         } catch (Exception e) {
             throw new IllegalArgumentException(
                     String.format("Failed to load module information for class %s", targetType), e);
         }
 
-        for(RpcDefinition rpc : ctx.getOperations()) {
-            String rpcNamespace = rpc.getQName().getNamespace().toString();
-            String rpcRevision = rpc.getQName().getFormattedRevision();
-            if(moduleInfo.getNamespace().equals(rpcNamespace) && moduleInfo.getRevision().equals(rpcRevision)) {
-                Optional<DataNodeContainer> potential = findInputOutput(rpc,targetType.getSimpleName());
-                if(potential.isPresent()) {
+        for (RpcDefinition rpc : ctx.getOperations()) {
+            if (targetModule.equals(rpc.getQName().getModule())) {
+                final Optional<DataNodeContainer> potential = findInputOutput(rpc,targetType.getSimpleName());
+                if (potential.isPresent()) {
                     return potential;
                 }
             }
         }
-        return Optional.absent();
+        return Optional.empty();
     }
 
     private static Optional<DataNodeContainer> findInputOutput(final RpcDefinition rpc, final String targetType) {
-        String rpcName = BindingMapping.getClassName(rpc.getQName());
-        String rpcInputName = rpcName + BindingMapping.RPC_INPUT_SUFFIX;
-        String rpcOutputName = rpcName + BindingMapping.RPC_OUTPUT_SUFFIX;
-        if(targetType.equals(rpcInputName)) {
-            return Optional.<DataNodeContainer>of(rpc.getInput());
-        } else if (targetType.equals(rpcOutputName)) {
-            return Optional.<DataNodeContainer>of(rpc.getOutput());
+        final String rpcName = BindingMapping.getClassName(rpc.getQName());
+        final String rpcInputName = rpcName + BindingMapping.RPC_INPUT_SUFFIX;
+        if (targetType.equals(rpcInputName)) {
+            return Optional.of(rpc.getInput());
+        }
+        final String rpcOutputName = rpcName + BindingMapping.RPC_OUTPUT_SUFFIX;
+        if (targetType.equals(rpcOutputName)) {
+            return Optional.of(rpc.getOutput());
         }
-       return Optional.absent();
+        return Optional.empty();
     }
 
-    public static Set<AugmentationSchema> collectAllAugmentationDefinitions(final SchemaContext currentSchema, final AugmentationTarget ctxNode) {
-        HashSet<AugmentationSchema> augmentations = new HashSet<>();
+    public static Set<AugmentationSchemaNode> collectAllAugmentationDefinitions(final SchemaContext currentSchema,
+            final AugmentationTarget ctxNode) {
+        HashSet<AugmentationSchemaNode> augmentations = new HashSet<>();
         augmentations.addAll(ctxNode.getAvailableAugmentations());
-        if(ctxNode instanceof DataSchemaNode && ((DataSchemaNode) ctxNode).isAddedByUses()) {
-
-            System.out.println(ctxNode);
-
+        if (ctxNode instanceof DataSchemaNode && ((DataSchemaNode) ctxNode).isAddedByUses()) {
+            LOG.info("DataSchemaNode target added by uses {}", ctxNode);
         }
 
         return augmentations;
     }
 
-    public static Optional<ChoiceSchemaNode> findInstantiatedChoice(final DataNodeContainer parent, final Class<?> choiceClass) {
+    public static Optional<ChoiceSchemaNode> findInstantiatedChoice(final DataNodeContainer parent,
+            final Class<?> choiceClass) {
         return findInstantiatedChoice(parent, BindingReflections.findQName(choiceClass));
     }
 
-    public static Optional<ChoiceSchemaNode> findInstantiatedChoice(final DataNodeContainer ctxNode, final QName choiceName) {
+    public static Optional<ChoiceSchemaNode> findInstantiatedChoice(final DataNodeContainer ctxNode,
+            final QName choiceName) {
         DataSchemaNode potential = ctxNode.getDataChildByName(choiceName);
         if (potential instanceof ChoiceSchemaNode) {
             return Optional.of((ChoiceSchemaNode) potential);
         }
 
-        return Optional.absent();
-    }
-
-    public static Optional<ChoiceCaseNode> findInstantiatedCase(final ChoiceSchemaNode instantiatedChoice, final ChoiceCaseNode originalDefinition) {
-        ChoiceCaseNode potential = instantiatedChoice.getCaseNodeByName(originalDefinition.getQName());
-        if(originalDefinition.equals(potential)) {
-            return Optional.of(potential);
-        }
-        if (potential != null) {
-            SchemaNode potentialRoot = SchemaNodeUtils.getRootOriginalIfPossible(potential);
-            if (originalDefinition.equals(potentialRoot)) {
-                return Optional.of(potential);
-            }
-        }
-        // We try to find case by name, then lookup its root definition
-        // and compare it with original definition
-        // This solves case, if choice was inside grouping
-        // which was used in different module and thus namespaces are
-        // different, but local names are still same.
-        //
-        // Still we need to check equality of definition, because local name is not
-        // sufficient to uniquelly determine equality of cases
-        //
-        potential = instantiatedChoice.getCaseNodeByName(originalDefinition.getQName().getLocalName());
-        if(potential != null && (originalDefinition.equals(SchemaNodeUtils.getRootOriginalIfPossible(potential)))) {
-            return Optional.of(potential);
-        }
-        return Optional.absent();
+        return Optional.empty();
     }
-
 }