2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.sal.java.api.generator;
10 import java.io.BufferedWriter;
12 import java.io.FileWriter;
13 import java.io.IOException;
14 import java.util.ArrayList;
15 import java.util.List;
18 import org.opendaylight.yangtools.sal.binding.model.api.CodeGenerator;
19 import org.opendaylight.yangtools.sal.binding.model.api.Type;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
23 public final class GeneratorJavaFile {
25 private static final Logger log = LoggerFactory.getLogger(GeneratorJavaFile.class);
26 private final List<CodeGenerator> generators = new ArrayList<>();
28 private final Set<? extends Type> types;
30 public GeneratorJavaFile(final Set<? extends Type> types) {
32 generators.add(new InterfaceGenerator());
33 generators.add(new TOGenerator());
34 generators.add(new EnumGenerator());
35 generators.add(new BuilderGenerator());
38 public List<File> generateToFile(final File parentDirectory) throws IOException {
39 final List<File> result = new ArrayList<>();
40 for (Type type : types) {
41 for (CodeGenerator generator : generators) {
42 File generatedJavaFile = generateTypeToJavaFile(parentDirectory, type, generator);
43 if (generatedJavaFile != null) {
44 result.add(generatedJavaFile);
51 private File generateTypeToJavaFile(final File parentDir, final Type type, final CodeGenerator generator)
53 if (parentDir == null) {
54 log.warn("Parent Directory not specified, files will be generated "
55 + "accordingly to generated Type package path.");
58 log.error("Cannot generate Type into Java File because " + "Generated Type is NULL!");
59 throw new IllegalArgumentException("Generated Type Cannot be NULL!");
61 if (generator == null) {
62 log.error("Cannot generate Type into Java File because " + "Code Generator instance is NULL!");
63 throw new IllegalArgumentException("Code Generator Cannot be NULL!");
65 final File packageDir = packageToDirectory(parentDir, type.getPackageName());
67 if (!packageDir.exists()) {
71 if (generator.isAcceptable(type)) {
72 String generatedCode = generator.generate(type);
73 if (generatedCode.isEmpty()) {
74 throw new IllegalStateException("Generated code should not be empty!");
76 final File file = new File(packageDir, generator.getUnitName(type) + ".java");
77 try (final FileWriter fw = new FileWriter(file)) {
79 try (final BufferedWriter bw = new BufferedWriter(fw)) {
80 bw.write(generatedCode);
82 } catch (IOException e) {
83 log.error(e.getMessage());
84 throw new IOException(e.getMessage());
91 private File packageToDirectory(final File parentDirectory, final String packageName) {
92 if (packageName == null) {
93 throw new IllegalArgumentException("Package Name cannot be NULL!");
96 final String[] subDirNames = packageName.split("\\.");
97 final StringBuilder dirPathBuilder = new StringBuilder();
98 dirPathBuilder.append(subDirNames[0]);
99 for (int i = 1; i < subDirNames.length; ++i) {
100 dirPathBuilder.append(File.separator);
101 dirPathBuilder.append(subDirNames[i]);
103 return new File(parentDirectory, dirPathBuilder.toString());