Binding generator v2 - fix action #1
[mdsal.git] / binding2 / mdsal-binding2-generator-impl / src / main / java / org / opendaylight / mdsal / binding / javav2 / generator / impl / RpcActionGenHelper.java
index 5c969e8ea8f41d5ca2837bb0b4786340efecf755..3a3812b9caf75b088b2235e667e00759078e8b0f 100644 (file)
@@ -16,8 +16,8 @@ import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil
 import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil.addRawInterfaceDefinition;
 import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil.moduleTypeBuilder;
 import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil.processUsesImplements;
+import static org.opendaylight.mdsal.binding.javav2.generator.impl.GenHelperUtil.resolveDataSchemaNodesCheck;
 import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil.encodeAngleBrackets;
-import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil.packageNameForGeneratedType;
 import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes.ACTION;
 import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes.INPUT;
 import static org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes.INSTANCE_IDENTIFIER;
@@ -35,9 +35,11 @@ import static org.opendaylight.mdsal.binding.javav2.generator.util.Types.paramet
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
+import org.opendaylight.mdsal.binding.javav2.generator.context.ModuleContext;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedTransferObject;
@@ -49,7 +51,9 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
 import org.opendaylight.yangtools.yang.model.api.ActionNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
@@ -92,6 +96,38 @@ final class RpcActionGenHelper {
         return Optional.absent();
     }
 
+    private static void resolveActions(final DataNodeContainer parent, final Module module,
+            final SchemaContext schemaContext, final boolean verboseClassComments,
+            Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders, final Map<Module, ModuleContext> genCtx,
+            TypeProvider typeProvider, final BindingNamespaceType namespaceType) {
+        Preconditions.checkNotNull(parent, "Parent should not be NULL.");
+        final Collection<DataSchemaNode> potentials = parent.getChildNodes();
+        for (DataSchemaNode potential : potentials) {
+            if (resolveDataSchemaNodesCheck(module, schemaContext,potential)) {
+                BindingNamespaceType namespaceType1 = namespaceType;
+                if (namespaceType.equals(BindingNamespaceType.Data)) {
+                    if (potential instanceof GroupingDefinition) {
+                        namespaceType1 = BindingNamespaceType.Grouping;
+                    }
+                }
+
+                if (potential instanceof ActionNodeContainer) {
+                    final Set<ActionDefinition> actions = ((ActionNodeContainer) potential).getActions();
+                    for (ActionDefinition action : actions) {
+                        genCtx.get(module).addTopLevelNodeType(resolveOperation(potential, action, module,
+                            schemaContext, verboseClassComments, genTypeBuilders, genCtx, typeProvider, true,
+                            namespaceType1));
+                    }
+                }
+
+                if (potential instanceof DataNodeContainer) {
+                    resolveActions((DataNodeContainer) potential, module, schemaContext, verboseClassComments,
+                        genTypeBuilders, genCtx, typeProvider, namespaceType1);
+                }
+            }
+        }
+    }
+
     /**
      * Converts Yang 1.1 <b>Actions</b> to list of <code>Type</code> objects.
      * @param module  module from which is obtained set of all Action objects to
@@ -101,21 +137,12 @@ final class RpcActionGenHelper {
      * @return generated context
      */
     static Map<Module, ModuleContext> actionMethodsToGenType(final Module module, Map<Module, ModuleContext> genCtx,
-            final SchemaContext schemaContext, final boolean verboseClassComments, Map<String, Map<String,
-            GeneratedTypeBuilder>> genTypeBuilders, TypeProvider typeProvider) {
+            final SchemaContext schemaContext, final boolean verboseClassComments,
+            Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders, TypeProvider typeProvider) {
 
         checkModuleAndModuleName(module);
-        final Collection<DataSchemaNode> potentials = module.getChildNodes();
-        for (DataSchemaNode potential : potentials) {
-            if (potential instanceof ActionNodeContainer) {
-                final Set<ActionDefinition> actions = ((ActionNodeContainer) potential).getActions();
-                for (ActionDefinition action: actions) {
-                    genCtx.get(module).addTopLevelNodeType(resolveOperation(potential, action, module,
-                            schemaContext, verboseClassComments, genTypeBuilders, genCtx, typeProvider, true,
-                            BindingNamespaceType.Data));
-                }
-            }
-        }
+        resolveActions(module, module, schemaContext, verboseClassComments, genTypeBuilders, genCtx, typeProvider,
+            BindingNamespaceType.Data);
         return genCtx;
     }
 
@@ -203,7 +230,7 @@ final class RpcActionGenHelper {
             sb.append("Rpc");
         }
         final GeneratedTypeBuilder interfaceBuilder = moduleTypeBuilder(module, sb.toString(),
-                verboseClassComments);
+                verboseClassComments, genCtx.get(module));
 
         final String basePackageName = interfaceBuilder.getPackageName();
 
@@ -281,7 +308,7 @@ final class RpcActionGenHelper {
             GeneratedTypeBuilder>> genTypeBuilders, final Map<Module, ModuleContext> genCtx, final boolean isInput,
             final BindingNamespaceType namespaceType) {
         final GeneratedTypeBuilder nodeType = addRawInterfaceDefinition(basePackageName, operationNode, schemaContext,
-                operationName, "", verboseClassComments, genTypeBuilders, namespaceType);
+                operationName, "", verboseClassComments, genTypeBuilders, namespaceType, genCtx.get(module));
         addImplementedInterfaceFromUses(operationNode, nodeType, genCtx);
         nodeType.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, parent, parameterizedTypeFor
                 (BindingTypes.ITEM, parent)));