You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by do...@apache.org on 2001/12/23 07:22:23 UTC

cvs commit: jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/exec DefaultExecManager.java

donaldp     01/12/22 22:22:23

  Added:       proposal/myrmidon/src/java/org/apache/myrmidon/framework/exec
                        DefaultExecManager.java
  Log:
  Add in default implementation of ExecuteManager. It takes over most of the responsibilities of Execute except that it does it in a more easily evolvable manner.
  
  Revision  Changes    Path
  1.1                  jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/exec/DefaultExecManager.java
  
  Index: DefaultExecManager.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included  with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.myrmidon.framework.exec;
  
  import java.io.File;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  import java.util.Locale;
  import org.apache.avalon.excalibur.io.FileUtil;
  import org.apache.myrmidon.framework.Os;
  import org.apache.myrmidon.framework.exec.launchers.DefaultCommandLauncher;
  import org.apache.myrmidon.framework.exec.launchers.MacCommandLauncher;
  import org.apache.myrmidon.framework.exec.launchers.ScriptCommandLauncher;
  import org.apache.myrmidon.framework.exec.launchers.WinNTCommandLauncher;
  
  /**
   * Default implementation of <code>ExecManager</code>.
   * Used to run processes in the ant environment.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2001/12/23 06:22:23 $
   * @author <a href="mailto:thomas.haas@softwired-inc.com">Thomas Haas</a>
   * @see ExecManager
   * @see ExecMetaData
   */
  public class DefaultExecManager
      implements ExecManager
  {
      /**
       * Used to destroy processes when the VM exits.
       */
      private final ProcessDestroyer m_processDestroyer = new ProcessDestroyer();
  
      private final CommandLauncher m_launcher;
      private final CommandLauncher m_shellLauncher;
  
      public DefaultExecManager( final File antDir )
          throws ExecException
      {
          m_launcher = new DefaultCommandLauncher();
          m_shellLauncher = createShellLauncher( antDir );
      }
  
      /**
       * Execute a process and wait for it to finish before
       * returning.
       */
      public int execute( final ExecMetaData metaData,
                          final InputStream input,
                          final OutputStream output,
                          final OutputStream error,
                          final long timeout )
          throws IOException, ExecException
      {
          final CommandLauncher launcher = getLauncher( metaData );
          final Process process = launcher.exec( metaData );
          final ProcessMonitor monitor =
              new ProcessMonitor( process, input, output, error, timeout );
  
          final Thread thread = new Thread( monitor, "ProcessMonitor" );
          thread.start();
  
          // add the process to the list of those to destroy if the VM exits
          m_processDestroyer.add( process );
  
          waitFor( process );
  
          //Now wait for monitor to finish aswell
          try { thread.join(); }
          catch( InterruptedException e )
          {
              //should never occur.
          }
  
          // remove the process to the list of those to destroy if the VM exits
          m_processDestroyer.remove( process );
  
          if( monitor.didProcessTimeout() )
          {
              throw new ExecException( "Process Timed out" );
          }
  
          return process.exitValue();
      }
  
      private void waitFor( final Process process )
      {
          //Should loop around until process is terminated.
          try
          {
              process.waitFor();
          }
          catch( final InterruptedException ie )
          {
              //should never happen
          }
      }
  
      private CommandLauncher getLauncher( final ExecMetaData metaData )
      {
          CommandLauncher launcher = m_launcher;
          if( false ) //!m_useVMLauncher )
          {
              launcher = m_shellLauncher;
          }
          return launcher;
      }
  
      private CommandLauncher createShellLauncher( final File antDir )
          throws ExecException
      {
          CommandLauncher launcher = null;
  
          if( Os.isFamily( "mac" ) )
          {
              // Mac
              launcher = new MacCommandLauncher();
          }
          else if( Os.isFamily( "os/2" ) )
          {
              // OS/2 - use same mechanism as Windows 2000
              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
              final String osname =
                  System.getProperty( "os.name" ).toLowerCase( Locale.US );
  
              if( osname.indexOf( "nt" ) >= 0 || osname.indexOf( "2000" ) >= 0 )
              {
                  // Windows 2000/NT
                  launcher = new WinNTCommandLauncher();
              }
              else
              {
                  // Windows 98/95 - need to use an auxiliary script
                  final String script = resolveCommand( antDir, "bin/antRun.bat" );
                  launcher = new ScriptCommandLauncher( script );
              }
          }
          else if( ( new Os( "netware" ) ).eval() )
          {
              // NetWare.  Need to determine which JDK we're running in
              final String perlScript = resolveCommand( antDir, "bin/antRun.pl" );
              final String[] script = new String[]{"perl", perlScript};
              launcher = new ScriptCommandLauncher( script );
          }
          else
          {
              // Generic
              final String script = resolveCommand( antDir, "bin/antRun" );
              launcher = new ScriptCommandLauncher( script );
          }
  
          return launcher;
      }
  
      private String resolveCommand( final File antDir, final String command )
      {
          return FileUtil.resolveFile( antDir, command ).toString();
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>