Detected by JDepend git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271062 13f79535-47bb-0310-9956-ffa450edef68master
@@ -7,15 +7,16 @@ | |||||
*/ | */ | ||||
package org.apache.antlib.nativelib; | package org.apache.antlib.nativelib; | ||||
import java.io.IOException; | |||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.Properties; | import java.util.Properties; | ||||
import org.apache.aut.nativelib.ExecException; | |||||
import org.apache.aut.nativelib.ExecManager; | |||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | import org.apache.avalon.excalibur.i18n.ResourceManager; | ||||
import org.apache.avalon.excalibur.i18n.Resources; | import org.apache.avalon.excalibur.i18n.Resources; | ||||
import org.apache.myrmidon.api.AbstractTask; | import org.apache.myrmidon.api.AbstractTask; | ||||
import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
import org.apache.aut.nativelib.impl.Environment; | |||||
import org.apache.aut.nativelib.ExecException; | |||||
import org.apache.myrmidon.framework.factorys.ExecManagerFactory; | |||||
import org.apache.myrmidon.services.ServiceException; | |||||
/** | /** | ||||
* This task is responsible for loading that OS-specific environment | * This task is responsible for loading that OS-specific environment | ||||
@@ -88,15 +89,18 @@ public class LoadEnvironment | |||||
{ | { | ||||
try | try | ||||
{ | { | ||||
return Environment.getNativeEnvironment(); | |||||
final ExecManagerFactory factory = new ExecManagerFactory(); | |||||
final ExecManager manager = (ExecManager)factory.createService(); | |||||
return manager.getNativeEnvironment(); | |||||
} | } | ||||
catch( final ExecException ee ) | |||||
catch( final ServiceException se ) | |||||
{ | { | ||||
throw new TaskException( ee.getMessage(), ee ); | |||||
throw new TaskException( se.getMessage(), se ); | |||||
} | } | ||||
catch( final IOException ioe ) | |||||
catch( final ExecException ee ) | |||||
{ | { | ||||
throw new TaskException( ioe.getMessage(), ioe ); | |||||
throw new TaskException( ee.getMessage(), ee ); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -10,6 +10,7 @@ package org.apache.aut.nativelib; | |||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import java.io.OutputStream; | import java.io.OutputStream; | ||||
import java.util.Properties; | |||||
/** | /** | ||||
* Interface via which clients can request that a native | * Interface via which clients can request that a native | ||||
@@ -30,6 +31,13 @@ import java.io.OutputStream; | |||||
*/ | */ | ||||
public interface ExecManager | public interface ExecManager | ||||
{ | { | ||||
/** | |||||
* Retrieve a properties object that contains a list of | |||||
* all the native environment variables. | |||||
*/ | |||||
Properties getNativeEnvironment() | |||||
throws ExecException; | |||||
/** | /** | ||||
* Execute a process and wait for it to finish before | * Execute a process and wait for it to finish before | ||||
* returning. | * returning. | ||||
@@ -12,16 +12,17 @@ import java.io.IOException; | |||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import java.io.OutputStream; | import java.io.OutputStream; | ||||
import java.util.Locale; | import java.util.Locale; | ||||
import java.util.Properties; | |||||
import org.apache.aut.nativelib.ExecException; | import org.apache.aut.nativelib.ExecException; | ||||
import org.apache.aut.nativelib.ExecManager; | import org.apache.aut.nativelib.ExecManager; | ||||
import org.apache.aut.nativelib.ExecMetaData; | import org.apache.aut.nativelib.ExecMetaData; | ||||
import org.apache.aut.nativelib.ExecOutputHandler; | import org.apache.aut.nativelib.ExecOutputHandler; | ||||
import org.apache.aut.nativelib.Os; | import org.apache.aut.nativelib.Os; | ||||
import org.apache.aut.nativelib.impl.launchers.CommandLauncher; | |||||
import org.apache.aut.nativelib.impl.launchers.DefaultCommandLauncher; | import org.apache.aut.nativelib.impl.launchers.DefaultCommandLauncher; | ||||
import org.apache.aut.nativelib.impl.launchers.MacCommandLauncher; | import org.apache.aut.nativelib.impl.launchers.MacCommandLauncher; | ||||
import org.apache.aut.nativelib.impl.launchers.ScriptCommandLauncher; | import org.apache.aut.nativelib.impl.launchers.ScriptCommandLauncher; | ||||
import org.apache.aut.nativelib.impl.launchers.WinNTCommandLauncher; | import org.apache.aut.nativelib.impl.launchers.WinNTCommandLauncher; | ||||
import org.apache.aut.nativelib.impl.launchers.CommandLauncher; | |||||
import org.apache.avalon.excalibur.io.FileUtil; | import org.apache.avalon.excalibur.io.FileUtil; | ||||
import org.apache.avalon.excalibur.io.IOUtil; | import org.apache.avalon.excalibur.io.IOUtil; | ||||
@@ -34,6 +35,7 @@ import org.apache.avalon.excalibur.io.IOUtil; | |||||
* @version $Revision$ $Date$ | * @version $Revision$ $Date$ | ||||
* @see ExecManager | * @see ExecManager | ||||
* @see ExecMetaData | * @see ExecMetaData | ||||
* @see Environment | |||||
*/ | */ | ||||
public class DefaultExecManager | public class DefaultExecManager | ||||
implements ExecManager | implements ExecManager | ||||
@@ -46,11 +48,35 @@ public class DefaultExecManager | |||||
private final CommandLauncher m_launcher; | private final CommandLauncher m_launcher; | ||||
private final CommandLauncher m_shellLauncher; | private final CommandLauncher m_shellLauncher; | ||||
/** | |||||
* Utility class that is used to load and parse the native | |||||
* environment variables. | |||||
*/ | |||||
private final Environment m_environment; | |||||
public DefaultExecManager( final File homeDir ) | public DefaultExecManager( final File homeDir ) | ||||
throws ExecException | throws ExecException | ||||
{ | { | ||||
m_launcher = new DefaultCommandLauncher(); | m_launcher = new DefaultCommandLauncher(); | ||||
m_shellLauncher = createShellLauncher( homeDir ); | m_shellLauncher = createShellLauncher( homeDir ); | ||||
m_environment = new Environment( this ); | |||||
} | |||||
/** | |||||
* Retrieve a properties object that contains a list of | |||||
* all the native environment variables. | |||||
*/ | |||||
public Properties getNativeEnvironment() | |||||
throws ExecException | |||||
{ | |||||
try | |||||
{ | |||||
return m_environment.getNativeEnvironment(); | |||||
} | |||||
catch( final IOException ioe ) | |||||
{ | |||||
throw new ExecException( ioe.getMessage(), ioe ); | |||||
} | |||||
} | } | ||||
/** | /** | ||||
@@ -79,13 +105,14 @@ public class DefaultExecManager | |||||
* Execute a process and wait for it to finish before | * Execute a process and wait for it to finish before | ||||
* returning. | * returning. | ||||
*/ | */ | ||||
public int execute( final ExecMetaData metaData, | |||||
public int execute( final ExecMetaData command, | |||||
final InputStream input, | final InputStream input, | ||||
final OutputStream output, | final OutputStream output, | ||||
final OutputStream error, | final OutputStream error, | ||||
final long timeout ) | final long timeout ) | ||||
throws IOException, ExecException | throws IOException, ExecException | ||||
{ | { | ||||
final ExecMetaData metaData = prepareExecMetaData( command ); | |||||
final CommandLauncher launcher = getLauncher( metaData ); | final CommandLauncher launcher = getLauncher( metaData ); | ||||
final Process process = launcher.exec( metaData ); | final Process process = launcher.exec( metaData ); | ||||
final ProcessMonitor monitor = | final ProcessMonitor monitor = | ||||
@@ -133,6 +160,30 @@ public class DefaultExecManager | |||||
} | } | ||||
} | } | ||||
/** | |||||
* Utility method to preapre a metaData object. | |||||
* This involves adding the native environment to the metaData if the | |||||
* metaData is specified as being additive. | |||||
*/ | |||||
private ExecMetaData prepareExecMetaData( final ExecMetaData metaData ) | |||||
throws ExecException | |||||
{ | |||||
if( !metaData.isEnvironmentAdditive() ) | |||||
{ | |||||
return metaData; | |||||
} | |||||
else | |||||
{ | |||||
final Properties newEnvironment = new Properties(); | |||||
newEnvironment.putAll( getNativeEnvironment() ); | |||||
newEnvironment.putAll( metaData.getEnvironment() ); | |||||
return new ExecMetaData( metaData.getCommand(), | |||||
newEnvironment, | |||||
metaData.getWorkingDirectory(), | |||||
false ); | |||||
} | |||||
} | |||||
private CommandLauncher getLauncher( final ExecMetaData metaData ) | private CommandLauncher getLauncher( final ExecMetaData metaData ) | ||||
{ | { | ||||
CommandLauncher launcher = m_launcher; | CommandLauncher launcher = m_launcher; | ||||
@@ -9,16 +9,16 @@ package org.apache.aut.nativelib.impl; | |||||
import java.io.BufferedReader; | import java.io.BufferedReader; | ||||
import java.io.ByteArrayOutputStream; | import java.io.ByteArrayOutputStream; | ||||
import java.io.File; | |||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.StringReader; | import java.io.StringReader; | ||||
import java.util.Iterator; | |||||
import java.util.Locale; | import java.util.Locale; | ||||
import java.util.Properties; | import java.util.Properties; | ||||
import org.apache.avalon.excalibur.util.StringUtil; | |||||
import org.apache.myrmidon.api.TaskException; | |||||
import org.apache.tools.ant.taskdefs.exec.Execute; | |||||
import org.apache.aut.nativelib.ExecException; | import org.apache.aut.nativelib.ExecException; | ||||
import org.apache.aut.nativelib.ExecManager; | |||||
import org.apache.aut.nativelib.ExecMetaData; | |||||
import org.apache.aut.nativelib.Os; | import org.apache.aut.nativelib.Os; | ||||
import org.apache.avalon.excalibur.util.StringUtil; | |||||
/** | /** | ||||
* This is the class that can be used to retrieve the environment | * This is the class that can be used to retrieve the environment | ||||
@@ -28,7 +28,7 @@ import org.apache.aut.nativelib.Os; | |||||
* @author <a href="mailto:thomas.haas@softwired-inc.com">Thomas Haas</a> | * @author <a href="mailto:thomas.haas@softwired-inc.com">Thomas Haas</a> | ||||
* @version $Revision$ $Date$ | * @version $Revision$ $Date$ | ||||
*/ | */ | ||||
public final class Environment | |||||
final class Environment | |||||
{ | { | ||||
private final static String[] COMMAND_COM = new String[]{"command.com", "/c", "set"}; | private final static String[] COMMAND_COM = new String[]{"command.com", "/c", "set"}; | ||||
private final static String[] CMD_EXE = new String[]{"cmd", "/c", "set"}; | private final static String[] CMD_EXE = new String[]{"cmd", "/c", "set"}; | ||||
@@ -37,39 +37,27 @@ public final class Environment | |||||
private final static String[] ENV_CMD = new String[]{"/usr/bin/env"}; | private final static String[] ENV_CMD = new String[]{"/usr/bin/env"}; | ||||
private final static String[] ENV_RAW = new String[]{"env"}; | private final static String[] ENV_RAW = new String[]{"env"}; | ||||
private static Properties c_procEnvironment; | |||||
/** | |||||
* This is a cached version of the native environment variables. | |||||
*/ | |||||
private Properties m_procEnvironment; | |||||
/** | /** | ||||
* Private constructor to block instantiation. | |||||
* This is the class that is used to invoke the native process | |||||
* to retrieve then environment variables. | |||||
*/ | */ | ||||
private Environment() | |||||
{ | |||||
} | |||||
private final ExecManager m_execManager; | |||||
public static void addNativeEnvironment( final Properties environment ) | |||||
throws ExecException, IOException | |||||
public Environment( final ExecManager execManager ) | |||||
{ | { | ||||
final Properties nativeEnvironment = getEnvironmentVariables(); | |||||
final Iterator nativeKeys = nativeEnvironment.keySet().iterator(); | |||||
while( nativeKeys.hasNext() ) | |||||
{ | |||||
final String key = (String)nativeKeys.next(); | |||||
if( environment.contains( key ) ) | |||||
{ | |||||
//Skip environment variables that are overidden | |||||
continue; | |||||
} | |||||
final String value = nativeEnvironment.getProperty( key ); | |||||
environment.setProperty( key, value ); | |||||
} | |||||
m_execManager = execManager; | |||||
} | } | ||||
/** | /** | ||||
* Retrieve a Properties object that contains the list of all | * Retrieve a Properties object that contains the list of all | ||||
* native EnvironmentData Variables for the current process. | * native EnvironmentData Variables for the current process. | ||||
*/ | */ | ||||
public static Properties getNativeEnvironment() | |||||
public Properties getNativeEnvironment() | |||||
throws IOException, ExecException | throws IOException, ExecException | ||||
{ | { | ||||
final Properties properties = new Properties(); | final Properties properties = new Properties(); | ||||
@@ -81,21 +69,21 @@ public final class Environment | |||||
* Get the Property object with all environment variables and | * Get the Property object with all environment variables and | ||||
* attempt to load it if it has not already been loaded. | * attempt to load it if it has not already been loaded. | ||||
*/ | */ | ||||
private static synchronized Properties getEnvironmentVariables() | |||||
private synchronized Properties getEnvironmentVariables() | |||||
throws IOException, ExecException | throws IOException, ExecException | ||||
{ | { | ||||
if( null == c_procEnvironment ) | |||||
if( null == m_procEnvironment ) | |||||
{ | { | ||||
c_procEnvironment = retrieveEnvironmentVariables(); | |||||
m_procEnvironment = retrieveEnvironmentVariables(); | |||||
} | } | ||||
return c_procEnvironment; | |||||
return m_procEnvironment; | |||||
} | } | ||||
/** | /** | ||||
* Retrieve a last of environment variables from the native OS. | * Retrieve a last of environment variables from the native OS. | ||||
*/ | */ | ||||
private static synchronized Properties retrieveEnvironmentVariables() | |||||
private synchronized Properties retrieveEnvironmentVariables() | |||||
throws IOException, ExecException | throws IOException, ExecException | ||||
{ | { | ||||
final String data = getEnvironmentText(); | final String data = getEnvironmentText(); | ||||
@@ -137,8 +125,8 @@ public final class Environment | |||||
* '=' character then generate an exception. After parsed data place | * '=' character then generate an exception. After parsed data place | ||||
* the key-value pair into the specified Properties object. | * the key-value pair into the specified Properties object. | ||||
*/ | */ | ||||
private static void addProperty( final Properties properties, | |||||
final String data ) | |||||
private void addProperty( final Properties properties, | |||||
final String data ) | |||||
throws ExecException | throws ExecException | ||||
{ | { | ||||
final int index = data.indexOf( '=' ); | final int index = data.indexOf( '=' ); | ||||
@@ -161,30 +149,18 @@ public final class Environment | |||||
* Retrieve the text of data that is the result of | * Retrieve the text of data that is the result of | ||||
* running the environment command. | * running the environment command. | ||||
*/ | */ | ||||
private static String getEnvironmentText() | |||||
private String getEnvironmentText() | |||||
throws IOException, ExecException | throws IOException, ExecException | ||||
{ | { | ||||
final ByteArrayOutputStream output = new ByteArrayOutputStream(); | |||||
final Execute exe = new Execute(); | |||||
exe.setOutput( output ); | |||||
exe.setError( output ); | |||||
exe.setCommandline( getEnvCommand() ); | |||||
final String[] command = getEnvCommand(); | |||||
final File workingDirectory = new File( "." ); | |||||
final ExecMetaData metaData = new ExecMetaData( command, null, workingDirectory, false ); | |||||
// Make sure we do not recurse forever | |||||
exe.setNewenvironment( true ); | |||||
try | |||||
{ | |||||
final int retval = exe.execute(); | |||||
if( retval != 0 ) | |||||
{ | |||||
// Just try to use what we got | |||||
} | |||||
} | |||||
catch( final TaskException te ) | |||||
final ByteArrayOutputStream output = new ByteArrayOutputStream(); | |||||
final int retval = m_execManager.execute( metaData, null, output, output, 0 ); | |||||
if( retval != 0 ) | |||||
{ | { | ||||
throw new ExecException( te.getMessage(), te ); | |||||
// Just try to use what we got | |||||
} | } | ||||
return output.toString(); | return output.toString(); | ||||
@@ -12,7 +12,6 @@ import java.io.IOException; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.Iterator; | import java.util.Iterator; | ||||
import java.util.Properties; | import java.util.Properties; | ||||
import org.apache.aut.nativelib.impl.Environment; | |||||
import org.apache.aut.nativelib.ExecException; | import org.apache.aut.nativelib.ExecException; | ||||
import org.apache.aut.nativelib.ExecMetaData; | import org.apache.aut.nativelib.ExecMetaData; | ||||
@@ -121,23 +120,13 @@ class ExecUtil | |||||
throws ExecException, IOException | throws ExecException, IOException | ||||
{ | { | ||||
final Properties environment = metaData.getEnvironment(); | final Properties environment = metaData.getEnvironment(); | ||||
if( 0 == environment.size() ) | |||||
if( null == environment || 0 == environment.size() ) | |||||
{ | { | ||||
return null; | return null; | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
if( metaData.isEnvironmentAdditive() ) | |||||
{ | |||||
final Properties newEnvironment = new Properties(); | |||||
newEnvironment.putAll( Environment.getNativeEnvironment() ); | |||||
newEnvironment.putAll( environment ); | |||||
return toNativeEnvironment( newEnvironment ); | |||||
} | |||||
else | |||||
{ | |||||
return toNativeEnvironment( environment ); | |||||
} | |||||
return toNativeEnvironment( environment ); | |||||
} | } | ||||
} | } | ||||
} | } |