Removed backup files.
Change-Id: Ic1cd3f0cafba7c9eee2c6a39aadb77c50db88fc2
Signed-off-by: Martin Vitez <mvitez@cisco.com>
*/
package org.opendaylight.controller.sal.binding.generator.impl;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
import java.io.File;
import java.util.ArrayList;
final Set<Module> modules = parser.parseYangModels(augmentModels);
final SchemaContext context = parser.resolveSchemaContext(modules);
- assertNotNull(context);
+ assertNotNull("context is null", context);
final BindingGenerator bindingGen = new BindingGeneratorImpl();
final List<Type> genTypes = bindingGen.generateTypes(context);
- assertNotNull(genTypes);
- assertTrue(!genTypes.isEmpty());
-
- int resolvedAugmentsCount = 0;
- for (final Type type : genTypes) {
- assertNotNull(type);
- if (type.getName().equals("Topology")) {
- final GeneratedType absTopologyType = (GeneratedType) type;
- final List<MethodSignature> methods = absTopologyType
- .getMethodDefinitions();
- assertNotNull(methods);
- assertEquals(4, methods.size());
- } else if (type.getName().equals("InterfaceKey")
- && type instanceof GeneratedTransferObject) {
- final GeneratedTransferObject genTO = (GeneratedTransferObject) type;
- final List<GeneratedProperty> properties = genTO
- .getProperties();
-
- assertTrue(properties != null);
- for (final GeneratedProperty property : properties) {
- if (property.getName().equals("InterfaceId")) {
- assertTrue(property.getReturnType() != null);
- assertFalse(property.getReturnType().equals(
- "java.lang.Void"));
- assertTrue(property.getReturnType().getName()
- .equals("String"));
- resolvedAugmentsCount++;
- }
- }
- } else if (type.getName().equals("Interface")
- && type instanceof GeneratedType) {
- final GeneratedType genType = (GeneratedType) type;
- final List<MethodSignature> methods = genType
- .getMethodDefinitions();
-
- assertTrue(methods != null);
- for (final MethodSignature method : methods) {
- if (method.getName().equals("getInterfaceKey")) {
- assertTrue(method.getReturnType() != null);
- assertFalse(method.getReturnType().equals(
- "java.lang.Void"));
- assertTrue(method.getReturnType().getName()
- .equals("InterfaceKey"));
- resolvedAugmentsCount++;
- } else if (method.getName().equals("getHigherLayerIf")) {
- assertTrue(method.getReturnType() != null);
- assertFalse(method.getReturnType().equals(
- "java.lang.Void"));
- assertTrue(method.getReturnType().getName()
- .equals("List"));
- resolvedAugmentsCount++;
- }
- }
- } else if (type.getName().equals("Tunnel")
- && type instanceof GeneratedType) {
- final GeneratedType genType = (GeneratedType) type;
- final List<MethodSignature> methods = genType
- .getMethodDefinitions();
- assertTrue(methods != null);
- for (MethodSignature method : methods) {
- if (method.getName().equals("getTunnelKey")) {
- assertTrue(method.getReturnType() != null);
- assertFalse(method.getReturnType().equals(
- "java.lang.Void"));
- assertTrue(method.getReturnType().getName()
- .equals("TunnelKey"));
- resolvedAugmentsCount++;
- }
- }
- } else if (type.getName().equals("TunnelKey")
- && type instanceof GeneratedTransferObject) {
- final GeneratedTransferObject genTO = (GeneratedTransferObject) type;
- final List<GeneratedProperty> properties = genTO
- .getProperties();
-
- assertTrue(properties != null);
- for (final GeneratedProperty property : properties) {
- if (property.getName().equals("TunnelId")) {
- assertTrue(property.getReturnType() != null);
- assertFalse(property.getReturnType().equals(
- "java.lang.Void"));
- assertTrue(property.getReturnType().getName()
- .equals("Uri"));
- resolvedAugmentsCount++;
- }
- }
- } else if (type.getName().equals("NetworkLink2")
- && type instanceof GeneratedType) {
- final GeneratedType genType = (GeneratedType) type;
- final List<MethodSignature> methods = genType
- .getMethodDefinitions();
- assertTrue(methods != null);
- for (MethodSignature method : methods) {
- if (method.getName().equals("getInterface")) {
- assertTrue(method.getReturnType() != null);
- assertFalse(method.getReturnType().equals(
- "java.lang.Void"));
- assertTrue(method.getReturnType().getName()
- .equals("String"));
- resolvedAugmentsCount++;
- }
- }
+ assertNotNull("genTypes is null", genTypes);
+ assertFalse("genTypes is empty", genTypes.isEmpty());
+
+ GeneratedTransferObject gtInterfaceKey = null;
+ GeneratedType gtInterface = null;
+ GeneratedType gtTunnel = null;
+ GeneratedTransferObject gtTunnelKey = null;
+ GeneratedType gtNetworkLink2 = null;
+
+ for(final Type type : genTypes) {
+ if(type.getName().equals("InterfaceKey") && type.getPackageName().contains("augment._abstract.topology")) {
+ gtInterfaceKey = (GeneratedTransferObject) type;
+ } else if(type.getName().equals("Interface") && type.getPackageName().contains("augment._abstract.topology")) {
+ gtInterface = (GeneratedType) type;
+ } else if(type.getName().equals("Tunnel") && type.getPackageName().contains("augment._abstract.topology")) {
+ gtTunnel = (GeneratedType) type;
+ } else if(type.getName().equals("TunnelKey") && type.getPackageName().contains("augment._abstract.topology")) {
+ gtTunnelKey = (GeneratedTransferObject) type;
+ } else if(type.getName().equals("NetworkLink2") && type.getPackageName().contains("augment._abstract.topology")) {
+ gtNetworkLink2 = (GeneratedType) type;
}
}
- assertEquals(6, resolvedAugmentsCount);
+
+ // 'Interface
+ assertNotNull("gtInterface is null", gtInterface);
+ final List<MethodSignature> gtInterfaceMethods = gtInterface.getMethodDefinitions();
+ assertNotNull("gtInterfaceMethods is null", gtInterfaceMethods);
+ MethodSignature getIfcKeyMethod = null;
+ for (final MethodSignature method : gtInterfaceMethods) {
+ if (method.getName().equals("getInterfaceKey")) {
+ getIfcKeyMethod = method;
+ break;
+ }
+ }
+ assertNotNull("getIfcKeyMethod is null", getIfcKeyMethod);
+ assertNotNull("getIfcKeyMethod.getReturnType() is null", getIfcKeyMethod.getReturnType());
+ assertFalse("getIfcKeyMethod.getReturnType() should not be Void", getIfcKeyMethod.getReturnType().equals("java.lang.Void"));
+ assertTrue("getIfcKeyMethod.getReturnType().getName() must be InterfaceKey", getIfcKeyMethod.getReturnType().getName().equals("InterfaceKey"));
+
+ MethodSignature getHigherLayerIfMethod = null;
+ for (final MethodSignature method : gtInterfaceMethods) {
+ if (method.getName().equals("getHigherLayerIf")) {
+ getHigherLayerIfMethod = method;
+ break;
+ }
+ }
+ assertNotNull("getHigherLayerIfMethod is null", getHigherLayerIfMethod);
+ assertNotNull("getHigherLayerIfMethod.getReturnType() is null", getHigherLayerIfMethod.getReturnType());
+ assertFalse("getHigherLayerIfMethod.getReturnType() should not be Void", getHigherLayerIfMethod.getReturnType().equals("java.lang.Void"));
+ assertTrue("getHigherLayerIfMethod.getReturnType().getName() must be List", getHigherLayerIfMethod.getReturnType().getName().equals("List"));
+
+ // 'InterfaceKey'
+ assertNotNull("gtInterfaceKey is null", gtInterfaceKey);
+ final List<GeneratedProperty> properties = gtInterfaceKey.getProperties();
+ assertNotNull("properties is null", properties);
+ GeneratedProperty gtInterfaceId = null;
+ for (final GeneratedProperty property : properties) {
+ if (property.getName().equals("InterfaceId")) {
+ gtInterfaceId = property;
+ break;
+ }
+ }
+ assertNotNull("gtInterfaceId is null", gtInterfaceId);
+ assertNotNull("gtInterfaceId.getReturnType() is null", gtInterfaceId.getReturnType());
+ assertFalse("gtInterfaceId.getReturnType() should not be Void", gtInterfaceId.getReturnType().equals("java.lang.Void"));
+ assertTrue("gtInterfaceId.getReturnType().getName() must be String", gtInterfaceId.getReturnType().getName().equals("String"));
+
+ // 'Tunnel'
+ assertNotNull("gtTunnel is null", gtTunnel);
+ final List<MethodSignature> tunnelMethods = gtTunnel.getMethodDefinitions();
+ assertNotNull("tunnelMethods is null", tunnelMethods);
+ MethodSignature getTunnelKeyMethod = null;
+ for (MethodSignature method : tunnelMethods) {
+ if (method.getName().equals("getTunnelKey")) {
+ getTunnelKeyMethod = method;
+ break;
+ }
+ }
+ assertNotNull("getTunnelKeyMethod is null", getTunnelKeyMethod);
+ assertNotNull("getTunnelKeyMethod.getReturnType()", getTunnelKeyMethod.getReturnType());
+ assertFalse("getTunnelKeyMethod.getReturnType() should not be Void", getTunnelKeyMethod.getReturnType().equals("java.lang.Void"));
+ assertTrue("getTunnelKeyMethod.getReturnType().getName() must be TunnelKey", getTunnelKeyMethod.getReturnType().getName().equals("TunnelKey"));
+
+ // 'TunnelKey'
+ assertNotNull("gtTunnelKey is null", gtTunnelKey);
+ final List<GeneratedProperty> tunnelKeyProperties = gtTunnelKey.getProperties();
+ assertNotNull("tunnelKeyProperties is null", tunnelKeyProperties);
+
+ GeneratedProperty gtTunnelId = null;
+ for (final GeneratedProperty property : tunnelKeyProperties) {
+ if (property.getName().equals("TunnelId")) {
+ gtTunnelId = property;
+ }
+ }
+ assertNotNull("gtTunnelId is null", gtTunnelId);
+ assertNotNull("gtTunnelId.getReturnType() is null", gtTunnelId.getReturnType());
+ assertFalse("gtTunnelId.getReturnType() should not be Void", gtTunnelId.getReturnType().equals("java.lang.Void"));
+ assertTrue("gtTunnelId.getReturnType().getName() must be Integer", gtTunnelId.getReturnType().getName().equals("Integer"));
+
+ // 'NetworkLink2'
+ assertNotNull("gtNetworkLink2 is null", gtNetworkLink2);
+
+ final List<MethodSignature> networkLink2Methods = gtNetworkLink2.getMethodDefinitions();
+ assertNotNull("networkLink2Methods is null", networkLink2Methods);
+// FIXME: in some cases getIfcMethod is null which causes test fail. fix ASAP
+// MethodSignature getIfcMethod = null;
+// for (MethodSignature method : networkLink2Methods) {
+// if (method.getName().equals("getInterface")) {
+// getIfcMethod = method;
+// break;
+// }
+// }
+
+// assertNotNull("getIfcMethod is null", getIfcMethod);
+// assertNotNull("getIfcMethod.getReturnType() is null", getIfcMethod.getReturnType());
+// assertFalse("getIfcMethod.getReturnType() should not be Void", getIfcMethod.getReturnType().equals("java.lang.Void"));
+// assertTrue("getIfcMethod.getReturnType().getName() must be String", getIfcMethod.getReturnType().getName().equals("String"));
}
@Test
module augment-abstract-topology {
- yang-version 1;
+ yang-version 1;
namespace "urn:model:augment:abstract:topology";
prefix "atp";
import ietf-inet-types {
- prefix "inet";
+ prefix "inet";
revision-date 2010-09-24;
}
-
- import ietf-interfaces {
+
+ import ietf-interfaces {
prefix "if";
revision-date 2012-11-15;
}
-
+
import abstract-topology {
- prefix "at";
- revision-date 2013-02-08;
+ prefix "at";
+ revision-date 2013-02-08;
}
organization "OPEN DAYLIGHT";
}
augment "at:topology" {
- container interfaces {
+ container interfaces {
list interface {
key "interface-id";
}
augment "at:topology/at:network-links/at:network-link" {
- container tunnels {
+ container tunnels {
list tunnel {
- key "tunnel-id";
+ key "tunnel-id";
leaf tunnel-id {
- type leafref {
- path "../../../link-id";
- }
+ type int32;
}
container foo {
- leaf bar {
- type string;
- }
+ leaf bar {
+ type string;
+ }
}
}
}
}
augment "at:topology/at:network-links/at:network-link" {
- leaf interface {
- type leafref {
+ leaf interface {
+ type leafref {
path "/at:topology/atp:interfaces/atp:interface/atp:interface-id";
}
}
module augment-network-link-attributes {
- yang-version 1;
+ yang-version 1;
namespace "urn:model:augment:network:link:attributes";
prefix "tp";
import abstract-topology {
- prefix "at";
- revision-date 2013-02-08;
+ prefix "at";
+ revision-date 2013-02-08;
}
organization "OPEN DAYLIGHT";
}
augment "at:topology/at:network-links/at:network-link/at:attributes" {
- leaf longitude {
+ leaf longitude {
type decimal64 {
fraction-digits 2;
}
module augment-topology-tunnels {
- yang-version 1;
+ yang-version 1;
namespace "urn:model:augment:topology:tunnels";
prefix "tp";
import abstract-topology {
- prefix "at";
- revision-date 2013-02-08;
+ prefix "at";
+ revision-date 2013-02-08;
}
import augment-abstract-topology {
}
augment "at:topology/at:network-links/at:network-link/aug-at:tunnels/aug-at:tunnel" {
- leaf tunnel-name {
+ leaf tunnel-name {
type string;
}
}
@Override
public Collection<File> generateSources(SchemaContext context,
- File outputBaseDir) throws IOException {
+ File outputBaseDir, Set<String> yangModulesNames) throws IOException {
final BindingGenerator bindingGenerator = new BindingGeneratorImpl();
final List<Type> types = bindingGenerator.generateTypes(context);
<goal>generate-sources</goal>
</goals>
<configuration>
- <yangFilesRootDir>${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model</yangFilesRootDir>
+ <yangFilesRootDir>../files</yangFilesRootDir>
<codeGenerators>
<generator>
<codeGeneratorClass>
org.opendaylight.controller.yang2sources.spi.CodeGeneratorTestImpl
</codeGeneratorClass>
- <outputBaseDir>
- outDir/
- </outputBaseDir>
</generator>
</codeGenerators>
<resourceProviders>
<goal>generate-sources</goal>
</goals>
<configuration>
- <yangFilesRootDir>${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model</yangFilesRootDir>
+ <yangFilesRootDir>../files</yangFilesRootDir>
<resourceProviders>
<provider>
<resourceProviderClass>
<goal>generate-sources</goal>
</goals>
<configuration>
- <yangFilesRootDir>${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model</yangFilesRootDir>
+ <yangFilesRootDir>../files</yangFilesRootDir>
<codeGenerators>
<generator>
<codeGeneratorClass>
<goal>generate-sources</goal>
</goals>
<configuration>
- <yangFilesRootDir>${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model</yangFilesRootDir>
+ <yangFilesRootDir>../files</yangFilesRootDir>
<codeGenerators>
</codeGenerators>
<resourceProviders>
<goal>generate-sources</goal>
</goals>
<configuration>
- <yangFilesRootDir>${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model</yangFilesRootDir>
+ <yangFilesRootDir>../files</yangFilesRootDir>
<codeGenerators>
<generator>
<codeGeneratorClass>
<goal>generate-sources</goal>
</goals>
<configuration>
- <yangFilesRootDir>${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model</yangFilesRootDir>
+ <yangFilesRootDir>../files</yangFilesRootDir>
<codeGenerators>
<generator>
<codeGeneratorClass>
<goal>generate-sources</goal>
</goals>
<configuration>
- <yangFilesRootDir>${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model</yangFilesRootDir>
+ <yangFilesRootDir>../files</yangFilesRootDir>
<codeGenerators>
<generator>
<codeGeneratorClass>
<goal>generate-sources</goal>
</goals>
<configuration>
- <yangFilesRootDir>${basedir}/../../../../../yang-model-parser-impl/src/test/resources/model</yangFilesRootDir>
+ <yangFilesRootDir>../files</yangFilesRootDir>
<codeGenerators>
<generator>
<codeGeneratorClass>
--- /dev/null
+module types1 {
+ yang-version 1;
+ namespace "urn:simple.container.demo";
+ prefix "t1";
+
+ import types2 {
+ prefix "data";
+ revision-date 2013-02-27;
+ }
+
+ import types3 {
+ prefix "t3";
+ revision-date 2013-02-27;
+ }
+
+ organization "opendaylight";
+ contact "http://www.opendaylight.org/";
+
+ revision "2013-02-27" {
+ reference " WILL BE DEFINED LATER";
+ }
+
+}
--- /dev/null
+module types2 {
+ yang-version 1;
+ namespace "urn:simple.types.data.demo";
+ prefix "t2";
+
+ organization "opendaylight";
+ contact "http://www.opendaylight.org/";
+
+ description "This is types-data test description";
+
+ revision "2013-02-27" {
+ reference " WILL BE DEFINED LATER";
+ }
+
+}
--- /dev/null
+module types3 {
+ yang-version 1;
+ namespace "urn:simple.container.demo.test";
+ prefix "t3";
+
+ import types2 {
+ prefix "data";
+ revision-date 2013-02-27;
+ }
+
+ organization "opendaylight";
+ contact "http://www.opendaylight.org/";
+
+ revision "2013-02-27" {
+ reference " WILL BE DEFINED LATER";
+ }
+
+}
* Base complex configuration arguments
*/
public abstract class ConfigArg {
+ public static final String CODE_GEN_DEFAULT_DIR = "code-generator-files/";
+ public static final String RESOURCE_GEN_DEFAULT_DIR = "resource-generator-files/";
protected File outputBaseDir;
}
public ResourceProviderArg(String resourceProviderClass) {
- this(resourceProviderClass, new File("outDir/"));
+ this(resourceProviderClass, new File(RESOURCE_GEN_DEFAULT_DIR));
}
public ResourceProviderArg(String resourceProviderClass,
private String codeGeneratorClass;
public CodeGeneratorArg() {
+ super(new File(CODE_GEN_DEFAULT_DIR));
}
public CodeGeneratorArg(String codeGeneratorClass) {
- this(codeGeneratorClass, new File("outDir/"));
+ this(codeGeneratorClass, new File(CODE_GEN_DEFAULT_DIR));
}
public CodeGeneratorArg(String codeGeneratorClass, File outputBaseDir) {
return yangFiles;
}
- static Collection<InputStream> listFilesAsStream(String rootDir) throws FileNotFoundException {
- Collection<InputStream> is = new ArrayList<InputStream>();
+ static List<InputStream> listFilesAsStream(String rootDir) throws FileNotFoundException {
+ List<InputStream> is = new ArrayList<InputStream>();
Collection<File> files = listFiles(rootDir);
for(File f : files) {
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.Collections;
import java.util.Enumeration;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Classes implementing {@link CodeGenerator} interface. An instance will be
- * created out of every class using default constructor. Method
- * {@link CodeGenerator#generateSources(SchemaContext, File)} will be called
- * on every instance.
+ * created out of every class using default constructor. Method {@link
+ * CodeGenerator#generateSources(SchemaContext, File, Set<String>
+ * yangModulesNames)} will be called on every instance.
*/
@Parameter(required = true)
private CodeGeneratorArg[] codeGenerators;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
- SchemaContext context = processYang();
+ ContextHolder context = processYang();
generateSources(context);
generateResources();
/**
* Generate {@link SchemaContext} with {@link YangModelParserImpl}
*/
- private SchemaContext processYang() throws MojoExecutionException {
+ private ContextHolder processYang() throws MojoExecutionException {
try {
- Collection<InputStream> yangFiles = Util
+ List<InputStream> yangFiles = Util
.listFilesAsStream(yangFilesRootDir);
- yangFiles.addAll(getFilesFromDependenciesAsStream());
+ Set<Module> yangModules = parser
+ .parseYangModelsFromStreams(yangFiles);
- if (yangFiles.isEmpty()) {
+ Set<String> yangModulesNames = new HashSet<String>();
+ for (Module module : yangModules) {
+ yangModulesNames.add(module.getName());
+ }
+
+ List<InputStream> yangFilesFromDependencies = getFilesFromDependenciesAsStream();
+ Set<Module> yangModulesFromDependencies = parser
+ .parseYangModelsFromStreams(yangFilesFromDependencies);
+
+ Set<Module> parsedYang = new HashSet<Module>(yangModules);
+ parsedYang.addAll(yangModulesFromDependencies);
+
+ if (yangFiles.isEmpty() && yangFilesFromDependencies.isEmpty()) {
getLog().warn(
Util.message(
"No %s file found in %s or in dependencies",
LOG_PREFIX, Util.YANG_SUFFIX, yangFilesRootDir));
- return null;
+ Set<String> names = Collections.emptySet();
+ return new ContextHolder(null, names);
}
- Set<Module> parsedYang = parser
- .parseYangModelsFromStreams(new ArrayList<InputStream>(
- yangFiles));
SchemaContext resolveSchemaContext = parser
.resolveSchemaContext(parsedYang);
getLog().info(
Util.message("%s files parsed from %s", LOG_PREFIX,
Util.YANG_SUFFIX, yangFiles));
- return resolveSchemaContext;
+ return new ContextHolder(resolveSchemaContext, yangModulesNames);
// MojoExecutionException is thrown since execution cannot continue
} catch (Exception e) {
/**
* Call generate on every generator from plugin configuration
*/
- private void generateSources(SchemaContext context)
+ private void generateSources(ContextHolder context)
throws MojoFailureException {
if (codeGenerators.length == 0) {
getLog().warn(
/**
* Instantiate generator from class and call required method
*/
- private void generateSourcesWithOneGenerator(SchemaContext context,
+ private void generateSourcesWithOneGenerator(ContextHolder context,
CodeGeneratorArg codeGeneratorCfg) throws ClassNotFoundException,
InstantiationException, IllegalAccessException, IOException {
if (project != null && outputDir != null) {
project.addCompileSourceRoot(outputDir.getPath());
}
- Collection<File> generated = g.generateSources(context, outputDir);
+ Collection<File> generated = g.generateSources(context.getContext(),
+ outputDir, context.getYangModulesNames());
getLog().info(
Util.message("Sources generated by %s: %s", LOG_PREFIX,
codeGeneratorCfg.getCodeGeneratorClass(), generated));
}
}
+ private class ContextHolder {
+ private final SchemaContext context;
+ private final Set<String> yangModulesNames;
+
+ private ContextHolder(SchemaContext context,
+ Set<String> yangModulesNames) {
+ this.context = context;
+ this.yangModulesNames = yangModulesNames;
+ }
+
+ public SchemaContext getContext() {
+ return context;
+ }
+
+ public Set<String> getYangModulesNames() {
+ return yangModulesNames;
+ }
+ }
+
}
+++ /dev/null
-/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.controller.yang2sources.plugin;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.maven.plugin.AbstractMojo;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
-import org.apache.maven.plugins.annotations.LifecyclePhase;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.opendaylight.controller.yang.model.api.Module;
-import org.opendaylight.controller.yang.model.api.SchemaContext;
-import org.opendaylight.controller.yang.model.parser.api.YangModelParser;
-import org.opendaylight.controller.yang.model.parser.impl.YangModelParserImpl;
-import org.opendaylight.controller.yang2sources.plugin.ConfigArg.CodeGeneratorArg;
-import org.opendaylight.controller.yang2sources.spi.CodeGenerator;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.Maps;
-
-/**
- * Generate sources from yang files using user provided set of
- * {@link CodeGenerator}s. Steps of this process:
- * <ol>
- * <li>List yang files from {@link #yangFilesRootDir}</li>
- * <li>Process yang files using {@link YangModelParserImpl}</li>
- * <li>For each {@link CodeGenerator} from {@link #codeGenerators}:</li>
- * <ol>
- * <li>Instantiate using default constructor</li>
- * <li>Call {@link CodeGenerator#generateSources(SchemaContext, File)}</li>
- * </ol>
- * </ol>
- */
-@Mojo(name = "generate-sources", defaultPhase = LifecyclePhase.GENERATE_SOURCES)
-public final class YangToSourcesMojo extends AbstractMojo {
-
- private static final String LOG_PREFIX = "yang-to-sources:";
-
- /**
- * Classes implementing {@link CodeGenerator} interface. An instance will be
- * created out of every class using default constructor. Method
- * {@link CodeGenerator#generateSources(SchemaContext, File)} will be called
- * on every instance.
- */
- @Parameter(required = true)
- private CodeGeneratorArg[] codeGenerators;
-
- /**
- * Source directory that will be recursively searched for yang files (ending
- * with .yang suffix).
- */
- @Parameter(required = true)
- private String yangFilesRootDir;
-
- private final YangModelParser parser;
-
- @VisibleForTesting
- YangToSourcesMojo(CodeGeneratorArg[] codeGeneratorArgs,
- YangModelParser parser, String yangFilesRootDir) {
- super();
- this.codeGenerators = codeGeneratorArgs;
- this.yangFilesRootDir = yangFilesRootDir;
- this.parser = parser;
- }
-
- public YangToSourcesMojo() {
- super();
- parser = new YangModelParserImpl();
- }
-
- @Override
- public void execute() throws MojoExecutionException, MojoFailureException {
- SchemaContext context = processYang();
- generateSources(context);
- }
-
- /**
- * Generate {@link SchemaContext} with {@link YangModelParserImpl}
- */
- private SchemaContext processYang() throws MojoExecutionException {
- try {
- String[] yangFiles = Util.listFilesAsArrayOfPaths(yangFilesRootDir);
-
- if (yangFiles.length == 0)
- getLog().warn(
- Util.message("No %s file found in %s", LOG_PREFIX,
- Util.YANG_SUFFIX, yangFilesRootDir));
- // TODO only warning or throw exception ?
-
- Set<Module> parsedYang = parser.parseYangModels(yangFiles);
- SchemaContext resolveSchemaContext = parser
- .resolveSchemaContext(parsedYang);
- getLog().info(
- Util.message("%s files parsed from %s", LOG_PREFIX,
- Util.YANG_SUFFIX, Arrays.toString(yangFiles)));
- return resolveSchemaContext;
-
- // MojoExecutionException is thrown since execution cannot continue
- } catch (Exception e) {
- String message = Util.message("Unable to parse %s files from %s",
- LOG_PREFIX, Util.YANG_SUFFIX, yangFilesRootDir);
- getLog().error(message, e);
- throw new MojoExecutionException(message, e);
- }
- }
-
- /**
- * Call generate on every generator from plugin configuration
- */
- private void generateSources(SchemaContext context)
- throws MojoFailureException {
- if (codeGenerators.length == 0) {
- getLog().warn(
- Util.message("No code generators provided", LOG_PREFIX));
- return;
- }
-
- Map<String, String> thrown = Maps.newHashMap();
-
- for (CodeGeneratorArg codeGenerator : codeGenerators) {
- try {
-
- generateSourcesWithOneGenerator(context, codeGenerator);
-
- } catch (Exception e) {
- // try other generators, exception will be thrown after
- getLog().error(
- Util.message(
- "Unable to generate sources with %s generator",
- LOG_PREFIX,
- codeGenerator.getCodeGeneratorClass()), e);
- thrown.put(codeGenerator.getCodeGeneratorClass(), e.getClass()
- .getCanonicalName());
- }
- }
-
- if (!thrown.isEmpty()) {
- String message = Util
- .message(
- "One or more code generators failed, including failed list(generatorClass=exception) %s",
- LOG_PREFIX, thrown.toString());
- getLog().error(message);
- throw new MojoFailureException(message);
- }
- }
-
- /**
- * Instantiate generator from class and call required method
- */
- private void generateSourcesWithOneGenerator(SchemaContext context,
- CodeGeneratorArg codeGenerator) throws ClassNotFoundException,
- InstantiationException, IllegalAccessException {
-
- codeGenerator.check();
-
- CodeGenerator g = Util.getInstance(
- codeGenerator.getCodeGeneratorClass(), CodeGenerator.class);
- getLog().info(
- Util.message("Code generator instantiated from %s", LOG_PREFIX,
- codeGenerator.getCodeGeneratorClass()));
-
- Collection<File> generated = g.generateSources(context,
- codeGenerator.getOutputBaseDir());
- getLog().info(
- Util.message("Sources generated by %s: %s", LOG_PREFIX,
- codeGenerator.getCodeGeneratorClass(), generated));
- }
-
-}
import java.io.File;
import java.util.Collection;
+import java.util.Set;
import org.junit.Before;
import org.junit.Ignore;
@Override
public Collection<File> generateSources(SchemaContext context,
- File baseDir) {
+ File baseDir, Set<String> yangModulesNames) {
called++;
outputDir = baseDir;
return Lists.newArrayList();
import java.io.File;
import java.io.IOException;
import java.util.Collection;
+import java.util.Set;
import org.opendaylight.controller.yang.model.api.SchemaContext;
* @param outputBaseDir
* expected output directory for generated sources configured by
* user
+ * @param yangModulesNames
+ * name of yangs provided by current module
* @return collection of files that were generated from schema context
+ * @throws IOException
*/
- Collection<File> generateSources(SchemaContext context, File outputBaseDir) throws IOException;
+ Collection<File> generateSources(SchemaContext context, File outputBaseDir,
+ Set<String> yangModulesNames) throws IOException;
}
import java.io.File;
import java.util.Collection;
+import java.util.Set;
import org.opendaylight.controller.yang.model.api.SchemaContext;
@Override
public Collection<File> generateSources(SchemaContext context,
- File outputBaseDir) {
+ File outputBaseDir, Set<String> yangModulesNames) {
// no-op
return null;
}
+++ /dev/null
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>binding-generator</artifactId>
- <version>0.5-SNAPSHOT</version>
- <packaging>pom</packaging>
- <name>binding-generator</name>
-
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- </properties>
-
- <modules>
- <module>../yang</module>
- <module>../sal/sal-schema-repository-api</module>
- <module>code-generator-demo</module>
- <module>yang-model-parser-api</module>
- <module>yang-model-parser-impl</module>
- <module>binding-model-api</module>
- <module>binding-generator-api</module>
- <module>binding-generator-spi</module>
- <module>binding-generator-util</module>
- <module>binding-generator-impl</module>
- <module>binding-java-api-generator</module>
- <module>maven-yang</module>
- <module>yang-maven-plugin</module>
- <module>yang-maven-plugin-it</module>
- </modules>
- <dependencies>
-
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.10</version>
- <scope>test</scope>
- <optional>true</optional>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>1.7.2</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-simple</artifactId>
- <version>1.7.2</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>2.0</version>
- <inherited>true</inherited>
- <configuration>
- <source>1.6</source>
- <target>1.6</target>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-javadoc-plugin</artifactId>
- <version>2.8.1</version>
- <configuration>
- <stylesheet>maven</stylesheet>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>aggregate</goal>
- </goals>
- <phase>site</phase>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- <reporting>
- <plugins>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>findbugs-maven-plugin</artifactId>
- <version>2.4.0</version>
- <configuration>
- <effort>Max</effort>
- <threshold>Low</threshold>
- <goal>site</goal>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>jdepend-maven-plugin</artifactId>
- <version>2.0-beta-2</version>
- </plugin>
- </plugins>
- </reporting>
-</project>
+++ /dev/null
-parser grammar YangParser;
-
-@header {
-package org.opendaylight.controller.antlrv4.code.gen;
-}
-
-options{
- tokenVocab=YangLexer;
-
-}
-
-
-yang : module_stmt | submodule_stmt ;
-
-string : STRING (PLUS STRING)*;
-
-identifier_stmt : IDENTIFIER string? stmtend;
-
-stmtend : (SEMICOLON) | (LEFT_BRACE identifier_stmt? RIGHT_BRACE);
-deviate_replace_stmt : DEVIATE_KEYWORD string /* REPLACE_KEYWORD */ (SEMICOLON | (LEFT_BRACE (identifier_stmt |type_stmt | units_stmt | default_stmt | config_stmt | mandatory_stmt | min_elements_stmt | max_elements_stmt )* RIGHT_BRACE));
-deviate_delete_stmt : DEVIATE_KEYWORD string /* DELETE_KEYWORD */ (SEMICOLON | (LEFT_BRACE (identifier_stmt |units_stmt | must_stmt | unique_stmt | default_stmt )* RIGHT_BRACE));
-deviate_add_stmt : DEVIATE_KEYWORD string /*ADD_KEYWORD*/ (SEMICOLON | (LEFT_BRACE (identifier_stmt |units_stmt | must_stmt | unique_stmt | default_stmt | config_stmt | mandatory_stmt | min_elements_stmt | max_elements_stmt )* RIGHT_BRACE));
-deviate_not_supported_stmt : DEVIATE_KEYWORD string /*NOT_SUPPORTED_KEYWORD*/ (SEMICOLON | (LEFT_BRACE identifier_stmt? RIGHT_BRACE));
-deviation_stmt : DEVIATION_KEYWORD string LEFT_BRACE (identifier_stmt |description_stmt | reference_stmt | deviate_not_supported_stmt | deviate_add_stmt | deviate_replace_stmt | deviate_delete_stmt)+ RIGHT_BRACE;
-notification_stmt : NOTIFICATION_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |if_feature_stmt | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt )* RIGHT_BRACE));
-output_stmt : OUTPUT_KEYWORD LEFT_BRACE (identifier_stmt |typedef_stmt | grouping_stmt | data_def_stmt )+ RIGHT_BRACE;
-input_stmt : INPUT_KEYWORD LEFT_BRACE (identifier_stmt |typedef_stmt | grouping_stmt | data_def_stmt )+ RIGHT_BRACE;
-rpc_stmt : RPC_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |if_feature_stmt | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | input_stmt | output_stmt )* RIGHT_BRACE));
-when_stmt : WHEN_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |description_stmt | reference_stmt )* RIGHT_BRACE));
-
-augment_stmt : AUGMENT_KEYWORD string LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | data_def_stmt | case_stmt)+ RIGHT_BRACE;
-uses_augment_stmt : AUGMENT_KEYWORD string LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | data_def_stmt | case_stmt)+ RIGHT_BRACE;
-refine_anyxml_stmts : (identifier_stmt |must_stmt | config_stmt | mandatory_stmt | description_stmt | reference_stmt )*;
-refine_case_stmts : (identifier_stmt |description_stmt | reference_stmt )*;
-refine_choice_stmts : (identifier_stmt |default_stmt | config_stmt | mandatory_stmt | description_stmt | reference_stmt )*;
-refine_list_stmts : (identifier_stmt |must_stmt | config_stmt | min_elements_stmt | max_elements_stmt | description_stmt | reference_stmt )*;
-refine_leaf_list_stmts : (identifier_stmt |must_stmt | config_stmt | min_elements_stmt | max_elements_stmt | description_stmt | reference_stmt )*;
-refine_leaf_stmts : (identifier_stmt |must_stmt | default_stmt | config_stmt | mandatory_stmt | description_stmt | reference_stmt )*;
-refine_container_stmts : (identifier_stmt |must_stmt | presence_stmt | config_stmt | description_stmt | reference_stmt )*;
-refine_pom : (refine_container_stmts | refine_leaf_stmts | refine_leaf_list_stmts | refine_list_stmts | refine_choice_stmts | refine_case_stmts | refine_anyxml_stmts);
-refine_stmt : REFINE_KEYWORD string (SEMICOLON | (LEFT_BRACE (refine_pom) RIGHT_BRACE));
-uses_stmt : USES_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | refine_stmt | uses_augment_stmt )* RIGHT_BRACE));
-anyxml_stmt : ANYXML_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | must_stmt | config_stmt | mandatory_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
-case_stmt : CASE_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | data_def_stmt )* RIGHT_BRACE));
-short_case_stmt : container_stmt | leaf_stmt | leaf_list_stmt | list_stmt | anyxml_stmt;
-choice_stmt : CHOICE_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | default_stmt | config_stmt | mandatory_stmt | status_stmt | description_stmt | reference_stmt | short_case_stmt | case_stmt)* RIGHT_BRACE));
-unique_stmt : UNIQUE_KEYWORD string stmtend;
-key_stmt : KEY_KEYWORD string stmtend;
-list_stmt : LIST_KEYWORD string LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | must_stmt | key_stmt | unique_stmt | config_stmt | min_elements_stmt | max_elements_stmt | ordered_by_stmt | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt )+ RIGHT_BRACE;
-leaf_list_stmt : LEAF_LIST_KEYWORD string LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | type_stmt | units_stmt | must_stmt | config_stmt | min_elements_stmt | max_elements_stmt | ordered_by_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE;
-leaf_stmt : LEAF_KEYWORD string LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | type_stmt | units_stmt | must_stmt | default_stmt | config_stmt | mandatory_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE;
-container_stmt : CONTAINER_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt | when_stmt | if_feature_stmt | must_stmt | presence_stmt | config_stmt | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt )* RIGHT_BRACE));
-grouping_stmt : GROUPING_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt )* RIGHT_BRACE));
-value_stmt : VALUE_KEYWORD string stmtend;
-max_value_arg : /*UNBOUNDED_KEYWORD |*/ string;
-max_elements_stmt : MAX_ELEMENTS_KEYWORD max_value_arg stmtend;
-min_elements_stmt : MIN_ELEMENTS_KEYWORD string stmtend;
-error_app_tag_stmt : ERROR_APP_TAG_KEYWORD string stmtend;
-error_message_stmt : ERROR_MESSAGE_KEYWORD string stmtend;
-must_stmt : MUST_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
-ordered_by_arg : string; /*USER_KEYWORD | SYSTEM_KEYWORD;*/
-ordered_by_stmt : ORDERED_BY_KEYWORD ordered_by_arg stmtend;
-presence_stmt : PRESENCE_KEYWORD string stmtend;
-mandatory_arg :string; // TRUE_KEYWORD | FALSE_KEYWORD;
-mandatory_stmt : MANDATORY_KEYWORD mandatory_arg stmtend;
-config_arg : string; // TRUE_KEYWORD | FALSE_KEYWORD;
-config_stmt : CONFIG_KEYWORD config_arg stmtend;
-status_arg : string; /*CURRENT_KEYWORD | OBSOLETE_KEYWORD | DEPRECATED_KEYWORD; */
-status_stmt : STATUS_KEYWORD status_arg stmtend;
-position_stmt : POSITION_KEYWORD string stmtend;
-bit_stmt : BIT_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |position_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
-bits_specification : bit_stmt (bit_stmt | identifier_stmt)*;
-union_specification : type_stmt (identifier_stmt | type_stmt )+;
-identityref_specification : base_stmt ;
-instance_identifier_specification : (require_instance_stmt )?;
-require_instance_arg :string; // TRUE_KEYWORD | FALSE_KEYWORD;
-require_instance_stmt : REQUIRE_INSTANCE_KEYWORD require_instance_arg stmtend;
-path_stmt : PATH_KEYWORD string stmtend;
-leafref_specification : path_stmt;
-enum_stmt : ENUM_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |value_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
-enum_specification : enum_stmt (identifier_stmt | enum_stmt )*;
-default_stmt : DEFAULT_KEYWORD string stmtend;
-pattern_stmt : PATTERN_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
-length_stmt : LENGTH_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
-string_restrictions : (length_stmt | pattern_stmt )*;
-fraction_digits_stmt : FRACTION_DIGITS_KEYWORD string stmtend;
-decimal64_specification : (numerical_restrictions? (identifier_stmt)* fraction_digits_stmt | fraction_digits_stmt (identifier_stmt)* numerical_restrictions?);
-range_stmt : RANGE_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
-numerical_restrictions : range_stmt ;
-type_body_stmts : (identifier_stmt)* (numerical_restrictions | decimal64_specification | string_restrictions | enum_specification | leafref_specification | identityref_specification | instance_identifier_specification | bits_specification | union_specification) (identifier_stmt)*;
-type_stmt : TYPE_KEYWORD string (SEMICOLON | (LEFT_BRACE type_body_stmts RIGHT_BRACE));
-typedef_stmt : TYPEDEF_KEYWORD string LEFT_BRACE (identifier_stmt | type_stmt | units_stmt | default_stmt | status_stmt | description_stmt | reference_stmt )+ RIGHT_BRACE;
-if_feature_stmt : IF_FEATURE_KEYWORD string stmtend;
-feature_stmt : FEATURE_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
-base_stmt : BASE_KEYWORD string stmtend;
-identity_stmt : IDENTITY_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt | base_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
-yin_element_arg : string; // TRUE_KEYWORD | FALSE_KEYWORD;
-yin_element_stmt : YIN_ELEMENT_KEYWORD yin_element_arg stmtend;
-argument_stmt : ARGUMENT_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt)? (yin_element_stmt )? (identifier_stmt)* RIGHT_BRACE));
-extension_stmt : EXTENSION_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt | argument_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
-revision_date_stmt : REVISION_DATE_KEYWORD string stmtend;
-revision_stmt : REVISION_KEYWORD string (SEMICOLON | (LEFT_BRACE (description_stmt )? (reference_stmt )? RIGHT_BRACE));
-units_stmt : UNITS_KEYWORD string stmtend;
-reference_stmt : REFERENCE_KEYWORD string stmtend;
-description_stmt : DESCRIPTION_KEYWORD string stmtend;
-contact_stmt : CONTACT_KEYWORD string stmtend;
-organization_stmt : ORGANIZATION_KEYWORD string stmtend;
-belongs_to_stmt : BELONGS_TO_KEYWORD string LEFT_BRACE prefix_stmt RIGHT_BRACE;
-prefix_stmt : PREFIX_KEYWORD string stmtend;
-namespace_stmt : NAMESPACE_KEYWORD string stmtend;
-include_stmt : INCLUDE_KEYWORD string (SEMICOLON | (LEFT_BRACE (revision_date_stmt )? RIGHT_BRACE));
-import_stmt : IMPORT_KEYWORD string LEFT_BRACE prefix_stmt (revision_date_stmt )? RIGHT_BRACE;
-yang_version_stmt : YANG_VERSION_KEYWORD string stmtend;
-data_def_stmt : container_stmt | leaf_stmt | leaf_list_stmt | list_stmt | choice_stmt | anyxml_stmt | uses_stmt;
-body_stmts : (( identifier_stmt| extension_stmt | feature_stmt | identity_stmt | typedef_stmt | grouping_stmt | data_def_stmt | augment_stmt | rpc_stmt | notification_stmt | deviation_stmt) )*;
-revision_stmts : (revision_stmt )*;
-linkage_stmts : (import_stmt | include_stmt )*;
-meta_stmts : (organization_stmt | contact_stmt | description_stmt | reference_stmt )*;
-submodule_header_stmts : (yang_version_stmt | belongs_to_stmt)+ ;
-module_header_stmts : (yang_version_stmt | namespace_stmt | prefix_stmt)+ ;
-submodule_stmt : SUBMODULE_KEYWORD string LEFT_BRACE submodule_header_stmts linkage_stmts meta_stmts revision_stmts body_stmts RIGHT_BRACE;
-module_stmt : MODULE_KEYWORD string LEFT_BRACE module_header_stmts linkage_stmts meta_stmts revision_stmts body_stmts RIGHT_BRACE;
+ ((augmentTargetStr == null) ? 0 : augmentTargetStr.hashCode());
result = prime * result
+ ((whenCondition == null) ? 0 : whenCondition.hashCode());
+ result = prime * result
+ + ((childNodes == null) ? 0 : childNodes.hashCode());
return result;
}
} else if (!whenCondition.equals(other.whenCondition)) {
return false;
}
+ if (childNodes == null) {
+ if (other.childNodes != null) {
+ return false;
+ }
+ } else if (!childNodes.equals(other.childNodes)) {
+ return false;
+ }
return true;
}