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"); | ||||
| } | } | ||||