import java.util.Set;
import java.util.stream.Collectors;
import org.opendaylight.mdsal.binding.javav2.model.api.Type;
-import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.EnumBuilder;
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder;
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
import org.opendaylight.yangtools.yang.common.QName;
}
/**
- * Adds mapping between schema path and inner enum.
+ * Adds mapping between schema path and inner enum, inner union, inner bits.
*
* @param path
- * @param enumBuilder
+ * @param builder
*/
- public void addInnerTypedefType(final SchemaPath path, final EnumBuilder enumBuilder) {
- this.innerTypes.put(path, enumBuilder);
+ public void addInnerTypedefType(final SchemaPath path, final Type builder) {
+ this.innerTypes.put(path, builder);
}
public Type getInnerType(final SchemaPath path) {
*/
static GeneratedTOBuilder addTOToTypeBuilder(final TypeDefinition<?> typeDef, final GeneratedTypeBuilder
typeBuilder, final DataSchemaNode leaf, final Module parentModule, final TypeProvider typeProvider,
- final SchemaContext schemaContext, ModuleContext context) {
+ final SchemaContext schemaContext, ModuleContext context, final Map<Module, ModuleContext> genCtx) {
final String classNameFromLeaf = leaf.getQName().getLocalName();
GeneratedTOBuilder genTOBuilder = null;
final String packageName = typeBuilder.getFullyQualifiedName();
}
if (genTOBuilder != null) {
typeBuilder.addEnclosingTransferObject(genTOBuilder);
+ genCtx.get(parentModule).addInnerTypedefType(typeDef.getPath(), genTOBuilder);
return genTOBuilder;
}
return null;
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedPropertyBuilder;
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTOBuilder;
import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.GeneratedTypeBuilder;
-import org.opendaylight.mdsal.binding.javav2.model.api.type.builder.MethodSignatureBuilder;
import org.opendaylight.mdsal.binding.javav2.spec.base.BaseIdentity;
import org.opendaylight.mdsal.binding.javav2.spec.base.TreeNode;
import org.opendaylight.mdsal.binding.javav2.spec.runtime.BindingNamespaceType;
schemaContext, verboseClassComments, genCtx, genTypeBuilders, typeProvider, namespaceType);
if (genType != null) {
StringBuilder getterName = new StringBuilder(node.getQName().getLocalName());
- final MethodSignatureBuilder getter = constructGetter(parent, getterName.toString(), node.getDescription(), genType, node.getStatus());
+ constructGetter(parent, getterName.toString(), node.getDescription(), genType, node.getStatus());
resolveDataSchemaNodes(module, basePackageName, genType, genType, node.getChildNodes(), genCtx,
schemaContext, verboseClassComments, genTypeBuilders, typeProvider, namespaceType);
processUsesImplements(node, module, schemaContext, genCtx, namespaceType);
LeafSchemaNode originalLeaf = (LeafSchemaNode)((DerivableSchemaNode) leaf).getOriginal().orNull();
Preconditions.checkNotNull(originalLeaf);
if (isInnerType(originalLeaf, typeDef)) {
- returnType = genCtx.get(findParentModule(schemaContext, originalLeaf)).getInnerType(typeDef.getPath());
+ if (typeDef instanceof EnumTypeDefinition
+ || typeDef instanceof UnionTypeDefinition
+ || typeDef instanceof BitsTypeDefinition) {
+ returnType = genCtx.get(findParentModule(schemaContext, originalLeaf)).getInnerType(typeDef.getPath());
+ } else {
+ final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef);
+ returnType = typeProvider.javaTypeForSchemaDefinitionType(getBaseOrDeclaredType(typeDef), leaf,
+ restrictions, genCtx.get(module));
+ }
} else {
final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef);
returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf, restrictions, genCtx.get(module));
((TypeProviderImpl) typeProvider).putReferencedType(leaf.getPath(), returnType);
} else if (typeDef instanceof UnionTypeDefinition) {
final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leaf, parentModule,
- typeProvider, schemaContext, genCtx.get(module));
+ typeProvider, schemaContext, genCtx.get(module), genCtx);
if (genTOBuilder != null) {
//TODO: https://bugs.opendaylight.org/show_bug.cgi?id=2289
returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule, typeProvider);
}
} else if (typeDef instanceof BitsTypeDefinition) {
final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leaf, parentModule,
- typeProvider, schemaContext, genCtx.get(module));
+ typeProvider, schemaContext, genCtx.get(module), genCtx);
if (genTOBuilder != null) {
returnType = genTOBuilder.toInstance();
}
((TypeProviderImpl) typeProvider).putReferencedType(node.getPath(), returnType);
} else if (typeDef instanceof UnionTypeDefinition) {
final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule,
- typeProvider, schemaContext, genCtx.get(module));
+ typeProvider, schemaContext, genCtx.get(module), genCtx);
if (genTOBuilder != null) {
returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule, typeProvider);
}
} else if (typeDef instanceof BitsTypeDefinition) {
final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule,
- typeProvider, schemaContext, genCtx.get(module));
+ typeProvider, schemaContext, genCtx.get(module), genCtx);
returnType = genTOBuilder.toInstance();
} else {
final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef);
// a base type which holds these constraints.
if (typeDefinition instanceof DecimalTypeDefinition) {
final Type ret = BaseYangTypes.BASE_YANG_TYPES_PROVIDER.javaTypeForSchemaDefinitionType
- (typeDefinition, parentNode, r, null);
+ (typeDefinition, parentNode, r, context);
if (ret != null) {
return ret;
}
public void addTOToTypeBuilderNullTest() throws Exception {
final Class[] parameterTypes =
{ TypeDefinition.class, GeneratedTypeBuilder.class, DataSchemaNode.class, Module.class,
- TypeProvider.class, SchemaContext.class, ModuleContext.class };
+ TypeProvider.class, SchemaContext.class, ModuleContext.class, Map.class };
final Method generate = AuxiliaryGenUtils.class.getDeclaredMethod("addTOToTypeBuilder", parameterTypes);
assertNotNull(generate);
generate.setAccessible(true);
final Set<Module> modules = new HashSet<>();
when(schemaContext.getModules()).thenReturn(modules);
final TypeProviderImpl typeProvider = new TypeProviderImpl(schemaContext);
+ final Map<Module, ModuleContext> genCtx = new HashMap<>();
+ genCtx.put(parentModule, new ModuleContext());
- final Object[] args1 = { typeDef, typeBuilder, leaf, parentModule, typeProvider, schemaContext, new ModuleContext() };
+ final Object[] args1 = { typeDef, typeBuilder, leaf, parentModule, typeProvider, schemaContext, new ModuleContext(), genCtx };
final GeneratedTOBuilder result = (GeneratedTOBuilder) generate.invoke(AuxiliaryGenUtils.class, args1);
assertEquals(null, result);
}
throws NoSuchMethodException, ReactorException, FileNotFoundException, URISyntaxException,
IllegalAccessException, InvocationTargetException {
final Class[] parameterTypes = { TypeDefinition.class, GeneratedTypeBuilder.class, DataSchemaNode.class,
- Module.class, TypeProvider.class, SchemaContext.class, ModuleContext.class };
+ Module.class, TypeProvider.class, SchemaContext.class, ModuleContext.class, Map.class };
final Method generate = AuxiliaryGenUtils.class.getDeclaredMethod("addTOToTypeBuilder", parameterTypes);
assertNotNull(generate);
generate.setAccessible(true);
final LeafSchemaNode leafSchemaNode =
(LeafSchemaNode) schemaContext.getModules().iterator().next().getChildNodes().iterator().next();
final TypeDefinition<? extends TypeDefinition<?>> typeDef = leafSchemaNode.getType();
+ final Map<Module, ModuleContext> genCtx = new HashMap<>();
+ genCtx.put(schemaContext.getModules().iterator().next(), new ModuleContext());
+
final Object[] args1 = { typeDef, typeBuilder, leafSchemaNode, schemaContext.getModules().iterator().next(),
- typeProvider, schemaContext, new ModuleContext() };
+ typeProvider, schemaContext, new ModuleContext(), genCtx };
return (GeneratedTOBuilder) generate.invoke(AuxiliaryGenUtils.class, args1);
}
}
}
+ @Test
+ public void generatedTypesUsesBitsLeafTest() throws Exception {
+ final BindingGenerator bg = new BindingGeneratorImpl(false);
+ final List<String> sources = new ArrayList<>();
+ sources.add("/uses-statement/test-uses-leaf-innertype2-base.yang");
+ sources.add("/uses-statement/test-uses-leaf-innertype2.yang");
+ final SchemaContext context = YangParserTestUtils.parseYangSources(sources);
+ final List<Type> generateTypes = bg.generateTypes(context);
+ assertNotNull(generateTypes);
+ assertTrue(!generateTypes.isEmpty());
+ for (final Type type : generateTypes) {
+ if (type.getName().equals("MyCont") && type.getPackageName()
+ .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.base.rev170809.data")) {
+ final GeneratedType gt = (GeneratedType) type;
+ for (MethodSignature methodSignature : gt.getMethodDefinitions()) {
+ if (methodSignature.getName().equals("getLeafBits")) {
+ assertEquals("LeafBits", methodSignature.getReturnType().getName());
+ }
+ }
+
+ }
+
+ if (type.getName().equals("MyCont") && type.getPackageName()
+ .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.rev170809.data")) {
+ final GeneratedType gt = (GeneratedType) type;
+ for (MethodSignature methodSignature : gt.getMethodDefinitions()) {
+ if (methodSignature.getName().equals("getLeafBits")) {
+ assertEquals("LeafBits", methodSignature.getReturnType().getName());
+ }
+ }
+ }
+ }
+ }
+
+ @Test
+ public void generatedTypesUsesUnionLeafTest() throws Exception {
+ final BindingGenerator bg = new BindingGeneratorImpl(false);
+ final List<String> sources = new ArrayList<>();
+ sources.add("/uses-statement/test-uses-leaf-innertype2-base.yang");
+ sources.add("/uses-statement/test-uses-leaf-innertype2.yang");
+ final SchemaContext context = YangParserTestUtils.parseYangSources(sources);
+ final List<Type> generateTypes = bg.generateTypes(context);
+ assertNotNull(generateTypes);
+ assertTrue(!generateTypes.isEmpty());
+ for (final Type type : generateTypes) {
+ if (type.getName().equals("MyCont") && type.getPackageName()
+ .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.base.rev170809.data")) {
+ final GeneratedType gt = (GeneratedType) type;
+ for (MethodSignature methodSignature : gt.getMethodDefinitions()) {
+ if (methodSignature.getName().equals("getLeafUnion")) {
+ assertEquals("LeafUnion", methodSignature.getReturnType().getName());
+ }
+ }
+
+ }
+
+ if (type.getName().equals("MyCont") && type.getPackageName()
+ .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.rev170809.data")) {
+ final GeneratedType gt = (GeneratedType) type;
+ for (MethodSignature methodSignature : gt.getMethodDefinitions()) {
+ if (methodSignature.getName().equals("getLeafUnion")) {
+ assertEquals("LeafUnion", methodSignature.getReturnType().getName());
+ }
+ }
+ }
+ }
+ }
+
+ @Test
+ public void generatedTypesUsesLeafTest() throws Exception {
+ final BindingGenerator bg = new BindingGeneratorImpl(false);
+ final List<String> sources = new ArrayList<>();
+ sources.add("/uses-statement/test-uses-leaf-innertype2-base.yang");
+ sources.add("/uses-statement/test-uses-leaf-innertype2.yang");
+ final SchemaContext context = YangParserTestUtils.parseYangSources(sources);
+ final List<Type> generateTypes = bg.generateTypes(context);
+ assertNotNull(generateTypes);
+ assertTrue(!generateTypes.isEmpty());
+ for (final Type type : generateTypes) {
+ if (type.getName().equals("MyCont") && type.getPackageName()
+ .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.base.rev170809.data")) {
+ final GeneratedType gt = (GeneratedType) type;
+ for (MethodSignature methodSignature : gt.getMethodDefinitions()) {
+ if (methodSignature.getName().equals("getLeafDecimal64")) {
+ assertEquals("BigDecimal", methodSignature.getReturnType().getName());
+ }
+ }
+
+ }
+
+ if (type.getName().equals("MyCont") && type.getPackageName()
+ .equals("org.opendaylight.mdsal.gen.javav2.urn.test.uses.leaf.innertype2.rev170809.data")) {
+ final GeneratedType gt = (GeneratedType) type;
+ for (MethodSignature methodSignature : gt.getMethodDefinitions()) {
+ if (methodSignature.getName().equals("getLeafDecimal64")) {
+ assertEquals("BigDecimal", methodSignature.getReturnType().getName());
+ }
+ }
+ }
+ }
+ }
+
@Test
public void generatedTypesTest() throws Exception {
final BindingGenerator bg = new BindingGeneratorImpl(false);
--- /dev/null
+module test-uses-leaf-innertype2-base {
+ namespace "urn:test:uses:leaf:innertype2:base";
+ prefix uses-leaf;
+ revision 2017-08-09;
+
+ grouping my-grp {
+ leaf leaf-decimal64 {
+ description
+ "Minimum LSP Bandwidth. Units in bytes per second";
+ type decimal64 {
+ fraction-digits 2;
+ }
+ }
+
+ leaf leaf-union {
+ type union {
+ type int32;
+ type string;
+ }
+ }
+
+ leaf leaf-bits {
+ type bits {
+ bit path-computation-with-gmpls-link-constraints {
+ position 0;
+ }
+ bit bidirectional-path-computation {
+ position 1;
+ }
+ bit diverse-path-computation {
+ position 2;
+ }
+ bit load-balanced-path-computation {
+ position 3;
+ }
+ bit synchronized-path-computation {
+ position 4;
+ }
+ bit support-for-multiple-objective-functions {
+ position 5;
+ }
+ bit support-for-additive-path-constraints {
+ position 6;
+ }
+ bit support-for-request-prioritization {
+ position 7;
+ }
+ bit support-for-multiple-requests-per-message {
+ position 8;
+ }
+ }
+ }
+ }
+
+ container my-cont {
+ uses my-grp;
+ }
+}
\ No newline at end of file
--- /dev/null
+module test-uses-leaf-innertype2 {
+ namespace "urn:test:uses:leaf:innertype2";
+ prefix uses-leaf;
+ revision 2017-08-09;
+ import test-uses-leaf-innertype2-base {
+ prefix "base";
+ }
+
+ container my-cont {
+ uses base:my-grp;
+ }
+}
\ No newline at end of file