Binding generator implementation & decomposition 02/56802/1
authorMartin Ciglan <mciglan@cisco.com>
Wed, 10 May 2017 10:59:37 +0000 (12:59 +0200)
committerMartin Ciglan <mciglan@cisco.com>
Wed, 10 May 2017 18:15:46 +0000 (18:15 +0000)
- various fixes to make sure binding & code generator
generates compilable Java code for RPCs

Change-Id: I87def49a28ffa5f978e64a3d8c3de1b0adc2049c
Signed-off-by: Martin Ciglan <mciglan@cisco.com>
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImpl.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/GenHelperUtil.java
binding2/mdsal-binding2-generator-impl/src/main/java/org/opendaylight/mdsal/binding/javav2/generator/impl/RpcActionGenHelper.java
binding2/mdsal-binding2-generator-impl/src/test/java/org/opendaylight/mdsal/binding/javav2/generator/impl/BindingGeneratorImplTest.java
binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/renderers/InterfaceRenderer.java
binding2/mdsal-binding2-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/javav2/java/api/generator/util/TextTemplateUtil.java

index fd9e8460f744e225ab3c4ddfaed4889dc6ac6bbc..fc5a2026889b6b8d5e9f27fffa7980a64e36bea8 100644 (file)
@@ -78,7 +78,6 @@ public class BindingGeneratorImpl implements BindingGenerator {
     public List<Type> generateTypes(SchemaContext context) {
         Preconditions.checkArgument(context != null, "Schema Context reference cannot be NULL.");
         Preconditions.checkState(context.getModules() != null, "Schema Context does not contain defined modules.");
-        typeProvider = new TypeProviderImpl(context);
         final Set<Module> modules = context.getModules();
         return generateTypes(context, modules);
     }
index e091d43a69fedeeb1662c57a91a3359c8195c355..e8d7a2e39a641fcb4752b07d974b6d16534733a1 100644 (file)
@@ -677,7 +677,6 @@ final class GenHelperUtil {
         }
 
         constructGetter(typeBuilder, leafName, leafDesc, returnType, leaf.getStatus());
-        genCtx.get(module).addChildNodeType(leaf, typeBuilder);
         return returnType;
     }
 
index cf65e3fabfc48907d5c3e62cc8e37f4b1829775c..5f4e7debb511c0865554d441167b6f75b7b7a25e 100644 (file)
@@ -39,6 +39,7 @@ import java.util.Map;
 import java.util.Set;
 import org.opendaylight.mdsal.binding.javav2.generator.spi.TypeProvider;
 import org.opendaylight.mdsal.binding.javav2.generator.util.BindingGeneratorUtil;
+import org.opendaylight.mdsal.binding.javav2.generator.util.BindingTypes;
 import org.opendaylight.mdsal.binding.javav2.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder;
 import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
