You are viewing a plain text version of this content. The canonical link for it is here.
Posted to npanday-commits@incubator.apache.org by ap...@apache.org on 2010/11/17 08:28:12 UTC

svn commit: r1035948 - in /incubator/npanday/trunk/components/dotnet-executable: ./ src/main/java/npanday/executable/ src/main/java/npanday/executable/compiler/impl/ src/test/ src/test/java/ src/test/java/npanday/ src/test/java/npanday/executable/

Author: apadilla
Date: Wed Nov 17 08:28:12 2010
New Revision: 1035948

URL: http://svn.apache.org/viewvc?rev=1035948&view=rev
Log:
[NPANDAY-337]
[NPANDAY-341]
* NPanday support for linux
* applied patches submitted by Luca and Vladimir 
    - modified some things and merged the patches they both submitted
* added unit test

Added:
    incubator/npanday/trunk/components/dotnet-executable/src/test/
    incubator/npanday/trunk/components/dotnet-executable/src/test/java/
    incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/
    incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/
    incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/CommandExecutorTest.java
Modified:
    incubator/npanday/trunk/components/dotnet-executable/pom.xml
    incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/CommandExecutor.java
    incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/compiler/impl/DefaultCompiler.java

Modified: incubator/npanday/trunk/components/dotnet-executable/pom.xml
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/components/dotnet-executable/pom.xml?rev=1035948&r1=1035947&r2=1035948&view=diff
==============================================================================
--- incubator/npanday/trunk/components/dotnet-executable/pom.xml (original)
+++ incubator/npanday/trunk/components/dotnet-executable/pom.xml Wed Nov 17 08:28:12 2010
@@ -48,5 +48,11 @@ under the License.
       <groupId>npanday</groupId>  
       <artifactId>dotnet-vendor</artifactId>  
     </dependency> 
+    <dependency> 
+      <groupId>junit</groupId>  
+      <artifactId>junit</artifactId>  
+      <version>4.8.1</version>  
+      <scope>test</scope> 
+    </dependency> 
   </dependencies> 
 </project>

Modified: incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/CommandExecutor.java
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/CommandExecutor.java?rev=1035948&r1=1035947&r2=1035948&view=diff
==============================================================================
--- incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/CommandExecutor.java (original)
+++ incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/CommandExecutor.java Wed Nov 17 08:28:12 2010
@@ -29,7 +29,7 @@ import org.codehaus.plexus.util.StringUt
 import org.codehaus.plexus.util.cli.shell.Shell;
 import java.io.IOException;
 
-  
+
 
 import java.util.List;
 import java.util.ArrayList;
@@ -196,28 +196,28 @@ public interface CommandExecutor
                     Commandline commandline = new Commandline()
                     {
                          protected Map envVars = Collections.synchronizedMap( new LinkedHashMap() );
-                         
-                         
+
+
                          public Process execute()
                              throws CommandLineException
                          {
                              // TODO: Provided only for backward compat. with <= 1.4
                              //verifyShellState();
-                     
+
                              Process process;
-                     
+
                              //addEnvironment( "MAVEN_TEST_ENVAR", "MAVEN_TEST_ENVAR_VALUE" );
-                     
+
                              String[] environment = getEnvironmentVariables();
-                             
+
                              File workingDir = getWorkingDirectory();
-                     
+
                              try
                              {
-                                 String cmd = this.toString();
+                                 String[] cmd = getEscapedShellCommandline();
+
                                  if ( workingDir == null )
                                  {
-                                     //process = Runtime.getRuntime().exec( getShellCommandline(), environment );
                                      process = Runtime.getRuntime().exec( cmd, environment );
                                  }
                                  else
@@ -232,8 +232,7 @@ public interface CommandExecutor
                                          throw new CommandLineException( "Path \"" + workingDir.getPath()
                                              + "\" does not specify a directory." );
                                      }
-                     
-                                     //process = Runtime.getRuntime().exec( getShellCommandline(), environment, workingDir );
+
                                      process = Runtime.getRuntime().exec( cmd, environment, workingDir );
                                  }
                              }
@@ -241,10 +240,10 @@ public interface CommandExecutor
                              {
                                  throw new CommandLineException( "Error while executing process.", ex );
                              }
-                     
+
                              return process;
                          }
