Patched Environment.java for raw access to the variables, rather than just a string array. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@278059 13f79535-47bb-0310-9956-ffa450edef68master
@@ -152,6 +152,7 @@ Other changes: | |||||
can be used with the jar attribute or nested filesets | can be used with the jar attribute or nested filesets | ||||
-a mapper to permit filename remapping on signing | -a mapper to permit filename remapping on signing | ||||
-tsaurl and tsacert attributes for timestamped JAR signing | -tsaurl and tsacert attributes for timestamped JAR signing | ||||
-nested <sysproperty> elements, which can be used for proxy setup and the like | |||||
Changes from Ant 1.6.2 to current Ant 1.6 CVS version | Changes from Ant 1.6.2 to current Ant 1.6 CVS version | ||||
===================================================== | ===================================================== | ||||
@@ -144,7 +144,15 @@ block</td> | |||||
<td valign="top">A mapper to rename jar files during signing</td> | <td valign="top">A mapper to rename jar files during signing</td> | ||||
<td valign="top" align="center">No, and only one can be supplied</td> | <td valign="top" align="center">No, and only one can be supplied</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<td valign="top">sysproperty</td> | |||||
<td valign="top">JVM system properties, with the syntax of Ant | |||||
<a href="exec.html#env">environment variables</a> </td> | |||||
<td valign="top" align="center">No, and only one can be supplied</td> | |||||
</tr> | |||||
</table> | </table> | ||||
<h3>Examples</h3> | <h3>Examples</h3> | ||||
<blockquote><pre> | <blockquote><pre> | ||||
<signjar jar="${dist}/lib/ant.jar" | <signjar jar="${dist}/lib/ant.jar" | ||||
@@ -154,7 +162,34 @@ alias="apache-group" storepass="secret"/> | |||||
signs the ant.jar with alias "apache-group" accessing the | signs the ant.jar with alias "apache-group" accessing the | ||||
keystore and private key via "secret" password. | keystore and private key via "secret" password. | ||||
</p> | </p> | ||||
<blockquote><pre> | |||||
<signjar destDir="signed" | |||||
alias="testonly" keystore="testkeystore" | |||||
storepass="apacheant" | |||||
preservelastmodified="true"> | |||||
<fileset dir="dist" includes="**/*.jar" /> | |||||
<flattenmapper /> | |||||
</signjar> | |||||
</pre></blockquote> | |||||
<p> | |||||
Sign all JAR files matching the dist/**/*.jar pattern, copying them to the | |||||
directory "signed" afterwards. The flatten mapper means that they will | |||||
all be copied to this directory, not to subdirectories. | |||||
</p> | |||||
<blockquote><pre> | |||||
<signjar | |||||
alias="testonly" keystore="testkeystore" | |||||
storepass="apacheant" | |||||
lazy="true" | |||||
> | |||||
<fileset dir="dist" includes="**/*.jar" /> | |||||
</signjar> | |||||
</pre></blockquote> | |||||
<p> | |||||
Sign all the JAR files in dist/**/*.jar <i>in-situ</i>. Lazy signing is used, | |||||
so the files will only be signed if they are not already signed. | |||||
</p> | |||||
<h3>About timestamp signing</h3> | <h3>About timestamp signing</h3> | ||||
<p> | <p> | ||||
@@ -6,8 +6,6 @@ | |||||
<property name="test.jar" location="${sign.dir}/signtest.jar" /> | <property name="test.jar" location="${sign.dir}/signtest.jar" /> | ||||
<property name="subdirtest.jar" location="${subdir}/signtest.jar" /> | <property name="subdirtest.jar" location="${subdir}/signtest.jar" /> | ||||
<mkdir dir="${sign.dir}" /> | |||||
<mkdir dir="${subdir}" /> | |||||
<macrodef name="assertSigned"> | <macrodef name="assertSigned"> | ||||
<attribute name="jar" default="${test.jar}" /> | <attribute name="jar" default="${test.jar}" /> | ||||
@@ -35,8 +33,13 @@ | |||||
<presetdef name="sign"> | <presetdef name="sign"> | ||||
<sign-base jar="${test.jar}" /> | <sign-base jar="${test.jar}" /> | ||||
</presetdef> | </presetdef> | ||||
<target name="init"> | |||||
<mkdir dir="${sign.dir}" /> | |||||
<mkdir dir="${subdir}" /> | |||||
</target> | |||||
<target name="jar" > | |||||
<target name="jar" depends="init"> | |||||
<jar jarfile="${test.jar}" basedir="${classes.dir}" includes="**/Task.class"/> | <jar jarfile="${test.jar}" basedir="${classes.dir}" includes="**/Task.class"/> | ||||
</target> | </target> | ||||
@@ -117,9 +120,8 @@ | |||||
</target> | </target> | ||||
<target name="testSignedJar" depends="jar"> | <target name="testSignedJar" depends="jar"> | ||||
<property name="new.jar" location="${sign.dir}/newfile.jar" /> | |||||
<sign signedjar="${new.jar}"/> | |||||
<assertSigned jar="${new.jar}"/> | |||||
<sign signedjar="${subdirtest.jar}"/> | |||||
<assertSigned jar="${subdirtest.jar}"/> | |||||
</target> | </target> | ||||
<target name="testDestDirAndSignedJar" depends="jar"> | <target name="testDestDirAndSignedJar" depends="jar"> | ||||
@@ -181,6 +183,12 @@ | |||||
<sign tsaurl="http://localhost:0/" /> | <sign tsaurl="http://localhost:0/" /> | ||||
</target> | </target> | ||||
<target name="testSysProperty" depends="jar"> | |||||
<sign> | |||||
<sysproperty key="ant.home" value="${ant.home}" /> | |||||
</sign> | |||||
<assertSigned/> | |||||
</target> | |||||
<target name="testVerifyJar" depends="basic"> | <target name="testVerifyJar" depends="basic"> | ||||
<verify-base jar="${test.jar}"/> | <verify-base jar="${test.jar}"/> | ||||
@@ -18,12 +18,15 @@ | |||||
package org.apache.tools.ant.taskdefs; | package org.apache.tools.ant.taskdefs; | ||||
import org.apache.tools.ant.Task; | import org.apache.tools.ant.Task; | ||||
import org.apache.tools.ant.BuildException; | |||||
import org.apache.tools.ant.util.JavaEnvUtils; | import org.apache.tools.ant.util.JavaEnvUtils; | ||||
import org.apache.tools.ant.types.FileSet; | import org.apache.tools.ant.types.FileSet; | ||||
import org.apache.tools.ant.types.RedirectorElement; | import org.apache.tools.ant.types.RedirectorElement; | ||||
import org.apache.tools.ant.types.Environment; | |||||
import java.io.File; | import java.io.File; | ||||
import java.util.Vector; | import java.util.Vector; | ||||
import java.util.Enumeration; | |||||
/** | /** | ||||
* This is factored out from {@link SignJar}; a base class that can be used | * This is factored out from {@link SignJar}; a base class that can be used | ||||
@@ -75,6 +78,12 @@ public abstract class AbstractJarSignerTask extends Task { | |||||
* redirector used to talk to the jarsigner program | * redirector used to talk to the jarsigner program | ||||
*/ | */ | ||||
private RedirectorElement redirector; | private RedirectorElement redirector; | ||||
/** | |||||
* Java declarations -J-Dname=value | |||||
*/ | |||||
private Environment sysProperties=new Environment(); | |||||
/** | /** | ||||
* error string for unit test verification: {@value} | * error string for unit test verification: {@value} | ||||
*/ | */ | ||||
@@ -164,6 +173,14 @@ public abstract class AbstractJarSignerTask extends Task { | |||||
filesets.addElement(set); | filesets.addElement(set); | ||||
} | } | ||||
/** | |||||
* Add a system property. | |||||
* | |||||
* @param sysp system property. | |||||
*/ | |||||
public void addSysproperty(Environment.Variable sysp) { | |||||
sysProperties.addVariable(sysp); | |||||
} | |||||
/** | /** | ||||
* init processing logic; this is retained through our execution(s) | * init processing logic; this is retained through our execution(s) | ||||
*/ | */ | ||||
@@ -201,14 +218,33 @@ public abstract class AbstractJarSignerTask extends Task { | |||||
*/ | */ | ||||
protected void setCommonOptions(final ExecTask cmd) { | protected void setCommonOptions(final ExecTask cmd) { | ||||
if (maxMemory != null) { | if (maxMemory != null) { | ||||
cmd.createArg().setValue("-J-Xmx" + maxMemory); | |||||
addValue(cmd,"-J-Xmx" + maxMemory); | |||||
} | } | ||||
if (verbose) { | if (verbose) { | ||||
cmd.createArg().setValue("-verbose"); | |||||
addValue(cmd,"-verbose"); | |||||
} | } | ||||
//now patch in all system properties | |||||
Vector props=sysProperties.getVariablesVector(); | |||||
Enumeration e=props.elements(); | |||||
while (e.hasMoreElements()) { | |||||
Environment.Variable variable = (Environment.Variable) e.nextElement(); | |||||
declareSysProperty(cmd,variable); | |||||
} | |||||
} | |||||
/** | |||||
* | |||||
* @param cmd command to configure | |||||
* @param property property to set | |||||
* @throws BuildException if the property is not correctly defined. | |||||
*/ | |||||
protected void declareSysProperty(ExecTask cmd,Environment.Variable property) { | |||||
addValue(cmd, "-J-D"+property.getContent()); | |||||
} | } | ||||
/** | /** | ||||
* bind to a keystore if the attributes are there | * bind to a keystore if the attributes are there | ||||
* @param cmd command to configure | * @param cmd command to configure | ||||
@@ -216,7 +252,7 @@ public abstract class AbstractJarSignerTask extends Task { | |||||
protected void bindToKeystore(final ExecTask cmd) { | protected void bindToKeystore(final ExecTask cmd) { | ||||
if (null != keystore) { | if (null != keystore) { | ||||
// is the keystore a file | // is the keystore a file | ||||
cmd.createArg().setValue("-keystore"); | |||||
addValue(cmd,"-keystore"); | |||||
String location; | String location; | ||||
File keystoreFile = getProject().resolveFile(keystore); | File keystoreFile = getProject().resolveFile(keystore); | ||||
if (keystoreFile.exists()) { | if (keystoreFile.exists()) { | ||||
@@ -225,11 +261,11 @@ public abstract class AbstractJarSignerTask extends Task { | |||||
// must be a URL - just pass as is | // must be a URL - just pass as is | ||||
location = keystore; | location = keystore; | ||||
} | } | ||||
cmd.createArg().setValue(location); | |||||
addValue(cmd,location); | |||||
} | } | ||||
if (null != storetype) { | if (null != storetype) { | ||||
cmd.createArg().setValue("-storetype"); | |||||
cmd.createArg().setValue(storetype); | |||||
addValue(cmd,"-storetype"); | |||||
addValue(cmd, storetype); | |||||
} | } | ||||
} | } | ||||
@@ -151,4 +151,14 @@ public class Environment { | |||||
} | } | ||||
return result; | return result; | ||||
} | } | ||||
/** | |||||
* Get the raw vector of variables. This is not a clone. | |||||
* @return a potentially empty (but never null) vector of elements of type | |||||
* Variable | |||||
* @since Ant 1.7 | |||||
*/ | |||||
public Vector getVariablesVector() { | |||||
return variables; | |||||
} | |||||
} | } |
@@ -150,6 +150,10 @@ public class SignJarTest extends BuildFileTest { | |||||
} | } | ||||
} | } | ||||
public void testSysProperty() { | |||||
executeTarget("testSysProperty"); | |||||
} | |||||
public void testVerifyJar() { | public void testVerifyJar() { | ||||
executeTarget("testVerifyJar"); | executeTarget("testVerifyJar"); | ||||
} | } | ||||