You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by br...@apache.org on 2005/10/24 02:29:58 UTC
svn commit: r327889 - in
/maven/components/trunk/maven-plugins/maven-jar-plugin: ./
src/main/java/org/apache/maven/plugin/jar/ src/site/ src/site/apt/
src/test/ src/test/java/ src/test/java/org/ src/test/java/org/apache/
src/test/java/org/apache/maven/...
Author: brett
Date: Sun Oct 23 17:29:52 2005
New Revision: 327889
URL: http://svn.apache.org/viewcvs?rev=327889&view=rev
Log:
PR: MNG-1130
Submitted by: Jerome Lacoste
Reviewed by: Brett Porter
Add a jar signing mojo
Modifications made: formatting, fix tests to run on Windows
Added:
maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/JarSignMojo.java (with props)
maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/apt/introduction.apt
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/apache/
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/apache/maven/
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/apache/maven/plugin/
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/apache/maven/plugin/jar/
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/apache/maven/plugin/jar/JarSignMojoTest.java (with props)
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/README
maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/pom.xml (with props)
Modified:
maven/components/trunk/maven-plugins/maven-jar-plugin/pom.xml
maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/AbstractJarMojo.java
maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/apt/howto.apt
maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/site.xml
Modified: maven/components/trunk/maven-plugins/maven-jar-plugin/pom.xml
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-jar-plugin/pom.xml?rev=327889&r1=327888&r2=327889&view=diff
==============================================================================
--- maven/components/trunk/maven-plugins/maven-jar-plugin/pom.xml (original)
+++ maven/components/trunk/maven-plugins/maven-jar-plugin/pom.xml Sun Oct 23 17:29:52 2005
@@ -9,6 +9,19 @@
<packaging>maven-plugin</packaging>
<name>Maven Jar Plugin</name>
<version>2.1-SNAPSHOT</version>
+ <contributors>
+ <contributor>
+ <name>Jerome Lacoste</name>
+ <email>jerome@coffeebreaks.org</email>
+ <organization>CoffeeBreaks</organization>
+ <organizationUrl>http://www.coffeebreaks.org</organizationUrl>
+ <timezone>+1</timezone>
+ <roles>
+ <role>Java Developer</role>
+ </roles>
+ </contributor>
+ </contributors>
+
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
@@ -18,6 +31,11 @@
<groupId>org.apache.maven</groupId>
<artifactId>maven-archiver</artifactId>
<version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.1</version>
</dependency>
</dependencies>
</project>
Modified: maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/AbstractJarMojo.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/AbstractJarMojo.java?rev=327889&r1=327888&r2=327889&view=diff
==============================================================================
--- maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/AbstractJarMojo.java (original)
+++ maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/AbstractJarMojo.java Sun Oct 23 17:29:52 2005
@@ -46,9 +46,8 @@
* @parameter expression="${project.build.directory}"
* @required
* @readonly
- * @todo Change type to File
*/
- private String basedir;
+ private File basedir;
/**
* Name of the generated JAR.
@@ -97,21 +96,18 @@
return project;
}
+ protected final File getBaseDir()
+ {
+ return basedir;
+ }
+
/**
* Overload this to produce a test-jar, for example.
*/
protected abstract String getClassifier();
- /**
- * Generates the JAR.
- *
- * @todo Add license files in META-INF directory.
- */
- public File createArchive()
- throws MojoExecutionException
+ protected static File getJarFile( File basedir, String finalName, String classifier )
{
- String classifier = getClassifier();
-
if ( classifier == null )
{
classifier = "";
@@ -121,7 +117,18 @@
classifier = "-" + classifier;
}
- File jarFile = new File( basedir, finalName + classifier + ".jar" );
+ return new File( basedir, finalName + classifier + ".jar" );
+ }
+
+ /**
+ * Generates the JAR.
+ *
+ * @todo Add license files in META-INF directory.
+ */
+ public File createArchive()
+ throws MojoExecutionException
+ {
+ File jarFile = getJarFile( basedir, finalName, getClassifier() );
MavenArchiver archiver = new MavenArchiver();
Added: maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/JarSignMojo.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/JarSignMojo.java?rev=327889&view=auto
==============================================================================
--- maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/JarSignMojo.java (added)
+++ maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/JarSignMojo.java Sun Oct 23 17:29:52 2005
@@ -0,0 +1,425 @@
+package org.apache.maven.plugin.jar;
+
+/*
+ * Copyright 2001-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.
+ */
+
+import org.apache.commons.lang.SystemUtils;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.logging.Log;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+/**
+ * Signs a JAR using jarsigner.
+ *
+ * @author <a href="jerome@coffeebreaks.org">Jerome Lacoste</a>
+ * @version $Id$
+ * @goal sign
+ * @phase package
+ * @requiresProject
+ * @todo refactor the common code with javadoc plugin
+ */
+public class JarSignMojo
+ extends AbstractMojo
+{
+ /**
+ * @parameter expression="${workingdir}" default-value="${basedir}"
+ * @required
+ */
+ private File workingDirectory;
+
+ /**
+ * Directory containing the generated JAR.
+ *
+ * @parameter expression="${project.build.directory}"
+ * @required
+ * @readonly
+ */
+ private File basedir;
+
+ /**
+ * Name of the generated JAR (without classifier and extension).
+ *
+ * @parameter alias="jarname" expression="${project.build.finalName}"
+ * @required
+ */
+ private String finalName;
+
+ /**
+ * Path of the jar to sign. When specified, the finalName is ignored.
+ *
+ * @parameter alias="jarpath"
+ * @required
+ */
+ private String jarPath;
+
+ /**
+ * See <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/jarsigner.html#Options">options</a>.
+ *
+ * @parameter expression="${keystore}"
+ */
+ private String keystore;
+
+ /**
+ * See <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/jarsigner.html#Options">options</a>.
+ *
+ * @parameter expression="${storepass}"
+ */
+ private String storepass;
+
+ /**
+ * See <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/jarsigner.html#Options">options</a>.
+ *
+ * @parameter expression="${keypass}"
+ */
+ private String keypass;
+
+ /**
+ * See <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/jarsigner.html#Options">options</a>.
+ *
+ * @parameter expression="${sigfile}"
+ * @todo make a File?
+ */
+ private String sigfile;
+
+ /**
+ * See <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/jarsigner.html#Options">options</a>.
+ *
+ * @parameter expression="${signedjar}" default-value="${project.build.directory}/signed/${project.build.finalName}.jar"
+ * @required
+ * @todo make a File?
+ */
+ private String signedjar;
+
+ /**
+ * See <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/jarsigner.html#Options">options</a>.
+ *
+ * @parameter expression="${type}"
+ */
+ private String type;
+
+ /**
+ * See <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/jarsigner.html#Options">options</a>.
+ *
+ * @parameter expression="${alias}"
+ * @required
+ */
+ private String alias;
+
+ /**
+ * Enable verbose
+ * See <a href="http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/jarsigner.html#Options">options</a>.
+ *
+ * @parameter expression="${verbose}" default-value="false"
+ */
+ private boolean verbose;
+
+ public void execute()
+ throws MojoExecutionException
+ {
+
+ List arguments = new ArrayList();
+
+ Commandline commandLine = new Commandline();
+
+ commandLine.setExecutable( getJarsignerPath() );
+
+ addArgIf( arguments, verbose, "-verbose" );
+
+ // I believe Commandline to add quotes where appropriate, although I haven't tested it enough.
+ // FIXME addArgIfNotEmpty will break those parameters containing a space.
+ // Look at webapp:gen-keystore for a way to fix that
+ addArgIfNotEmpty( arguments, "-keystore", this.keystore );
+ addArgIfNotEmpty( arguments, "-storepass", this.storepass );
+ addArgIfNotEmpty( arguments, "-keypass", this.keypass );
+ addArgIfNotEmpty( arguments, "-signedjar", this.signedjar );
+ addArgIfNotEmpty( arguments, "-storetype", this.type );
+ addArgIfNotEmpty( arguments, "-sigfile", this.sigfile );
+
+ if ( jarPath != null )
+ {
+ arguments.add( new File( jarPath ) );
+ }
+ else
+ {
+ arguments.add( AbstractJarMojo.getJarFile( basedir, finalName, null ) );
+ }
+
+ addArgIf( arguments, alias != null, this.alias );
+
+ for ( Iterator it = arguments.iterator(); it.hasNext(); )
+ {
+ commandLine.createArgument().setValue( it.next().toString() );
+ }
+
+ commandLine.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+
+ createParentDirIfNecessary( signedjar );
+
+ getLog().debug( "Executing: " + commandLine );
+
+ // jarsigner may ask for some input if the parameters are missing or incorrect.
+ // This should take care of it and make it fail gracefully
+ final InputStream inputStream = new InputStream()
+ {
+ public int read()
+ {
+ return -1;
+ }
+ };
+ StreamConsumer outConsumer = new StreamConsumer()
+ {
+ public void consumeLine( String line )
+ {
+ getLog().info( line );
+ }
+ };
+ final StringBuffer errBuffer = new StringBuffer();
+ StreamConsumer errConsumer = new StreamConsumer()
+ {
+ public void consumeLine( String line )
+ {
+ errBuffer.append( line );
+ getLog().warn( line );
+ }
+ };
+
+ try
+ {
+ int result = executeCommandLine( commandLine, inputStream, outConsumer, errConsumer );
+
+ if ( result != 0 )
+ {
+ throw new MojoExecutionException( "Result of " + commandLine + " execution is: \'" + result + "\': "
+ + errBuffer.toString() + "." );
+ }
+ }
+ catch ( CommandLineException e )
+ {
+ throw new MojoExecutionException( "command execution failed", e );
+ }
+ }
+
+ private void createParentDirIfNecessary( final String file )
+ {
+ if ( file != null )
+ {
+ final File fileDir = new File( file ).getParentFile();
+
+ if ( fileDir != null )
+ { // not a relative path
+ boolean mkdirs = fileDir.mkdirs();
+ getLog().debug( "mdkirs: " + mkdirs + " " + fileDir );
+ }
+ }
+ }
+
+ // taken from JavadocReport then slightly refactored
+ // should probably share with other plugins that use $JAVA_HOME/bin tools
+
+ /**
+ * Get the path of jarsigner tool depending the OS.
+ *
+ * @return the path of the jarsigner tool
+ */
+ private String getJarsignerPath()
+ {
+ return getJDKCommandPath( "jarsigner", getLog() );
+ }
+
+ private static String getJDKCommandPath( String command, Log logger )
+ {
+ String path = getJDKCommandExe( command ).getAbsolutePath();
+ logger.debug( command + " executable=[" + path + "]" );
+ return path;
+ }
+
+ private static File getJDKCommandExe( String command )
+ {
+ String fullCommand = command + ( SystemUtils.IS_OS_WINDOWS ? ".exe" : "" );
+
+ File exe;
+
+ // For IBM's JDK 1.2
+ if ( SystemUtils.IS_OS_AIX )
+ {
+ exe = new File( SystemUtils.getJavaHome() + "/../sh", fullCommand );
+ }
+ else if ( SystemUtils.IS_OS_MAC_OSX )
+ {
+ exe = new File( SystemUtils.getJavaHome() + "/bin", fullCommand );
+ }
+ else
+ {
+ exe = new File( SystemUtils.getJavaHome() + "/../bin", fullCommand );
+ }
+
+ return exe;
+ }
+
+ // Helper methods. Could/should be shared e.g. with JavadocReport
+
+ /**
+ * Convenience method to add an argument to the <code>command line</code>
+ * conditionally based on the given flag.
+ *
+ * @param arguments
+ * @param b the flag which controls if the argument is added or not.
+ * @param value the argument value to be added.
+ */
+ private void addArgIf( List arguments, boolean b, String value )
+ {
+ if ( b )
+ {
+ arguments.add( value );
+ }
+ }
+
+ /**
+ * Convenience method to add an argument to the <code>command line</code>
+ * if the the value is not null or empty.
+ * <p>
+ * Moreover, the value could be comma separated.
+ *
+ * @param arguments
+ * @param key the argument name.
+ * @param value the argument value to be added.
+ * @see #addArgIfNotEmpty(java.util.List,String,String,boolean)
+ */
+ private void addArgIfNotEmpty( List arguments, String key, String value )
+ {
+ addArgIfNotEmpty( arguments, key, value, false );
+ }
+
+ /**
+ * Convenience method to add an argument to the <code>command line</code>
+ * if the the value is not null or empty.
+ * <p>
+ * Moreover, the value could be comma separated.
+ *
+ * @param arguments
+ * @param key the argument name.
+ * @param value the argument value to be added.
+ * @param repeatKey repeat or not the key in the command line
+ */
+ private void addArgIfNotEmpty( List arguments, String key, String value, boolean repeatKey )
+ {
+ if ( !StringUtils.isEmpty( value ) )
+ {
+ arguments.add( key );
+
+ StringTokenizer token = new StringTokenizer( value, "," );
+ while ( token.hasMoreTokens() )
+ {
+ String current = token.nextToken().trim();
+
+ if ( !StringUtils.isEmpty( current ) )
+ {
+ arguments.add( current );
+
+ if ( token.hasMoreTokens() && repeatKey )
+ {
+ arguments.add( key );
+ }
+ }
+ }
+ }
+ }
+
+ //
+ // methods used for tests purposes - allow mocking and simulate automatic setters
+ //
+
+ protected int executeCommandLine( Commandline commandLine, InputStream inputStream, StreamConsumer stream1,
+ StreamConsumer stream2 )
+ throws CommandLineException
+ {
+ return CommandLineUtils.executeCommandLine( commandLine, inputStream, stream1, stream2 );
+ }
+
+ public void setWorkingDir( File workingDir )
+ {
+ this.workingDirectory = workingDir;
+ }
+
+ public void setBasedir( File basedir )
+ {
+ this.basedir = basedir;
+ }
+
+ public void setKeystore( String keystore )
+ {
+ this.keystore = keystore;
+ }
+
+ public void setKeypass( String keypass )
+ {
+ this.keypass = keypass;
+ }
+
+ public void setSignedJar( String signedjar )
+ {
+ this.signedjar = signedjar;
+ }
+
+ public void setAlias( String alias )
+ {
+ this.alias = alias;
+ }
+
+ // hiding for now - I don't think this is required to be seen
+ /*
+ public void setFinalName( String finalName ) {
+ this.finalName = finalName;
+ }
+ */
+
+ public void setJarPath( String jarPath )
+ {
+ this.jarPath = jarPath;
+ }
+
+ public void setStorepass( String storepass )
+ {
+ this.storepass = storepass;
+ }
+
+ public void setSigFile( String sigfile )
+ {
+ this.sigfile = sigfile;
+ }
+
+ public void setType( String type )
+ {
+ this.type = type;
+ }
+
+ public void setVerbose( boolean verbose )
+ {
+ this.verbose = verbose;
+ }
+}
Propchange: maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/JarSignMojo.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/components/trunk/maven-plugins/maven-jar-plugin/src/main/java/org/apache/maven/plugin/jar/JarSignMojo.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Modified: maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/apt/howto.apt
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/apt/howto.apt?rev=327889&r1=327888&r2=327889&view=diff
==============================================================================
--- maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/apt/howto.apt (original)
+++ maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/apt/howto.apt Sun Oct 23 17:29:52 2005
@@ -2,11 +2,11 @@
Maven 2 JAR Plugin
------
-Maven 2 JAR Plugin
+How to use
- Builds your project into a jar
+ Brief examples on how to use the jar:jar and jar:sign goals.
-*How to Use
+* How to use jar:jar
If the packaging of your project is set to 'jar', this plugin is executed
whenever it passes the "package" phase. Have it executed
@@ -18,3 +18,45 @@
From your project's target directory you'll able to see the generated jar file.
+
+* How to configure jar:sign using pom.xml
+
+ If you need to sign a jar, when using the 'jar' packaging, you just need to configure
+ the sign goal appropriately for the signing to occur automatically during the package phase.
+
+-------------------
+<project>
+ ...
+ <packaging>jar</packaging>
+ ...
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>sign</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <keystore>/path/to/your/keystore</keystore>
+ <alias>youralias</alias>
+ <storepass>yourstorepassword</storepass>
+ <!--signedjar>${project.build.directory}/signed/${project.build.finalName}.jar</signedjar-->
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
+-------------------
+
+* How to use jar:sign specifying parameters on the command line
+
+-------------------
+ m2 jar:sign -Dkeystore=/path/to/your/keystore -Dstorepass=yourstorepassword -Dalias=youralias
+-------------------
+
+ For full documentation, click {{{index.html}here}}.
Added: maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/apt/introduction.apt
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/apt/introduction.apt?rev=327889&view=auto
==============================================================================
--- maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/apt/introduction.apt (added)
+++ maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/apt/introduction.apt Sun Oct 23 17:29:52 2005
@@ -0,0 +1,13 @@
+ ------
+ Maven 2 JAR Plugin
+ ------
+
+Maven 2 JAR Plugin
+
+ This plugin provides the capability to manipulate jars. Currently it can create jars for your project sources or tests classes. To achieve this use
+"jar:jar" or "jar:test-jar".
+
+ It also provides the capability to sign a jar file with the goal "jar:sign".
+
+ To learn how to use the plugin, click {{{howto.html}here}}.
+
Modified: maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/site.xml
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/site.xml?rev=327889&r1=327888&r2=327889&view=diff
==============================================================================
--- maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/site.xml (original)
+++ maven/components/trunk/maven-plugins/maven-jar-plugin/src/site/site.xml Sun Oct 23 17:29:52 2005
@@ -13,7 +13,8 @@
</links>
<menu name="Maven JAR Quickstart">
- <item name="Overview" href="howto.html"/>
+ <item name="Introduction" href="introduction.html"/>
+ <item name="How to use" href="howto.html"/>
</menu>
${reports}
</body>
Added: maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/apache/maven/plugin/jar/JarSignMojoTest.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/apache/maven/plugin/jar/JarSignMojoTest.java?rev=327889&view=auto
==============================================================================
--- maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/apache/maven/plugin/jar/JarSignMojoTest.java (added)
+++ maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/apache/maven/plugin/jar/JarSignMojoTest.java Sun Oct 23 17:29:52 2005
@@ -0,0 +1,210 @@
+package org.apache.maven.plugin.jar;
+
+/*
+ * Copyright 2001-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.
+ */
+
+import junit.framework.TestCase;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.Commandline;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * These unit tests only check whether the generated command lines are correct.
+ * Really running the command would mean checking the results, which is too painful and not really a unit test.
+ * It would probably require to 'jarsigner -verify' the resulting signed jar and I believe it would make the code
+ * too complex with very few benefits.
+ *
+ * @author Jerome Lacoste <je...@coffeebreaks.org>
+ * @version $Id:$
+ */
+public class JarSignMojoTest
+ extends TestCase
+{
+ private MockJarSignMojo mojo;
+
+ static class MockJarSignMojo
+ extends JarSignMojo
+ {
+ public int executeResult;
+
+ public List commandLines = new ArrayList();
+
+ public String failureMsg;
+
+ public Map systemProperties = new HashMap();
+
+ protected int executeCommandLine( Commandline commandLine, InputStream inputStream, StreamConsumer stream1,
+ StreamConsumer stream2 )
+ throws CommandLineException
+ {
+ commandLines.add( commandLine );
+ if ( failureMsg != null )
+ {
+ throw new CommandLineException( failureMsg );
+ }
+ return executeResult;
+ }
+
+ protected String getSystemProperty( String key )
+ {
+ return (String) systemProperties.get( key );
+ }
+ }
+
+ public void setUp()
+ throws IOException
+ {
+ mojo = new MockJarSignMojo();
+ mojo.executeResult = 0;
+ // it doesn't really matter if the paths are not cross-platform, we don't execute the command lines anyway
+ File basedir = new File( System.getProperty( "java.io.tmpdir" ) );
+ mojo.setBasedir( basedir );
+ mojo.setWorkingDir( basedir );
+ mojo.setSignedJar( "/tmp/signed/file-version.jar" );
+ mojo.setAlias( "alias" );
+ mojo.setKeystore( "/tmp/keystore" );
+ mojo.setKeypass( "secretpassword" );
+ }
+
+ public void tearDown()
+ {
+ mojo = null;
+ }
+
+ public void testPleaseMaven()
+ {
+ assertTrue( true );
+ }
+
+ /**
+ */
+ public void testRunOK()
+ throws MojoExecutionException
+ {
+ mojo.execute();
+
+ String[] expectedArguments = {
+ "-keystore",
+ "/tmp/keystore",
+ "-keypass",
+ "secretpassword",
+ "-signedjar",
+ "/tmp/signed/file-version.jar",
+ getNullJar(),
+ "alias" };
+
+ checkMojo( expectedArguments );
+ }
+
+ /**
+ */
+ public void testRunFailure()
+ {
+ mojo.executeResult = 1;
+
+ // any missing argument should produce this. Let's simulate a missing alias
+ mojo.setAlias( null );
+
+ try
+ {
+ mojo.execute();
+ fail( "expected failure" );
+ }
+ catch ( MojoExecutionException e )
+ {
+ assertTrue( e.getMessage().startsWith( "Result of " ) );
+ }
+
+ String[] expectedArguments = {
+ "-keystore",
+ "/tmp/keystore",
+ "-keypass",
+ "secretpassword",
+ "-signedjar",
+ "/tmp/signed/file-version.jar",
+ getNullJar() };
+
+ checkMojo( expectedArguments );
+ }
+
+ private String getNullJar()
+ {
+ String value = System.getProperty( "java.io.tmpdir" );
+ if ( !value.endsWith( "\\" ) && !value.endsWith( "/" ) )
+ {
+ value += "/";
+ }
+ value += "null.jar";
+ return value;
+ }
+
+ /**
+ */
+ public void testRunError()
+ {
+ mojo.failureMsg = "simulated failure";
+
+ try
+ {
+ mojo.execute();
+ fail( "expected failure" );
+ }
+ catch ( MojoExecutionException e )
+ {
+ assertEquals( "command execution failed", e.getMessage() );
+ }
+
+ String[] expectedArguments = {
+ "-keystore",
+ "/tmp/keystore",
+ "-keypass",
+ "secretpassword",
+ "-signedjar",
+ "/tmp/signed/file-version.jar",
+ getNullJar(),
+ "alias" };
+
+ checkMojo( expectedArguments );
+ }
+
+ private void checkMojo( String[] expectedCommandLineArguments )
+ {
+ assertEquals( 1, mojo.commandLines.size() );
+ Commandline commandline = (Commandline) mojo.commandLines.get( 0 );
+ String[] arguments = commandline.getArguments();
+ // isn't there an assertEquals for arrays?
+ /*
+ for (int i = 0; i < arguments.length; i++ ) {
+ System.out.println( arguments[ i ] );
+ }
+ */
+ assertEquals( "Differing number of arguments", expectedCommandLineArguments.length, arguments.length );
+ for ( int i = 0; i < arguments.length; i++ )
+ {
+ assertEquals( expectedCommandLineArguments[i], arguments[i] );
+ }
+ }
+}
Propchange: maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/apache/maven/plugin/jar/JarSignMojoTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/java/org/apache/maven/plugin/jar/JarSignMojoTest.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/README
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/README?rev=327889&view=auto
==============================================================================
--- maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/README (added)
+++ maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/README Sun Oct 23 17:29:52 2005
@@ -0,0 +1,7 @@
+A pom.xml that can be used to make some functional tests.
+These values are of course specific to my environment.
+Not sure what to do with this. Should I turn this into a fully automated functional test?
+
+The keystore was generated using:
+
+keytool -genkey -alias m2 -keypass m2m2m2 -keystore keystore -storepass m2m2m2 -dname "cn=www.example.com, ou=None, L=Seattle, ST=Washington, o=ExampleOrg, c=US"
Added: maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/pom.xml
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/pom.xml?rev=327889&view=auto
==============================================================================
--- maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/pom.xml (added)
+++ maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/pom.xml Sun Oct 23 17:29:52 2005
@@ -0,0 +1,31 @@
+<!-- Test project which creates and signs a jar artifact -->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>jar-mng-1130-0</artifactId>
+ <groupId>org.apache.maven.plugins</groupId>
+ <version>1.0</version>
+ <packaging>jar</packaging>
+ <name>Test Case for MNG-1130</name>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>sign</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <keystore>keystore</keystore>
+ <alias>m2</alias>
+ <storepass>m2m2m2</storepass>
+ <!--signedjar>${project.build.directory}/signed/${project.build.finalName}.jar</signedjar-->
+ <!--type></type-->
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
Propchange: maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: maven/components/trunk/maven-plugins/maven-jar-plugin/src/test/resources/sign-0/pom.xml
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"