Author: maartenc
Date: Wed Sep 22 21:34:43 2010
New Revision: 1000246
URL: http://svn.apache.org/viewvc?rev=1000246&view=rev
Log:
NEW: the ivy:makepom Ant task can use a custom template file to generate the
pom.xml (merged from trunk)
Added:
ant/ivy/core/branches/2.2.x/src/etc/makepom/
- copied from r999129, ant/ivy/core/trunk/src/etc/makepom/
ant/ivy/core/branches/2.2.x/src/etc/makepom/pom.template
- copied unchanged from r999129,
ant/ivy/core/trunk/src/etc/makepom/pom.template
ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/plugins/parser/m2/pom.template
- copied unchanged from r997517,
ant/ivy/core/trunk/src/java/org/apache/ivy/plugins/parser/m2/pom.template
Modified:
ant/ivy/core/branches/2.2.x/ (props changed)
ant/ivy/core/branches/2.2.x/CHANGES.txt
ant/ivy/core/branches/2.2.x/build-release.xml
ant/ivy/core/branches/2.2.x/doc/use/makepom.html
ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/ant/IvyMakePom.java
ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorWriter.java
ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/plugins/parser/m2/PomWriterOptions.java
Propchange: ant/ivy/core/branches/2.2.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Sep 22 21:34:43 2010
@@ -1,4 +1,4 @@
/ant/ivy/core/branches/2.0.0:727187-727188,727520-732505
/ant/ivy/core/branches/2.0.0-rc2:707459-708717
/ant/ivy/core/branches/2.0.x:696803-698317
-/ant/ivy/core/trunk:695737,696014-696031,696442,958415-958693,961017-961020,962767-983820,983827-984586,984952,988337,988678,988691-988707,990621-991115,997391,997711-997931,1000206,1000225
+/ant/ivy/core/trunk:695737,696014-696031,696442,958415-958693,961017-961020,962767-983820,983827-984586,984952,988337,988678,988691-988707,990621-991115,997391,997508-997517,997711-997931,999129,1000206,1000225
Modified: ant/ivy/core/branches/2.2.x/CHANGES.txt
URL:
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.2.x/CHANGES.txt?rev=1000246&r1=1000245&r2=1000246&view=diff
==============================================================================
--- ant/ivy/core/branches/2.2.x/CHANGES.txt (original)
+++ ant/ivy/core/branches/2.2.x/CHANGES.txt Wed Sep 22 21:34:43 2010
@@ -116,6 +116,7 @@ for detailed view of each issue, please
- DOCUMENTATION: Grammar, spelling, and clarity of Settings File documentation
(IVY-1216) (thanks to Steve Miller)
- DOCUMENTATION: Grammar, spelling, and clarity of Tutorial documentation
(IVY-1222) (thanks to Steve Miller)
+- NEW: the ivy:makepom Ant task can use a custom template file to generate the
pom.xml
- NEW: Ivy can now generate OpenPGP compatible ASCII armored detached
signatures when publishing artifacts.
- IMPROVEMENT: the <artifact> child of ivy:publish now accepts any attribute
Modified: ant/ivy/core/branches/2.2.x/build-release.xml
URL:
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.2.x/build-release.xml?rev=1000246&r1=1000245&r2=1000246&view=diff
==============================================================================
--- ant/ivy/core/branches/2.2.x/build-release.xml (original)
+++ ant/ivy/core/branches/2.2.x/build-release.xml Wed Sep 22 21:34:43 2010
@@ -319,7 +319,7 @@
<property name="m2.distrib.dir"
value="${distrib.dir}/maven2/${build.version}" />
<ivy:makepom ivyfile="${artifacts.build.dir}/ivy.xml"
pomfile="${m2.distrib.dir}/ivy-${build.version}.pom"
-
headerfile="${basedir}/src/etc/license/license-header.xml">
+
templatefile="${basedir}/src/etc/makepom/pom.template">
<mapping conf="core" scope="compile"/>
<mapping conf="test" scope="test"/>
</ivy:makepom>
Modified: ant/ivy/core/branches/2.2.x/doc/use/makepom.html
URL:
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.2.x/doc/use/makepom.html?rev=1000246&r1=1000245&r2=1000246&view=diff
==============================================================================
--- ant/ivy/core/branches/2.2.x/doc/use/makepom.html (original)
+++ ant/ivy/core/branches/2.2.x/doc/use/makepom.html Wed Sep 22 21:34:43 2010
@@ -32,6 +32,45 @@ An example of use is to publish an Ivy m
<em>Note that all Ivy features are not supported by maven poms, so the
converted pom may not resolve to the exact same dependencies as the original
ivy file.</em>
+<span class="since">since 2.2</span>
+It is possible to specify a template file defining the structure of the
generated POM. The following processing is done on this template:
+<ul>
+<li>properties like <i>${property.name}</i> are replaced if they are defined
in Ant or by the ivy:makepom task (see below for the standard properties)</li>
+<li>lines containg the string <i>SKIP_LINE</i> are skipped.</li>
+<li>the defined dependencies will be added to the first <dependencies> element
encountered in the pom template. If the template doesn't contain a
<dependencies> element, it is generated a the end of the pom.
+</ul>
+
+The ivy:makepom task defines following properties that can be used in the
template. <ul>
+<li><b>ivy.pom.groupId</b>: defaults to the organisation as defined in the
ivy.xml file</li>
+<li><b>ivy.pom.artifactId</b>: defaults to the value of the 'atifactName'
attribute of this task, or the name of the module as defined in the ivy.xml
file</li>
+<li><b>ivy.pom.packaging</b>: defaults to the value of the 'artifactPackaging'
attribute of this task, or the extenstion of the artifact</li>
+<li><b>ivy.pom.version</b>: defaults to the revision as defined in the ivy.xml
file</li>
+<li><b>ivy.pom.name</b>: defaults to 'SKIP_LINE'</li>
+<li><b>ivy.pom.description</b>: defaults to the value of the 'description'
attribute of this task, or 'SKIP_LINE' when not specified</li>
+<li><b>ivy.pom.url</b>: defaults to the homepage as defined in the ivy.xml
file</li>
+<li><b>ivy.pom.license</b>: the content of the specified headerFile, or
'SKIP_LINE' if not specified</li>
+<li><b>ivy.pom.header</b>: some Ivy information, or 'SKIP_LINE' if the
'printIvyInfo' attribute is set to false.</li>
+</ul>
+Note that each property can be given a value manually in the Ant build file.
In that case, Ivy will use the value specified in the build file instead of the
default value.
+
+The default template that ships with Ivy looks like this:
+<code type="xml">
+${ivy.pom.license}
+${ivy.pom.header}
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>${ivy.pom.groupId}</groupId>
+ <artifactId>${ivy.pom.artifactId}</artifactId>
+ <packaging>${ivy.pom.packaging}</packaging>
+ <version>${ivy.pom.version}</version>
+ <name>${ivy.pom.name}</name>
+ <description>${ivy.pom.description}</description>
+ <url>${ivy.pom.url}</url>
+</project>
+</code>
+
<h1>Attributes</h1>
<table class="ant">
<thead>
@@ -42,6 +81,8 @@ An example of use is to publish an Ivy m
<td>Yes</td></tr>
<tr><td>pomfile</td><td>the destination pom file to write</td>
<td>Yes</td></tr>
+ <tr><td>templatefile</td><td>the template file to use when generating the
pom <span class="since">(since 2.2)</span></td>
+ <td>No, defaults to the internal template file.</td></tr>
<tr><td>artifactName</td><td>The name of the artifact which is represented
by the generated pom file. <span class="since">(since 2.2)</span></td>
<td>No, defaults to the module name in the source ivy file.</td></tr>
<tr><td>artifactPackaging</td><td>The packaging of the artifact which is
represented by the generated pom file. <span class="since">(since
2.2)</span></td>
Modified:
ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/ant/IvyMakePom.java
URL:
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/ant/IvyMakePom.java?rev=1000246&r1=1000245&r2=1000246&view=diff
==============================================================================
--- ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/ant/IvyMakePom.java
(original)
+++ ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/ant/IvyMakePom.java Wed
Sep 22 21:34:43 2010
@@ -105,6 +105,8 @@ public class IvyMakePom extends IvyTask
private File headerFile = null;
+ private File templateFile = null;
+
private boolean printIvyInfo = true;
private String conf;
@@ -141,6 +143,14 @@ public class IvyMakePom extends IvyTask
this.headerFile = headerFile;
}
+ public File getTemplateFile() {
+ return templateFile;
+ }
+
+ public void setTemplateFile(File templateFile) {
+ this.templateFile = templateFile;
+ }
+
public String getDescription() {
return description;
}
@@ -223,7 +233,8 @@ public class IvyMakePom extends IvyTask
.setArtifactPackaging(getArtifactPackaging())
.setPrintIvyInfo(isPrintIvyInfo())
.setDescription(getDescription())
- .setExtraDependencies(getDependencies());
+ .setExtraDependencies(getDependencies())
+ .setTemplate(getTemplateFile());
if (!mappings.isEmpty()) {
options.setMapping(new
PomWriterOptions.ConfigurationScopeMapping(getMappingsMap()));
Modified:
ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorWriter.java
URL:
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorWriter.java?rev=1000246&r1=1000245&r2=1000246&view=diff
==============================================================================
---
ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorWriter.java
(original)
+++
ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/plugins/parser/m2/PomModuleDescriptorWriter.java
Wed Sep 22 21:34:43 2010
@@ -18,26 +18,36 @@
package org.apache.ivy.plugins.parser.m2;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import org.apache.ivy.Ivy;
+import org.apache.ivy.core.IvyContext;
+import org.apache.ivy.core.IvyPatternHelper;
import org.apache.ivy.core.module.descriptor.Artifact;
import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.core.settings.IvySettings;
+import org.apache.ivy.core.settings.IvyVariableContainer;
import
org.apache.ivy.plugins.parser.m2.PomWriterOptions.ConfigurationScopeMapping;
import org.apache.ivy.plugins.parser.m2.PomWriterOptions.ExtraDependency;
import org.apache.ivy.util.ConfigurationUtils;
public final class PomModuleDescriptorWriter {
+ private static final String SKIP_LINE = "SKIP_LINE";
+
private static final ConfigurationScopeMapping DEFAULT_MAPPING
= new ConfigurationScopeMapping(new HashMap() {
{
@@ -55,40 +65,84 @@ public final class PomModuleDescriptorWr
public static void write(ModuleDescriptor md, File output,
PomWriterOptions options)
throws IOException {
+ LineNumberReader in;
+ if (options.getTemplate() == null) {
+ in = new LineNumberReader(new
InputStreamReader(PomModuleDescriptorWriter.class.getResourceAsStream("pom.template")));
+ } else {
+ in = new LineNumberReader(new InputStreamReader(new
FileInputStream(options.getTemplate())));
+ }
+
if (output.getParentFile() != null) {
output.getParentFile().mkdirs();
}
- PrintWriter out = new PrintWriter(new OutputStreamWriter(new
FileOutputStream(output),
- "UTF-8"));
+ PrintWriter out = new PrintWriter(new OutputStreamWriter(new
FileOutputStream(output), "UTF-8"));
try {
- out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+ IvySettings settings = IvyContext.getContext().getSettings();
+ IvyVariableContainer variables = new
IvyVariableContainerWrapper(settings.getVariableContainer());
+
+ variables.setVariable("ivy.pom.license", SKIP_LINE, true);
+ variables.setVariable("ivy.pom.header", SKIP_LINE, true);
+ variables.setVariable("ivy.pom.groupId", SKIP_LINE, true);
+ variables.setVariable("ivy.pom.artifactId", SKIP_LINE, true);
+ variables.setVariable("ivy.pom.version", SKIP_LINE, true);
+ variables.setVariable("ivy.pom.packaging", SKIP_LINE, true);
+ variables.setVariable("ivy.pom.name", SKIP_LINE, true);
+ variables.setVariable("ivy.pom.description", SKIP_LINE, true);
+ variables.setVariable("ivy.pom.url", SKIP_LINE, true);
+
if (options.getLicenseHeader() != null) {
- out.print(options.getLicenseHeader());
+ variables.setVariable("ivy.pom.license",
options.getLicenseHeader(), true);
}
if (options.isPrintIvyInfo()) {
- out.println("<!--");
- out.println(" Apache Maven 2 POM generated by Apache Ivy");
- out.println(" " + Ivy.getIvyHomeURL());
- out.println(" Apache Ivy version: " + Ivy.getIvyVersion()
- + " " + Ivy.getIvyDate());
- out.println("-->");
- }
- out.println("<project xmlns=\"http://maven.apache.org/POM/4.0.0\" "
- +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
- out.println("
xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 "
- + "http://maven.apache.org/maven-v4_0_0.xsd\">\n");
- out.println(" <modelVersion>4.0.0</modelVersion>");
- printModuleId(md, out, options);
- printDependencies(md, out, options);
- out.println("</project>");
+ String header = "<!--\n"
+ + " Apache Maven 2 POM generated by Apache
Ivy\n"
+ + " " + Ivy.getIvyHomeURL() + "\n"
+ + " Apache Ivy version: " +
Ivy.getIvyVersion()
+ + " " + Ivy.getIvyDate() + "\n"
+ + "-->";
+ variables.setVariable("ivy.pom.header", header, true);
+ }
+
+ setModuleVariables(md, variables, options);
+
+ boolean dependenciesPrinted = false;
+
+ int lastIndent = 0;
+ int indent = 0;
+ String line = in.readLine();
+ while (line != null) {
+ line = IvyPatternHelper.substituteVariables(line, variables);
+ if (line.indexOf(SKIP_LINE) != -1) {
+ // skip this line
+ line = in.readLine();
+ continue;
+ }
+
+ lastIndent = indent;
+ indent = line.indexOf('<');
+
+ if (!dependenciesPrinted && line.indexOf("</dependencies>") !=
-1) {
+ printDependencies(md, out, options, indent, false);
+ dependenciesPrinted = true;
+ }
+
+ if (!dependenciesPrinted && line.indexOf("</project>") != -1) {
+ printDependencies(md, out, options, lastIndent, true);
+ dependenciesPrinted = true;
+ }
+
+ out.println(line);
+ line = in.readLine();
+ }
} finally {
+ in.close();
out.close();
}
}
- private static void printModuleId(ModuleDescriptor md, PrintWriter out,
PomWriterOptions options) {
+ private static void setModuleVariables(ModuleDescriptor md,
IvyVariableContainer variables, PomWriterOptions options) {
ModuleRevisionId mrid = md.getModuleRevisionId();
- out.println(" <groupId>" + mrid.getOrganisation() + "</groupId>");
+ variables.setVariable("ivy.pom.groupId", mrid.getOrganisation(), true);
String artifactId = options.getArtifactName();
if (artifactId == null) {
@@ -107,16 +161,16 @@ public final class PomModuleDescriptorWr
}
}
- out.println(" <artifactId>" + artifactId + "</artifactId>");
- out.println(" <packaging>" + packaging + "</packaging>");
+ variables.setVariable("ivy.pom.artifactId", artifactId, true);
+ variables.setVariable("ivy.pom.packaging", packaging, true);
if (mrid.getRevision() != null) {
- out.println(" <version>" + mrid.getRevision() + "</version>");
+ variables.setVariable("ivy.pom.version", mrid.getRevision(), true);
}
if (options.getDescription() != null) {
- out.println(" <description>" + options.getDescription() +
"</description>");
+ variables.setVariable("ivy.pom.description",
options.getDescription(), true);
}
if (md.getHomePage() != null) {
- out.println(" <url>" + md.getHomePage() + "</url>");
+ variables.setVariable("ivy.pom.url", md.getHomePage(), true);
}
}
@@ -134,38 +188,54 @@ public final class PomModuleDescriptorWr
return null;
}
+
+ private static void indent(PrintWriter out, int indent) {
+ for (int i = 0; i < indent; i++) {
+ out.print(' ');
+ }
+ }
private static void printDependencies(ModuleDescriptor md, PrintWriter
out,
- PomWriterOptions options) {
+ PomWriterOptions options, int indent, boolean printDependencies) {
List extraDeps = options.getExtraDependencies();
DependencyDescriptor[] dds = getDependencies(md, options);
if (!extraDeps.isEmpty() || (dds.length > 0)) {
- out.println(" <dependencies>");
-
+ if (printDependencies) {
+ indent(out, indent);
+ out.println("<dependencies>");
+ }
+
// print the extra dependencies first
for (Iterator it = extraDeps.iterator(); it.hasNext(); ) {
PomWriterOptions.ExtraDependency dep = (ExtraDependency)
it.next();
- out.println(" <dependency>");
+ indent(out, indent * 2);
+ out.println("<dependency>");
String groupId = dep.getGroup();
if (groupId == null) {
groupId = md.getModuleRevisionId().getOrganisation();
}
- out.println(" <groupId>" + groupId + "</groupId>");
- out.println(" <artifactId>" + dep.getArtifact() +
"</artifactId>");
+ indent(out, indent * 3);
+ out.println("<groupId>" + groupId + "</groupId>");
+ indent(out, indent * 3);
+ out.println("<artifactId>" + dep.getArtifact() +
"</artifactId>");
String version = dep.getVersion();
if (version == null) {
version = md.getModuleRevisionId().getRevision();
}
- out.println(" <version>" + version + "</version>");
+ indent(out, indent * 3);
+ out.println("<version>" + version + "</version>");
if (dep.getScope() != null) {
- out.println(" <scope>" + dep.getScope() + "</scope>");
+ indent(out, indent * 3);
+ out.println("<scope>" + dep.getScope() + "</scope>");
}
if (dep.isOptional()) {
- out.println(" <optional>true</optional>");
+ indent(out, indent * 3);
+ out.println("<optional>true</optional>");
}
- out.println(" </dependency>");
+ indent(out, indent * 2);
+ out.println("</dependency>");
}
// now print the dependencies listed in the ModuleDescriptor
@@ -176,20 +246,31 @@ public final class PomModuleDescriptorWr
for (int i = 0; i < dds.length; i++) {
ModuleRevisionId mrid = dds[i].getDependencyRevisionId();
- out.println(" <dependency>");
- out.println(" <groupId>" + mrid.getOrganisation() +
"</groupId>");
- out.println(" <artifactId>" + mrid.getName() +
"</artifactId>");
- out.println(" <version>" + mrid.getRevision() +
"</version>");
+ indent(out, indent * 2);
+ out.println("<dependency>");
+ indent(out, indent * 3);
+ out.println("<groupId>" + mrid.getOrganisation() +
"</groupId>");
+ indent(out, indent * 3);
+ out.println("<artifactId>" + mrid.getName() + "</artifactId>");
+ indent(out, indent * 3);
+ out.println("<version>" + mrid.getRevision() + "</version>");
String scope =
mapping.getScope(dds[i].getModuleConfigurations());
if (scope != null) {
- out.println(" <scope>" + scope + "</scope>");
+ indent(out, indent * 3);
+ out.println("<scope>" + scope + "</scope>");
}
if (mapping.isOptional(dds[i].getModuleConfigurations())) {
- out.println(" <optional>true</optional>");
+ indent(out, indent * 3);
+ out.println("<optional>true</optional>");
}
- out.println(" </dependency>");
+ indent(out, indent * 2);
+ out.println("</dependency>");
+ }
+
+ if (printDependencies) {
+ indent(out, indent);
+ out.println("</dependencies>");
}
- out.println(" </dependencies>");
}
}
@@ -208,4 +289,41 @@ public final class PomModuleDescriptorWr
return (DependencyDescriptor[]) result.toArray(new
DependencyDescriptor[result.size()]);
}
+
+ /**
+ * Wraps an {...@link IvyVariableContainer} delegating most method calls
to the wrapped instance,
+ * except for a set of variables which are only stored locally in the
wrapper, and not
+ * propagated to the wrapped instance.
+ */
+ private static final class IvyVariableContainerWrapper implements
IvyVariableContainer {
+
+ private final IvyVariableContainer variables;
+
+ private Map localVariables = new HashMap();
+
+ private IvyVariableContainerWrapper(IvyVariableContainer variables) {
+ this.variables = variables;
+ }
+
+ public void setVariable(String varName, String value, boolean
overwrite) {
+ localVariables.put(varName, value);
+ }
+
+ public void setEnvironmentPrefix(String prefix) {
+ variables.setEnvironmentPrefix(prefix);
+ }
+
+ public String getVariable(String name) {
+ String result = variables.getVariable(name);
+ if (result == null) {
+ result = (String) localVariables.get(name);
+ }
+ return result;
+ }
+
+ public Object clone() {
+ throw new UnsupportedOperationException();
+ }
+ }
+
}
Modified:
ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/plugins/parser/m2/PomWriterOptions.java
URL:
http://svn.apache.org/viewvc/ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/plugins/parser/m2/PomWriterOptions.java?rev=1000246&r1=1000245&r2=1000246&view=diff
==============================================================================
---
ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/plugins/parser/m2/PomWriterOptions.java
(original)
+++
ant/ivy/core/branches/2.2.x/src/java/org/apache/ivy/plugins/parser/m2/PomWriterOptions.java
Wed Sep 22 21:34:43 2010
@@ -17,6 +17,7 @@
*/
package org.apache.ivy.plugins.parser.m2;
+import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -39,6 +40,17 @@ public class PomWriterOptions {
private List/*<ExtraDependency>*/ extraDependencies = new ArrayList();
private String description;
+
+ private File template;
+
+ public File getTemplate() {
+ return template;
+ }
+
+ public PomWriterOptions setTemplate(File template) {
+ this.template = template;
+ return this;
+ }
public String[] getConfs() {
return confs;
@@ -55,6 +67,9 @@ public class PomWriterOptions {
public PomWriterOptions setLicenseHeader(String licenseHeader) {
this.licenseHeader = licenseHeader;
+ if (this.licenseHeader != null) {
+ this.licenseHeader = this.licenseHeader.trim();
+ }
return this;
}