From: Tony Tkacik Date: Mon, 25 Aug 2014 10:25:30 +0000 (+0000) Subject: Merge changes If1e9a750,Ib530560c,Id01393c3,I2d375382,Id60447ef,I350611fb,I0dbd80db X-Git-Tag: release/beryllium~377 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=f6cfd5ebb36e6c59c69fc234bf974475d45ca4ab;hp=8e1e09f3b4caf94cb5a4586f545f3a18ab6cf573;p=mdsal.git Merge changes If1e9a750,Ib530560c,Id01393c3,I2d375382,Id60447ef,I350611fb,I0dbd80db * changes: BUG-1611: make sure runtime components create short comments BUG-1611: force maven plugin generating verbose comments BUG-1611: make verbose comments optional BUG-1611: use CharMatcher to remove characters BUG-1611: drop a FIXME for thread-safety BUG-1611: do not instantiate splitters needlessly BUG-1611: fix SimpleDateFormat --- 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 9c66f8d6a6..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 @@ -30,6 +30,7 @@ import static org.opendaylight.yangtools.yang.model.util.SchemaContextUtil.findP 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; @@ -38,6 +39,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; + import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil; import org.opendaylight.yangtools.binding.generator.util.BindingTypes; import org.opendaylight.yangtools.binding.generator.util.ReferencedTypeImpl; @@ -105,9 +107,28 @@ 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'; + + /** + * 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 +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"; - - 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 @@ -617,7 +643,6 @@ public class BindingGeneratorImpl implements BindingGenerator { newType.setDescription(createDescription(identity, newType.getFullyQualifiedName())); newType.setReference(identity.getReference()); newType.setModuleName(module.getName()); - SchemaPath path = identity.getPath(); newType.setSchemaPath(identity.getPath().getPathFromRoot()); final QName qname = identity.getQName(); @@ -1368,7 +1393,7 @@ public class BindingGeneratorImpl implements BindingGenerator { 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) { @@ -1965,15 +1990,13 @@ 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 + ""); } } @@ -1982,72 +2005,77 @@ public class BindingGeneratorImpl implements BindingGenerator { 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 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("

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

");
             sb.append(NEW_LINE);
