Binding generator v2 - augments fix #1
[mdsal.git] / binding2 / mdsal-binding2-generator-impl / src / main / java / org / opendaylight / mdsal / binding / javav2 / generator / impl / GenHelperUtil.java
index 1b542527ce5754c9f35aa0d5b243c76a68bbd32e..25e3aa78e8fe5563db22a612073fcbcfe0a152bf 100644 (file)
@@ -285,6 +285,56 @@ final class GenHelperUtil {
         return null;
     }
 
+    static Map<Module, ModuleContext> addRawAugmentGenTypeDefinition(final Module module, final String augmentPackageName,
+            final Type targetTypeRef, final List<AugmentationSchema> schemaPathAugmentListEntry,
+            final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders, final Map<Module, ModuleContext> genCtx,
+            final SchemaContext schemaContext, final boolean verboseClassComments, final TypeProvider typeProvider) {
+
+        //pick augmentation grouped by augmentation target, there is always at least one
+        final AugmentationSchema augSchema = schemaPathAugmentListEntry.get(0);
+
+        final String augmentNamespacePackageName = BindingGeneratorUtil.packageNameForGeneratedType(augmentPackageName,
+                augSchema.getTargetPath(), BindingNamespaceType.Data);
+
+        Map<String, GeneratedTypeBuilder> augmentBuilders = genTypeBuilders.computeIfAbsent(
+                augmentNamespacePackageName, k -> new HashMap<>());
+
+        //this requires valid semantics in YANG model
+        String augIdentifier = null;
+        for (AugmentationSchema aug : schemaPathAugmentListEntry) {
+            augIdentifier = getAugmentIdentifier(aug.getUnknownSchemaNodes());
+            break;
+        }
+
+        if (augIdentifier == null) {
+            augIdentifier = augGenTypeName(augmentBuilders, targetTypeRef.getName());
+        }
+
+        GeneratedTypeBuilder augTypeBuilder = new GeneratedTypeBuilderImpl(augmentNamespacePackageName, augIdentifier);
+
+        augTypeBuilder.addImplementsType(BindingTypes.TREE_NODE);
+        augTypeBuilder.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, augTypeBuilder));
+        augTypeBuilder.addImplementsType(Types.augmentationTypeFor(targetTypeRef));
+        annotateDeprecatedIfNecessary(augSchema.getStatus(), augTypeBuilder);
+
+        //produces getters for augTypeBuilder eventually
+        for (AugmentationSchema aug : schemaPathAugmentListEntry) {
+            //apply all uses
+            addImplementedInterfaceFromUses(aug, augTypeBuilder, genCtx);
+            augSchemaNodeToMethods(module, augmentNamespacePackageName, augTypeBuilder, augTypeBuilder, aug.getChildNodes(),
+               genCtx, schemaContext, verboseClassComments, typeProvider, genTypeBuilders);
+        }
+
+        augmentBuilders.put(augTypeBuilder.getName(), augTypeBuilder);
+
+        if(!augSchema.getChildNodes().isEmpty()) {
+            genCtx.get(module).addTypeToAugmentation(augTypeBuilder, augSchema);
+        }
+        genCtx.get(module).addAugmentType(augTypeBuilder);
+        return genCtx;
+    }
+
+    //TODO: delete this method eventually when uses-augments & augmented choice cases are implemented
     /**
      * Returns a generated type builder for an augmentation.
      *
@@ -306,6 +356,7 @@ final class GenHelperUtil {
      *            and uses of augment
      * @return generated type builder for augment in genCtx
      */
+    @Deprecated
     static Map<Module, ModuleContext> addRawAugmentGenTypeDefinition(final Module module, final String augmentPackageName,
                 final String basePackageName, final Type targetTypeRef, final AugmentationSchema augSchema,
                 final Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders, final Map<Module,