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=15b818e43ddbb9754eb159349c8ed63ca3831ce4;hb=7fedd460044be8d15547f65b713ecbeec0f74296;hp=f42678e7c287d60c30ca69e1dceab8700d9a1305;hpb=7200fc552bb7d5b6b2bff77cf27951ca545d94ac;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 f42678e7c2..15b818e43d 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 @@ -12,7 +12,6 @@ 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.packageNameForGeneratedType; -import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.parseToValidParamName; import static org.opendaylight.yangtools.binding.generator.util.BindingTypes.DATA_OBJECT; import static org.opendaylight.yangtools.binding.generator.util.BindingTypes.DATA_ROOT; import static org.opendaylight.yangtools.binding.generator.util.BindingTypes.IDENTIFIABLE; @@ -27,6 +26,7 @@ import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findD import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findNodeInSchemaContext; import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findParentModule; +import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; @@ -38,6 +38,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import org.opendaylight.yangtools.sal.binding.generator.impl.YangTemplate; import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil; import org.opendaylight.yangtools.binding.generator.util.BindingTypes; import org.opendaylight.yangtools.binding.generator.util.ReferencedTypeImpl; @@ -72,7 +73,7 @@ import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; -import org.opendaylight.yangtools.yang.model.api.ChoiceNode; +import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -95,8 +96,10 @@ import org.opendaylight.yangtools.yang.model.api.UsesNode; import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition; +import org.opendaylight.yangtools.yang.model.util.BaseTypes; import org.opendaylight.yangtools.yang.model.util.DataNodeIterator; import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; +import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils; import org.opendaylight.yangtools.yang.model.util.UnionType; import org.opendaylight.yangtools.yang.parser.builder.util.Comparators; import org.opendaylight.yangtools.yang.parser.util.ModuleDependencySort; @@ -105,9 +108,29 @@ import org.slf4j.LoggerFactory; 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'; + private static final String QNAME_FQCN = QName.class.getName(); + + /** + * 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 @@ -128,18 +151,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"; - - private final char NEW_LINE = '\n'; - - private final char TAB = '\t'; + public BindingGeneratorImpl(final boolean verboseClassComments) { + this.verboseClassComments = verboseClassComments; + } /** * Resolves generated types from context schema nodes of all @@ -187,7 +215,7 @@ public class BindingGeneratorImpl implements BindingGenerator { * * @throws IllegalArgumentException * */ private void choiceToGeneratedType(final Module module, final String basePackageName, - final GeneratedTypeBuilder parent, final ChoiceNode choiceNode) { + final GeneratedTypeBuilder parent, final ChoiceSchemaNode choiceNode) { checkArgument(basePackageName != null, "Base Package Name cannot be NULL."); checkArgument(choiceNode != null, "Choice Schema Node cannot be NULL."); @@ -1170,7 +1201,7 @@ public class BindingGeneratorImpl implements BindingGenerator { * */ private void generateTypesFromChoiceCases(final Module module, final String basePackageName, - final Type refChoiceType, final ChoiceNode choiceNode) { + final Type refChoiceType, final ChoiceSchemaNode 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."); @@ -1180,19 +1211,17 @@ public class BindingGeneratorImpl implements BindingGenerator { return; } - for (ChoiceCaseNode caseNode : caseNodes) { + for (final ChoiceCaseNode caseNode : caseNodes) { if (caseNode != null && !caseNode.isAddedByUses() && !caseNode.isAugmenting()) { final String packageName = packageNameForGeneratedType(basePackageName, caseNode.getPath()); - final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode); - addImplementedInterfaceFromUses(caseNode, caseTypeBuilder); + final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode, module); caseTypeBuilder.addImplementsType(refChoiceType); genCtx.get(module).addCaseType(caseNode.getPath(), caseTypeBuilder); genCtx.get(module).addChoiceToCaseMapping(refChoiceType, caseTypeBuilder, caseNode); final Iterable caseChildNodes = caseNode.getChildNodes(); if (caseChildNodes != null) { - Object parentNode = null; final SchemaPath nodeSp = choiceNode.getPath(); - parentNode = findDataSchemaNode(schemaContext, nodeSp.getParent()); + final Object parentNode = findDataSchemaNode(schemaContext, nodeSp.getParent()); SchemaNode parent; if (parentNode instanceof AugmentationSchema) { @@ -1215,6 +1244,7 @@ public class BindingGeneratorImpl implements BindingGenerator { final SchemaPath sp = choiceNode.getPath(); parent = findDataSchemaNode(schemaContext, sp.getParent()); } + Preconditions.checkState(parent != null, "Could not find Choice node parent "+choiceNode.getPath().getParent()); GeneratedTypeBuilder childOfType = findChildNodeByPath(parent.getPath()); if (childOfType == null) { childOfType = findGroupingByPath(parent.getPath()); @@ -1222,7 +1252,6 @@ public class BindingGeneratorImpl implements BindingGenerator { resolveDataSchemaNodes(module, basePackageName, caseTypeBuilder, childOfType, caseChildNodes); } } - processUsesAugments(caseNode, module); } } @@ -1255,15 +1284,15 @@ public class BindingGeneratorImpl implements BindingGenerator { * */ private void generateTypesFromAugmentedChoiceCases(final Module module, final String basePackageName, - final Type targetType, final ChoiceNode targetNode, final Iterable augmentedNodes) { + final Type targetType, final ChoiceSchemaNode 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."); - for (DataSchemaNode caseNode : augmentedNodes) { + for (final DataSchemaNode caseNode : augmentedNodes) { if (caseNode != null) { final String packageName = packageNameForGeneratedType(basePackageName, caseNode.getPath()); - final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode); + final GeneratedTypeBuilder caseTypeBuilder = addDefaultInterfaceDefinition(packageName, caseNode, module); caseTypeBuilder.addImplementsType(targetType); SchemaNode parent = null; @@ -1311,6 +1340,8 @@ public class BindingGeneratorImpl implements BindingGenerator { * @param leaf * leaf schema node which is mapped as getter method which is * added to typeBuilder + * @param module + * Module in which type was defined * @return boolean value *
    *
  • false - if leaf or typeBuilder are @@ -1318,7 +1349,7 @@ public class BindingGeneratorImpl implements BindingGenerator { *
  • true - in other cases
  • *
*/ - private Type resolveLeafSchemaNodeAsMethod(final GeneratedTypeBuilder typeBuilder, final LeafSchemaNode leaf) { + private Type resolveLeafSchemaNodeAsMethod(final GeneratedTypeBuilder typeBuilder, final LeafSchemaNode leaf, Module module) { Type returnType = null; if ((leaf != null) && (typeBuilder != null)) { final String leafName = leaf.getQName().getLocalName(); @@ -1336,7 +1367,7 @@ public class BindingGeneratorImpl implements BindingGenerator { returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf); final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDef; final EnumBuilder enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, leaf.getQName(), - typeBuilder); + typeBuilder,module); if (enumBuilder != null) { returnType = enumBuilder.toInstance(typeBuilder); @@ -1367,20 +1398,20 @@ public class BindingGeneratorImpl implements BindingGenerator { private void processContextRefExtension(final LeafSchemaNode leaf, final MethodSignatureBuilder getter, final Module module) { - for (UnknownSchemaNode node : leaf.getUnknownSchemaNodes()) { + for (final 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 = BindingMapping.getRootPackageName(module.getQNameModule()); } else if (length == 2) { - String prefix = iterator.next(); + final String prefix = iterator.next(); final Module dependentModule = findModuleFromImports(module.getImports(), prefix); if (dependentModule == null) { throw new IllegalArgumentException("Failed to process context-reference: unknown prefix " @@ -1408,7 +1439,7 @@ public class BindingGeneratorImpl implements BindingGenerator { } private IdentitySchemaNode findIdentityByName(final Set identities, final String name) { - for (IdentitySchemaNode id : identities) { + for (final IdentitySchemaNode id : identities) { if (id.getQName().getLocalName().equals(name)) { return id; } @@ -1417,7 +1448,7 @@ public class BindingGeneratorImpl implements BindingGenerator { } private Module findModuleFromImports(final Set imports, final String prefix) { - for (ModuleImport imp : imports) { + for (final ModuleImport imp : imports) { if (imp.getPrefix().equals(prefix)) { return schemaContext.findModuleByName(imp.getModuleName(), imp.getRevision()); } @@ -1433,23 +1464,27 @@ public class BindingGeneratorImpl implements BindingGenerator { if (leafDesc == null) { leafDesc = ""; } - - if (leafName != null) { - Type returnType = null; - final TypeDefinition typeDef = leaf.getType(); - if (typeDef instanceof UnionTypeDefinition) { - // GeneratedType for this type definition should be already - // created - QName qname = typeDef.getQName(); - Module unionModule = schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(), - qname.getRevision()); - final ModuleContext mc = genCtx.get(unionModule); - returnType = mc.getTypedefs().get(typeDef.getPath()); - } else { - returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf); - } - return resolveLeafSchemaNodeAsProperty(toBuilder, leaf, returnType, isReadOnly); + Type returnType = null; + final TypeDefinition typeDef = leaf.getType(); + if (typeDef instanceof UnionTypeDefinition) { + // GeneratedType for this type definition should be already + // created + final QName qname = typeDef.getQName(); + final Module unionModule = schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(), + qname.getRevision()); + final ModuleContext mc = genCtx.get(unionModule); + returnType = mc.getTypedefs().get(typeDef.getPath()); + } else if (typeDef instanceof EnumTypeDefinition && BaseTypes.ENUMERATION_QNAME.equals(typeDef.getQName())) { + // Annonymous enumeration (already generated, since it is inherited via uses). + LeafSchemaNode originalLeaf = (LeafSchemaNode) SchemaNodeUtils.getRootOriginalIfPossible(leaf); + QName qname = originalLeaf.getQName(); + final Module enumModule = schemaContext.findModuleByNamespaceAndRevision(qname.getNamespace(), + qname.getRevision()); + returnType = genCtx.get(enumModule).getInnerType(originalLeaf.getType().getPath()); + } else { + returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, leaf); } + return resolveLeafSchemaNodeAsProperty(toBuilder, leaf, returnType, isReadOnly); } return false; } @@ -1482,7 +1517,7 @@ public class BindingGeneratorImpl implements BindingGenerator { } final String leafName = leaf.getQName().getLocalName(); final String leafDesc = leaf.getDescription(); - final GeneratedPropertyBuilder propBuilder = toBuilder.addProperty(parseToValidParamName(leafName)); + final GeneratedPropertyBuilder propBuilder = toBuilder.addProperty(BindingMapping.getPropertyName(leafName)); propBuilder.setReadOnly(isReadOnly); propBuilder.setReturnType(returnType); propBuilder.setComment(leafDesc); @@ -1502,6 +1537,7 @@ public class BindingGeneratorImpl implements BindingGenerator { * @param node * leaf list schema node which is added to * typeBuilder as getter method + * @param module * @return boolean value *
    *
  • true - if node, typeBuilder, @@ -1509,7 +1545,7 @@ public class BindingGeneratorImpl implements BindingGenerator { *
  • false - other cases
  • *
*/ - private boolean resolveLeafListSchemaNode(final GeneratedTypeBuilder typeBuilder, final LeafListSchemaNode node) { + private boolean resolveLeafListSchemaNode(final GeneratedTypeBuilder typeBuilder, final LeafListSchemaNode node, Module module) { if ((node != null) && (typeBuilder != null)) { final QName nodeName = node.getQName(); @@ -1522,7 +1558,7 @@ public class BindingGeneratorImpl implements BindingGenerator { returnType = typeProvider.javaTypeForSchemaDefinitionType(typeDef, node); final EnumTypeDefinition enumTypeDef = (EnumTypeDefinition) typeDef; final EnumBuilder enumBuilder = resolveInnerEnumFromTypeDefinition(enumTypeDef, nodeName, - typeBuilder); + typeBuilder,module); returnType = new ReferencedTypeImpl(enumBuilder.getPackageName(), enumBuilder.getName()); ((TypeProviderImpl) typeProvider).putReferencedType(node.getPath(), returnType); } else if (typeDef instanceof UnionType) { @@ -1560,10 +1596,11 @@ public class BindingGeneratorImpl implements BindingGenerator { genTOBuilder.setIsUnion(true); ((TypeProviderImpl) typeProvider).addUnitsToGenTO(genTOBuilder, typeDef.getUnits()); - // union builder - final GeneratedTOBuilder unionBuilder = new GeneratedTOBuilderImpl(typeBuilder.getPackageName(), - genTOBuilder.getName() + "Builder"); - unionBuilder.setIsUnionBuilder(true); + + + final GeneratedTOBuilder unionBuilder = createUnionBuilder(genTOBuilder,typeBuilder); + + final MethodSignatureBuilder method = unionBuilder.addMethod("getDefaultInstance"); method.setReturnType(returnType); method.addParameter(Types.STRING, "defaultValue"); @@ -1580,8 +1617,25 @@ public class BindingGeneratorImpl implements BindingGenerator { return returnType.toInstance(); } - private GeneratedTypeBuilder addDefaultInterfaceDefinition(final String packageName, final SchemaNode schemaNode) { - return addDefaultInterfaceDefinition(packageName, schemaNode, null); + private GeneratedTOBuilder createUnionBuilder(final GeneratedTOBuilder genTOBuilder, final GeneratedTypeBuilder typeBuilder) { + + final String outerCls = Types.getOuterClassName(genTOBuilder); + final StringBuilder name; + if(outerCls != null) { + name = new StringBuilder(outerCls); + } else { + name = new StringBuilder(); + } + name.append(genTOBuilder.getName()); + name.append("Builder"); + final GeneratedTOBuilderImpl unionBuilder = new GeneratedTOBuilderImpl(typeBuilder.getPackageName(),name.toString()); + unionBuilder.setIsUnionBuilder(true); + return unionBuilder; + } + + private GeneratedTypeBuilder addDefaultInterfaceDefinition(final String packageName, final SchemaNode schemaNode, + final Module module) { + return addDefaultInterfaceDefinition(packageName, schemaNode, null, module); } /** @@ -1589,10 +1643,10 @@ public class BindingGeneratorImpl implements BindingGenerator { * schemaNode. * * The new builder always implements - * {@link org.opendaylight.yangtools.yang.binding.DataObject DataObject}.
+ * {@link org.opendaylight.yangtools.yang.binding.DataObject DataObject}.
* If schemaNode is instance of GroupingDefinition it also * implements {@link org.opendaylight.yangtools.yang.binding.Augmentable - * Augmentable}.
+ * Augmentable}.
* If schemaNode is instance of * {@link org.opendaylight.yangtools.yang.model.api.DataNodeContainer * DataNodeContainer} it can also implement nodes which are specified in @@ -1608,7 +1662,7 @@ public class BindingGeneratorImpl implements BindingGenerator { * @return generated type builder schemaNode */ private GeneratedTypeBuilder addDefaultInterfaceDefinition(final String packageName, final SchemaNode schemaNode, - final Type parent) { + final Type parent, final Module module) { final GeneratedTypeBuilder it = addRawInterfaceDefinition(packageName, schemaNode, ""); if (parent == null) { it.addImplementsType(DATA_OBJECT); @@ -1619,6 +1673,11 @@ public class BindingGeneratorImpl implements BindingGenerator { it.addImplementsType(augmentable(it)); } + if (schemaNode instanceof DataNodeContainer) { + groupingsToGenTypes(module, ((DataNodeContainer) schemaNode).getGroupings()); + addImplementedInterfaceFromUses((DataNodeContainer) schemaNode, it); + } + return it; } @@ -1716,7 +1775,7 @@ public class BindingGeneratorImpl implements BindingGenerator { } else { method.append("get"); } - String name = BindingMapping.toFirstUpper(BindingMapping.getPropertyName(localName)); + final String name = BindingMapping.toFirstUpper(BindingMapping.getPropertyName(localName)); method.append(name); return method.toString(); } @@ -1784,7 +1843,7 @@ public class BindingGeneratorImpl implements BindingGenerator { if (schemaNode instanceof LeafSchemaNode) { final LeafSchemaNode leaf = (LeafSchemaNode) schemaNode; final String leafName = leaf.getQName().getLocalName(); - final Type type = resolveLeafSchemaNodeAsMethod(typeBuilder, leaf); + final Type type = resolveLeafSchemaNodeAsMethod(typeBuilder, leaf,module); if (listKeys.contains(leafName)) { if (type == null) { resolveLeafSchemaNodeAsProperty(genTOBuilder, leaf, true, module); @@ -1794,11 +1853,11 @@ public class BindingGeneratorImpl implements BindingGenerator { } } else if (!schemaNode.isAddedByUses()) { if (schemaNode instanceof LeafListSchemaNode) { - resolveLeafListSchemaNode(typeBuilder, (LeafListSchemaNode) schemaNode); + resolveLeafListSchemaNode(typeBuilder, (LeafListSchemaNode) schemaNode, module); } else if (schemaNode instanceof ContainerSchemaNode) { containerToGenType(module, basePackageName, typeBuilder, typeBuilder, (ContainerSchemaNode) schemaNode); - } else if (schemaNode instanceof ChoiceNode) { - choiceToGeneratedType(module, basePackageName, typeBuilder, (ChoiceNode) schemaNode); + } else if (schemaNode instanceof ChoiceSchemaNode) { + choiceToGeneratedType(module, basePackageName, typeBuilder, (ChoiceSchemaNode) schemaNode); } else if (schemaNode instanceof ListSchemaNode) { listToGenType(module, basePackageName, typeBuilder, typeBuilder, (ListSchemaNode) schemaNode); } @@ -1810,7 +1869,7 @@ public class BindingGeneratorImpl implements BindingGenerator { checkArgument(typeBuilder != null, "Generated Type Builder cannot be NULL."); if (genTOBuilder != null) { - GeneratedTransferObject genTO = genTOBuilder.toInstance(); + final GeneratedTransferObject genTO = genTOBuilder.toInstance(); constructGetter(typeBuilder, "key", "Returns Primary Key of Yang List Type", genTO); genCtx.get(module).addGeneratedTOBuilder(genTOBuilder); } @@ -1829,9 +1888,9 @@ public class BindingGeneratorImpl implements BindingGenerator { private List listKeys(final ListSchemaNode list) { final List listKeys = new ArrayList<>(); - List keyDefinition = list.getKeyDefinition(); + final List keyDefinition = list.getKeyDefinition(); if (keyDefinition != null) { - for (QName keyDef : keyDefinition) { + for (final QName keyDef : keyDefinition) { listKeys.add(keyDef.getLocalName()); } } @@ -1894,15 +1953,16 @@ public class BindingGeneratorImpl implements BindingGenerator { genTOBuilders.addAll(types); GeneratedTOBuilder resultTOBuilder = null; - if (!types.isEmpty()) { - resultTOBuilder = types.remove(0); - for (GeneratedTOBuilder genTOBuilder : types) { - resultTOBuilder.addEnclosingTransferObject(genTOBuilder); - } + if (types.isEmpty()) { + throw new IllegalStateException("No GeneratedTOBuilder objects generated from union " + typeDef); + } + resultTOBuilder = types.remove(0); + for (final GeneratedTOBuilder genTOBuilder : types) { + resultTOBuilder.addEnclosingTransferObject(genTOBuilder); } final GeneratedPropertyBuilder genPropBuilder = resultTOBuilder.addProperty("value"); - genPropBuilder.setReturnType(Types.primitiveType("char[]", null)); + genPropBuilder.setReturnType(Types.CHAR_ARRAY); resultTOBuilder.addEqualsIdentity(genPropBuilder); resultTOBuilder.addHashIdentity(genPropBuilder); resultTOBuilder.addToStringProperty(genPropBuilder); @@ -1912,7 +1972,7 @@ public class BindingGeneratorImpl implements BindingGenerator { packageName, typeDef, classNameFromLeaf, parentModule.getName())); } if (genTOBuilders != null && !genTOBuilders.isEmpty()) { - for (GeneratedTOBuilder genTOBuilder : genTOBuilders) { + for (final GeneratedTOBuilder genTOBuilder : genTOBuilders) { typeBuilder.addEnclosingTransferObject(genTOBuilder); } return genTOBuilders.get(0); @@ -1939,7 +1999,7 @@ public class BindingGeneratorImpl implements BindingGenerator { */ private GeneratedTypeBuilder addImplementedInterfaceFromUses(final DataNodeContainer dataNodeContainer, final GeneratedTypeBuilder builder) { - for (UsesNode usesNode : dataNodeContainer.getUses()) { + for (final UsesNode usesNode : dataNodeContainer.getUses()) { if (usesNode.getGroupingPath() != null) { final GeneratedType genType = findGroupingByPath(usesNode.getGroupingPath()).toInstance(); if (genType == null) { @@ -1966,89 +2026,91 @@ public class BindingGeneratorImpl implements BindingGenerator { private String createDescription(final Set schemaNodes, final String moduleName, final String moduleSourcePath) { final StringBuilder sb = new StringBuilder(); - final String yangSnipet = YangTemplate.generateYangSnipet(schemaNodes); 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) { + } 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("
(Source path: "); sb.append(moduleSourcePath); sb.append("):"); sb.append(NEW_LINE); - sb.append("
");
-        sb.append(NEW_LINE);
-        sb.append(yangSnipet);
-        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 Module module = findParentModule(schemaContext, schemaNode); - final String yangSnipet = YangTemplate.generateYangSnipet(schemaNode); final String formattedDescription = YangTemplate.formatToParagraph(schemaNode.getDescription(), 0); - final StringBuilder linkToBuilderClass = new StringBuilder(); - final StringBuilder linkToKeyClass = new StringBuilder(); - final Splitter splitter = Splitter.on("\\."); - final String[] namespace = Iterables.toArray(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"); - } - } if (!isNullOrEmpty(formattedDescription)) { sb.append(formattedDescription); sb.append(NEW_LINE); } - 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(yangSnipet);
-        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)) { + if (verboseClassComments) { + final Module module = findParentModule(schemaContext, schemaNode); + final StringBuilder linkToBuilderClass = new StringBuilder(); + final String[] namespace = Iterables.toArray(BSDOT_SPLITTER.split(fullyQualifiedName), String.class); + final String className = namespace[namespace.length - 1]; + + if (hasBuilderClass(schemaNode)) { + linkToBuilderClass.append(className); + linkToBuilderClass.append("Builder"); + } + + 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("

To create instances of this class use " + "{@link " + linkToBuilderClass + "}."); + sb.append(YangTemplate.generateYangSnipet(schemaNode)); + sb.append("

"); sb.append(NEW_LINE); - sb.append("@see "); - sb.append(linkToBuilderClass); - if (schemaNode instanceof ListSchemaNode) { + 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(linkToKeyClass); + sb.append(linkToBuilderClass); + sb.append(NEW_LINE); + if (schemaNode instanceof ListSchemaNode) { + final List keyDef = ((ListSchemaNode)schemaNode).getKeyDefinition(); + if (keyDef != null && !keyDef.isEmpty()) { + sb.append("@see "); + sb.append(className); + sb.append("Key"); + } + sb.append(NEW_LINE); + } } - sb.append(NEW_LINE); } return sb.toString(); @@ -2068,33 +2130,35 @@ public class BindingGeneratorImpl implements BindingGenerator { private String createDescription(final Module module) { final StringBuilder sb = new StringBuilder(); - final String yangSnipet = YangTemplate.generateYangSnipet(module); final String formattedDescription = YangTemplate.formatToParagraph(module.getDescription(), 0); if (!isNullOrEmpty(formattedDescription)) { sb.append(formattedDescription); sb.append(NEW_LINE); } - 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(yangSnipet);
-        sb.append("
"); + + 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); + for (final ModuleContext ctx : genCtx.values()) { + final GeneratedTypeBuilder result = ctx.getChildNode(path); if (result != null) { return result; } @@ -2103,8 +2167,8 @@ public class BindingGeneratorImpl implements BindingGenerator { } private GeneratedTypeBuilder findGroupingByPath(final SchemaPath path) { - for (ModuleContext ctx : genCtx.values()) { - GeneratedTypeBuilder result = ctx.getGrouping(path); + for (final ModuleContext ctx : genCtx.values()) { + final GeneratedTypeBuilder result = ctx.getGrouping(path); if (result != null) { return result; } @@ -2113,8 +2177,8 @@ public class BindingGeneratorImpl implements BindingGenerator { } private GeneratedTypeBuilder findCaseByPath(final SchemaPath path) { - for (ModuleContext ctx : genCtx.values()) { - GeneratedTypeBuilder result = ctx.getCase(path); + for (final ModuleContext ctx : genCtx.values()) { + final GeneratedTypeBuilder result = ctx.getCase(path); if (result != null) { return result; }