[MGPG-10] Patch from Christian Schulte reworked for current structure


git-svn-id: https://svn.apache.org/repos/asf/maven/plugins/trunk@577889 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/maven/plugin/gpg/GpgSignAttachedMojo.java b/src/main/java/org/apache/maven/plugin/gpg/GpgSignAttachedMojo.java
index 888adf1..52c6724 100644
--- a/src/main/java/org/apache/maven/plugin/gpg/GpgSignAttachedMojo.java
+++ b/src/main/java/org/apache/maven/plugin/gpg/GpgSignAttachedMojo.java
@@ -112,6 +112,14 @@
     private String[] excludes;
 
     /**
+     * The directory where to store signature files.
+     *
+     * @parameter expression="${project.build.directory}/gpg"
+     * @since 1.0-alpha-4
+     */
+    private File outputDirectory;
+    
+    /**
      * The maven project.
      *
      * @parameter expression="${project}"
@@ -200,9 +208,12 @@
         // What we need to generateSignatureForArtifact here
         // ----------------------------------------------------------------------------
 
-        signer.setInteractive(settings.isInteractiveMode());
-        signer.setKeyName(keyname);
-        signer.setUseAgent(useAgent);
+        signer.setInteractive( settings.isInteractiveMode() );
+        signer.setKeyName( keyname );
+        signer.setUseAgent( useAgent );
+        signer.setOutputDirectory( outputDirectory );
+        signer.setBuildDirectory( new File( project.getBuild().getDirectory() ) );
+        signer.setBaseDirectory( project.getBasedir() );
         
         List signingBundles = new ArrayList();
 
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 39d30a7..2458453 100644
--- a/src/main/java/org/apache/maven/plugin/gpg/GpgSigner.java
+++ b/src/main/java/org/apache/maven/plugin/gpg/GpgSigner.java
@@ -42,6 +42,9 @@
     private boolean useAgent;
     private boolean isInteractive = true;
     private String keyname;
+    private File outputDir;
+    private File buildDir;
+    private File baseDir;
     
     public GpgSigner()
     {
@@ -63,17 +66,64 @@
         keyname = s;
     }
     
+    public void setOutputDirectory(File out) 
+    {
+        outputDir = out;
+    }
+    public void setBuildDirectory(File out) 
+    {
+        buildDir = out;
+    }
+    public void setBaseDirectory(File out) 
+    {
+        baseDir = out;
+    }
+    
     
     public File generateSignatureForArtifact( File file , String pass)
         throws MojoExecutionException
     {
         File signature = new File( file + SIGNATURE_EXTENSION );
     
+        boolean isInBuildDir = false;
+        if ( buildDir != null )
+        {
+            File parent = signature.getParentFile();
+            if ( buildDir.equals(parent) ) 
+            {
+                isInBuildDir = true;
+            }
+        }
+        if ( !isInBuildDir
+            && outputDir != null ) 
+        {
+            String fileDirectory = "";
+            File signatureDirectory = signature;
+            
+            while( ( signatureDirectory = signatureDirectory.getParentFile() ) != null )
+            {
+                if( !signatureDirectory.equals( baseDir ) )
+                {
+                    fileDirectory = signatureDirectory.getName() + File.separatorChar + fileDirectory;
+                }
+                else
+                {
+                    break;
+                }
+            }
+            signatureDirectory = new File( outputDir, fileDirectory );
+            if( !signatureDirectory.exists() )
+            {
+                signatureDirectory.mkdirs();
+            }
+            signature = new File( signatureDirectory, file.getName() + SIGNATURE_EXTENSION );
+        }
+        
         if ( signature.exists() )
         {
             signature.delete();
         }
-    
+        
         Commandline cmd = new Commandline();
     
         cmd.setExecutable( "gpg" + ( SystemUtils.IS_OS_WINDOWS ? ".exe" : "" ) );
@@ -114,6 +164,9 @@
             cmd.createArgument().setValue( "--no-tty" );
         }
         
+        cmd.createArgument().setValue( "--output" );
+        cmd.createArgument().setFile( signature );
+        
         cmd.createArgument().setFile( file );
     
     
diff --git a/src/main/java/org/apache/maven/plugin/gpg/SignAndDeployFileMojo.java b/src/main/java/org/apache/maven/plugin/gpg/SignAndDeployFileMojo.java
index a7eb1e7..6066293 100644
--- a/src/main/java/org/apache/maven/plugin/gpg/SignAndDeployFileMojo.java
+++ b/src/main/java/org/apache/maven/plugin/gpg/SignAndDeployFileMojo.java
@@ -75,6 +75,13 @@
      */
     private boolean useAgent;
 
+    /**
+     * The directory where to store signature files.
+     *
+     * @parameter expression="${gpg.asc.directory}"
+     */
+    private File ascDirectory;
+    
     
     /**
      * @parameter expression="${settings}"
@@ -236,6 +243,8 @@
         signer.setInteractive( settings.isInteractiveMode() );
         signer.setKeyName( keyname );
         signer.setUseAgent( useAgent );
+        signer.setOutputDirectory(ascDirectory);
+        signer.setBaseDirectory(new File("foo").getAbsoluteFile().getParentFile().getAbsoluteFile());
         
         setDeployer( new SignedArtifactDeployer( deployer, passphrase ) );
         super.execute();