/** * */ package org.minnal.generator.core; import java.io.Closeable; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.javalite.common.Inflector; import org.minnal.generator.exception.MinnalGeneratorException; import org.minnal.utils.serializer.Serializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author ganeshs */ public abstract class AbstractGenerator implements Generator { private List<Generator> generators = new ArrayList<Generator>(); protected File baseDir; protected String applicationName; private static final Logger logger = LoggerFactory.getLogger(AbstractGenerator.class); public static final String MAIN_FOLDER = "src/main"; public static final String TEST_FOLDER = "src/test"; public static final String MAIN_JAVA_FOLDER = MAIN_FOLDER + "/java"; public static final String TEST_JAVA_FOLDER = TEST_FOLDER + "/java"; public static final String MAIN_RESOURCES_FOLDER = MAIN_FOLDER + "/resources"; public static final String TEST_RESOURCES_FOLDER = TEST_FOLDER + "/resources"; public static final String MAIN_META_INF_FOLDER = MAIN_RESOURCES_FOLDER + "/META-INF"; public static final String TEST_META_INF_FOLDER = TEST_RESOURCES_FOLDER + "/META-INF"; public static final String MAIN_SERVICES_FOLDER = MAIN_META_INF_FOLDER + "/services"; public static final String TEST_SERVICES_FOLDER = TEST_META_INF_FOLDER + "/services"; public AbstractGenerator(File baseDir) { this.baseDir = baseDir; } @Override public void init() { applicationName = Inflector.camelize(baseDir.getName().toLowerCase().replace('-', '_')); } protected String getBasePackage() { return "com." + Inflector.underscore(applicationName).replace('_', '.'); } protected String getDomainPackage() { return getBasePackage() + "." + "domain"; } protected String getResourcesPackage() { return getBasePackage() + "." + "resources"; } protected String getApplicationClassName() { return getBasePackage() + "." + applicationName + "Application"; } protected String getApplicationConfigClassName() { return getBasePackage() + "." + applicationName + "Configuration"; } protected File getResourcesFolder(boolean checkExists) { return getFile(baseDir, MAIN_RESOURCES_FOLDER, checkExists); } protected File getJavaFolder(boolean checkExists) { return getFile(baseDir, MAIN_JAVA_FOLDER, checkExists); } protected File getMetaInfFolder(boolean checkExists) { return getFile(baseDir, MAIN_META_INF_FOLDER, checkExists); } protected File getServicesFolder(boolean checkExists) { return getFile(baseDir, MAIN_SERVICES_FOLDER, checkExists); } protected File getFile(File baseDir, String name, boolean checkExists) { File file = new File(baseDir, name); if (checkExists && !file.exists()) { throw new MinnalGeneratorException("File " + file.getAbsolutePath() + " doesn't exist"); } return file; } protected File createPackage(String packageName) { return createPackage(packageName, MAIN_JAVA_FOLDER); } protected File createPackage(String packageName, String sourceFolder) { File srcDir = getFile(baseDir, sourceFolder, true); File pkg = new File(srcDir, packageName.replace('.', '/')); if (!pkg.exists()) { if (!pkg.mkdirs()) { throw new IllegalStateException("Failed while creating the package - " + pkg.getPath()); } } return pkg; } protected void addGenerator(Generator generator) { generators.add(generator); } protected File createFolder(String folderName) { return createFolder(baseDir, folderName); } protected File createFolder(File basedir, String folderName) { logger.info("Creating the folder {} under {}", folderName, basedir); File folder = new File(basedir, folderName); if (!folder.mkdirs()) { throw new IllegalStateException("Failed while creating the folder - " + folder.getPath()); } return folder; } @SuppressWarnings("unchecked") protected <T extends Generator> T generatorFor(Class<T> generatorClass) { for (Generator generator : generators) { if (generator.getClass().equals(generatorClass)) { return (T) generator; } } return null; } @Override public void generate() { for (Generator generator : generators) { generator.init(); generator.generate(); } } protected void serializeTo(File file, Object content, Serializer serializer) { FileOutputStream stream = null; try { stream = new FileOutputStream(file); serializer.serialize(content, stream); } catch (Exception e) { throw new MinnalGeneratorException("Failed while writing the file " + file.getAbsolutePath(), e); } finally { if (stream != null) { closeStream(stream); } } } protected <T> T deserializeFrom(File file, Serializer serializer, Class<T> clazz) { if (!file.exists()) { return null; } InputStream stream = null; try { stream = new FileInputStream(file); return serializer.deserialize(stream, clazz); } catch (Exception e) { throw new MinnalGeneratorException("Failed while creating the file " + file.getAbsolutePath()); } finally { closeStream(stream); } } protected void closeStream(Closeable closeable) { try { if (closeable != null) { closeable.close(); } } catch (Exception e) { } } }