import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
+import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
newType.setModuleName(module.getName());
newType.setSchemaPath(identity.getPath());
- qnameConstant(newType, BindingMapping.QNAME_STATIC_FIELD_NAME, identity.getQName());
+ qnameConstant(newType, JavaTypeName.create(context.modulePackageName(), BindingMapping.MODULE_INFO_CLASS_NAME),
+ identity.getQName().getLocalName());
context.addIdentityType(identity.getQName(), newType);
}
-
- private static Constant qnameConstant(final GeneratedTypeBuilderBase<?> toBuilder, final String constantName,
- final QName name) {
- return toBuilder.addConstant(typeForClass(QName.class), constantName, name);
+ private static Constant qnameConstant(final GeneratedTypeBuilderBase<?> toBuilder,
+ final JavaTypeName yangModuleInfo, final String localName) {
+ return toBuilder.addConstant(typeForClass(QName.class), BindingMapping.QNAME_STATIC_FIELD_NAME,
+ new SimpleImmutableEntry<>(yangModuleInfo, localName));
}
/**
// FIXME: Validation of name conflict
final GeneratedTypeBuilder newType = typeProvider.newGeneratedTypeBuilder(identifier);
final Module module = findParentModule(schemaContext, schemaNode);
- qnameConstant(newType, BindingMapping.QNAME_STATIC_FIELD_NAME, schemaNode.getQName());
+ qnameConstant(newType, JavaTypeName.create(BindingMapping.getRootPackageName(module.getQNameModule()),
+ BindingMapping.MODULE_INFO_CLASS_NAME), schemaNode.getQName().getLocalName());
addCodegenInformation(newType, module, schemaNode);
newType.setSchemaPath(schemaNode.getPath());
import com.google.common.collect.Iterables
import java.util.Collection
import java.util.List
+import java.util.Map.Entry
import java.util.StringTokenizer
import java.util.regex.Pattern
import org.opendaylight.mdsal.binding.model.api.ConcreteType
import org.opendaylight.mdsal.binding.model.api.GeneratedProperty
import org.opendaylight.mdsal.binding.model.api.GeneratedType
import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject
+import org.opendaylight.mdsal.binding.model.api.JavaTypeName
import org.opendaylight.mdsal.binding.model.api.MethodSignature
import org.opendaylight.mdsal.binding.model.api.Restrictions
import org.opendaylight.mdsal.binding.model.api.Type
import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition.Single
import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition.Multiple
import org.opendaylight.mdsal.binding.model.util.Types
+import org.opendaylight.yangtools.yang.binding.BindingMapping
import org.opendaylight.yangtools.yang.binding.CodeHelpers
import org.opendaylight.yangtools.yang.common.QName
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode
»'''
def protected emitConstant(Constant c) '''
- «IF c.value instanceof QName»
- «val qname = c.value as QName»
- «val rev = qname.revision»
- public static final «c.type.importedName» «c.name» = «QName.importedName».create("«qname.namespace.toString
- »", «IF rev.isPresent»"«rev.get»", «ENDIF»"«qname.localName»").intern();
+ «IF BindingMapping.QNAME_STATIC_FIELD_NAME.equals(c.name)»
+ «val entry = c.value as Entry<JavaTypeName, String>»
+ public static final «c.type.importedName» «c.name» = «entry.key.importedName».«BindingMapping.MODULE_INFO_QNAMEOF_METHOD_NAME»("«entry.value»");
«ELSE»
public static final «c.type.importedName» «c.name» = «c.value»;
«ENDIF»
return importedName(Types.typeForClass(cls));
}
+ final String importedName(final JavaTypeName intype) {
+ return javaType.getReferenceString(intype);
+ }
+
final void addImport(final Class<?> cls) {
javaType.getReferenceString(JavaTypeName.create(cls));
}
import static org.opendaylight.yangtools.yang.binding.BindingMapping.MODEL_BINDING_PROVIDER_CLASS_NAME
import static org.opendaylight.yangtools.yang.binding.BindingMapping.MODULE_INFO_CLASS_NAME
+import static org.opendaylight.yangtools.yang.binding.BindingMapping.MODULE_INFO_QNAMEOF_METHOD_NAME
import static extension org.opendaylight.yangtools.yang.binding.BindingMapping.getClassName
import static extension org.opendaylight.yangtools.yang.binding.BindingMapping.getRootPackageName
import org.opendaylight.yangtools.yang.model.api.Module
import org.opendaylight.yangtools.yang.model.api.SchemaContext
+/**
+ * Template for {@link YangModuleInfo} implementation for a particular module. Aside from fulfilling that contract,
+ * this class provides a static {@code createQName(String)} method, which is used by co-generated code to initialize
+ * QNAME constants.
+ */
class YangModuleInfoTemplate {
val Module module
def String generate() {
val body = '''
public final class «MODULE_INFO_CLASS_NAME» extends «ResourceYangModuleInfo.importedName» {
-
+ «val rev = module.revision»
+ private static final «QName.importedName» NAME = «QName.importedName».create("«module.namespace.toString»", «IF rev.present»"«rev.get.toString»", «ENDIF»"«module.name»").intern();
private static final «YangModuleInfo.importedName» INSTANCE = new «MODULE_INFO_CLASS_NAME»();
- «val rev = module.revision»
- private final «QName.importedName» name = QName.create("«module.namespace.toString»", «IF rev.present»"«rev.get.toString»", «ENDIF»"«module.name»").intern();
private final «Set.importedName»<«YangModuleInfo.importedName»> importedModules;
public static «YangModuleInfo.importedName» getInstance() {
return INSTANCE;
}
+ public static «QName.importedName» «MODULE_INFO_QNAMEOF_METHOD_NAME»(final «String.importedName» localName) {
+ return «QName.importedName».create(NAME, localName).intern();
+ }
+
«classBody(module, MODULE_INFO_CLASS_NAME)»
}
'''
@Override
public «QName.importedName» getName() {
- return name;
+ return NAME;
}
@Override
«FOR submodule : module.submodules»
«val className = submodule.name.className»
private static final class «className»Info extends «ResourceYangModuleInfo.importedName» {
-
+ «val rev = submodule.revision»
+ private final «QName.importedName» NAME = «QName.importedName».create("«
+ submodule.namespace.toString»", «IF rev.present»"«rev.get.toString»", «ENDIF»"«submodule.name»").intern();
private static final «YangModuleInfo.importedName» INSTANCE = new «className»Info();
- «val rev = submodule.revision»
- private final «QName.importedName» name = QName.create("«submodule.namespace.toString»", «IF rev.present»"«rev.get.toString»", «ENDIF» "«submodule.name»").intern();
private final «Set.importedName»<YangModuleInfo> importedModules;
public static «YangModuleInfo.importedName» getInstance() {
// Test if all sources are generated from 'module foo'
File fooParent = new File(sourcesOutputDir, CompilationTestUtils.NS_FOO);
- CompilationTestUtils.assertFilesCount(fooParent, 4);
+ CompilationTestUtils.assertFilesCount(fooParent, 5);
assertTrue(new File(fooParent, "IgpLinkAttributes.java").exists());
assertTrue(new File(fooParent, "Link1.java").exists());
assertTrue(new File(fooParent, "Link1Builder.java").exists());
// Test if all sources are generated from 'module bar'
File barParent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAR);
- CompilationTestUtils.assertFilesCount(barParent, 7);
+ CompilationTestUtils.assertFilesCount(barParent, 8);
assertTrue(new File(barParent, "BarData.java").exists());
assertTrue(new File(barParent, "NetworkTopology.java").exists());
assertTrue(new File(barParent, "NetworkTopologyBuilder.java").exists());
// Test if all sources are generated from 'module baz'
File bazParent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAZ);
- CompilationTestUtils.assertFilesCount(bazParent, 4);
+ CompilationTestUtils.assertFilesCount(bazParent, 5);
assertTrue(new File(bazParent, "IgpLinkAttributes1.java").exists());
assertTrue(new File(bazParent, "IgpLinkAttributes1Builder.java").exists());
assertTrue(new File(bazParent, "LinkAttributes.java").exists());
import static org.junit.Assert.assertTrue;
import com.google.common.collect.ImmutableSet;
+import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.List;
+import java.util.Optional;
import org.junit.Before;
import org.junit.BeforeClass;
import org.opendaylight.mdsal.binding.generator.api.BindingGenerator;
import org.opendaylight.mdsal.binding.generator.impl.BindingGeneratorImpl;
import org.opendaylight.mdsal.binding.java.api.generator.GeneratorJavaFile;
+import org.opendaylight.mdsal.binding.java.api.generator.YangModuleInfoTemplate;
import org.opendaylight.mdsal.binding.model.api.Type;
+import org.opendaylight.yangtools.yang.binding.BindingMapping;
+import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
Collections.sort(types, (o1, o2) -> o2.getName().compareTo(o1.getName()));
final GeneratorJavaFile generator = new GeneratorJavaFile(ImmutableSet.copyOf(types));
generator.generateToFile(sourcesOutputDir);
+
+ // Also generate YangModuleInfo
+ for (Module module : context.getModules()) {
+ final YangModuleInfoTemplate template = new YangModuleInfoTemplate(module, context,
+ mod -> Optional.of("fake/" + mod.getName()));
+
+ final File file = new File(GeneratorJavaFile.packageToDirectory(sourcesOutputDir,
+ BindingMapping.getRootPackageName(module.getQNameModule())),
+ BindingMapping.MODULE_INFO_CLASS_NAME + ".java");
+ Files.asCharSink(file, StandardCharsets.UTF_8).write(template.generate());
+ }
}
}
CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
final Map<String, File> generatedFiles = getFiles(sourcesOutputDir);
- assertEquals(3, generatedFiles.size());
+ assertEquals(4, generatedFiles.size());
final File fooContainerFile = generatedFiles.get("FooContainer.java");
assertNotNull(fooContainerFile);
// Test if all sources are generated from module foo
File parent = new File(sourcesOutputDir, NS_FOO);
- assertFilesCount(parent, 5);
+ assertFilesCount(parent, 6);
File fooData = new File(parent, "FooData.java");
File foo_gr1 = new File(parent, "FooGr1.java");
File nodes = new File(parent, "Nodes.java");
// Test if all sources are generated from module bar
parent = new File(sourcesOutputDir, NS_BAR);
- assertFilesCount(parent, 2);
+ assertFilesCount(parent, 3);
File barGr1 = new File(parent, "BarGr1.java");
File barGr2 = new File(parent, "BarGr2.java");
assertTrue(barGr1.exists());
// Test if all sources are generated from module baz
parent = new File(sourcesOutputDir, NS_BAZ);
- assertFilesCount(parent, 1);
+ assertFilesCount(parent, 2);
File bazGr1 = new File(parent, "BazGr1.java");
assertTrue(bazGr1.exists());
assertTrue(linksBuilder.exists());
assertTrue(linksKey.exists());
assertTrue(testData.exists());
- CompilationTestUtils.assertFilesCount(parent, 6);
+ CompilationTestUtils.assertFilesCount(parent, 7);
parent = new File(sourcesOutputDir, CompilationTestUtils.NS_TEST + CompilationTestUtils.FS + "links");
final File level = new File(parent, "Level.java");
assertTrue(new File(parent, "OpenObject.java").exists());
assertTrue(new File(parent, "ExplicitRouteObject.java").exists());
assertTrue(new File(parent, "PathKeySubobject.java").exists());
- CompilationTestUtils.assertFilesCount(parent, 9);
+ CompilationTestUtils.assertFilesCount(parent, 10);
parent = new File(parent, "object");
assertTrue(new File(parent, "Nodes.java").exists());
assertTrue(new File(parent, "BasicExplicitRouteSubobjects.java").exists());
assertTrue(new File(parent, "ExplicitRouteSubobjects.java").exists());
assertTrue(new File(parent, "RouteSubobjects.java").exists());
- CompilationTestUtils.assertFilesCount(parent, 5);
+ CompilationTestUtils.assertFilesCount(parent, 6);
parent = new File(parent, "route");
CompilationTestUtils.assertFilesCount(parent, 1);
assertTrue(pathAttributes.exists());
assertTrue(update.exists());
assertTrue(updateBuilder.exists());
- CompilationTestUtils.assertFilesCount(parent, 6);
+ CompilationTestUtils.assertFilesCount(parent, 7);
parent = new File(sourcesOutputDir, CompilationTestUtils.NS_FOO + CompilationTestUtils.FS + "path");
CompilationTestUtils.assertFilesCount(parent, 1);
assertTrue(destination.exists());
assertTrue(pathAttributes1.exists());
assertTrue(pathAttributes1Builder.exists());
- CompilationTestUtils.assertFilesCount(parent, 5);
+ CompilationTestUtils.assertFilesCount(parent, 6);
parent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAR + CompilationTestUtils.FS + "destination");
CompilationTestUtils.assertFilesCount(parent, 2);
// Test if all sources were generated from 'module baz'
parent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAZ);
- CompilationTestUtils.assertFilesCount(parent, 2);
+ CompilationTestUtils.assertFilesCount(parent, 3);
final File linkstateDestination = new File(parent, "LinkstateDestination.java");
assertTrue(linkstateDestination.exists());
assertTrue(new File(parent, "NodesBuilder.java").exists());
assertTrue(new File(parent, "Alg.java").exists());
assertTrue(new File(parent, "NodesIdUnionBuilder.java").exists());
- CompilationTestUtils.assertFilesCount(parent, 5);
+ CompilationTestUtils.assertFilesCount(parent, 6);
// Test if sources are compilable
CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
// Test if all sources are generated
final File fooParent = new File(sourcesOutputDir, CompilationTestUtils.NS_FOO);
- CompilationTestUtils.assertFilesCount(fooParent, 3);
+ CompilationTestUtils.assertFilesCount(fooParent, 4);
assertTrue(new File(fooParent, "FooData.java").exists());
assertTrue(new File(fooParent, "Nodes.java").exists());
assertTrue(new File(fooParent, "NodesBuilder.java").exists());
final File barParent = new File(sourcesOutputDir, CompilationTestUtils.NS_BAR);
- CompilationTestUtils.assertFilesCount(barParent, 1);
+ CompilationTestUtils.assertFilesCount(barParent, 2);
assertTrue(new File(barParent, "IdentityClass.java").exists());
// Test if sources are compilable
assertTrue(fooBuilder.exists());
assertTrue(testData.exists());
assertTrue(fooDir.exists());
- assertFilesCount(parent, 4);
+ assertFilesCount(parent, 5);
parent = new File(parent, "foo");
File bar = new File(parent, "Bar.java");
assertTrue(unionExt2.exists());
assertTrue(unionExt3.exists());
assertTrue(unionExt4.exists());
- CompilationTestUtils.assertFilesCount(parent, 33);
+ CompilationTestUtils.assertFilesCount(parent, 34);
// Test if sources are compilable
CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir);
private static final Splitter DOT_SPLITTER = Splitter.on('.');
public static final String MODULE_INFO_CLASS_NAME = "$YangModuleInfoImpl";
+ public static final String MODULE_INFO_QNAMEOF_METHOD_NAME = "qnameOf";
public static final String MODEL_BINDING_PROVIDER_CLASS_NAME = "$YangModelBindingProvider";
public static final String RPC_INPUT_SUFFIX = "Input";