for (Entry<SchemaPath, List<AugmentationSchema>> schemaPathAugmentListEntry : augmentationsGrouped.entrySet()) {
resultCtx = augmentationToGenTypes(basePackageName, schemaPathAugmentListEntry, module, schemaContext,
verboseClassComments, resultCtx, genTypeBuilders, typeProvider);
+
+ for (AugmentationSchema augSchema : schemaPathAugmentListEntry.getValue()) {
+ GenHelperUtil.processUsesAugments(schemaContext, augSchema, module, genCtx,
+ genTypeBuilders, verboseClassComments, typeProvider);
+ }
+
}
return resultCtx;
* if augment target path is null
* @return generated context
*/
- private static Map<Module, ModuleContext> augmentationToGenTypes(final String augmentPackageName,
+ private static Map<Module, ModuleContext> augmentationToGenTypes(final String basePackageName,
final Entry<SchemaPath, List<AugmentationSchema>> schemaPathAugmentListEntry, final Module module,
final SchemaContext schemaContext, final boolean verboseClassComments,
Map<Module, ModuleContext> genCtx, Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders,
final TypeProvider typeProvider) {
final SchemaPath targetPath = schemaPathAugmentListEntry.getKey();
- Preconditions.checkArgument(augmentPackageName != null, "Package Name cannot be NULL.");
+ Preconditions.checkArgument(basePackageName != null, "Package Name cannot be NULL.");
Preconditions.checkState(targetPath != null,
"Augmentation Schema does not contain Target Path (Target Path is NULL).");
- //TODO: implement uses-augment scenario
-
SchemaNode targetSchemaNode;
targetSchemaNode = SchemaContextUtil.findDataSchemaNode(schemaContext, targetPath);
throw new IllegalArgumentException("augment target not found: " + targetPath);
}
- //TODO: loose this assignment afterwards
+ //TODO: loose this assignment afterwards #2 done
Map<Module, ModuleContext> generatedCtx = genCtx;
GeneratedTypeBuilder targetTypeBuilder = GenHelperUtil.findChildNodeByPath(targetSchemaNode.getPath(),
throw new NullPointerException("Target type not yet generated: " + targetSchemaNode);
}
+ final String augmentNamespacePackageName =
+ BindingGeneratorUtil.packageNameForAugmentedGeneratedType(basePackageName, targetPath);
+
if (!(targetSchemaNode instanceof ChoiceSchemaNode)) {
- generatedCtx = GenHelperUtil.addRawAugmentGenTypeDefinition(module, augmentPackageName,
+ generatedCtx = GenHelperUtil.addRawAugmentGenTypeDefinition(module, augmentNamespacePackageName,
targetTypeBuilder.toInstance(), schemaPathAugmentListEntry.getValue(), genTypeBuilders, generatedCtx,
schemaContext, verboseClassComments, typeProvider);
} else {
- //TODO: implement augmented choice cases scenario
+ //TODO: #3 implement augmented choice cases scenario
}
return generatedCtx;
}
static Map<Module, ModuleContext> usesAugmentationToGenTypes(final SchemaContext schemaContext,
- final String augmentPackageName, final AugmentationSchema augSchema, final Module module,
+ final String augmentPackageName, final List<AugmentationSchema> schemaPathAugmentListEntry, final Module module,
final UsesNode usesNode, final DataNodeContainer usesNodeParent, Map<Module, ModuleContext> genCtx,
Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders, final boolean verboseClassComments,
final TypeProvider typeProvider) {
+ Preconditions.checkArgument(augmentPackageName != null, "Package Name cannot be NULL.");
+
+ final SchemaPath targetPath = schemaPathAugmentListEntry.get(0).getTargetPath();
+ final SchemaNode targetSchemaNode = findOriginalTargetFromGrouping(schemaContext, targetPath, usesNode);
+ if (targetSchemaNode == null) {
+ throw new IllegalArgumentException("augment target not found: " + targetPath);
+ }
+
+ GeneratedTypeBuilder targetTypeBuilder = GenHelperUtil.findChildNodeByPath(targetSchemaNode.getPath(),
+ genCtx);
+ if (targetTypeBuilder == null) {
+ targetTypeBuilder = GenHelperUtil.findCaseByPath(targetSchemaNode.getPath(), genCtx);
+ }
+ if (targetTypeBuilder == null) {
+ throw new NullPointerException("Target type not yet generated: " + targetSchemaNode);
+ }
+
+ if (!(targetSchemaNode instanceof ChoiceSchemaNode)) {
+ String packageName = augmentPackageName;
+ if (usesNodeParent instanceof SchemaNode) {
+ packageName = BindingGeneratorUtil.packageNameForAugmentedGeneratedType(augmentPackageName,
+ ((SchemaNode) usesNodeParent).getPath());
+ } else if (usesNodeParent instanceof AugmentationSchema) {
+ Type parentTypeBuilder = genCtx.get(module).getTargetToAugmentation()
+ .get(((AugmentationSchema) usesNodeParent).getTargetPath());
+ packageName = parentTypeBuilder.getFullyQualifiedName();
+ }
+ genCtx = GenHelperUtil.addRawAugmentGenTypeDefinition(module, packageName,
+ targetTypeBuilder.toInstance(), schemaPathAugmentListEntry, genTypeBuilders, genCtx,
+ schemaContext, verboseClassComments, typeProvider);
+ return genCtx;
+ } else {
+ genCtx = generateTypesFromAugmentedChoiceCases(schemaContext, module, augmentPackageName,
+ targetTypeBuilder.toInstance(), (ChoiceSchemaNode) targetSchemaNode,
+ schemaPathAugmentListEntry.get(0).getChildNodes(),
+ usesNodeParent, genCtx, verboseClassComments, genTypeBuilders, typeProvider);
+ return genCtx;
+ }
+ }
+
+ //TODO: delete this method eventually when uses-augments & augmented choice cases are implemented
+ @Deprecated
+ public static Map<Module, ModuleContext> usesAugmentationToGenTypes(final SchemaContext schemaContext, final String
+ augmentPackageName, final AugmentationSchema augSchema, final Module module, final UsesNode usesNode, final DataNodeContainer
+ usesNodeParent, Map<Module, ModuleContext> genCtx,
+ Map<String, Map<String, GeneratedTypeBuilder>> genTypeBuilders,
+ final boolean verboseClassComments, final TypeProvider typeProvider) {
+
Preconditions.checkArgument(augmentPackageName != null, "Package Name cannot be NULL.");
Preconditions.checkArgument(augSchema != null, "Augmentation Schema cannot be NULL.");
Preconditions.checkState(augSchema.getTargetPath() != null,
packageName = BindingGeneratorUtil.packageNameForAugmentedGeneratedType(augmentPackageName,
((SchemaNode) usesNodeParent).getPath());
} else if (usesNodeParent instanceof AugmentationSchema) {
- Type parentTypeBuiler = genCtx.get(module).getTypeToAugmentation().inverse().get(usesNodeParent);
+ Type parentTypeBuilder = genCtx.get(module).getTypeToAugmentation().inverse().get(usesNodeParent);
packageName = BindingGeneratorUtil.packageNameForAugmentedGeneratedType(
- parentTypeBuiler.getPackageName(), (AugmentationSchema)usesNodeParent);
+ parentTypeBuilder.getPackageName(), (AugmentationSchema)usesNodeParent);
}
genCtx = GenHelperUtil.addRawAugmentGenTypeDefinition(module, packageName, augmentPackageName,
targetTypeBuilder.toInstance(), augSchema, genTypeBuilders, genCtx, schemaContext,
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.stream.Collectors;
+
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;
final boolean verboseClassComments, final TypeProvider typeProvider) {
final String basePackageName = BindingMapping.getRootPackageName(module);
for (final UsesNode usesNode : node.getUses()) {
- for (final AugmentationSchema augment : usesNode.getAugmentations()) {
- genCtx = AugmentToGenType.usesAugmentationToGenTypes(schemaContext, basePackageName, augment, module,
+ Map<SchemaPath, List<AugmentationSchema>> augmentationsGrouped =
+ usesNode.getAugmentations().stream().collect(Collectors.groupingBy(AugmentationSchema::getTargetPath));
+ for (Map.Entry<SchemaPath, List<AugmentationSchema>> schemaPathAugmentListEntry : augmentationsGrouped.entrySet()) {
+ genCtx = AugmentToGenType.usesAugmentationToGenTypes(schemaContext, basePackageName,
+ schemaPathAugmentListEntry.getValue(), module,
usesNode, node, genCtx, genTypeBuilders, verboseClassComments, typeProvider);
- genCtx = processUsesAugments(schemaContext, augment, module, genCtx, genTypeBuilders,
- verboseClassComments, typeProvider);
+ for (AugmentationSchema augSchema : schemaPathAugmentListEntry.getValue()) {
+ genCtx = processUsesAugments(schemaContext, augSchema, module, genCtx, genTypeBuilders,
+ verboseClassComments, typeProvider);
+ }
}
}
return genCtx;
//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<>());
+ augmentPackageName, k -> new HashMap<>());
//this requires valid semantics in YANG model
String augIdentifier = null;
augIdentifier = augGenTypeName(augmentBuilders, targetTypeRef.getName());
}
- GeneratedTypeBuilder augTypeBuilder = new GeneratedTypeBuilderImpl(augmentNamespacePackageName, augIdentifier);
+ GeneratedTypeBuilder augTypeBuilder = new GeneratedTypeBuilderImpl(augmentPackageName, augIdentifier,
+ false, true);
augTypeBuilder.addImplementsType(BindingTypes.TREE_NODE);
augTypeBuilder.addImplementsType(parameterizedTypeFor(BindingTypes.INSTANTIABLE, augTypeBuilder));
for (AugmentationSchema aug : schemaPathAugmentListEntry) {
//apply all uses
addImplementedInterfaceFromUses(aug, augTypeBuilder, genCtx);
- augSchemaNodeToMethods(module, augmentNamespacePackageName, augTypeBuilder, augTypeBuilder, aug.getChildNodes(),
+ augSchemaNodeToMethods(module, augmentPackageName, augTypeBuilder, augTypeBuilder, aug.getChildNodes(),
genCtx, schemaContext, verboseClassComments, typeProvider, genTypeBuilders);
}
if(!augSchema.getChildNodes().isEmpty()) {
genCtx.get(module).addTypeToAugmentation(augTypeBuilder, augSchema);
+ genCtx.get(module).addTargetToAugmentation(augTypeBuilder, augSchema.getTargetPath());
}
genCtx.get(module).addAugmentType(augTypeBuilder);
return genCtx;
private final Set<GeneratedTypeBuilder> topLevelNodes = new HashSet<>();
private final List<GeneratedTypeBuilder> augmentations = new ArrayList<>();
private final BiMap<Type,AugmentationSchema> typeToAugmentation = HashBiMap.create();
+ private final BiMap<SchemaPath,Type> targetToAugmentation = HashBiMap.create();
private final Map<Type,Object> typeToSchema = new HashMap<>();
private final Multimap<Type, Type> choiceToCases = HashMultimap.create();
private final BiMap<Type,ChoiceCaseNode> caseTypeToSchema = HashBiMap.create();
private final Map<SchemaPath, Type> innerTypes = new HashMap<>();
+
List<Type> getGeneratedTypes() {
final List<Type> result = new ArrayList<>();
return Maps.unmodifiableBiMap(this.typeToAugmentation);
}
+ public BiMap<SchemaPath, Type> getTargetToAugmentation() {
+ return Maps.unmodifiableBiMap(this.targetToAugmentation);
+ }
+
public void addTypeToAugmentation(final GeneratedTypeBuilder builder, final AugmentationSchema schema) {
this.typeToAugmentation.put(builder, schema);
this.typeToSchema.put(builder, schema);
}
+ public void addTargetToAugmentation(final GeneratedTypeBuilder builder, final SchemaPath augmentTarget) {
+ this.targetToAugmentation.put(augmentTarget, builder);
+ }
+
public void addChoiceToCaseMapping(final Type choiceType, final Type caseType, final ChoiceCaseNode schema) {
this.choiceToCases.put(choiceType, caseType);
this.caseTypeToSchema.put(caseType, schema);
@Test
public void usesAugmentationToGenTypesNullPckgNameTest() throws Exception {
try {
- AugmentToGenType.usesAugmentationToGenTypes(null, null, null, null, null, null, null, null, false, null);
+ AugmentToGenType.usesAugmentationToGenTypes(null, null, (AugmentationSchema) null, null, null, null, null, null, false, null);
} catch (final Exception e) {
assertNotNull(e);
assertTrue(e instanceof IllegalArgumentException);
@Test
public void usesAugmentationToGenTypesNullAugSchemaNodeTest() throws Exception {
try {
- AugmentToGenType.usesAugmentationToGenTypes(null, "", null, null, null, null, null, null, false, null);
+ AugmentToGenType.usesAugmentationToGenTypes(null, "", (AugmentationSchema) null, null, null, null, null, null, false, null);
} catch (final Exception e) {
assertNotNull(e);
assertTrue(e instanceof IllegalArgumentException);
assertTrue(!generateTypes.isEmpty());
for (final Type type : generateTypes) {
if (type.getName().equals("A11")) {
- assertEquals("org.opendaylight.mdsal.gen.javav2.yang.test.uses.augment.recursive.rev170519.d",
+ assertEquals("org.opendaylight.mdsal.gen.javav2.yang.test.uses.augment.recursive.rev170519.data.d",
type.getPackageName());
} else if (type.getName().equals("B11")) {
- assertEquals("org.opendaylight.mdsal.gen.javav2.yang.test.uses.augment.recursive.rev170519.d.a1",
+ assertEquals("org.opendaylight.mdsal.gen.javav2.yang.test.uses.augment.recursive.rev170519.data.d.a11",
type.getPackageName());
} else if (type.getName().equals("C11")) {
- assertEquals("org.opendaylight.mdsal.gen.javav2.yang.test.uses.augment.recursive.rev170519.d.a1.b1",
+ assertEquals("org.opendaylight.mdsal.gen.javav2.yang.test.uses.augment.recursive.rev170519.data.d.a11.b11",
type.getPackageName());
}
}
--- /dev/null
+module augment-test-uses-grouping {
+ prefix "foo";
+ namespace "org.test.augment.uses.grouping";
+
+ container foo1 {
+ leaf my-leaf {
+ type string;
+ }
+ }
+
+ augment /foo:foo1 {
+ uses grp {
+ augment my-cont {
+ leaf my-uses-grp-leaf {
+ type string;
+ }
+ }
+ }
+
+ leaf bar {
+ type string;
+ }
+ }
+
+ augment /foo:foo1 {
+ leaf baz {
+ type string;
+ }
+ }
+
+ grouping grp {
+ container my-cont {
+ leaf my-grp-leaf {
+ type string;
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+module augment-test-uses {
+ prefix "foo";
+ namespace "org.test.augment.uses";
+
+ container foo1 {
+ leaf my-leaf {
+ type string;
+ }
+ }
+
+ augment /foo:foo1 {
+ uses grp;
+ leaf bar {
+ type string;
+ }
+ }
+
+ augment /foo:foo1 {
+ leaf baz {
+ type string;
+ }
+ }
+
+ grouping grp {
+ leaf my-grp-leaf {
+ type string;
+ }
+ }
+}
\ No newline at end of file
return basePackageName;
}
- return generateNormalizedPackageName(basePackageName, pathFromRoot, size, null);
+ return generateNormalizedPackageName(basePackageName, pathFromRoot, size, BindingNamespaceType.Data);
}
/**
setAbstract(true);
}
+ public GeneratedTypeBuilderImpl(final String packageName, final String name,
+ final boolean isPkNameNormalized,
+ final boolean isTypeNormalized) {
+ super(packageName, name, isPkNameNormalized, isTypeNormalized);
+ setAbstract(true);
+ }
+
@Override
public GeneratedType toInstance() {
return new GeneratedTypeImpl(this);
@if(genType.isInstanceOf[GeneratedType] && !genType.isInstanceOf[GeneratedTransferObject]) {
@if(hasImplementsFromUses(genType.asInstanceOf[GeneratedType])) {
/**
- *Set fields from given grouping argument. Valid argument is instance of one of following types:
+ * Set fields from given grouping argument. Valid argument is instance of one of following types:
* <ul>
@for(impl <- getAllIfcs(genType.asInstanceOf[GeneratedType])) {
* <li>@{impl.getFullyQualifiedName}</li>
@for(impl <- getAllIfcs(genType.asInstanceOf[GeneratedType])) {
@if(impl.isInstanceOf[GeneratedType] && !impl.asInstanceOf[GeneratedType].getMethodDefinitions.isEmpty) {
if (arg instanceof @{impl.asInstanceOf[GeneratedType].getFullyQualifiedName}) {
- @if(!impl.isInstanceOf[GeneratedTransferObject]) {
- @for(getter <- genType.asInstanceOf[GeneratedType].getMethodDefinitions) {
+ @if(impl.isInstanceOf[GeneratedType] && !impl.isInstanceOf[GeneratedTransferObject]) {
+ @for(getter <- impl.asInstanceOf[GeneratedType].getMethodDefinitions) {
this._@{propertyNameFromGetter(getter)} = ((@{impl.asInstanceOf[GeneratedType].getFullyQualifiedName})arg).@{getter.getName}();
}
}