package knorxx.framework.generator; import com.google.common.base.Charsets; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import com.google.common.io.CharStreams; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.StringReader; import java.util.List; import java.util.Properties; /** * * @author sj */ public abstract class GenerationRoots { public abstract String getSourceRoot(); public abstract String getOutputRoot(); public static class Simple extends GenerationRoots { private final String sourceRoot; private final String outputRoot; public Simple(String sourceRoot, String outputRoot) { this.sourceRoot = sourceRoot; this.outputRoot = outputRoot; } public Simple(List<String> sourceParts, List<String> outputParts) { this.sourceRoot = Joiner.on(File.separator).join(sourceParts); this.outputRoot = Joiner.on(File.separator).join(outputParts); } public static GenerationRoots createMainJava() { return new Simple(Lists.newArrayList(getCurrentDirectory(), "src", "main", "java"), Lists.newArrayList(getCurrentDirectory(), "target", "classes")); } private static String getCurrentDirectory() { try { String rootFolder = new File(".").getCanonicalPath(); return rootFolder; } catch (IOException ex) { throw new IllegalStateException("Unable to get the current directory!", ex); } } public static GenerationRoots createTestJava() { return new Simple(Lists.newArrayList(getCurrentDirectory(), "src", "test", "java"), Lists.newArrayList(getCurrentDirectory(), "target", "test-classes")); } @Override public String getSourceRoot() { return sourceRoot; } @Override public String getOutputRoot() { return outputRoot; } } public static class PropertyFile extends GenerationRoots { private final String sourceRoot; private final String outputRoot; public PropertyFile(InputStream inputStream) throws IOException { Properties properties = new Properties(); try (InputStream input = inputStream) { properties.load(new StringReader(CharStreams.toString(new InputStreamReader(input, Charsets.UTF_8)).replace("\\", "\\\\"))); } this.sourceRoot = properties.getProperty("sourceRoot"); this.outputRoot = properties.getProperty("outputRoot"); } @Override public String getSourceRoot() { return sourceRoot; } @Override public String getOutputRoot() { return outputRoot; } } }