-                         
+
                          public String[] getEnvironmentVariables()
                              throws CommandLineException
                          {
@@ -267,23 +266,21 @@ public interface CommandExecutor
                              }
                              return environmentVars;
                          }
-                         
-                         
-                         
+
                          public void addEnvironment( String name, String value )
                          {
                              //envVars.add( name + "=" + value );
                              envVars.put( name, value );
                          }
-                     
+
                          /**
-                                                                    * Add system environment variables
-                                                                    */
+                                                              * Add system environment variables
+                                                             */
                          public void addSystemEnvironment()
                              throws Exception
                         {
                              Properties systemEnvVars = CommandLineUtils.getSystemEnvVars();
-                     
+
                              for ( Iterator i = systemEnvVars.keySet().iterator(); i.hasNext(); )
                              {
                                  String key = (String) i.next();
@@ -293,7 +290,7 @@ public interface CommandExecutor
                                  }
                              }
                         }
-                        
+
                         public String toString()
                         {
                             StringBuffer strBuff = new StringBuffer("");
@@ -304,51 +301,53 @@ public interface CommandExecutor
                             }
                             return strBuff.toString().trim();
                         }
-                        
+
+                        public String[] getEscapedShellCommandline()
+                        {
+                            String[] scl = getShellCommandline();
+                            for ( int i = 0; i < scl.length; i++ ) {
+                                scl[i] = escapeCmdParams( scl[i] );
+                            }
+                            return scl;
+                        }
+
                         // escaped to make use of dotnet style of command escapes .
                         // Eg. /define:"CONFIG=\"Debug\",DEBUG=-1,TRACE=-1,_MyType=\"Windows\",PLATFORM=\"AnyCPU\""
                         private String escapeCmdParams(String param)
                         {
                             if(param == null)
                                 return null;
-                            
+
                             String str = param;
                             if(param.startsWith("/") && param.indexOf(":") > 0)
                             {
                                 int delem = param.indexOf(":") + 1;
                                 String command = param.substring(0, delem);
                                 String value = param.substring(delem);
-                                
+
                                 if(value.indexOf(" ") > 0 || value.indexOf("\"") > 0)
                                 {
                                     value = "\"" + value.replaceAll("\"", "\\\\\"")  + "\"";
                                 }
-                                
+
                                 str = command + value;
                             }
                             else if(param.startsWith("@"))
                             {
-                            	str = param;
+                                str = param;
                             }
-                            else if(param.indexOf(" ") > 0)
+                            else if(param.indexOf(" ") > 0 && !( param.startsWith( "\"" ) &&  param.endsWith( "\"" ) ) )
                             {
                                 str = "\"" + param  + "\"";
                             }
-                            
+
                             return str;
                         }
-
-
-
-
-                    
-                    
                     };
-                    
-                    
-                    
+
                     commandline.setExecutable( executable );
                     commandline.addArguments( commands.toArray( new String[commands.size()]));
+
                     if ( workingDirectory != null && workingDirectory.exists() )
                     {
                         commandline.setWorkingDirectory( workingDirectory.getAbsolutePath() );

Modified: incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/compiler/impl/DefaultCompiler.java
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/compiler/impl/DefaultCompiler.java?rev=1035948&r1=1035947&r2=1035948&view=diff
==============================================================================
--- incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/compiler/impl/DefaultCompiler.java (original)
+++ incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/compiler/impl/DefaultCompiler.java Wed Nov 17 08:28:12 2010
@@ -291,7 +291,13 @@ public final class DefaultCompiler
             throw new ExecutionException( "Error while creating response file for the commands.", e );
         }
         filteredCommands.clear();
-        filteredCommands.add("@" + escapeCmdParams(responseFilePath) );
+        responseFilePath = "@" + responseFilePath;
+        if ( responseFilePath.indexOf( " " ) > 0)
+        {
+            responseFilePath = "\"" + responseFilePath + "\"";
+        }
+
+        filteredCommands.add( responseFilePath );
         
         return filteredCommands;
     }