@@ -55,7 +56,6 @@ import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
-import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil;
 
 /**
  *
@@ -152,9 +152,22 @@ public final class RpcActionGenHelper {
         }
 
         for (final RpcDefinition rpc : rpcDefinitions) {
-            DataSchemaNode parent = (DataSchemaNode) SchemaContextUtil.findDataSchemaNode(schemaContext, rpc.getPath().getParent());
+            //FIXME: get correct parent for routed RPCs only
+            DataSchemaNode parent = null;
+
+            ContainerSchemaNode input = rpc.getInput();
+            boolean isAction = false;
+            if (input != null) {
+                for (DataSchemaNode schemaNode : input.getChildNodes()) {
+                    if (getRoutingContext(schemaNode).isPresent()) {
+                        isAction = true;
+                        break;
+                    }
+                }
+            }
+
             //routedRPC?
-            if (getRoutingContext(parent).isPresent()) {
+            if (isAction) {
                 genCtx.get(module).addChildNodeType(parent, resolveOperation(parent, rpc, module, schemaContext,
                         verboseClassComments, genTypeBuilders, genCtx, typeProvider, true));
             } else {
@@ -197,16 +210,18 @@ public final class RpcActionGenHelper {
 
         //input
         final ContainerSchemaNode input = operation.getInput();
-        final GeneratedTypeBuilder inType = resolveOperationNode(module, operation.getInput(), basePackageName,
-                schemaContext, operationName, verboseClassComments, typeProvider, genTypeBuilders, genCtx, true);
+        final GeneratedTypeBuilder inType = resolveOperationNode(interfaceBuilder, module, operation.getInput(),
+                basePackageName, schemaContext, operationName, verboseClassComments, typeProvider, genTypeBuilders, genCtx, true);
         annotateDeprecatedIfNecessary(operation.getStatus(), inType);
+        inType.setParentTypeForBuilder(interfaceBuilder);
         genCtx.get(module).addChildNodeType(input, inType);
 
         //output
         final ContainerSchemaNode output = operation.getOutput();
-        final GeneratedTypeBuilder outType = resolveOperationNode(module, operation.getOutput(), basePackageName,
-                schemaContext, operationName, verboseClassComments, typeProvider, genTypeBuilders, genCtx, false);
+        final GeneratedTypeBuilder outType = resolveOperationNode(interfaceBuilder, module, operation.getOutput(),
+                basePackageName, schemaContext, operationName, verboseClassComments, typeProvider, genTypeBuilders, genCtx, false);
         annotateDeprecatedIfNecessary(operation.getStatus(), outType);
+        outType.setParentTypeForBuilder(interfaceBuilder);
         genCtx.get(module).addChildNodeType(output, outType);
 
         final GeneratedType inTypeInstance = inType.toInstance();
@@ -242,6 +257,7 @@ public final class RpcActionGenHelper {
         } else {
             //RPC
             interfaceBuilder.addImplementsType(parameterizedTypeFor(RPC, inType, outType));
+            interfaceBuilder.addImplementsType(TREE_NODE);
         }
 
         operationMethod.addParameter(parameterizedTypeFor(RPC_CALLBACK, outType), "callback");
@@ -252,15 +268,16 @@ public final class RpcActionGenHelper {
         return interfaceBuilder;
     }
 
-    private static GeneratedTypeBuilder resolveOperationNode(final Module module, final ContainerSchemaNode
-            operationNode, final String basePackageName, final SchemaContext schemaContext, final String
+    private static GeneratedTypeBuilder resolveOperationNode(GeneratedTypeBuilder parent, final Module module, final
+            ContainerSchemaNode operationNode, final String basePackageName, final SchemaContext schemaContext, final String
             operationName, final boolean verboseClassComments, TypeProvider typeProvider, Map<String, Map<String,
             GeneratedTypeBuilder>> genTypeBuilders, final Map<Module, ModuleContext> genCtx, final boolean isInput) {
 
         final GeneratedTypeBuilder nodeType = addRawInterfaceDefinition(basePackageName, operationNode, schemaContext,
                 operationName, verboseClassComments, genTypeBuilders);
         addImplementedInterfaceFromUses(operationNode, nodeType, genCtx);
-        nodeType.addImplementsType(TREE_NODE);
+        nodeType.addImplementsType(parameterizedTypeFor(BindingTypes.TREE_CHILD_NODE, parent, parameterizedTypeFor
+                (BindingTypes.ITEM, parent)));
         if (isInput) {
             nodeType.addImplementsType(parameterizedTypeFor(INPUT, nodeType));
         } else {
index d6b2188e1720cc497d61f245d3e197461938e4df..779841026276e0a6c11cc06649df5de05995b8aa 100644 (file)
@@ -57,7 +57,7 @@ public class BindingGeneratorImplTest {
 
         assertNotNull(generateTypes);
         assertTrue(!generateTypes.isEmpty());
-        assertEquals(7, generateTypes.size());
+        assertEquals(3, generateTypes.size());
         final int[] test_i = { 0 };
         for (final Type t : generateTypes) {
             if (t instanceof GeneratedTransferObject) {
@@ -90,7 +90,7 @@ public class BindingGeneratorImplTest {
                 testActualType((GeneratedType) t, test_i);
             }
         }
-        assertEquals(7, test_i[0]);
+        assertEquals(3, test_i[0]);
     }
 
     @Test
index c3e66d97debfcd9a63162e9521c20dabc680d16c..da48a4cb6eccf6250d966e11c240aa788f52322b 100644 (file)
@@ -23,6 +23,9 @@ import org.opendaylight.mdsal.binding.javav2.model.api.MethodSignature;
 import org.opendaylight.mdsal.binding.javav2.model.api.Type;
 
 public class InterfaceRenderer extends BaseRenderer {
+
+    private static final char NEW_LINE = '\n';
+
     /**
      * Creates the instance of this class which is used for generating the interface file source
      * code from <code>type</code>.
@@ -51,7 +54,8 @@ public class InterfaceRenderer extends BaseRenderer {
                 .append(method.getName())
                 .append('(')
                 .append(generateParameters(method.getParameters()))
-                .append(");");
+                .append(");")
+                .append(NEW_LINE);
         }
         final String methodList = sb1.toString();
 
@@ -119,8 +123,11 @@ public class InterfaceRenderer extends BaseRenderer {
                    .append(parameter.getSingleValue());
                 parameterList.add(sb2.toString());
             }
-            sb1.append(String.join(",", parameterList))
-               .append(')');
+            sb1.append(String.join(",", parameterList));
+            if (!annotationType.getParameters().isEmpty()) {
+                sb1.append(')');
+            }
+            sb1.append(NEW_LINE);
         }
         return sb1.toString();
     }
index 2ea7eb27f0e6dc9c284e0ac67d8214f5ad413c79..9008311796bc81b3f89064935686609fac7a467b 100644 (file)
@@ -70,7 +70,8 @@ public final class TextTemplateUtil {
         if (text.isEmpty()) {
             return "";
         }
-        final StringBuilder sb = new StringBuilder("/**");
+        final StringBuilder sb = new StringBuilder(NEW_LINE);
+        sb.append("/**");
         sb.append(NEW_LINE);
         Iterable<String> lineSplitText = NL_SPLITTER.split(text);
         for (final String t : lineSplitText) {
@@ -82,6 +83,7 @@ public final class TextTemplateUtil {
             }
         }
         sb.append(" */");
+        sb.append(NEW_LINE);
         return sb.toString();
     }
 
@@ -172,7 +174,7 @@ public final class TextTemplateUtil {
 
     private static String formatDataForJavaDoc(TypeMember type, String additionalComment) {
         final StringBuilder javaDoc = new StringBuilder();
-        if (type.getComment() != null || !type.getComment().isEmpty()) {
+        if (type.getComment() != null && !type.getComment().isEmpty()) {
             javaDoc.append(formatToParagraph(type.getComment(), 0))
                     .append(NEW_LINE)
                     .append(NEW_LINE)
@@ -364,7 +366,7 @@ public final class TextTemplateUtil {
         } else if (name.startsWith("get")) {
             prefix = 3;
         } else {
-            throw new IllegalArgumentException("Not a getter");
+            prefix = 0;
         }
         return toFirstLower(name.substring(prefix));
     }