+++ /dev/null
-package org.opendaylight.yangtools.sal.java.api.generator;\r
-\r
-import org.opendaylight.yangtools.sal.binding.model.api.CodeGenerator;\r
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;\r
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType;\r
-import org.opendaylight.yangtools.sal.binding.model.api.Type;\r
-\r
-public abstract class AbstractCodeGenerator implements CodeGenerator {\r
- \r
- @Override\r
- public boolean isAcceptable(Type type) {\r
- return (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject));\r
- }\r
-\r
- \r
-}\r
package org.opendaylight.yangtools.sal.java.api.generator;\r
\r
-import java.io.IOException;\r
-import java.io.StringWriter;\r
-import java.io.Writer;\r
-\r
-import org.opendaylight.yangtools.binding.generator.util.Types;\r
-import org.opendaylight.yangtools.sal.java.api.generator.BuilderTemplate;\r
import org.opendaylight.yangtools.sal.binding.model.api.CodeGenerator;\r
import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;\r
import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType;\r
import org.opendaylight.yangtools.sal.binding.model.api.Type;\r
-import org.opendaylight.yangtools.yang.binding.DataObject;\r
+import org.opendaylight.yangtools.yang.binding.Augmentable;\r
+\r
+public final class BuilderGenerator implements CodeGenerator {\r
\r
-public final class BuilderGenerator extends AbstractCodeGenerator {\r
+ public static final String BUILDER = "Builder";\r
\r
- public static final String FILE_NAME_SUFFIX = "Builder";\r
+ @Override\r
+ public boolean isAcceptable(Type type) {\r
+ if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) {\r
+ for (Type t : ((GeneratedType) type).getImplements()) {\r
+ // "rpc" and "grouping" elements do not implement Augmentable\r
+ if (t.getFullyQualifiedName().equals(Augmentable.class.getName())) {\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ return false;\r
+ }\r
\r
@Override\r
- public Writer generate(Type type) throws IOException {\r
- final Writer writer = new StringWriter();\r
- if (type instanceof GeneratedType && isAcceptable((GeneratedType )type)) {\r
+ public String generate(Type type) {\r
+ if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) {\r
final GeneratedType genType = (GeneratedType) type;\r
final BuilderTemplate template = new BuilderTemplate(genType);\r
- writer.write(template.generate().toString());\r
+ return template.generate();\r
}\r
- return writer;\r
+ return "";\r
}\r
\r
- public boolean isAcceptable(Type type) {\r
- return super.isAcceptable(type) && type instanceof GeneratedType \r
- && ((GeneratedType )type).getImplements().contains(Types.typeForClass(DataObject.class));\r
+ @Override\r
+ public String getUnitName(Type type) {\r
+ return type.getName() + BUILDER;\r
}\r
\r
}\r
}
}
- def generate() {
+ def String generate() {
val body = generateBody
val pkgAndImports = generatePkgAndImports
return pkgAndImports.toString + body.toString
GeneratorUtil.getExplicitType(genTO, type, imports)
}
-}
\ No newline at end of file
+}
*/\r
package org.opendaylight.yangtools.sal.java.api.generator;\r
\r
-import java.io.IOException;\r
-import java.io.StringWriter;\r
-import java.io.Writer;\r
-\r
-import org.opendaylight.yangtools.sal.java.api.generator.EnumTemplate;\r
import org.opendaylight.yangtools.sal.binding.model.api.CodeGenerator;\r
import org.opendaylight.yangtools.sal.binding.model.api.Enumeration;\r
import org.opendaylight.yangtools.sal.binding.model.api.Type;\r
\r
-public class EnumGenerator extends AbstractCodeGenerator {\r
+public class EnumGenerator implements CodeGenerator {\r
+\r
+ @Override\r
+ public boolean isAcceptable(Type type) {\r
+ return type instanceof Enumeration;\r
+ }\r
\r
@Override\r
- public Writer generate(Type type) throws IOException {\r
- final Writer writer = new StringWriter();\r
+ public String generate(Type type) {\r
if (type instanceof Enumeration) {\r
final Enumeration enums = (Enumeration) type;\r
final EnumTemplate enumTemplate = new EnumTemplate(enums);\r
- writer.write(enumTemplate.generate().toString());\r
+ return enumTemplate.generate();\r
}\r
- return writer;\r
+ return "";\r
+ }\r
+\r
+ @Override\r
+ public String getUnitName(Type type) {\r
+ return type.getName();\r
}\r
\r
}\r
this.enums = enums
}
- def generate() {
+ def String generate() {
val body = generateBody
val pkg = generatePkg
return pkg.toString + body.toString
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
-import java.io.Writer;
import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.opendaylight.yangtools.sal.binding.model.api.CodeGenerator;
-import org.opendaylight.yangtools.sal.binding.model.api.Enumeration;
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType;
import org.opendaylight.yangtools.sal.binding.model.api.Type;
-import org.opendaylight.yangtools.yang.binding.Augmentable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class GeneratorJavaFile {
private static final Logger log = LoggerFactory.getLogger(GeneratorJavaFile.class);
- private final CodeGenerator interfaceGenerator;
- private final TOGenerator TOGenerator;
- private final EnumGenerator enumGenerator;
- private final BuilderGenerator builderGenerator;
+ private final List<CodeGenerator> generators = new ArrayList<>();
- private final Set<GeneratedType> genTypes;
- private final Set<GeneratedTransferObject> genTransferObjects;
- private final Set<Enumeration> enumerations;
+ private final Set<? extends Type> types;
- public GeneratorJavaFile(final CodeGenerator codeGenerator, final Set<GeneratedType> types) {
- this.interfaceGenerator = codeGenerator;
- this.genTypes = types;
- this.genTransferObjects = new HashSet<>();
- this.enumerations = new HashSet<>();
- this.TOGenerator = new TOGenerator();
- this.enumGenerator = new EnumGenerator();
- this.builderGenerator = new BuilderGenerator();
- }
-
- public GeneratorJavaFile(final Set<GeneratedType> types, final Set<GeneratedTransferObject> genTransferObjects,
- final Set<Enumeration> enumerations) {
- this.interfaceGenerator = new InterfaceGenerator();
- this.TOGenerator = new TOGenerator();
- this.enumGenerator = new EnumGenerator();
- this.builderGenerator = new BuilderGenerator();
-
- this.genTypes = types;
- this.genTransferObjects = genTransferObjects;
- this.enumerations = enumerations;
+ public GeneratorJavaFile(final Set<? extends Type> types) {
+ this.types = types;
+ generators.add(new InterfaceGenerator());
+ generators.add(new TOGenerator());
+ generators.add(new EnumGenerator());
+ generators.add(new BuilderGenerator());
}
public List<File> generateToFile(final File parentDirectory) throws IOException {
final List<File> result = new ArrayList<>();
- for (GeneratedType type : genTypes) {
- final File genFile = generateTypeToJavaFile(parentDirectory, type, interfaceGenerator, "");
-
- if (genFile != null) {
- result.add(genFile);
- }
-
- if(builderGenerator.isAcceptable(type)){
- final File genBuilderFile = generateTypeToJavaFile(parentDirectory, type, builderGenerator,
- BuilderGenerator.FILE_NAME_SUFFIX);
-
- if (genBuilderFile != null) {
- result.add(genBuilderFile);
- }
- }
- }
- for (GeneratedTransferObject transferObject : genTransferObjects) {
- final File genFile = generateTypeToJavaFile(parentDirectory, transferObject, TOGenerator, "");
-
- if (genFile != null) {
- result.add(genFile);
- }
- }
-
- for (Enumeration enumeration : enumerations) {
- final File genFile = generateTypeToJavaFile(parentDirectory, enumeration, enumGenerator, "");
-
- if (genFile != null) {
- result.add(genFile);
+ for (Type type : types) {
+ for (CodeGenerator generator : generators) {
+ File generatedJavaFile = generateTypeToJavaFile(parentDirectory, type, generator);
+ if (generatedJavaFile != null) {
+ result.add(generatedJavaFile);
+ }
}
}
-
return result;
}
- private File generateTypeToJavaFile(final File parentDir, final Type type, final CodeGenerator generator, String fileNameSuffix)
+ private File generateTypeToJavaFile(final File parentDir, final Type type, final CodeGenerator generator)
throws IOException {
if (parentDir == null) {
log.warn("Parent Directory not specified, files will be generated "
if (!packageDir.exists()) {
packageDir.mkdirs();
}
- final File file = new File(packageDir, type.getName() + fileNameSuffix + ".java");
- try (final FileWriter fw = new FileWriter(file)) {
- file.createNewFile();
-
- try (final BufferedWriter bw = new BufferedWriter(fw)) {
- Writer writer = generator.generate(type);
- bw.write(writer.toString());
+
+ if (generator.isAcceptable(type)) {
+ String generatedCode = generator.generate(type);
+ if (generatedCode.isEmpty()) {
+ throw new IllegalStateException("Generated code should not be empty!");
}
- } catch (IOException e) {
- log.error(e.getMessage());
- throw new IOException(e.getMessage());
- }
- return file;
- }
-
- private boolean isAugmentableIfcImplemented(GeneratedType genType) {
- for (Type implType : genType.getImplements()) {
- if (implType.getFullyQualifiedName().equals(Augmentable.class.getName())) {
- return true;
+ final File file = new File(packageDir, generator.getUnitName(type) + ".java");
+ try (final FileWriter fw = new FileWriter(file)) {
+ file.createNewFile();
+ try (final BufferedWriter bw = new BufferedWriter(fw)) {
+ bw.write(generatedCode);
+ }
+ } catch (IOException e) {
+ log.error(e.getMessage());
+ throw new IOException(e.getMessage());
}
+ return file;
}
- return false;
+ return null;
}
-
+
private File packageToDirectory(final File parentDirectory, final String packageName) {
if (packageName == null) {
throw new IllegalArgumentException("Package Name cannot be NULL!");
*/\r
package org.opendaylight.yangtools.sal.java.api.generator;\r
\r
-import java.io.IOException;\r
-import java.io.StringWriter;\r
-import java.io.Writer;\r
-\r
-import org.opendaylight.yangtools.sal.java.api.generator.InterfaceTemplate;\r
import org.opendaylight.yangtools.sal.binding.model.api.CodeGenerator;\r
import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;\r
import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType;\r
import org.opendaylight.yangtools.sal.binding.model.api.Type;\r
\r
-public final class InterfaceGenerator extends AbstractCodeGenerator {\r
+public final class InterfaceGenerator implements CodeGenerator {\r
+\r
+ @Override\r
+ public boolean isAcceptable(Type type) {\r
+ return type instanceof GeneratedType && !(type instanceof GeneratedTransferObject);\r
+ }\r
\r
@Override\r
- public Writer generate(Type type) throws IOException {\r
- final Writer writer = new StringWriter();\r
+ public String generate(Type type) {\r
if (type instanceof GeneratedType && !(type instanceof GeneratedTransferObject)) {\r
final GeneratedType genType = (GeneratedType) type;\r
final InterfaceTemplate interfaceTemplate = new InterfaceTemplate(genType);\r
- writer.write(interfaceTemplate.generate().toString());\r
+ return interfaceTemplate.generate();\r
}\r
- return writer;\r
+ return "";\r
}\r
- \r
- \r
- \r
+\r
+ @Override\r
+ public String getUnitName(Type type) {\r
+ return type.getName();\r
+ }\r
+\r
}\r
enclosedGeneratedTypes = genType.enclosedTypes
}
- def generate() {
+ def String generate() {
val body = generateBody
val pkgAndImports = generatePkgAndImports
return pkgAndImports.toString + body.toString
*/\r
package org.opendaylight.yangtools.sal.java.api.generator;\r
\r
-import java.io.IOException;\r
-import java.io.StringWriter;\r
-import java.io.Writer;\r
-\r
-import org.opendaylight.yangtools.sal.java.api.generator.ClassTemplate;\r
import org.opendaylight.yangtools.sal.binding.model.api.CodeGenerator;\r
import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;\r
import org.opendaylight.yangtools.sal.binding.model.api.Type;\r
\r
-public final class TOGenerator extends AbstractCodeGenerator {\r
+public final class TOGenerator implements CodeGenerator {\r
\r
@Override\r
- public Writer generate(Type type) throws IOException {\r
- final Writer writer = new StringWriter();\r
+ public String generate(Type type) {\r
if (type instanceof GeneratedTransferObject) {\r
final GeneratedTransferObject genTO = (GeneratedTransferObject) type;\r
final ClassTemplate template = new ClassTemplate(genTO);\r
- writer.write(template.generate().toString());\r
+ return template.generate();\r
}\r
- return writer;\r
+ return "";\r
}\r
- \r
+\r
@Override\r
public boolean isAcceptable(Type type) {\r
- return type instanceof GeneratedTransferObject;\r
+ return type instanceof GeneratedTransferObject;\r
+ }\r
+\r
+ @Override\r
+ public String getUnitName(Type type) {\r
+ return type.getName();\r
}\r
\r
}\r
package org.opendaylight.yangtools.sal.java.api.generator.test;\r
\r
-import static org.junit.Assert.*;\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotNull;\r
+import static org.junit.Assert.assertTrue;\r
\r
import java.io.File;\r
-import java.io.IOException;\r
-import java.io.Writer;\r
import java.util.ArrayList;\r
import java.util.List;\r
import java.util.Set;\r
}\r
\r
final TOGenerator clsGen = new TOGenerator();\r
- try {\r
- final Writer writer = clsGen.generate(genTO);\r
- assertNotNull(writer);\r
+ final String outputStr = clsGen.generate(genTO);\r
\r
- final String outputStr = writer.toString();\r
- writer.close();\r
-\r
- assertNotNull(outputStr);\r
- assertTrue(outputStr\r
- .contains("public CompositeKeyListKey(String Key2, "\r
- + "Byte Key1)"));\r
-\r
- } catch (IOException e) {\r
- e.printStackTrace();\r
- }\r
+ assertNotNull(outputStr);\r
+ assertTrue(outputStr\r
+ .contains("public CompositeKeyListKey(String Key2, "\r
+ + "Byte Key1)"));\r
\r
assertEquals(2, propertyCount);\r
genTOsCount++;\r
final GeneratedTransferObject genTO = toBuilder.toInstance();\r
\r
final TOGenerator clsGen = new TOGenerator();\r
- try {\r
- final Writer writer = clsGen.generate(genTO);\r
- assertNotNull(writer);\r
-\r
- final String outputStr = writer.toString();\r
- writer.close();\r
+ final String outputStr = clsGen.generate(genTO);\r
\r
- assertNotNull(outputStr);\r
- assertTrue(outputStr.contains("public DefCtor()"));\r
-\r
- } catch (IOException e) {\r
- e.printStackTrace();\r
- }\r
+ assertNotNull(outputStr);\r
+ assertTrue(outputStr.contains("public DefCtor()"));\r
}\r
\r
@Test\r
toBuilder.addToStringProperty(propBuilder);\r
final GeneratedTransferObject genTO = toBuilder.toInstance();\r
final TOGenerator clsGen = new TOGenerator();\r
- try {\r
- final Writer writer = clsGen.generate(genTO);\r
- assertNotNull(writer);\r
- } catch (IOException e) {\r
- e.printStackTrace();\r
- }\r
+ assertNotNull(clsGen.generate(genTO));\r
}\r
}\r
*/
package org.opendaylight.yangtools.sal.java.api.generator.test;
-import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import org.opendaylight.yangtools.binding.generator.util.generated.type.builder.GeneratedTypeBuilderImpl;
import org.opendaylight.yangtools.sal.binding.generator.api.BindingGenerator;
import org.opendaylight.yangtools.sal.binding.generator.impl.BindingGeneratorImpl;
-import org.opendaylight.yangtools.sal.binding.model.api.Enumeration;
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;
import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType;
import org.opendaylight.yangtools.sal.binding.model.api.Type;
import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTypeBuilder;
import org.opendaylight.yangtools.sal.java.api.generator.GeneratorJavaFile;
-import org.opendaylight.yangtools.sal.java.api.generator.InterfaceGenerator;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
GeneratedTypeBuilder gtb = new GeneratedTypeBuilderImpl("org.opendaylight.controller.gen", "Type4");
gtb.addImplementsType(Types.augmentableTypeFor(gtb));
types.add(gtb.toInstance());
- GeneratorJavaFile generator = new GeneratorJavaFile(
- new InterfaceGenerator(), types);
+ GeneratorJavaFile generator = new GeneratorJavaFile(types);
generator.generateToFile(new File(PATH));
String[] files = new File(PATH + FS + "org" + FS + "opendaylight" + FS
assertTrue(filesList.contains("Type2.java"));
assertTrue(filesList.contains("Type3.java"));
assertTrue(filesList.contains("Type4.java"));
- assertTrue(filesList.contains("Type1Builder.java"));
+ assertTrue(filesList.contains("Type4Builder.java"));
}
@Ignore
final Set<Module> modulesToBuild = parser.parseYangModels(sourceFiles);
- final SchemaContext context = parser
- .resolveSchemaContext(modulesToBuild);
+ final SchemaContext context = parser.resolveSchemaContext(modulesToBuild);
final List<Type> types = bindingGenerator.generateTypes(context);
- final Set<GeneratedType> typesToGenerate = new HashSet<GeneratedType>();
- final Set<GeneratedTransferObject> tosToGenerate = new HashSet<GeneratedTransferObject>();
- final Set<Enumeration> enumerationToGenerate = new HashSet<Enumeration>();
- for (Type type : types) {
- if (type instanceof GeneratedType
- && !(type instanceof GeneratedTransferObject)) {
- typesToGenerate.add((GeneratedType) type);
- }
-
- if (type instanceof GeneratedTransferObject) {
- tosToGenerate.add((GeneratedTransferObject) type);
- }
- if (type instanceof Enumeration) {
- enumerationToGenerate.add((Enumeration) type);
- }
- }
-
- final GeneratorJavaFile generator = new GeneratorJavaFile(
- typesToGenerate, tosToGenerate, enumerationToGenerate);
+ final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
generator.generateToFile(new File(GENERATOR_OUTPUT_PATH));
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
package org.opendaylight.yangtools.sal.binding.model.api;\r
\r
import java.io.IOException;\r
-import java.io.Writer;\r
\r
/**\r
*\r
public interface CodeGenerator {\r
\r
/**\r
- *\r
- * @param type\r
- * @return\r
+ * @param type Input type to be processed\r
+ * @return generated code\r
* @throws IOException\r
*/\r
- Writer generate(Type type) throws IOException;\r
- \r
+ String generate(Type type);\r
+\r
/**\r
- * \r
- * \r
* @param type Input type to be processed\r
* @return true if type is acceptable for processing.\r
*/\r
- boolean isAcceptable(Type type);\r
+ boolean isAcceptable(Type type);\r
+\r
+ /**\r
+ * @param type Input type to be processed\r
+ * @return name of generated unit\r
+ */\r
+ String getUnitName(Type type);\r
\r
}\r
import org.apache.maven.project.MavenProject;
import org.opendaylight.yangtools.sal.binding.generator.api.BindingGenerator;
import org.opendaylight.yangtools.sal.binding.generator.impl.BindingGeneratorImpl;
-import org.opendaylight.yangtools.sal.binding.model.api.Enumeration;
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedTransferObject;
-import org.opendaylight.yangtools.sal.binding.model.api.GeneratedType;
import org.opendaylight.yangtools.sal.binding.model.api.Type;
import org.opendaylight.yangtools.sal.java.api.generator.GeneratorJavaFile;
import org.opendaylight.yangtools.yang.model.api.Module;
final BindingGenerator bindingGenerator = new BindingGeneratorImpl();
final List<Type> types = bindingGenerator.generateTypes(context, yangModules);
- final Set<GeneratedType> typesToGenerate = new HashSet<>();
- final Set<GeneratedTransferObject> tosToGenerate = new HashSet<>();
- final Set<Enumeration> enumsToGenerate = new HashSet<>();
-
- for (Type type : types) {
- if (type instanceof GeneratedTransferObject) {
- tosToGenerate.add((GeneratedTransferObject) type);
- } else if (type instanceof GeneratedType) {
- typesToGenerate.add((GeneratedType) type);
- } else if (type instanceof Enumeration) {
- enumsToGenerate.add((Enumeration) type);
- }
- }
-
- final GeneratorJavaFile generator = new GeneratorJavaFile(typesToGenerate, tosToGenerate, enumsToGenerate);
+ final GeneratorJavaFile generator = new GeneratorJavaFile(new HashSet<>(types));
return generator.generateToFile(outputBaseDir);
}