blob: 1557997a2db2238b374f2d8bcc4936a4fa94569c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.easyant.tasks;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.easyant.core.EasyAntMagicNames;
import org.apache.easyant.core.report.EasyAntReport;
import org.apache.easyant.core.report.XMLEasyAntReportWriter;
import org.apache.easyant.core.services.PluginService;
import org.apache.ivy.core.IvyPatternHelper;
import org.apache.ivy.core.cache.ResolutionCacheManager;
import org.apache.ivy.core.module.id.ModuleRevisionId;
import org.apache.ivy.core.settings.IvySettings;
import org.apache.ivy.util.FileUtil;
import org.apache.ivy.util.Message;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.XSLTProcess;
import org.apache.tools.ant.taskdefs.XSLTProcess.Param;
import org.apache.tools.ant.util.JAXPUtils;
public class PluginReport extends AbstractEasyAntTask {
private File todir;
private File toFile;
private String conf;
private File xslFile;
private String xslext = "html";
private List<XSLTProcess.Param> params = new ArrayList<XSLTProcess.Param>();
private File moduleIvy;
private File sourceDirectory;
private String outputpattern;
public File getModuleIvy() {
return moduleIvy;
}
public void setModuleIvy(File moduleIvy) {
this.moduleIvy = moduleIvy;
}
public File getSourceDirectory() {
return sourceDirectory;
}
public void setSourceDirectory(File sourceDirectory) {
this.sourceDirectory = sourceDirectory;
}
public File getTodir() {
return todir;
}
public void setTodir(File todir) {
this.todir = todir;
}
public String getConf() {
return conf;
}
public void setConf(String conf) {
this.conf = conf;
}
public File getXslfile() {
return xslFile;
}
public void setXslfile(File xslFile) {
this.xslFile = xslFile;
}
public String getOutputpattern() {
return outputpattern;
}
public void setOutputpattern(String outputpattern) {
this.outputpattern = outputpattern;
}
public String getXslext() {
return xslext;
}
public void setXslext(String xslext) {
this.xslext = xslext;
}
public File getToFile() {
return toFile;
}
public void setToFile(File toFile) {
this.toFile = toFile;
}
public void execute() throws BuildException {
IvySettings settings = getEasyAntIvyInstance().getSettings();
if (moduleIvy == null || !moduleIvy.exists()) {
throw new BuildException("moduleIvy attribute is not set or is not a file");
}
if (sourceDirectory == null || !sourceDirectory.exists()) {
throw new BuildException("sourceDirectory attribute is not set or doesn't exists");
}
conf = getProperty(conf, settings, "ivy.resolved.configurations");
if ("*".equals(conf)) {
conf = getProperty(settings, "ivy.resolved.configurations");
}
if (conf == null) {
throw new BuildException("no conf provided for ivy report task: "
+ "It can either be set explicitely via the attribute 'conf' or "
+ "via 'ivy.resolved.configurations' property or a prior call to <resolve/>");
}
if (todir == null) {
String t = getProperty(settings, "ivy.report.todir");
if (t != null) {
todir = getProject().resolveFile(t);
} else {
todir = getProject().getBaseDir();
}
}
if (todir != null && todir.exists()) {
todir.mkdirs();
}
outputpattern = getProperty(outputpattern, settings, "ivy.report.output.pattern");
if (outputpattern == null) {
outputpattern = "[organisation]-[module]-[conf].[ext]";
}
if (todir != null && todir.exists() && !todir.isDirectory()) {
throw new BuildException("destination directory should be a directory !");
}
PluginService pluginService = getProject().getReference(
EasyAntMagicNames.PLUGIN_SERVICE_INSTANCE);
OutputStream stream = null;
try {
EasyAntReport easyantReport = pluginService.getPluginInfo(moduleIvy, sourceDirectory, conf);
ModuleRevisionId moduleRevisionId = easyantReport.getModuleDescriptor().getModuleRevisionId();
File reportFile = new File(todir, getOutputPattern(moduleRevisionId, conf, "xml"));
todir.mkdirs();
stream = new FileOutputStream(reportFile);
XMLEasyAntReportWriter writer = new XMLEasyAntReportWriter();
writer.output(easyantReport, stream);
genStyled(reportFile, getReportStylePath(), easyantReport);
} catch (Exception e) {
throw new BuildException("impossible to generate report: " + e, e);
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
// do nothing
}
}
}
}
private File getReportStylePath() throws IOException {
if (xslFile != null) {
return xslFile;
}
// style should be a file (and not an url)
// so we have to copy it from classpath to cache
ResolutionCacheManager cacheMgr = getEasyAntIvyInstance().getResolutionCacheManager();
File style = new File(cacheMgr.getResolutionCacheRoot(), "easyant-report.xsl");
if (!style.exists()) {
Message.debug("copying easyant-report.xsl to " + style.getAbsolutePath());
FileUtil.copy(XMLEasyAntReportWriter.class.getResourceAsStream("easyant-report.xsl"), style, null);
}
return style;
}
private String getOutputPattern(ModuleRevisionId moduleRevisionId, String conf, String ext) {
return IvyPatternHelper.substitute(outputpattern, moduleRevisionId.getOrganisation(),
moduleRevisionId.getName(), moduleRevisionId.getRevision(), "", "", ext, conf,
moduleRevisionId.getQualifiedExtraAttributes(), null);
}
private void genStyled(File reportFile, File style, EasyAntReport easyantReport) throws IOException {
InputStream xsltStream = null;
try {
// create stream to stylesheet
xsltStream = new BufferedInputStream(new FileInputStream(style));
Source xsltSource = new StreamSource(xsltStream, JAXPUtils.getSystemId(style));
// create transformer
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer = tFactory.newTransformer(xsltSource);
// add the provided XSLT parameters
for (Param param : params) {
transformer.setParameter(param.getName(), param.getExpression());
}
ModuleRevisionId moduleRevisionId = easyantReport.getModuleDescriptor().getModuleRevisionId();
File outFile;
if (toFile != null) {
outFile = toFile;
} else {
outFile = new File(todir, getOutputPattern(moduleRevisionId, conf, xslext));
}
log("Processing " + reportFile + " to " + outFile);
// make sure the output directory exist
File outFileDir = outFile.getParentFile();
if (!outFileDir.exists()) {
if (!outFileDir.mkdirs()) {
throw new BuildException("Unable to create directory: " + outFileDir.getAbsolutePath());
}
}
InputStream inStream = null;
OutputStream outStream = null;
try {
inStream = new BufferedInputStream(new FileInputStream(reportFile));
outStream = new BufferedOutputStream(new FileOutputStream(outFile));
StreamResult res = new StreamResult(outStream);
Source src = new StreamSource(inStream, JAXPUtils.getSystemId(style));
transformer.transform(src, res);
} catch (TransformerException e) {
throw new BuildException(e);
} finally {
if (inStream != null) {
try {
inStream.close();
} catch (IOException e) {
// ignore
}
}
if (outStream != null) {
try {
outStream.close();
} catch (IOException e) {
// ignore
}
}
}
} catch (TransformerConfigurationException e) {
throw new BuildException(e);
} finally {
if (xsltStream != null) {
try {
xsltStream.close();
} catch (IOException e) {
// ignore
}
}
}
}
public XSLTProcess.Param createParam() {
XSLTProcess.Param result = new XSLTProcess.Param();
params.add(result);
return result;
}
private String getProperty(String value, IvySettings ivy, String name) {
if (value == null) {
return getProperty(ivy, name);
} else {
value = ivy.substitute(value);
Message.debug("parameter found as attribute value: " + name + "=" + value);
return value;
}
}
private String getProperty(IvySettings ivy, String name) {
String val = ivy.getVariable(name);
if (val == null) {
val = ivy.substitute(getProject().getProperty(name));
if (val != null) {
Message.debug("parameter found as ant project property: " + name + "=" + val);
} else {
Message.debug("parameter not found: " + name);
}
} else {
val = ivy.substitute(val);
Message.debug("parameter found as ivy variable: " + name + "=" + val);
}
return val;
}
}