-            sb.append("@see ");
-            sb.append(linkToBuilderClass);
-            if (schemaNode instanceof ListSchemaNode) {
+            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(linkToKeyClass); + sb.append(linkToBuilderClass); + if (schemaNode instanceof ListSchemaNode) { + sb.append("@see "); + sb.append(linkToKeyClass); + } + sb.append(NEW_LINE); } - sb.append(NEW_LINE); } return sb.toString(); @@ -2067,26 +2095,28 @@ 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(); } diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java index da757095d6..29a532228d 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java @@ -13,6 +13,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; + import java.net.URI; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; @@ -27,8 +28,11 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; + import javassist.ClassPool; + import javax.annotation.concurrent.GuardedBy; + import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil; import org.opendaylight.yangtools.binding.generator.util.ReferencedTypeImpl; import org.opendaylight.yangtools.binding.generator.util.Types; @@ -134,7 +138,7 @@ SchemaLock, AutoCloseable, SchemaContextHolder, TypeResolver { @GuardedBy("this") private void recreateBindingContext(final SchemaContext schemaContext) { - BindingGeneratorImpl newBinding = new BindingGeneratorImpl(); + BindingGeneratorImpl newBinding = new BindingGeneratorImpl(false); newBinding.generateTypes(schemaContext); for (Map.Entry entry : newBinding.getModuleContexts().entrySet()) { diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/YangTemplate.xtend b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/YangTemplate.xtend index 98d7ef1d9e..d0ad08c36b 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/YangTemplate.xtend +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/YangTemplate.xtend @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.sal.binding.generator.impl -import java.text.SimpleDateFormat import java.util.Collection import java.util.Date import java.util.List @@ -40,11 +39,16 @@ import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode import org.opendaylight.yangtools.yang.model.api.UsesNode import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair +import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil +import com.google.common.base.CharMatcher class YangTemplate { + // FIXME: this is not thread-safe and seems to be unused! private static var Module module = null + private static val CharMatcher NEWLINE_OR_TAB = CharMatcher.anyOf("\n\t") + def static String generateYangSnipet(SchemaNode schemaNode) { if (schemaNode == null) return '' @@ -121,16 +125,11 @@ class YangTemplate { ''' } - def static formatDate(Date moduleRevision) { - val SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd") - return dateFormat.format(moduleRevision) - } - def static writeRevision(Date moduleRevision, String moduleDescription) { val revisionIndent = 12 ''' - revision «formatDate(moduleRevision)» { + revision «SimpleDateFormatUtil.getRevisionFormat.format(moduleRevision)» { description "«formatToParagraph(moduleDescription, revisionIndent)»"; } ''' @@ -736,8 +735,7 @@ class YangTemplate { val lineIndent = computeNextLineIndent(nextLineIndent); formattedText = formattedText.replace("*/", "*/"); - formattedText = formattedText.replace("\n", ""); - formattedText = formattedText.replace("\t", ""); + formattedText = NEWLINE_OR_TAB.removeFrom(formattedText); formattedText = formattedText.replaceAll(" +", " "); val StringTokenizer tokenizer = new StringTokenizer(formattedText, " ", true); @@ -785,8 +783,7 @@ class YangTemplate { val ns = pathElement.namespace val localName = pathElement.localName - sb.append("\\") - sb.append('(') + sb.append("\\(") sb.append(ns) sb.append(')') sb.append(localName) diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/BindingRuntimeContext.java b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/BindingRuntimeContext.java index 1b40b8895c..a69e30ea1f 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/BindingRuntimeContext.java +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/BindingRuntimeContext.java @@ -77,7 +77,7 @@ public class BindingRuntimeContext implements Immutable { this.strategy = strategy; this.schemaContext = schema; - BindingGeneratorImpl generator = new BindingGeneratorImpl(); + BindingGeneratorImpl generator = new BindingGeneratorImpl(false); generator.generateTypes(schema); Map modules = generator.getModuleContexts(); diff --git a/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/maven/sal/api/gen/plugin/CodeGeneratorImpl.java b/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/maven/sal/api/gen/plugin/CodeGeneratorImpl.java index a2b60e89d3..99f426dcc6 100644 --- a/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/maven/sal/api/gen/plugin/CodeGeneratorImpl.java +++ b/code-generator/maven-sal-api-gen-plugin/src/main/java/org/opendaylight/yangtools/maven/sal/api/gen/plugin/CodeGeneratorImpl.java @@ -11,6 +11,18 @@ import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet.Builder; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.apache.maven.plugin.logging.Log; import org.apache.maven.project.MavenProject; import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil; @@ -29,17 +41,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonatype.plexus.build.incremental.BuildContext; -import java.io.BufferedWriter; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; - public final class CodeGeneratorImpl implements CodeGenerator, BuildContextAware { private static final String FS = File.separator; private BuildContext buildContext; @@ -57,7 +58,7 @@ public final class CodeGeneratorImpl implements CodeGenerator, BuildContextAware outputBaseDir = outputDir == null ? getDefaultOutputBaseDir() : outputDir; - final BindingGenerator bindingGenerator = new BindingGeneratorImpl(); + final BindingGenerator bindingGenerator = new BindingGeneratorImpl(true); final List types = bindingGenerator.generateTypes(context, yangModules); final GeneratorJavaFile generator = new GeneratorJavaFile(buildContext, types); @@ -78,8 +79,8 @@ public final class CodeGeneratorImpl implements CodeGenerator, BuildContextAware return result; } - private Collection generateModuleInfos(File outputBaseDir, Set yangModules, - SchemaContext context) { + private Collection generateModuleInfos(final File outputBaseDir, final Set yangModules, + final SchemaContext context) { Builder result = ImmutableSet.builder(); Builder bindingProviders = ImmutableSet.builder(); for (Module module : yangModules) { @@ -96,8 +97,8 @@ public final class CodeGeneratorImpl implements CodeGenerator, BuildContextAware return result.build(); } - private File writeMetaInfServices(File outputBaseDir, Class serviceClass, - ImmutableSet services) { + private File writeMetaInfServices(final File outputBaseDir, final Class serviceClass, + final ImmutableSet services) { File metainfServicesFolder = new File(outputBaseDir, "META-INF" + File.separator + "services"); metainfServicesFolder.mkdirs(); File serviceFile = new File(metainfServicesFolder, serviceClass.getName()); @@ -118,38 +119,38 @@ public final class CodeGeneratorImpl implements CodeGenerator, BuildContextAware return outputBaseDir; } - private static void setOutputBaseDirAsSourceFolder(File outputBaseDir, MavenProject mavenProject) { + private static void setOutputBaseDirAsSourceFolder(final File outputBaseDir, final MavenProject mavenProject) { Preconditions.checkNotNull(mavenProject, "Maven project needs to be set in this phase"); mavenProject.addCompileSourceRoot(outputBaseDir.getPath()); } @Override - public void setLog(Log log) { + public void setLog(final Log log) { } @Override - public void setAdditionalConfig(Map additionalConfiguration) { + public void setAdditionalConfig(final Map additionalConfiguration) { this.additionalConfig = additionalConfiguration; } @Override - public void setResourceBaseDir(File resourceBaseDir) { + public void setResourceBaseDir(final File resourceBaseDir) { this.resourceBaseDir = resourceBaseDir; } @Override - public void setMavenProject(MavenProject project) { + public void setMavenProject(final MavenProject project) { this.mavenProject = project; this.projectBaseDir = project.getBasedir(); } @Override - public void setBuildContext(BuildContext buildContext) { + public void setBuildContext(final BuildContext buildContext) { this.buildContext = Preconditions.checkNotNull(buildContext); } - private Set generateYangModuleInfo(File outputBaseDir, Module module, SchemaContext ctx, - Builder providerSourceSet) { + private Set generateYangModuleInfo(final File outputBaseDir, final Module module, final SchemaContext ctx, + final Builder providerSourceSet) { Builder generatedFiles = ImmutableSet. builder(); final YangModuleInfoTemplate template = new YangModuleInfoTemplate(module, ctx); @@ -171,7 +172,7 @@ public final class CodeGeneratorImpl implements CodeGenerator, BuildContextAware } - private File writeJavaSource(File packageDir, String className, String source) { + private File writeJavaSource(final File packageDir, final String className, final String source) { if (!packageDir.exists()) { packageDir.mkdirs(); } @@ -180,7 +181,7 @@ public final class CodeGeneratorImpl implements CodeGenerator, BuildContextAware return file; } - private File writeFile(File file, String source) { + private File writeFile(final File file, final String source) { try (final OutputStream stream = buildContext.newFileOutputStream(file)) { try (final Writer fw = new OutputStreamWriter(stream)) { try (final BufferedWriter bw = new BufferedWriter(fw)) {