895b1972c8bdcaa5f504d33d4fa10177d4b32d25
[yangtools.git] / code-generator / binding-java-api-generator / src / main / java / org / opendaylight / yangtools / sal / java / api / generator / GeneratorJavaFile.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yangtools.sal.java.api.generator;
9
10 import java.io.BufferedWriter;
11 import java.io.File;
12 import java.io.FileWriter;
13 import java.io.IOException;
14 import java.util.ArrayList;
15 import java.util.List;
16 import java.util.Set;
17
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;
22
23 public final class GeneratorJavaFile {
24
25     private static final Logger log = LoggerFactory.getLogger(GeneratorJavaFile.class);
26     private final List<CodeGenerator> generators = new ArrayList<>();
27
28     private final Set<? extends Type> types;
29
30     public GeneratorJavaFile(final Set<? extends Type> types) {
31         this.types = types;
32         generators.add(new InterfaceGenerator());
33         generators.add(new TOGenerator());
34         generators.add(new EnumGenerator());
35         generators.add(new BuilderGenerator());
36     }
37
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);
45                 }
46             }
47         }
48         return result;
49     }
50
51     private File generateTypeToJavaFile(final File parentDir, final Type type, final CodeGenerator generator)
52             throws IOException {
53         if (parentDir == null) {
54             log.warn("Parent Directory not specified, files will be generated "
55                     + "accordingly to generated Type package path.");
56         }
57         if (type == null) {
58             log.error("Cannot generate Type into Java File because " + "Generated Type is NULL!");
59             throw new IllegalArgumentException("Generated Type Cannot be NULL!");
60         }
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!");
64         }
65         final File packageDir = packageToDirectory(parentDir, type.getPackageName());
66
67         if (!packageDir.exists()) {
68             packageDir.mkdirs();
69         }
70         
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!");
75             }
76             final File file = new File(packageDir, generator.getUnitName(type) + ".java");
77             try (final FileWriter fw = new FileWriter(file)) {
78                 file.createNewFile();
79                 try (final BufferedWriter bw = new BufferedWriter(fw)) {
80                     bw.write(generatedCode);
81                 }
82             } catch (IOException e) {
83                 log.error(e.getMessage());
84                 throw new IOException(e.getMessage());
85             }
86             return file;
87         }
88         return null;
89     }
90     
91     private File packageToDirectory(final File parentDirectory, final String packageName) {
92         if (packageName == null) {
93             throw new IllegalArgumentException("Package Name cannot be NULL!");
94         }
95
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]);
102         }
103         return new File(parentDirectory, dirPathBuilder.toString());
104     }
105 }