Cache YangModuleInfo type name
[mdsal.git] / binding / mdsal-binding-generator-impl / src / main / java / org / opendaylight / mdsal / binding / generator / impl / AbstractTypeGenerator.java
index f536e84bcdec3393482d0b197be211dc508c1ed0..768e22acf5dc67d6a48916b037755f30c34bb149 100644 (file)
@@ -455,8 +455,7 @@ abstract class AbstractTypeGenerator {
                 final GeneratedTypeBuilder builder = typeProvider.newGeneratedTypeBuilder(JavaTypeName.create(
                     packageNameForGeneratedType(context.modulePackageName(), action.getPath()),
                     BindingMapping.getClassName(qname)));
-                qnameConstant(builder, JavaTypeName.create(context.modulePackageName(),
-                    BindingMapping.MODULE_INFO_CLASS_NAME), qname.getLocalName());
+                qnameConstant(builder, context.moduleInfoType(), qname.getLocalName());
 
                 annotateDeprecatedIfNecessary(action, builder);
                 builder.addImplementsType(keyType != null ? keyedListAction(parent, keyType, input, output)
@@ -543,7 +542,7 @@ abstract class AbstractTypeGenerator {
     private Type createRpcContainer(final ModuleContext context, final String rpcName, final RpcDefinition rpc,
             final ContainerSchemaNode schema, final Type type) {
         processUsesAugments(schema, context, false);
-        final GeneratedTypeBuilder outType = addRawInterfaceDefinition(
+        final GeneratedTypeBuilder outType = addRawInterfaceDefinition(context,
             JavaTypeName.create(context.modulePackageName(), rpcName + BindingMapping.getClassName(schema.getQName())),
             schema);
         addImplementedInterfaceFromUses(schema, outType);
@@ -713,8 +712,7 @@ abstract class AbstractTypeGenerator {
         newType.setModuleName(module.getName());
         newType.setSchemaPath(identity.getPath());
 
-        qnameConstant(newType, JavaTypeName.create(context.modulePackageName(), BindingMapping.MODULE_INFO_CLASS_NAME),
-            identity.getQName().getLocalName());
+        qnameConstant(newType, context.moduleInfoType(), identity.getQName().getLocalName());
 
         context.addIdentityType(identity, newType);
     }
@@ -916,11 +914,37 @@ abstract class AbstractTypeGenerator {
     private DataSchemaNode findOriginalTargetFromGrouping(final SchemaPath targetPath, final UsesNode parentUsesNode) {
         SchemaNode result = findUsedGrouping(parentUsesNode);
         for (final QName node : targetPath.getPathFromRoot()) {
+            // FIXME: this dispatch is rather ugly, we probably want to refactor it a bit
             if (result instanceof DataNodeContainer) {
                 final QName resultNode = node.withModule(result.getQName().getModule());
-                result = ((DataNodeContainer) result).getDataChildByName(resultNode);
+
+                SchemaNode found = ((DataNodeContainer) result).getDataChildByName(resultNode);
+                if (found == null) {
+                    if (result instanceof ActionNodeContainer) {
+                        found = ((ActionNodeContainer) result).findAction(resultNode).orElse(null);
+                    }
+                    if (found == null && result instanceof NotificationNodeContainer) {
+                        found = ((NotificationNodeContainer) result).findNotification(resultNode).orElse(null);
+                    }
+                }
+                result = found;
             } else if (result instanceof ChoiceSchemaNode) {
                 result = findNamedCase((ChoiceSchemaNode) result, node.getLocalName());
+            } else if (result instanceof ActionDefinition) {
+                final ActionDefinition action = (ActionDefinition) result;
+                final QName resultNode = node.withModule(result.getQName().getModule());
+
+                final ContainerSchemaNode input = action.getInput();
+                final ContainerSchemaNode output = action.getOutput();
+                if (resultNode.equals(input.getQName())) {
+                    result = input;
+                } else if (resultNode.equals(output.getQName())) {
+                    result = output;
+                } else {
+                    result = null;
+                }
+            } else if (result != null) {
+                throw new IllegalStateException("Cannot handle " + result);
             }
         }
         if (result == null) {
@@ -1141,7 +1165,7 @@ abstract class AbstractTypeGenerator {
     private void choiceToGeneratedType(final ModuleContext context, final GeneratedTypeBuilder parent,
             final ChoiceSchemaNode choiceNode, final boolean inGrouping) {
         if (!choiceNode.isAddedByUses()) {
-            final GeneratedTypeBuilder choiceTypeBuilder = addRawInterfaceDefinition(
+            final GeneratedTypeBuilder choiceTypeBuilder = addRawInterfaceDefinition(context,
                 JavaTypeName.create(packageNameForGeneratedType(context.modulePackageName(), choiceNode.getPath()),
                 BindingMapping.getClassName(choiceNode.getQName())), choiceNode);
             choiceTypeBuilder.addImplementsType(choiceIn(parent));
@@ -1158,7 +1182,7 @@ abstract class AbstractTypeGenerator {
     private void opaqueToGeneratedType(final ModuleContext context, final GeneratedTypeBuilder parent,
             final DataSchemaNode anyNode) {
         if (!anyNode.isAddedByUses()) {
-            final GeneratedTypeBuilder anyxmlTypeBuilder = addRawInterfaceDefinition(
+            final GeneratedTypeBuilder anyxmlTypeBuilder = addRawInterfaceDefinition(context,
                 JavaTypeName.create(packageNameForGeneratedType(context.modulePackageName(), anyNode.getPath()),
                 BindingMapping.getClassName(anyNode.getQName())), anyNode);
             anyxmlTypeBuilder.addImplementsType(opaqueObject(anyxmlTypeBuilder)).addImplementsType(childOf(parent));
@@ -1670,7 +1694,7 @@ abstract class AbstractTypeGenerator {
             name = JavaTypeName.create(packageName, BindingMapping.getClassName(schemaNode.getQName()));
         }
 
-        final GeneratedTypeBuilder it = addRawInterfaceDefinition(name, schemaNode);
+        final GeneratedTypeBuilder it = addRawInterfaceDefinition(context, name, schemaNode);
         it.addImplementsType(baseInterface);
         if (!(schemaNode instanceof GroupingDefinition)) {
             it.addImplementsType(augmentable(it));
@@ -1701,7 +1725,8 @@ abstract class AbstractTypeGenerator {
      *             <li>if schemaNode name is null</li>
      *             </ul>
      */
-    private GeneratedTypeBuilder addRawInterfaceDefinition(final JavaTypeName identifier, final SchemaNode schemaNode) {
+    private GeneratedTypeBuilder addRawInterfaceDefinition(final ModuleContext context, final JavaTypeName identifier,
+            final SchemaNode schemaNode) {
         checkArgument(schemaNode != null, "Data Schema Node cannot be NULL.");
         checkArgument(schemaNode.getQName() != null, "QName for Data Schema Node cannot be NULL.");
         final String schemaNodeName = schemaNode.getQName().getLocalName();
@@ -1709,10 +1734,9 @@ abstract class AbstractTypeGenerator {
 
         // FIXME: Validation of name conflict
         final GeneratedTypeBuilder newType = typeProvider.newGeneratedTypeBuilder(identifier);
-        final Module module = findParentModule(schemaContext, schemaNode);
-        qnameConstant(newType, JavaTypeName.create(BindingMapping.getRootPackageName(module.getQNameModule()),
-            BindingMapping.MODULE_INFO_CLASS_NAME), schemaNode.getQName().getLocalName());
+        qnameConstant(newType, context.moduleInfoType(), schemaNode.getQName().getLocalName());
 
+        final Module module = context.module();
         addCodegenInformation(newType, module, schemaNode);
         newType.setSchemaPath(schemaNode.getPath());
         newType.setModuleName(module.getName());