/**
*
*/
package org.minnal.generator.core;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.Set;
import org.apache.maven.model.Build;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.PluginExecution;
import org.apache.maven.model.Repository;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.minnal.generator.exception.MinnalGeneratorException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Charsets;
/**
* @author ganeshs
*/
public class PomGenerator extends AbstractGenerator {
private String projectName;
private Model model;
private Set<Dependency> dependenciesToAdd = new HashSet<Dependency>();
private Set<Dependency> dependenciesToRemove = new HashSet<Dependency>();
private static final String MODEL_VERSION = "4.0.0";
private static final String DEFAULT_VERSION = "0.0.1-SNAPSHOT";
private static final String POM_FILE = "pom.xml";
private static final String ACTIVE_JPA_RELEASES_REPO = "https://raw.github.com/ActiveJpa/activejpa/mvn-repo/releases";
private static final String AUTOPOJO_RELEASES_REPO = "https://raw.github.com/minnal/mvn-repo/master/releases";
private static final String MINNAL_RELEASES_REPO = "https://raw.github.com/minnal/mvn-repo/master/releases";
private static final Logger logger = LoggerFactory.getLogger(PomGenerator.class);
public PomGenerator(File baseDir, String projectName) {
super(baseDir);
this.projectName = projectName;
}
@Override
public void init() {
super.init();
File pom = new File(baseDir, POM_FILE);
if (pom.exists()) {
logger.trace("pom already exist. Reading it");
MavenXpp3Reader reader = new MavenXpp3Reader();
FileInputStream stream = null;
try {
stream = new FileInputStream(pom);
model = reader.read(stream);
} catch (Exception e) {
throw new MinnalGeneratorException("Failed while reading the pom - " + pom.getName(), e);
} finally {
closeStream(stream);
}
} else {
model = createMavenModel();
}
for (Dependency dependency : dependenciesToAdd) {
if (!model.getDependencies().contains(dependency)) {
model.addDependency(dependency);
}
}
for (Dependency dependency : dependenciesToRemove) {
model.removeDependency(dependency);
}
}
private Model createMavenModel() {
model = new Model();
model.setArtifactId(projectName);
model.setName(projectName);
model.setModelVersion(MODEL_VERSION);
model.setVersion(DEFAULT_VERSION);
model.setGroupId("com." + projectName.toLowerCase());
Repository repository = new Repository();
repository.setId("activejpa-repo");
repository.setUrl(ACTIVE_JPA_RELEASES_REPO);
model.addRepository(repository);
repository = new Repository();
repository.setId("autopojo-repo");
repository.setUrl(AUTOPOJO_RELEASES_REPO);
model.addRepository(repository);
repository = new Repository();
repository.setId("minnal-repo");
repository.setUrl(MINNAL_RELEASES_REPO);
model.addRepository(repository);
Build build = new Build();
Plugin plugin = new Plugin();
plugin.setGroupId("org.codehaus.mojo");
plugin.setArtifactId("exec-maven-plugin");
plugin.setVersion("1.3.2");
Xpp3Dom configuration = new Xpp3Dom("configuration");
Xpp3Dom executable = new Xpp3Dom("executable");
executable.setValue("java");
configuration.addChild(executable);
Xpp3Dom arguments = new Xpp3Dom("arguments");
Xpp3Dom classpath = new Xpp3Dom("argument");
Xpp3Dom classpathScope = new Xpp3Dom("classpathScope");
classpath.setValue("-classpath");
arguments.addChild(classpath);
arguments.addChild(new Xpp3Dom("classpath"));
Xpp3Dom mainClass = new Xpp3Dom("argument");
mainClass.setValue("${mainClass}");
arguments.addChild(mainClass);
classpathScope.setValue("compile");
configuration.addChild(arguments);
configuration.addChild(classpathScope);
plugin.setConfiguration(configuration);
PluginExecution execution = new PluginExecution();
execution.addGoal("java");
plugin.addExecution(execution);
build.addPlugin(plugin);
model.setBuild(build);
return model;
}
public void addDependency(String groupId, String artifactId, String version) {
addDependency(groupId, artifactId, version, "compile");
}
public void addDependency(String groupId, String artifactId, String version, String scope) {
Dependency dependency = new Dependency();
dependency.setArtifactId(artifactId);
dependency.setGroupId(groupId);
dependency.setVersion(version);
dependency.setScope(scope);
dependenciesToAdd.add(dependency);
}
@Override
public void generate() {
logger.info("Creating the pom file {}", POM_FILE);
File pom = new File(baseDir, POM_FILE);
OutputStreamWriter fileWriter = null;
try {
fileWriter = new OutputStreamWriter(new FileOutputStream(pom), Charsets.UTF_8);
logger.debug("Writing the generated pom file {}", POM_FILE);
MavenXpp3Writer writer = new MavenXpp3Writer();
writer.write(fileWriter, model);
} catch (Exception e) {
throw new MinnalGeneratorException("Failed while writing the pom - " + pom.getName(), e);
} finally {
closeStream(fileWriter);
}
}
}