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; | |||
import java.io.IOException; | |||
import java.util.Iterator; | |||
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.Resources; | |||
import org.apache.myrmidon.api.AbstractTask; | |||
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 | |||
@@ -88,15 +89,18 @@ public class LoadEnvironment | |||
{ | |||
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.InputStream; | |||
import java.io.OutputStream; | |||
import java.util.Properties; | |||
/** | |||
* Interface via which clients can request that a native | |||
@@ -30,6 +31,13 @@ import java.io.OutputStream; | |||
*/ | |||
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 | |||
* returning. | |||
@@ -12,16 +12,17 @@ import java.io.IOException; | |||
import java.io.InputStream; | |||
import java.io.OutputStream; | |||
import java.util.Locale; | |||
import java.util.Properties; | |||
import org.apache.aut.nativelib.ExecException; | |||
import org.apache.aut.nativelib.ExecManager; | |||
import org.apache.aut.nativelib.ExecMetaData; | |||
import org.apache.aut.nativelib.ExecOutputHandler; | |||
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.MacCommandLauncher; | |||
import org.apache.aut.nativelib.impl.launchers.ScriptCommandLauncher; | |||
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.IOUtil; | |||
@@ -34,6 +35,7 @@ import org.apache.avalon.excalibur.io.IOUtil; | |||
* @version $Revision$ $Date$ | |||
* @see ExecManager | |||
* @see ExecMetaData | |||
* @see Environment | |||
*/ | |||
public class DefaultExecManager | |||
implements ExecManager | |||
@@ -46,11 +48,35 @@ public class DefaultExecManager | |||
private final CommandLauncher m_launcher; | |||
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 ) | |||
throws ExecException | |||
{ | |||
m_launcher = new DefaultCommandLauncher(); | |||
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 | |||
* returning. | |||
*/ | |||
public int execute( final ExecMetaData metaData, | |||
public int execute( final ExecMetaData command, | |||
final InputStream input, | |||
final OutputStream output, | |||
final OutputStream error, | |||
final long timeout ) | |||
throws IOException, ExecException | |||
{ | |||
final ExecMetaData metaData = prepareExecMetaData( command ); | |||
final CommandLauncher launcher = getLauncher( metaData ); | |||
final Process process = launcher.exec( metaData ); | |||
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 ) | |||
{ | |||
CommandLauncher launcher = m_launcher; | |||
@@ -9,16 +9,16 @@ package org.apache.aut.nativelib.impl; | |||
import java.io.BufferedReader; | |||
import java.io.ByteArrayOutputStream; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.io.StringReader; | |||
import java.util.Iterator; | |||
import java.util.Locale; | |||
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.ExecManager; | |||
import org.apache.aut.nativelib.ExecMetaData; | |||
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 | |||
@@ -28,7 +28,7 @@ import org.apache.aut.nativelib.Os; | |||
* @author <a href="mailto:thomas.haas@softwired-inc.com">Thomas Haas</a> | |||
* @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[] 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_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 | |||
* native EnvironmentData Variables for the current process. | |||
*/ | |||
public static Properties getNativeEnvironment() | |||
public Properties getNativeEnvironment() | |||
throws IOException, ExecException | |||
{ | |||
final Properties properties = new Properties(); | |||
@@ -81,21 +69,21 @@ public final class Environment | |||
* Get the Property object with all environment variables and | |||
* attempt to load it if it has not already been loaded. | |||
*/ | |||
private static synchronized Properties getEnvironmentVariables() | |||
private synchronized Properties getEnvironmentVariables() | |||
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. | |||
*/ | |||
private static synchronized Properties retrieveEnvironmentVariables() | |||
private synchronized Properties retrieveEnvironmentVariables() | |||
throws IOException, ExecException | |||
{ | |||
final String data = getEnvironmentText(); | |||
@@ -137,8 +125,8 @@ public final class Environment | |||
* '=' character then generate an exception. After parsed data place | |||
* 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 | |||
{ | |||
final int index = data.indexOf( '=' ); | |||
@@ -161,30 +149,18 @@ public final class Environment | |||
* Retrieve the text of data that is the result of | |||
* running the environment command. | |||
*/ | |||
private static String getEnvironmentText() | |||
private String getEnvironmentText() | |||
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(); | |||
@@ -12,7 +12,6 @@ import java.io.IOException; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
import java.util.Properties; | |||
import org.apache.aut.nativelib.impl.Environment; | |||
import org.apache.aut.nativelib.ExecException; | |||
import org.apache.aut.nativelib.ExecMetaData; | |||
@@ -121,23 +120,13 @@ class ExecUtil | |||
throws ExecException, IOException | |||
{ | |||
final Properties environment = metaData.getEnvironment(); | |||
if( 0 == environment.size() ) | |||
if( null == environment || 0 == environment.size() ) | |||
{ | |||
return null; | |||
} | |||
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 ); | |||
} | |||
} | |||
} |