/**
*
* Copyright 2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.geronimo.plugin.packaging;
import java.io.File;
import java.io.StringWriter;
import java.util.Iterator;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.commons.jelly.tags.velocity.JellyContextAdapter;
import org.apache.commons.jelly.JellyContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.maven.project.Dependency;
import org.apache.maven.repository.Artifact;
import org.apache.velocity.Template;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.context.Context;
import org.apache.xmlbeans.XmlCursor;
import org.apache.xmlbeans.XmlException;
import org.apache.xmlbeans.XmlObject;
import org.apache.xmlbeans.XmlOptions;
/**
* @version $Rev$ $Date$
*/
public class PlanProcessor {
private static Log log = LogFactory.getLog(PlanProcessor.class);
private static final String IMPORT_PROPERTY = "geronimo.import";
private static final QName IMPORT_QNAME = new QName("http://geronimo.apache.org/xml/ns/deployment-1.0", "import");
private static final String INCLUDE_PROPERTY = "geronimo.include";
private static final QName INCLUDE_QNAME = new QName("http://geronimo.apache.org/xml/ns/deployment-1.0", "include");
private static final String DEPENDENCY_PROPERTY = "geronimo.dependency";
private static final QName DEPENDENCY_QNAME = new QName("http://geronimo.apache.org/xml/ns/deployment-1.0", "dependency");
private List artifacts;
private String sourceDir;
private String targetDir;
private String planFile;
private String targetFile;
private Context context;
public List getArtifacts() {
return artifacts;
}
public void setArtifacts(List artifacts) {
this.artifacts = artifacts;
}
public String getSourceDir() {
return sourceDir;
}
public void setSourceDir(String sourceDir) {
this.sourceDir = sourceDir;
}
public String getTargetDir() {
return targetDir;
}
public void setTargetDir(String targetDir) {
this.targetDir = targetDir;
}
public String getPlanFile() {
return planFile;
}
public void setPlanFile(String planFile) {
this.planFile = planFile;
}
public String getTargetFile() {
return targetFile;
}
public void setTargetFile(String targetFile) {
this.targetFile = targetFile;
}
public void setContext(JellyContext context) {
this.context = new JellyContextAdapter(context);
}
public void execute() throws Exception, XmlException {
try {
if (artifacts == null) {
throw new RuntimeException("Artifacts not supplied");
}
if (targetDir == null) {
throw new RuntimeException("No target directory supplied");
}
if (planFile == null) {
throw new RuntimeException("No source plan supplied");
}
if (targetFile == null) {
throw new RuntimeException("No target plan supplied");
}
File sourceD = new File(sourceDir);
VelocityEngine velocity = new VelocityEngine();
velocity.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, sourceD.getAbsolutePath());
velocity.init();
Template template = velocity.getTemplate(planFile);
StringWriter writer = new StringWriter();
template.merge(context, writer);
String plan = writer.toString();
XmlObject doc = XmlObject.Factory.parse(plan);
XmlCursor xmlCursor = doc.newCursor();
try {
xmlCursor.toFirstContentToken();
xmlCursor.toFirstChild();
insertPlanElements(xmlCursor, IMPORT_PROPERTY, IMPORT_QNAME);
insertPlanElements(xmlCursor, INCLUDE_PROPERTY, INCLUDE_QNAME);
insertPlanElements(xmlCursor, DEPENDENCY_PROPERTY, DEPENDENCY_QNAME);
File targetDir = new File(this.targetDir);
if (targetDir.exists()) {
if (!targetDir.isDirectory()) {
throw new RuntimeException("TargetDir: " + this.targetDir + " exists and is not a directory");
}
} else {
targetDir.mkdirs();
}
File output = new File(targetFile);
XmlOptions xmlOptions = new XmlOptions();
xmlOptions.setSavePrettyPrint();
doc.save(output, xmlOptions);
} finally {
xmlCursor.dispose();
}
} catch (Exception e) {
log.error(e.getClass().getName()+": "+e.getMessage(), e);
throw e;
}
}
private void insertPlanElements(XmlCursor xmlCursor, String artifactProperty, QName elementQName) {
if (xmlCursor.toNextSibling(elementQName)) {
while(xmlCursor.toNextSibling(elementQName));
xmlCursor.toEndToken();
xmlCursor.toNextToken();
}
for (Iterator iterator = artifacts.iterator(); iterator.hasNext();) {
Artifact artifact = (Artifact) iterator.next();
Dependency dependency = (Dependency) artifact.getDependency();
if ("true".equals(dependency.getProperty(artifactProperty))) {
String groupId = dependency.getGroupId();
String artifactId = dependency.getArtifactId();
String version = dependency.getVersion();
String type = dependency.getType();
org.apache.geronimo.deployment.xbeans.DependencyType dependencyType = org.apache.geronimo.deployment.xbeans.DependencyType.Factory.newInstance();
dependencyType.setGroupId(groupId);
dependencyType.setArtifactId(artifactId);
dependencyType.setVersion(version);
if (type != null && !"jar".equals(type)) {
dependencyType.setType(type);
}
xmlCursor.beginElement(elementQName);
XmlCursor element = dependencyType.newCursor();
try {
element.copyXmlContents(xmlCursor);
} finally {
element.dispose();
}
xmlCursor.toNextToken();
}
}
}
}