Added: incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/CommandExecutorTest.java
URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/CommandExecutorTest.java?rev=1035948&view=auto
==============================================================================
--- incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/CommandExecutorTest.java (added)
+++ incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/CommandExecutorTest.java Wed Nov 17 08:28:12 2010
@@ -0,0 +1,60 @@
+package npanday.executable;
+
+import org.junit.Test;
+import static org.junit.Assert.*;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import npanday.executable.CommandExecutor;
+
+
+public class CommandExecutorTest
+    {
+        private static final String MKDIR = "mkdir";
+        private String parentPath;
+        private List<String> params = new ArrayList<String>();
+        private CommandExecutor cmdExecutor;
+
+        public CommandExecutorTest()
+        {
+            File f = new File( "test" );
+            parentPath = System.getProperty( "user.dir" ) + File.separator + "target" + File.separator + "test-resources";
+            cmdExecutor = CommandExecutor.Factory.createDefaultCommmandExecutor();
+        }
+
+        @Test
+        public void testParamWithNoSpaces()
+            throws ExecutionException
+        {
+            String path = parentPath + File.separator + "sampledirectory";
+
+            params.clear();
+            params.add(path);
+
+            cmdExecutor.executeCommand( MKDIR, params );
+            File dir = new File( path );
+
+            assertTrue( dir.exists() );
+        }
+
+        @Test
+        public void testParamWithSpaces()
+            throws ExecutionException
+        { 
+            String path = parentPath + File.separator + "sample directory";
+
+            params.clear(); 
+            params.add(path);
+
+            cmdExecutor.executeCommand( MKDIR, params );
+            File dir = new File( path );
+
+            assertTrue( dir.exists() );
+         }
+
+    }
\ No newline at end of file



Re: svn commit: r1035948 - in /incubator/npanday/trunk/components/dotnet-executable: ./ src/main/java/npanday/executable/ src/main/java/npanday/executable/compiler/impl/ src/test/ src/test/java/ src/test/java/npanday/ src/test/java/npanday/executable/

Posted by Brett Porter <br...@apache.org>.
it might be worth considering switching to commons-exec for the executor instead of Runtime.exec - I think it would handle the cross-platform escaping better and has had several ears of dealing with edge cases on obscure platforms :)

On 17/11/2010, at 7:28 PM, apadilla@apache.org wrote:

