donaldp 01/12/22 05:06:32
Modified: proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/exec
Execute.java
Log:
Removed some unused crufty code and moved native ENvironment manipulation
code into new class.
Revision Changes Path
1.7 +81 -206
jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/exec/Execute.java
Index: Execute.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/exec/Execute.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- Execute.java 2001/12/21 14:21:20 1.6
+++ Execute.java 2001/12/22 13:06:32 1.7
@@ -7,20 +7,19 @@
*/
package org.apache.tools.ant.taskdefs.exec;
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
-import java.io.StringReader;
-import java.util.Locale;
import java.util.ArrayList;
+import java.util.Locale;
+import java.util.Properties;
+import org.apache.avalon.excalibur.io.FileUtil;
import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.framework.Os;
import org.apache.myrmidon.framework.exec.CommandLauncher;
+import org.apache.myrmidon.framework.exec.Environment;
import org.apache.myrmidon.framework.exec.ExecMetaData;
import org.apache.myrmidon.framework.exec.launchers.DefaultCommandLauncher;
import org.apache.myrmidon.framework.exec.launchers.MacCommandLauncher;
-import org.apache.myrmidon.framework.exec.launchers.PerlCommandLauncher;
import org.apache.myrmidon.framework.exec.launchers.ScriptCommandLauncher;
import org.apache.myrmidon.framework.exec.launchers.WinNTCommandLauncher;
import org.apache.tools.ant.Project;
@@ -39,20 +38,19 @@
*/
public final static int INVALID = Integer.MAX_VALUE;
- protected static String c_antWorkingDirectory = System.getProperty(
"user.dir" );
- private static CommandLauncher c_launcher;
+ private static final CommandLauncher c_launcher = new
DefaultCommandLauncher();
private static CommandLauncher c_shellLauncher;
- private static ArrayList c_procEnvironment;
/**
* Used to destroy processes when the VM exits.
*/
private static ProcessDestroyer c_processDestroyer = new
ProcessDestroyer();
+ private ExecMetaData m_metaData;
private String[] m_command;
- private String[] m_environment;
+ private Properties m_environment;
private int m_exitValue = INVALID;
- private File m_workingDirectory;
+ private File m_workingDirectory = new File( "." );
private Project m_project;
private boolean m_newEnvironment;
@@ -68,55 +66,88 @@
*/
static
{
+ c_shellLauncher = createShellLauncher();
+ }
+ private static CommandLauncher createShellLauncher()
+ {
+ CommandLauncher launcher = null;
try
{
- c_launcher = new DefaultCommandLauncher();
-
if( Os.isFamily( "mac" ) )
{
// Mac
- c_shellLauncher = new MacCommandLauncher();
+ launcher = new MacCommandLauncher();
}
else if( Os.isFamily( "os/2" ) )
{
// OS/2 - use same mechanism as Windows 2000
- c_shellLauncher = new WinNTCommandLauncher();
+ launcher = new WinNTCommandLauncher();
}
else if( Os.isFamily( "windows" ) )
{
// Windows. Need to determine which JDK we're running in
// Determine if we're running under 2000/NT or 98/95
- String osname =
+ final String osname =
System.getProperty( "os.name" ).toLowerCase( Locale.US );
if( osname.indexOf( "nt" ) >= 0 || osname.indexOf( "2000" )
>= 0 )
{
// Windows 2000/NT
- c_shellLauncher = new WinNTCommandLauncher();
+ launcher = new WinNTCommandLauncher();
}
else
{
// Windows 98/95 - need to use an auxiliary script
- c_shellLauncher = new ScriptCommandLauncher(
"bin/antRun.bat" );
+ final String script = resolveCommand( "bin/antRun.bat" );
+ launcher = new ScriptCommandLauncher( script );
}
}
else if( ( new Os( "netware" ) ).eval() )
{
// NetWare. Need to determine which JDK we're running in
- c_shellLauncher = new PerlCommandLauncher( "bin/antRun.pl" );
+ final String perlScript = resolveCommand( "bin/antRun.pl" );
+ final String[] script = new String[]{"perl", perlScript};
+ launcher = new ScriptCommandLauncher( script );
}
else
{
// Generic
- c_shellLauncher = new ScriptCommandLauncher( "bin/antRun" );
+ final String script = resolveCommand( "bin/antRun" );
+ launcher = new ScriptCommandLauncher( script );
}
+ }
+ catch( final TaskException te )
+ {
+ te.printStackTrace();
}
- catch( TaskException e )
+ return launcher;
+ }
+
+ private static String resolveCommand( final String command )
+ {
+ final File homeDir = getAntHomeDirectory();
+ final String script =
+ FileUtil.resolveFile( homeDir, command ).toString();
+ return script;
+ }
+
+ /**
+ * Retrieve the directory in which Myrmidon is installed.
+ * This is used to determine the locaiton of scripts in various
launchers.
+ */
+ protected static File getAntHomeDirectory()
+ {
+ final String antHome = System.getProperty( "ant.home" );
+ if( null == antHome )
{
- e.printStackTrace();
+ final String message =
+ "Cannot locate antRun script: Property 'ant.home' not
specified";
+ throw new IllegalStateException( message );
}
+
+ return new File( antHome );
}
/**
@@ -149,74 +180,8 @@
*/
public Execute( ExecuteStreamHandler streamHandler, ExecuteWatchdog
watchdog )
{
- this.m_streamHandler = streamHandler;
- this.m_watchdog = watchdog;
- }
-
- /**
- * Find the list of environment variables for this process.
- *
- * @return The ProcEnvironment value
- */
- public static synchronized ArrayList getProcEnvironment()
- throws TaskException
- {
- if( c_procEnvironment != null )
- return c_procEnvironment;
-
- c_procEnvironment = new ArrayList();
- try
- {
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- Execute exe = new Execute( new PumpStreamHandler( out ) );
- exe.setCommandline( getProcEnvCommand() );
- // Make sure we do not recurse forever
- exe.setNewenvironment( true );
- int retval = exe.execute();
- if( retval != 0 )
- {
- // Just try to use what we got
- }
-
- BufferedReader in =
- new BufferedReader( new StringReader( out.toString() ) );
- String var = null;
- String line;
- String lineSep = System.getProperty( "line.separator" );
- while( ( line = in.readLine() ) != null )
- {
- if( line.indexOf( '=' ) == -1 )
- {
- // Chunk part of previous env var (UNIX env vars can
- // contain embedded new lines).
- if( var == null )
- {
- var = lineSep + line;
- }
- else
- {
- var += lineSep + line;
- }
- }
- else
- {
- // New env var...append the previous one if we have it.
- if( var != null )
- {
- c_procEnvironment.add( var );
- }
- var = line;
- }
- }
- // Since we "look ahead" before adding, there's one last env var.
- c_procEnvironment.add( var );
- }
- catch( IOException exc )
- {
- exc.printStackTrace();
- // Just try to see how much we got
- }
- return c_procEnvironment;
+ m_streamHandler = streamHandler;
+ m_watchdog = watchdog;
}
/**
@@ -236,7 +201,6 @@
Execute exe = new Execute( new LogStreamHandler( task,
Project.MSG_INFO,
Project.MSG_ERR
) );
- exe.setAntRun( task.getProject() );
exe.setCommandline( cmdline );
int retval = exe.execute();
if( retval != 0 )
@@ -250,66 +214,6 @@
}
}
- private static String[] getProcEnvCommand()
- {
- if( Os.isFamily( "os/2" ) )
- {
- // OS/2 - use same mechanism as Windows 2000
- // Not sure
- String[] cmd = {"cmd", "/c", "set"};
- return cmd;
- }
- else if( Os.isFamily( "windows" ) )
- {
- String osname =
- System.getProperty( "os.name" ).toLowerCase( Locale.US );
- // Determine if we're running under 2000/NT or 98/95
- if( osname.indexOf( "nt" ) >= 0 || osname.indexOf( "2000" ) >= 0
)
- {
- // Windows 2000/NT
- String[] cmd = {"cmd", "/c", "set"};
- return cmd;
- }
- else
- {
- // Windows 98/95 - need to use an auxiliary script
- String[] cmd = {"command.com", "/c", "set"};
- return cmd;
- }
- }
- else if( Os.isFamily( "unix" ) )
- {
- // Generic UNIX
- // Alternatively one could use: /bin/sh -c env
- String[] cmd = {"/usr/bin/env"};
- return cmd;
- }
- else if( Os.isFamily( "netware" ) )
- {
- String[] cmd = {"env"};
- return cmd;
- }
- else
- {
- // MAC OS 9 and previous
- // TODO: I have no idea how to get it, someone must fix it
- String[] cmd = null;
- return cmd;
- }
- }
-
- /**
- * Set the name of the antRun script using the project's value.
- *
- * @param project the current project.
- * @exception TaskException Description of Exception
- */
- public void setAntRun( Project project )
- throws TaskException
- {
- this.m_project = project;
- }
-
/**
* Sets the commandline of the subprocess to launch.
*
@@ -323,11 +227,17 @@
/**
* Sets the environment variables for the subprocess to launch.
*
- * @param env The new Environment value
+ * @param env The new EnvironmentData value
*/
public void setEnvironment( String[] env )
+ throws TaskException
+ {
+ setEnvironment( Environment.createEnvVars( env ) );
+ }
+
+ public void setEnvironment( final Properties environment )
{
- this.m_environment = env;
+ m_environment = environment;
}
/**
@@ -356,31 +266,14 @@
/**
* Sets the working directory of the process to execute. <p>
*
- * This is emulated using the antRun scripts unless the OS is Windows NT
in
- * which case a cmd.exe is spawned, or MRJ and setting user.dir works, or
- * JDK 1.3 and there is official support in java.lang.Runtime.
- *
- * @param wd the working directory of the process.
+ * @param workingDirectory the working directory of the process.
*/
- public void setWorkingDirectory( File wd )
+ public void setWorkingDirectory( final File workingDirectory )
{
- if( wd == null || wd.getAbsolutePath().equals( c_antWorkingDirectory
) )
- m_workingDirectory = null;
- else
- m_workingDirectory = wd;
+ m_workingDirectory = workingDirectory;
}
/**
- * Returns the commandline used to create a subprocess.
- *
- * @return the commandline used to create a subprocess
- */
- public String[] getCommandline()
- {
- return m_command;
- }
-
- /**
* Returns the environment used to create a subprocess.
*
* @return the environment used to create a subprocess
@@ -389,8 +282,21 @@
throws TaskException
{
if( m_environment == null || m_newEnvironment )
- return m_environment;
- return patchEnvironment();
+ {
+ return Environment.toNativeFormat( m_environment );
+ }
+ else
+ {
+ try
+ {
+ Environment.addNativeEnvironment( m_environment );
+ return Environment.toNativeFormat( m_environment );
+ }
+ catch( final IOException ioe )
+ {
+ throw new TaskException( ioe.getMessage(), ioe );
+ }
+ }
}
/**
@@ -419,9 +325,8 @@
launcher = c_shellLauncher;
}
- if( null == m_workingDirectory ) m_workingDirectory = new File( "."
);
final ExecMetaData metaData =
- new ExecMetaData( getCommandline(), getEnvironment(),
+ new ExecMetaData( m_command, getEnvironment(),
m_workingDirectory, false );
final Process process = launcher.exec( metaData );
try
@@ -483,35 +388,5 @@
catch( InterruptedException e )
{
}
- }
-
- /**
- * Patch the current environment with the new values from the user.
- *
- * @return the patched environment
- */
- private String[] patchEnvironment()
- throws TaskException
- {
- ArrayList osEnv = (ArrayList)getProcEnvironment().clone();
- for( int i = 0; i < m_environment.length; i++ )
- {
- int pos = m_environment[ i ].indexOf( '=' );
- // Get key including "="
- String key = m_environment[ i ].substring( 0, pos + 1 );
- int size = osEnv.size();
- for( int j = 0; j < size; j++ )
- {
- if( ( (String)osEnv.get( j ) ).startsWith( key ) )
- {
- osEnv.remove( j );
- break;
- }
- }
- osEnv.add( m_environment[ i ] );
- }
-
- final String[] result = new String[ osEnv.size() ];
- return (String[])osEnv.toArray( result );
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>