[MGPG-49] Add support for --lock-* command line options

git-svn-id: https://svn.apache.org/repos/asf/maven/plugins/trunk@1570541 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/maven/plugin/gpg/AbstractGpgMojo.java b/src/main/java/org/apache/maven/plugin/gpg/AbstractGpgMojo.java
index e3054bd..07029e4 100644
--- a/src/main/java/org/apache/maven/plugin/gpg/AbstractGpgMojo.java
+++ b/src/main/java/org/apache/maven/plugin/gpg/AbstractGpgMojo.java
@@ -21,6 +21,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.List;
 
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
@@ -61,12 +62,12 @@
      * optional as the agent will provide it.
      * For gpg2, specify true as --no-use-agent was removed in gpg2 and doesn't ask for a passphrase anymore.
      */
-    @Parameter( property = "gpg.useagent", defaultValue = "false" )
+    @Parameter( property = "gpg.useagent", defaultValue = "false")
     private boolean useAgent;
 
     /**
      */
-    @Parameter( defaultValue = "${settings.interactiveMode}", readonly = true )
+    @Parameter( defaultValue = "${settings.interactiveMode}", readonly = true)
     private boolean interactive;
 
     /**
@@ -107,6 +108,31 @@
     @Parameter( property = "gpg.publicKeyring" )
     private String publicKeyring;
 
+    /**
+     * The lock mode to use when invoking gpg. By default no lock mode will be specified. Valid values are {@code once},
+     * {@code multiple} and {@code never}. The lock mode gets translated into the corresponding {@code --lock-___}
+     * command line argument. Improper usage of this option may lead to data and key corruption.
+     *
+     * @see <a href="http://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration-Options.html">the --lock-*
+     * options</a>
+     * @since 1.5
+     */
+    @Parameter( property = "gpg.lockMode" )
+    private String lockMode;
+
+    /**
+     * Sets the arguments to be passed to gpg. Example:
+     * <pre>
+     * &lt;gpgArguments&gt;
+     *   &lt;arg&gt;--no-random-seed-file&lt;/arg&gt;
+     *   &lt;arg&gt;--no-permission-warning&lt;/arg&gt;
+     * &lt;/gpgArguments&gt;
+     * </pre>
+     * @since 1.5
+     */
+    @Parameter
+    private List<String> gpgArguments;
+
     AbstractGpgSigner newSigner( MavenProject project )
         throws MojoExecutionException, MojoFailureException
     {
@@ -120,6 +146,8 @@
         signer.setDefaultKeyring( defaultKeyring );
         signer.setSecretKeyring( secretKeyring );
         signer.setPublicKeyring( publicKeyring );
+        signer.setLockMode( lockMode );
+        signer.setArgs( gpgArguments );
 
         signer.setPassPhrase( passphrase );
         if ( null == passphrase && !useAgent )
diff --git a/src/main/java/org/apache/maven/plugin/gpg/AbstractGpgSigner.java b/src/main/java/org/apache/maven/plugin/gpg/AbstractGpgSigner.java
index edc8b6c..a22d6fb 100644
--- a/src/main/java/org/apache/maven/plugin/gpg/AbstractGpgSigner.java
+++ b/src/main/java/org/apache/maven/plugin/gpg/AbstractGpgSigner.java
@@ -23,6 +23,7 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.util.List;
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.logging.Log;
@@ -62,16 +63,30 @@
 
     protected String publicKeyring;
 
+    protected String lockMode;
+
+    protected List<String> args;
+
     public Log getLog()
     {
         return log;
     }
 
+    public void setArgs( List<String> args )
+    {
+        this.args = args;
+    }
+
     public void setInteractive( boolean b )
     {
         isInteractive = b;
     }
 
+    public void setLockMode( String lockMode )
+    {
+        this.lockMode = lockMode;
+    }
+
     public void setUseAgent( boolean b )
     {
         useAgent = b;
diff --git a/src/main/java/org/apache/maven/plugin/gpg/GpgSigner.java b/src/main/java/org/apache/maven/plugin/gpg/GpgSigner.java
index 2f69e83..862ba4e 100644
--- a/src/main/java/org/apache/maven/plugin/gpg/GpgSigner.java
+++ b/src/main/java/org/apache/maven/plugin/gpg/GpgSigner.java
@@ -22,6 +22,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.InputStream;
+import java.util.Iterator;
 
 import org.apache.maven.plugin.MojoExecutionException;
 import org.codehaus.plexus.util.Os;
@@ -66,6 +67,14 @@
             cmd.setExecutable( "gpg" + ( Os.isFamily( Os.FAMILY_WINDOWS ) ? ".exe" : "" ) );
         }
 
+        if ( args != null )
+        {
+            for ( String arg : args )
+            {
+                cmd.createArg().setValue( arg );
+            }
+        }
+
         if ( homeDir != null )
         {
             cmd.createArg().setValue( "--homedir" );
@@ -128,6 +137,19 @@
             cmd.createArg().setValue( publicKeyring );
         }
 
+        if ( "once".equalsIgnoreCase( lockMode ) )
+        {
+            cmd.createArg().setValue( "--lock-once" );
+        }
+        else if ( "multiple".equalsIgnoreCase( lockMode ) )
+        {
+            cmd.createArg().setValue( "--lock-multiple" );
+        }
+        else if ( "never".equalsIgnoreCase( lockMode ) )
+        {
+            cmd.createArg().setValue( "--lock-never" );
+        }
+
         cmd.createArg().setValue( "--output" );
         cmd.createArg().setFile( signature );