> Author: apadilla
> Date: Wed Nov 17 08:28:12 2010
> New Revision: 1035948
> 
> URL: http://svn.apache.org/viewvc?rev=1035948&view=rev
> Log:
> [NPANDAY-337]
> [NPANDAY-341]
> * NPanday support for linux
> * applied patches submitted by Luca and Vladimir 
>    - modified some things and merged the patches they both submitted
> * added unit test
> 
> Added:
>    incubator/npanday/trunk/components/dotnet-executable/src/test/
>    incubator/npanday/trunk/components/dotnet-executable/src/test/java/
>    incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/
>    incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/
>    incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/CommandExecutorTest.java
> Modified:
>    incubator/npanday/trunk/components/dotnet-executable/pom.xml
>    incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/CommandExecutor.java
>    incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/compiler/impl/DefaultCompiler.java
> 
> Modified: incubator/npanday/trunk/components/dotnet-executable/pom.xml
> URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/components/dotnet-executable/pom.xml?rev=1035948&r1=1035947&r2=1035948&view=diff
> ==============================================================================
> --- incubator/npanday/trunk/components/dotnet-executable/pom.xml (original)
> +++ incubator/npanday/trunk/components/dotnet-executable/pom.xml Wed Nov 17 08:28:12 2010
> @@ -48,5 +48,11 @@ under the License.
>       <groupId>npanday</groupId>  
>       <artifactId>dotnet-vendor</artifactId>  
>     </dependency> 
> +    <dependency> 
> +      <groupId>junit</groupId>  
> +      <artifactId>junit</artifactId>  
> +      <version>4.8.1</version>  
> +      <scope>test</scope> 
> +    </dependency> 
>   </dependencies> 
> </project>
> 
> Modified: incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/CommandExecutor.java
> URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/CommandExecutor.java?rev=1035948&r1=1035947&r2=1035948&view=diff
> ==============================================================================
> --- incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/CommandExecutor.java (original)
> +++ incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/CommandExecutor.java Wed Nov 17 08:28:12 2010
> @@ -29,7 +29,7 @@ import org.codehaus.plexus.util.StringUt
> import org.codehaus.plexus.util.cli.shell.Shell;
> import java.io.IOException;
> 
> -  
> +
> 
> import java.util.List;
> import java.util.ArrayList;
> @@ -196,28 +196,28 @@ public interface CommandExecutor
>                     Commandline commandline = new Commandline()
>                     {
>                          protected Map envVars = Collections.synchronizedMap( new LinkedHashMap() );
> -                         
> -                         
> +
> +
>                          public Process execute()
>                              throws CommandLineException
>                          {
>                              // TODO: Provided only for backward compat. with <= 1.4
>                              //verifyShellState();
> -                     
> +
>                              Process process;
> -                     
> +
>                              //addEnvironment( "MAVEN_TEST_ENVAR", "MAVEN_TEST_ENVAR_VALUE" );
> -                     
> +
>                              String[] environment = getEnvironmentVariables();
> -                             
> +
>                              File workingDir = getWorkingDirectory();
> -                     
> +
>                              try
>                              {
> -                                 String cmd = this.toString();
> +                                 String[] cmd = getEscapedShellCommandline();
> +
>                                  if ( workingDir == null )
>                                  {
> -                                     //process = Runtime.getRuntime().exec( getShellCommandline(), environment );
>                                      process = Runtime.getRuntime().exec( cmd, environment );
>                                  }
>                                  else
> @@ -232,8 +232,7 @@ public interface CommandExecutor
>                                          throw new CommandLineException( "Path \"" + workingDir.getPath()
>                                              + "\" does not specify a directory." );
>                                      }
> -                     
> -                                     //process = Runtime.getRuntime().exec( getShellCommandline(), environment, workingDir );
> +
>                                      process = Runtime.getRuntime().exec( cmd, environment, workingDir );
>                                  }
>                              }
> @@ -241,10 +240,10 @@ public interface CommandExecutor
>                              {
>                                  throw new CommandLineException( "Error while executing process.", ex );
>                              }
> -                     
> +
>                              return process;
>                          }
> -                         
> +
>                          public String[] getEnvironmentVariables()
>                              throws CommandLineException
>                          {
> @@ -267,23 +266,21 @@ public interface CommandExecutor
>                              }
>                              return environmentVars;
>                          }
> -                         
> -                         
> -                         
> +
>                          public void addEnvironment( String name, String value )
>                          {
>                              //envVars.add( name + "=" + value );
>                              envVars.put( name, value );
>                          }
> -                     
> +
>                          /**
> -                                                                    * Add system environment variables
> -                                                                    */
> +                                                              * Add system environment variables
> +                                                             */
>                          public void addSystemEnvironment()
>                              throws Exception
>                         {
>                              Properties systemEnvVars = CommandLineUtils.getSystemEnvVars();
> -                     
> +
>                              for ( Iterator i = systemEnvVars.keySet().iterator(); i.hasNext(); )
>                              {
>                                  String key = (String) i.next();
> @@ -293,7 +290,7 @@ public interface CommandExecutor
>                                  }
>                              }
>                         }
> -                        
> +
>                         public String toString()
>                         {
>                             StringBuffer strBuff = new StringBuffer("");
> @@ -304,51 +301,53 @@ public interface CommandExecutor
>                             }
>                             return strBuff.toString().trim();
>                         }
> -                        
> +
> +                        public String[] getEscapedShellCommandline()
> +                        {
> +                            String[] scl = getShellCommandline();
> +                            for ( int i = 0; i < scl.length; i++ ) {
> +                                scl[i] = escapeCmdParams( scl[i] );
> +                            }
> +                            return scl;
> +                        }
> +
>                         // escaped to make use of dotnet style of command escapes .
>                         // Eg. /define:"CONFIG=\"Debug\",DEBUG=-1,TRACE=-1,_MyType=\"Windows\",PLATFORM=\"AnyCPU\""
>                         private String escapeCmdParams(String param)
>                         {
>                             if(param == null)
>                                 return null;
> -                            
> +
>                             String str = param;
>                             if(param.startsWith("/") && param.indexOf(":") > 0)
>                             {
>                                 int delem = param.indexOf(":") + 1;
>                                 String command = param.substring(0, delem);
>                                 String value = param.substring(delem);
> -                                
> +
>                                 if(value.indexOf(" ") > 0 || value.indexOf("\"") > 0)
>                                 {
>                                     value = "\"" + value.replaceAll("\"", "\\\\\"")  + "\"";
>                                 }
> -                                
> +
>                                 str = command + value;
>                             }
>                             else if(param.startsWith("@"))
>                             {
> -                            	str = param;
> +                                str = param;
>                             }
> -                            else if(param.indexOf(" ") > 0)
> +                            else if(param.indexOf(" ") > 0 && !( param.startsWith( "\"" ) &&  param.endsWith( "\"" ) ) )
>                             {
>                                 str = "\"" + param  + "\"";
>                             }
> -                            
> +
>                             return str;
>                         }
> -
> -
> -
> -
> -                    
> -                    
>                     };
> -                    
> -                    
> -                    
> +
>                     commandline.setExecutable( executable );
>                     commandline.addArguments( commands.toArray( new String[commands.size()]));
> +
>                     if ( workingDirectory != null && workingDirectory.exists() )
>                     {
>                         commandline.setWorkingDirectory( workingDirectory.getAbsolutePath() );
> 
> Modified: incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/compiler/impl/DefaultCompiler.java
> URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/compiler/impl/DefaultCompiler.java?rev=1035948&r1=1035947&r2=1035948&view=diff
> ==============================================================================
> --- incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/compiler/impl/DefaultCompiler.java (original)
> +++ incubator/npanday/trunk/components/dotnet-executable/src/main/java/npanday/executable/compiler/impl/DefaultCompiler.java Wed Nov 17 08:28:12 2010
> @@ -291,7 +291,13 @@ public final class DefaultCompiler
>             throw new ExecutionException( "Error while creating response file for the commands.", e );
>         }
>         filteredCommands.clear();
> -        filteredCommands.add("@" + escapeCmdParams(responseFilePath) );
> +        responseFilePath = "@" + responseFilePath;
> +        if ( responseFilePath.indexOf( " " ) > 0)
> +        {
> +            responseFilePath = "\"" + responseFilePath + "\"";
> +        }
> +
> +        filteredCommands.add( responseFilePath );
> 
>         return filteredCommands;
>     }
> 
> Added: incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/CommandExecutorTest.java
> URL: http://svn.apache.org/viewvc/incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/CommandExecutorTest.java?rev=1035948&view=auto
> ==============================================================================
> --- incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/CommandExecutorTest.java (added)
> +++ incubator/npanday/trunk/components/dotnet-executable/src/test/java/npanday/executable/CommandExecutorTest.java Wed Nov 17 08:28:12 2010
> @@ -0,0 +1,60 @@
> +package npanday.executable;
> +
> +import org.junit.Test;
> +import static org.junit.Assert.*;
> +import java.io.File;
> +import java.io.FileInputStream;
> +import java.io.FileNotFoundException;
> +import java.io.IOException;
> +import java.util.List;
> +import java.util.ArrayList;
> +import java.util.Arrays;
> +
> +import npanday.executable.CommandExecutor;
> +
> +
> +public class CommandExecutorTest
> +    {
> +        private static final String MKDIR = "mkdir";
> +        private String parentPath;
> +        private List<String> params = new ArrayList<String>();
> +        private CommandExecutor cmdExecutor;
> +
> +        public CommandExecutorTest()
> +        {
> +            File f = new File( "test" );
> +            parentPath = System.getProperty( "user.dir" ) + File.separator + "target" + File.separator + "test-resources";
> +            cmdExecutor = CommandExecutor.Factory.createDefaultCommmandExecutor();
> +        }
> +
> +        @Test
> +        public void testParamWithNoSpaces()
> +            throws ExecutionException
> +        {
> +            String path = parentPath + File.separator + "sampledirectory";
> +
> +            params.clear();
> +            params.add(path);
> +
> +            cmdExecutor.executeCommand( MKDIR, params );
> +            File dir = new File( path );
> +
> +            assertTrue( dir.exists() );
> +        }
> +
> +        @Test
> +        public void testParamWithSpaces()
> +            throws ExecutionException
> +        { 
> +            String path = parentPath + File.separator + "sample directory";
> +
> +            params.clear(); 
> +            params.add(path);
> +
> +            cmdExecutor.executeCommand( MKDIR, params );
> +            File dir = new File( path );
> +
> +            assertTrue( dir.exists() );
> +         }
> +
> +    }
> \ No newline at end of file
> 
> 

--
Brett Porter
brett@apache.org
http://brettporter.wordpress.com/