X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=code-generator%2Fbinding-generator-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fsal%2Fbinding%2Fgenerator%2Fimpl%2FBindingGeneratorImpl.java;h=befe3e88e02c494e48b287d8089cf2f05eb8fd08;hb=c13c841a2311ac4c0c507451624e0b3ddf26e775;hp=b4837dc185efe2e1e0841149a6f4c5055f998b19;hpb=a20ef189fb92011da7dd521164a98d098201fcc2;p=yangtools.git diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java index b4837dc185..befe3e88e0 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/BindingGeneratorImpl.java @@ -11,7 +11,6 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.computeDefaultSUID; -import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.moduleNamespaceToPackageName; import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.packageNameForGeneratedType; import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.parseToValidParamName; import static org.opendaylight.yangtools.binding.generator.util.BindingTypes.DATA_OBJECT; @@ -26,9 +25,12 @@ import static org.opendaylight.yangtools.binding.generator.util.Types.VOID; import static org.opendaylight.yangtools.binding.generator.util.Types.typeForClass; import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findDataSchemaNode; import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findNodeInSchemaContext; -import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findOriginal; import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findParentModule; +import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; + import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -76,6 +78,7 @@ import org.opendaylight.yangtools.yang.model.api.ChoiceNode; 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.DerivableSchemaNode; import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; @@ -102,15 +105,30 @@ import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Splitter; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; - public class BindingGeneratorImpl implements BindingGenerator { private static final Logger LOG = LoggerFactory.getLogger(BindingGeneratorImpl.class); + private static final Splitter COLON_SPLITTER = Splitter.on(':'); + private static final Splitter BSDOT_SPLITTER = Splitter.on("\\."); + private static final char NEW_LINE = '\n'; + + /** + * Constant with the concrete name of identifier. + */ + private static final String AUGMENT_IDENTIFIER_NAME = "augment-identifier"; + + /** + * Constant with the concrete name of namespace. + */ + private static final String YANG_EXT_NAMESPACE = "urn:opendaylight:yang:extension:yang-ext"; private final Map genCtx = new HashMap<>(); + /** + * When set to true, generated classes will include javadoc comments which + * are useful for users. + */ + private final boolean verboseClassComments; + /** * Outer key represents the package name. Outer value represents map of all * builders in the same package. Inner key represents the schema node name @@ -131,14 +149,23 @@ public class BindingGeneratorImpl implements BindingGenerator { private SchemaContext schemaContext; /** - * Constant with the concrete name of namespace. + * Create a new binding generator with verboe comments. + * + * @deprecated Use {@link #BindingGeneratorImpl(boolean)} instead. */ - private final static String YANG_EXT_NAMESPACE = "urn:opendaylight:yang:extension:yang-ext"; + @Deprecated + public BindingGeneratorImpl() { + this(true); + } /** - * Constant with the concrete name of identifier. + * Create a new binding generator. + * + * @param verboseClassComments generate verbose comments */ - private final static String AUGMENT_IDENTIFIER_NAME = "augment-identifier"; + public BindingGeneratorImpl(final boolean verboseClassComments) { + this.verboseClassComments = verboseClassComments; + } /** * Resolves generated types from context schema nodes of all @@ -240,7 +267,7 @@ public class BindingGeneratorImpl implements BindingGenerator { if (!m.getChildNodes().isEmpty()) { final GeneratedTypeBuilder moduleType = moduleToDataType(m); genCtx.get(m).addModuleNode(moduleType); - final String basePackageName = moduleNamespaceToPackageName(m); + final String basePackageName = BindingMapping.getRootPackageName(m.getQNameModule()); resolveDataSchemaNodes(m, basePackageName, moduleType, moduleType, m.getChildNodes()); } } @@ -285,16 +312,20 @@ public class BindingGeneratorImpl implements BindingGenerator { final String packageName = packageNameForGeneratedType(basePackageName, node.getPath()); final GeneratedTypeBuilder genType = addDefaultInterfaceDefinition(packageName, node, childOf); genType.addComment(node.getDescription()); + genType.setDescription(createDescription(node, genType.getFullyQualifiedName())); + genType.setModuleName(module.getName()); + genType.setReference(node.getReference()); + genType.setSchemaPath(node.getPath().getPathFromRoot()); if (node instanceof DataNodeContainer) { - genCtx.get(module).addChildNodeType(node.getPath(), genType); + genCtx.get(module).addChildNodeType(node, genType); groupingsToGenTypes(module, ((DataNodeContainer) node).getGroupings()); processUsesAugments((DataNodeContainer) node, module); } return genType; } - private void containerToGenType(final Module module, final String basePackageName, final GeneratedTypeBuilder parent, - final GeneratedTypeBuilder childOf, final ContainerSchemaNode node) { + private void containerToGenType(final Module module, final String basePackageName, + final GeneratedTypeBuilder parent, final GeneratedTypeBuilder childOf, final ContainerSchemaNode node) { final GeneratedTypeBuilder genType = processDataSchemaNode(module, basePackageName, childOf, node); if (genType != null) { constructGetter(parent, node.getQName().getLocalName(), node.getDescription(), genType); @@ -336,7 +367,7 @@ public class BindingGeneratorImpl implements BindingGenerator { } private void processUsesAugments(final DataNodeContainer node, final Module module) { - final String basePackageName = moduleNamespaceToPackageName(module); + final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); for (UsesNode usesNode : node.getUses()) { for (AugmentationSchema augment : usesNode.getAugmentations()) { usesAugmentationToGenTypes(basePackageName, augment, module, usesNode, node); @@ -365,7 +396,7 @@ public class BindingGeneratorImpl implements BindingGenerator { checkArgument(module.getName() != null, "Module name cannot be NULL."); checkState(module.getAugmentations() != null, "Augmentations Set cannot be NULL."); - final String basePackageName = moduleNamespaceToPackageName(module); + final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); final List augmentations = resolveAugmentations(module); for (AugmentationSchema augment : augmentations) { augmentationToGenTypes(basePackageName, augment, module); @@ -414,6 +445,8 @@ public class BindingGeneratorImpl implements BindingGenerator { addImplementedInterfaceFromUses(module, moduleDataTypeBuilder); moduleDataTypeBuilder.addImplementsType(DATA_ROOT); moduleDataTypeBuilder.addComment(module.getDescription()); + moduleDataTypeBuilder.setDescription(createDescription(module)); + moduleDataTypeBuilder.setReference(module.getReference()); return moduleDataTypeBuilder; } @@ -442,9 +475,11 @@ public class BindingGeneratorImpl implements BindingGenerator { return; } - final String basePackageName = moduleNamespaceToPackageName(module); + final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); final GeneratedTypeBuilder interfaceBuilder = moduleTypeBuilder(module, "Service"); interfaceBuilder.addImplementsType(Types.typeForClass(RpcService.class)); + interfaceBuilder.setDescription(createDescription(rpcDefinitions, module.getName(), module.getModuleSourcePath())); + for (RpcDefinition rpc : rpcDefinitions) { if (rpc != null) { final String rpcName = BindingMapping.getClassName(rpc.getQName()); @@ -460,7 +495,7 @@ public class BindingGeneratorImpl implements BindingGenerator { inType.addImplementsType(DATA_OBJECT); inType.addImplementsType(augmentable(inType)); resolveDataSchemaNodes(module, basePackageName, inType, inType, input.getChildNodes()); - genCtx.get(module).addChildNodeType(input.getPath(), inType); + genCtx.get(module).addChildNodeType(input, inType); final GeneratedType inTypeInstance = inType.toInstance(); method.addParameter(inTypeInstance, "input"); } @@ -472,7 +507,7 @@ public class BindingGeneratorImpl implements BindingGenerator { outType.addImplementsType(DATA_OBJECT); outType.addImplementsType(augmentable(outType)); resolveDataSchemaNodes(module, basePackageName, outType, outType, output.getChildNodes()); - genCtx.get(module).addChildNodeType(output.getPath(), outType); + genCtx.get(module).addChildNodeType(output, outType); outTypeInstance = outType.toInstance(); } @@ -512,7 +547,9 @@ public class BindingGeneratorImpl implements BindingGenerator { final GeneratedTypeBuilder listenerInterface = moduleTypeBuilder(module, "Listener"); listenerInterface.addImplementsType(BindingTypes.NOTIFICATION_LISTENER); - final String basePackageName = moduleNamespaceToPackageName(module); + final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); + + for (NotificationDefinition notification : notifications) { if (notification != null) { @@ -521,17 +558,18 @@ public class BindingGeneratorImpl implements BindingGenerator { final GeneratedTypeBuilder notificationInterface = addDefaultInterfaceDefinition(basePackageName, notification, BindingTypes.DATA_OBJECT); notificationInterface.addImplementsType(NOTIFICATION); - genCtx.get(module).addChildNodeType(notification.getPath(), notificationInterface); + genCtx.get(module).addChildNodeType(notification, notificationInterface); // Notification object resolveDataSchemaNodes(module, basePackageName, notificationInterface, notificationInterface, notification.getChildNodes()); listenerInterface.addMethod("on" + notificationInterface.getName()) - .setAccessModifier(AccessModifier.PUBLIC).addParameter(notificationInterface, "notification") - .setComment(notification.getDescription()).setReturnType(Types.VOID); + .setAccessModifier(AccessModifier.PUBLIC).addParameter(notificationInterface, "notification") + .setComment(notification.getDescription()).setReturnType(Types.VOID); } } + listenerInterface.setDescription(createDescription(notifications, module.getName(), module.getModuleSourcePath())); genCtx.get(module).addTopLevelNodeType(listenerInterface); } @@ -550,7 +588,7 @@ public class BindingGeneratorImpl implements BindingGenerator { */ private void allIdentitiesToGenTypes(final Module module, final SchemaContext context) { final Set schemaIdentities = module.getIdentities(); - final String basePackageName = moduleNamespaceToPackageName(module); + final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); if (schemaIdentities != null && !schemaIdentities.isEmpty()) { for (IdentitySchemaNode identity : schemaIdentities) { @@ -578,14 +616,14 @@ public class BindingGeneratorImpl implements BindingGenerator { * information about base of identity * */ - private void identityToGenType(final Module module, final String basePackageName, final IdentitySchemaNode identity, - final SchemaContext context) { + private void identityToGenType(final Module module, final String basePackageName, + final IdentitySchemaNode identity, final SchemaContext context) { if (identity == null) { return; } final String packageName = packageNameForGeneratedType(basePackageName, identity.getPath()); final String genTypeName = BindingMapping.getClassName(identity.getQName()); - final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl(packageName, genTypeName); + final GeneratedTOBuilderImpl newType = new GeneratedTOBuilderImpl(packageName, genTypeName); final IdentitySchemaNode baseIdentity = identity.getBaseIdentity(); if (baseIdentity == null) { final GeneratedTOBuilderImpl gto = new GeneratedTOBuilderImpl(BaseIdentity.class.getPackage().getName(), @@ -593,21 +631,28 @@ public class BindingGeneratorImpl implements BindingGenerator { newType.setExtendsType(gto.toInstance()); } else { final Module baseIdentityParentModule = SchemaContextUtil.findParentModule(context, baseIdentity); - final String returnTypePkgName = moduleNamespaceToPackageName(baseIdentityParentModule); + final String returnTypePkgName = BindingMapping.getRootPackageName(baseIdentityParentModule + .getQNameModule()); final String returnTypeName = BindingMapping.getClassName(baseIdentity.getQName()); final GeneratedTransferObject gto = new GeneratedTOBuilderImpl(returnTypePkgName, returnTypeName) - .toInstance(); + .toInstance(); newType.setExtendsType(gto); } newType.setAbstract(true); newType.addComment(identity.getDescription()); + newType.setDescription(createDescription(identity, newType.getFullyQualifiedName())); + newType.setReference(identity.getReference()); + newType.setModuleName(module.getName()); + newType.setSchemaPath(identity.getPath().getPathFromRoot()); + final QName qname = identity.getQName(); qnameConstant(newType, BindingMapping.QNAME_STATIC_FIELD_NAME, qname); genCtx.get(module).addIdentityType(identity.getQName(), newType); } - private static Constant qnameConstant(final GeneratedTypeBuilderBase toBuilder, final String constantName, final QName name) { + private static Constant qnameConstant(final GeneratedTypeBuilderBase toBuilder, final String constantName, + final QName name) { StringBuilder sb = new StringBuilder("org.opendaylight.yangtools.yang.common.QName"); sb.append(".create("); sb.append('"'); @@ -635,9 +680,9 @@ public class BindingGeneratorImpl implements BindingGenerator { * */ private void groupingsToGenTypes(final Module module, final Collection groupings) { - final String basePackageName = moduleNamespaceToPackageName(module); + final String basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); final List groupingsSortedByDependencies = new GroupingDefinitionDependencySort() - .sort(groupings); + .sort(groupings); for (GroupingDefinition grouping : groupingsSortedByDependencies) { groupingToGenType(basePackageName, grouping, module); } @@ -689,6 +734,7 @@ public class BindingGeneratorImpl implements BindingGenerator { && (enumTypeDef.getQName().getLocalName() != null)) { final String enumerationName = BindingMapping.getClassName(enumName); final EnumBuilder enumBuilder = typeBuilder.addEnumeration(enumerationName); + enumBuilder.setDescription(enumTypeDef.getDescription()); enumBuilder.updateEnumPairsFromEnumTypeDef(enumTypeDef); return enumBuilder; } @@ -711,9 +757,15 @@ public class BindingGeneratorImpl implements BindingGenerator { */ private GeneratedTypeBuilder moduleTypeBuilder(final Module module, final String postfix) { checkArgument(module != null, "Module reference cannot be NULL."); - final String packageName = moduleNamespaceToPackageName(module); + final String packageName = BindingMapping.getRootPackageName(module.getQNameModule()); final String moduleName = BindingMapping.getClassName(module.getName()) + postfix; - return new GeneratedTypeBuilderImpl(packageName, moduleName); + + final GeneratedTypeBuilderImpl moduleBuilder = new GeneratedTypeBuilderImpl(packageName, moduleName); + moduleBuilder.setDescription(createDescription(module)); + moduleBuilder.setReference(module.getReference()); + moduleBuilder.setModuleName(moduleName); + + return moduleBuilder; } /** @@ -740,7 +792,8 @@ public class BindingGeneratorImpl implements BindingGenerator { * @throws IllegalStateException * if augment target path is null */ - private void augmentationToGenTypes(final String augmentPackageName, final AugmentationSchema augSchema, final Module module) { + private void augmentationToGenTypes(final String augmentPackageName, final AugmentationSchema augSchema, + final Module module) { checkArgument(augmentPackageName != null, "Package Name cannot be NULL."); checkArgument(augSchema != null, "Augmentation Schema cannot be NULL."); checkState(augSchema.getTargetPath() != null, @@ -752,9 +805,11 @@ public class BindingGeneratorImpl implements BindingGenerator { targetSchemaNode = findDataSchemaNode(schemaContext, targetPath); if (targetSchemaNode instanceof DataSchemaNode && ((DataSchemaNode) targetSchemaNode).isAddedByUses()) { - targetSchemaNode = findOriginal((DataSchemaNode) targetSchemaNode, schemaContext); + if (targetSchemaNode instanceof DerivableSchemaNode) { + targetSchemaNode = ((DerivableSchemaNode) targetSchemaNode).getOriginal().orNull(); + } if (targetSchemaNode == null) { - throw new NullPointerException("Failed to find target node from grouping in augmentation " + augSchema + throw new IllegalStateException("Failed to find target node from grouping in augmentation " + augSchema + " in module " + module.getName()); } } @@ -782,8 +837,8 @@ public class BindingGeneratorImpl implements BindingGenerator { } } - private void usesAugmentationToGenTypes(final String augmentPackageName, final AugmentationSchema augSchema, final Module module, - final UsesNode usesNode, final DataNodeContainer usesNodeParent) { + private void usesAugmentationToGenTypes(final String augmentPackageName, final AugmentationSchema augSchema, + final Module module, final UsesNode usesNode, final DataNodeContainer usesNodeParent) { checkArgument(augmentPackageName != null, "Package Name cannot be NULL."); checkArgument(augSchema != null, "Augmentation Schema cannot be NULL."); checkState(augSchema.getTargetPath() != null, @@ -912,9 +967,12 @@ public class BindingGeneratorImpl implements BindingGenerator { augSchemaNodeToMethods(module, basePackageName, augTypeBuilder, augTypeBuilder, augSchema.getChildNodes()); augmentBuilders.put(augTypeName, augTypeBuilder); - genCtx.get(module).addTargetToAugmentation(targetTypeRef, augTypeBuilder); + if(!augSchema.getChildNodes().isEmpty()) { + genCtx.get(module).addTargetToAugmentation(targetTypeRef, augTypeBuilder); + genCtx.get(module).addTypeToAugmentation(augTypeBuilder, augSchema); + + } genCtx.get(module).addAugmentType(augTypeBuilder); - genCtx.get(module).addTypeToAugmentation(augTypeBuilder, augSchema); return augTypeBuilder; } @@ -982,8 +1040,8 @@ public class BindingGeneratorImpl implements BindingGenerator { * added to it. */ private GeneratedTypeBuilder resolveDataSchemaNodes(final Module module, final String basePackageName, - final GeneratedTypeBuilder parent, final GeneratedTypeBuilder childOf, final Set schemaNodes) { - if ((schemaNodes != null) && (parent != null)) { + final GeneratedTypeBuilder parent, final GeneratedTypeBuilder childOf, final Iterable schemaNodes) { + if (schemaNodes != null && parent != null) { for (DataSchemaNode schemaNode : schemaNodes) { if (!schemaNode.isAugmenting() && !schemaNode.isAddedByUses()) { addSchemaNodeToBuilderAsMethod(basePackageName, schemaNode, parent, childOf, module); @@ -1016,7 +1074,8 @@ public class BindingGeneratorImpl implements BindingGenerator { * added to it. */ private GeneratedTypeBuilder augSchemaNodeToMethods(final Module module, final String basePackageName, - final GeneratedTypeBuilder typeBuilder, final GeneratedTypeBuilder childOf, final Set schemaNodes) { + final GeneratedTypeBuilder typeBuilder, final GeneratedTypeBuilder childOf, + final Iterable schemaNodes) { if ((schemaNodes != null) && (typeBuilder != null)) { for (DataSchemaNode schemaNode : schemaNodes) { if (!schemaNode.isAugmenting()) { @@ -1088,8 +1147,8 @@ public class BindingGeneratorImpl implements BindingGenerator { *
  • if choiceNode is null
  • * */ - private void choiceToGeneratedType(final Module module, final String basePackageName, final GeneratedTypeBuilder parent, - final ChoiceNode choiceNode) { + private void choiceToGeneratedType(final Module module, final String basePackageName, + final GeneratedTypeBuilder parent, final ChoiceNode choiceNode) { checkArgument(basePackageName != null, "Base Package Name cannot be NULL."); checkArgument(choiceNode != null, "Choice Schema Node cannot be NULL."); @@ -1099,7 +1158,7 @@ public class BindingGeneratorImpl implements BindingGenerator { constructGetter(parent, choiceNode.getQName().getLocalName(), choiceNode.getDescription(), choiceTypeBuilder); choiceTypeBuilder.addImplementsType(typeForClass(DataContainer.class)); - genCtx.get(module).addChildNodeType(choiceNode.getPath(), choiceTypeBuilder); + genCtx.get(module).addChildNodeType(choiceNode, choiceTypeBuilder); generateTypesFromChoiceCases(module, basePackageName, choiceTypeBuilder.toInstance(), choiceNode); } } @@ -1131,8 +1190,8 @@ public class BindingGeneratorImpl implements BindingGenerator { *
  • if caseNodes equals null
  • * */ - private void generateTypesFromChoiceCases(final Module module, final String basePackageName, final Type refChoiceType, - final ChoiceNode choiceNode) { + private void generateTypesFromChoiceCases(final Module module, final String basePackageName, + final Type refChoiceType, final ChoiceNode choiceNode) { checkArgument(basePackageName != null, "Base Package Name cannot be NULL."); checkArgument(refChoiceType != null, "Referenced Choice Type cannot be NULL."); checkArgument(choiceNode != null, "ChoiceNode cannot be NULL."); @@ -1149,7 +1208,7 @@ public class BindingGeneratorImpl implements BindingGenerator { caseTypeBuilder.addImplementsType(refChoiceType); genCtx.get(module).addCaseType(caseNode.getPath(), caseTypeBuilder); genCtx.get(module).addChoiceToCaseMapping(refChoiceType, caseTypeBuilder, caseNode); - final Set caseChildNodes = caseNode.getChildNodes(); + final Iterable caseChildNodes = caseNode.getChildNodes(); if (caseChildNodes != null) { Object parentNode = null; final SchemaPath nodeSp = choiceNode.getPath(); @@ -1162,11 +1221,13 @@ public class BindingGeneratorImpl implements BindingGenerator { SchemaNode targetSchemaNode = findDataSchemaNode(schemaContext, targetPath); if (targetSchemaNode instanceof DataSchemaNode && ((DataSchemaNode) targetSchemaNode).isAddedByUses()) { - targetSchemaNode = findOriginal((DataSchemaNode) targetSchemaNode, schemaContext); + if (targetSchemaNode instanceof DerivableSchemaNode) { + targetSchemaNode = ((DerivableSchemaNode) targetSchemaNode).getOriginal().orNull(); + } if (targetSchemaNode == null) { - throw new NullPointerException( + throw new IllegalStateException( "Failed to find target node from grouping for augmentation " + augSchema - + " in module " + module.getName()); + + " in module " + module.getName()); } } parent = targetSchemaNode; @@ -1175,6 +1236,9 @@ public class BindingGeneratorImpl implements BindingGenerator { parent = findDataSchemaNode(schemaContext, sp.getParent()); } GeneratedTypeBuilder childOfType = findChildNodeByPath(parent.getPath()); + if (childOfType == null) { + childOfType = findGroupingByPath(parent.getPath()); + } resolveDataSchemaNodes(module, basePackageName, caseTypeBuilder, childOfType, caseChildNodes); } } @@ -1210,8 +1274,8 @@ public class BindingGeneratorImpl implements BindingGenerator { *
  • if augmentedNodes is null
  • * */ - private void generateTypesFromAugmentedChoiceCases(final Module module, final String basePackageName, final Type targetType, - final ChoiceNode targetNode, final Set augmentedNodes) { + private void generateTypesFromAugmentedChoiceCases(final Module module, final String basePackageName, + final Type targetType, final ChoiceNode targetNode, final Iterable augmentedNodes) { checkArgument(basePackageName != null, "Base Package Name cannot be NULL."); checkArgument(targetType != null, "Referenced Choice Type cannot be NULL."); checkArgument(augmentedNodes != null, "Set of Choice Case Nodes cannot be NULL."); @@ -1247,7 +1311,7 @@ public class BindingGeneratorImpl implements BindingGenerator { } else { node = targetNode.getCaseNodeByName(caseNode.getQName().getLocalName()); } - final Set childNodes = node.getChildNodes(); + final Iterable childNodes = node.getChildNodes(); if (childNodes != null) { resolveDataSchemaNodes(module, basePackageName, caseTypeBuilder, childOfType, childNodes); } @@ -1299,14 +1363,14 @@ public class BindingGeneratorImpl implements BindingGenerator { } ((TypeProviderImpl) typeProvider).putReferencedType(leaf.getPath(), returnType); } else if (typeDef instanceof UnionType) { - genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leaf); + genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leaf, parentModule); if (genTOBuilder != null) { returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule); } } else if (typeDef instanceof BitsTypeDefinition) { - genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leaf); + genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, leaf, parentModule); if (genTOBuilder != null) { - returnType = new ReferencedTypeImpl(genTOBuilder.getPackageName(), genTOBuilder.getName()); + returnType = genTOBuilder.toInstance(); } } else { final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); @@ -1321,19 +1385,20 @@ public class BindingGeneratorImpl implements BindingGenerator { return returnType; } - private void processContextRefExtension(final LeafSchemaNode leaf, final MethodSignatureBuilder getter, final Module module) { + private void processContextRefExtension(final LeafSchemaNode leaf, final MethodSignatureBuilder getter, + final Module module) { for (UnknownSchemaNode node : leaf.getUnknownSchemaNodes()) { final QName nodeType = node.getNodeType(); if ("context-reference".equals(nodeType.getLocalName())) { final String nodeParam = node.getNodeParameter(); IdentitySchemaNode identity = null; String basePackageName = null; - final Iterable splittedElement = Splitter.on(':').split(nodeParam); + final Iterable splittedElement = COLON_SPLITTER.split(nodeParam); final Iterator iterator = splittedElement.iterator(); final int length = Iterables.size(splittedElement); if (length == 1) { identity = findIdentityByName(module.getIdentities(), iterator.next()); - basePackageName = moduleNamespaceToPackageName(module); + basePackageName = BindingMapping.getRootPackageName(module.getQNameModule()); } else if (length == 2) { String prefix = iterator.next(); final Module dependentModule = findModuleFromImports(module.getImports(), prefix); @@ -1342,7 +1407,7 @@ public class BindingGeneratorImpl implements BindingGenerator { + prefix); } identity = findIdentityByName(dependentModule.getIdentities(), iterator.next()); - basePackageName = moduleNamespaceToPackageName(dependentModule); + basePackageName = BindingMapping.getRootPackageName(dependentModule.getQNameModule()); } else { throw new IllegalArgumentException("Failed to process context-reference: unknown identity " + nodeParam); @@ -1396,13 +1461,8 @@ public class BindingGeneratorImpl implements BindingGenerator { // GeneratedType for this type definition should be already // created QName qname = typeDef.getQName(); - Module unionModule = null; - String prefix = qname.getPrefix(); - if (prefix == null || prefix.isEmpty() || prefix.equals(module.getPrefix())) { - unionModule = module; - } else { - unionModule = findModuleFromImports(module.getImports(), qname.getPrefix()); - } + Module unionModule = schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(), + qname.getRevision()); final ModuleContext mc = genCtx.get(unionModule); returnType = mc.getTypedefs().get(typeDef.getPath()); } else { @@ -1435,8 +1495,8 @@ public class BindingGeneratorImpl implements BindingGenerator { *
  • true - other cases
  • * */ - private boolean resolveLeafSchemaNodeAsProperty(final GeneratedTOBuilder toBuilder, final LeafSchemaNode leaf, final Type returnType, - final boolean isReadOnly) { + private boolean resolveLeafSchemaNodeAsProperty(final GeneratedTOBuilder toBuilder, final LeafSchemaNode leaf, + final Type returnType, final boolean isReadOnly) { if (returnType == null) { return false; } @@ -1486,13 +1546,13 @@ public class BindingGeneratorImpl implements BindingGenerator { returnType = new ReferencedTypeImpl(enumBuilder.getPackageName(), enumBuilder.getName()); ((TypeProviderImpl) typeProvider).putReferencedType(node.getPath(), returnType); } else if (typeDef instanceof UnionType) { - final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node); + final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule); if (genTOBuilder != null) { returnType = createReturnTypeForUnion(genTOBuilder, typeDef, typeBuilder, parentModule); } } else if (typeDef instanceof BitsTypeDefinition) { - final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node); - returnType = new ReferencedTypeImpl(genTOBuilder.getPackageName(), genTOBuilder.getName()); + final GeneratedTOBuilder genTOBuilder = addTOToTypeBuilder(typeDef, typeBuilder, node, parentModule); + returnType = genTOBuilder.toInstance(); } else { final Restrictions restrictions = BindingGeneratorUtil.getRestrictions(typeDef); returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node, restrictions); @@ -1510,6 +1570,12 @@ public class BindingGeneratorImpl implements BindingGenerator { final GeneratedTypeBuilder typeBuilder, final Module parentModule) { final GeneratedTOBuilderImpl returnType = new GeneratedTOBuilderImpl(genTOBuilder.getPackageName(), genTOBuilder.getName()); + + returnType.setDescription(typeDef.getDescription()); + returnType.setReference(typeDef.getReference()); + returnType.setSchemaPath(typeDef.getPath().getPathFromRoot()); + returnType.setModuleName(parentModule.getName()); + genTOBuilder.setTypedef(true); genTOBuilder.setIsUnion(true); ((TypeProviderImpl) typeProvider).addUnitsToGenTO(genTOBuilder, typeDef.getUnits()); @@ -1561,7 +1627,8 @@ public class BindingGeneratorImpl implements BindingGenerator { * parent type (can be null) * @return generated type builder schemaNode */ - private GeneratedTypeBuilder addDefaultInterfaceDefinition(final String packageName, final SchemaNode schemaNode, final Type parent) { + private GeneratedTypeBuilder addDefaultInterfaceDefinition(final String packageName, final SchemaNode schemaNode, + final Type parent) { final GeneratedTypeBuilder it = addRawInterfaceDefinition(packageName, schemaNode, ""); if (parent == null) { it.addImplementsType(DATA_OBJECT); @@ -1618,7 +1685,8 @@ public class BindingGeneratorImpl implements BindingGenerator { * * */ - private GeneratedTypeBuilder addRawInterfaceDefinition(final String packageName, final SchemaNode schemaNode, final String prefix) { + private GeneratedTypeBuilder addRawInterfaceDefinition(final String packageName, final SchemaNode schemaNode, + final String prefix) { checkArgument(schemaNode != null, "Data Schema Node cannot be NULL."); checkArgument(packageName != null, "Package Name for Generated Type cannot be NULL."); checkArgument(schemaNode.getQName() != null, "QName for Data Schema Node cannot be NULL."); @@ -1634,8 +1702,14 @@ public class BindingGeneratorImpl implements BindingGenerator { // FIXME: Validation of name conflict final GeneratedTypeBuilderImpl newType = new GeneratedTypeBuilderImpl(packageName, genTypeName); + final Module module = findParentModule(schemaContext, schemaNode); qnameConstant(newType, BindingMapping.QNAME_STATIC_FIELD_NAME, schemaNode.getQName()); newType.addComment(schemaNode.getDescription()); + newType.setDescription(createDescription(schemaNode, newType.getFullyQualifiedName())); + newType.setReference(schemaNode.getReference()); + newType.setSchemaPath(schemaNode.getPath().getPathFromRoot()); + newType.setModuleName(module.getName()); + if (!genTypeBuilders.containsKey(packageName)) { final Map builders = new HashMap<>(); builders.put(genTypeName, newType); @@ -1692,8 +1766,8 @@ public class BindingGeneratorImpl implements BindingGenerator { * @return method signature builder which represents the getter method of * interfaceBuilder */ - private MethodSignatureBuilder constructGetter(final GeneratedTypeBuilder interfaceBuilder, final String schemaNodeName, - final String comment, final Type returnType) { + private MethodSignatureBuilder constructGetter(final GeneratedTypeBuilder interfaceBuilder, + final String schemaNodeName, final String comment, final Type returnType) { final MethodSignatureBuilder getMethod = interfaceBuilder .addMethod(getterMethodName(schemaNodeName, returnType)); getMethod.setComment(comment); @@ -1726,7 +1800,8 @@ public class BindingGeneratorImpl implements BindingGenerator { * */ private void addSchemaNodeToListBuilders(final String basePackageName, final DataSchemaNode schemaNode, - final GeneratedTypeBuilder typeBuilder, final GeneratedTOBuilder genTOBuilder, final List listKeys, final Module module) { + final GeneratedTypeBuilder typeBuilder, final GeneratedTOBuilder genTOBuilder, final List listKeys, + final Module module) { checkArgument(schemaNode != null, "Data Schema Node cannot be NULL."); checkArgument(typeBuilder != null, "Generated Type Builder cannot be NULL."); @@ -1754,7 +1829,8 @@ public class BindingGeneratorImpl implements BindingGenerator { } } - private void typeBuildersToGenTypes(final Module module, final GeneratedTypeBuilder typeBuilder, final GeneratedTOBuilder genTOBuilder) { + private void typeBuildersToGenTypes(final Module module, final GeneratedTypeBuilder typeBuilder, + final GeneratedTOBuilder genTOBuilder) { checkArgument(typeBuilder != null, "Generated Type Builder cannot be NULL."); if (genTOBuilder != null) { @@ -1830,8 +1906,8 @@ public class BindingGeneratorImpl implements BindingGenerator { * @param leaf * @return generated TO builder for typeDef */ - private GeneratedTOBuilder addTOToTypeBuilder(final TypeDefinition typeDef, final GeneratedTypeBuilder typeBuilder, - final DataSchemaNode leaf) { + private GeneratedTOBuilder addTOToTypeBuilder(final TypeDefinition typeDef, + final GeneratedTypeBuilder typeBuilder, final DataSchemaNode leaf, final Module parentModule) { final String classNameFromLeaf = BindingMapping.getClassName(leaf.getQName()); final List genTOBuilders = new ArrayList<>(); final String packageName = typeBuilder.getFullyQualifiedName(); @@ -1857,7 +1933,7 @@ public class BindingGeneratorImpl implements BindingGenerator { } else if (typeDef instanceof BitsTypeDefinition) { genTOBuilders.add((((TypeProviderImpl) typeProvider)).provideGeneratedTOBuilderForBitsTypeDefinition( - packageName, typeDef, classNameFromLeaf)); + packageName, typeDef, classNameFromLeaf, parentModule.getName())); } if (genTOBuilders != null && !genTOBuilders.isEmpty()) { for (GeneratedTOBuilder genTOBuilder : genTOBuilders) { @@ -1894,13 +1970,157 @@ public class BindingGeneratorImpl implements BindingGenerator { throw new IllegalStateException("Grouping " + usesNode.getGroupingPath() + "is not resolved for " + builder.getName()); } + builder.addImplementsType(genType); - builder.addComment(genType.getComment()); + /* + builder.addComment(genType.getDescription()); + builder.setDescription(genType.getDescription()); + builder.setModuleName(genType.getModuleName()); + builder.setReference(genType.getReference()); + builder.setSchemaPath(genType.getSchemaPath()); + */ } } return builder; } + private boolean isNullOrEmpty(final Collection list) { + return (list == null || list.isEmpty() ? true : false); + } + + private String createDescription(final Set schemaNodes, final String moduleName, final String moduleSourcePath) { + final StringBuilder sb = new StringBuilder(); + + if (!isNullOrEmpty(schemaNodes)) { + final SchemaNode node = schemaNodes.iterator().next(); + + if (node instanceof RpcDefinition) { + sb.append("Interface for implementing the following YANG RPCs defined in module " + moduleName + ""); + } else if (node instanceof NotificationDefinition) { + sb.append("Interface for receiving the following YANG notifications defined in module " + moduleName + ""); + } + } + sb.append(NEW_LINE); + sb.append("
    (Source path: "); + sb.append(moduleSourcePath); + sb.append("):"); + sb.append(NEW_LINE); + + if (verboseClassComments) { + sb.append("
    ");
    +            sb.append(NEW_LINE);
    +            sb.append(YangTemplate.generateYangSnipet(schemaNodes));
    +            sb.append("
    "); + sb.append(NEW_LINE); + } + + return sb.toString(); + } + + private String createDescription(final SchemaNode schemaNode, final String fullyQualifiedName) { + final StringBuilder sb = new StringBuilder(); + final String formattedDescription = YangTemplate.formatToParagraph(schemaNode.getDescription(), 0); + + if (!isNullOrEmpty(formattedDescription)) { + sb.append(formattedDescription); + sb.append(NEW_LINE); + } + + if (verboseClassComments) { + final Module module = findParentModule(schemaContext, schemaNode); + final StringBuilder linkToBuilderClass = new StringBuilder(); + final StringBuilder linkToKeyClass = new StringBuilder(); + final String[] namespace = Iterables.toArray(BSDOT_SPLITTER.split(fullyQualifiedName), String.class); + String className = namespace[namespace.length - 1]; + + if (hasBuilderClass(schemaNode)) { + linkToBuilderClass.append(className); + linkToBuilderClass.append("Builder"); + + if (schemaNode instanceof ListSchemaNode) { + linkToKeyClass.append(className); + linkToKeyClass.append("Key"); + } + } + + sb.append("

    "); + sb.append("This class represents the following YANG schema fragment defined in module "); + sb.append(module.getName()); + sb.append(""); + sb.append(NEW_LINE); + sb.append("
    (Source path: "); + sb.append(module.getModuleSourcePath()); + sb.append("):"); + sb.append(NEW_LINE); + sb.append("

    ");
    +            sb.append(NEW_LINE);
    +            sb.append(YangTemplate.generateYangSnipet(schemaNode));
    +            sb.append("
    "); + sb.append(NEW_LINE); + sb.append("The schema path to identify an instance is"); + sb.append(NEW_LINE); + sb.append(""); + sb.append(YangTemplate.formatSchemaPath(module.getName(), schemaNode.getPath().getPathFromRoot())); + sb.append(""); + sb.append(NEW_LINE); + + if (hasBuilderClass(schemaNode)) { + sb.append(NEW_LINE); + sb.append("

    To create instances of this class use " + "{@link " + linkToBuilderClass + "}."); + sb.append(NEW_LINE); + sb.append("@see "); + sb.append(linkToBuilderClass); + if (schemaNode instanceof ListSchemaNode) { + sb.append("@see "); + sb.append(linkToKeyClass); + } + sb.append(NEW_LINE); + } + } + + return sb.toString(); + } + + private boolean hasBuilderClass(final SchemaNode schemaNode) { + if (schemaNode instanceof ContainerSchemaNode || schemaNode instanceof ListSchemaNode || + schemaNode instanceof RpcDefinition || schemaNode instanceof NotificationDefinition) { + return true; + } + return false; + } + + private boolean isNullOrEmpty(final String string) { + return (string == null || string.isEmpty() ? true : false); + } + + private String createDescription(final Module module) { + final StringBuilder sb = new StringBuilder(); + final String formattedDescription = YangTemplate.formatToParagraph(module.getDescription(), 0); + + if (!isNullOrEmpty(formattedDescription)) { + sb.append(formattedDescription); + sb.append(NEW_LINE); + } + + if (verboseClassComments) { + sb.append("

    "); + sb.append("This class represents the following YANG schema fragment defined in module "); + sb.append(module.getName()); + sb.append(""); + sb.append(NEW_LINE); + sb.append("
    Source path: "); + sb.append(module.getModuleSourcePath()); + sb.append("):"); + sb.append(NEW_LINE); + sb.append("

    ");
    +            sb.append(NEW_LINE);
    +            sb.append(YangTemplate.generateYangSnipet(module));
    +            sb.append("
    "); + } + + return sb.toString(); + } + private GeneratedTypeBuilder findChildNodeByPath(final SchemaPath path) { for (ModuleContext ctx : genCtx.values()) { GeneratedTypeBuilder result = ctx.getChildNode(path);