ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dona...@apache.org
Subject cvs commit: jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/nativelib Argument.java ArgumentList.java Commandline.java EnvironmentData.java EnvironmentVariable.java Execute.java LoggingExecOutputHandler.java Resources.properties
Date Sun, 14 Apr 2002 09:30:15 GMT
donaldp     02/04/14 02:30:15

  Added:       framework/src/java/org/apache/myrmidon Constants.java
               framework/src/java/org/apache/myrmidon/framework
                        AbstractContainerTask.java AbstractFacadeTask.java
                        AbstractFileSet.java AbstractMatchingTask.java
                        AbstractTypeDef.java ChainFileNameMapper.java
                        DataType.java FileNameMapper.java FileSet.java
                        JavaVersion.java LogLevel.java Pattern.java
                        PatternSet.java PatternUtil.java
                        Resources.properties TaskList.java
                        TypeInstanceTask.java
               framework/src/java/org/apache/myrmidon/framework/conditions
                        AndCondition.java Condition.java
                        IsSetCondition.java IsTrueCondition.java
                        NotCondition.java OrCondition.java
                        Resources.properties
               framework/src/java/org/apache/myrmidon/framework/factories
                        ExecManagerFactory.java Resources.properties
                        VfsManager.java VfsManagerFactory.java
               framework/src/java/org/apache/myrmidon/framework/file
                        ArrayFileList.java FileList.java
                        FileListToStringConverter.java FileListUtil.java
                        ParsedPathElement.java Path.java
                        StringToPathConverter.java
               framework/src/java/org/apache/myrmidon/framework/filters
                        LineFilter.java LineFilterSet.java
                        TokenLineFilter.java TokenSet.java
               framework/src/java/org/apache/myrmidon/framework/java
                        ExecuteJava.java JavaRuntimeClassPath.java
                        Resources.properties
               framework/src/java/org/apache/myrmidon/framework/nativelib
                        Argument.java ArgumentList.java Commandline.java
                        EnvironmentData.java EnvironmentVariable.java
                        Execute.java LoggingExecOutputHandler.java
                        Resources.properties
  Log:
  Copy across framework hierarchy from main ant cvs. Minor touchups to work with new hierarchy.
  
  Revision  Changes    Path
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/Constants.java
  
  Index: Constants.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;
  
  /**
   * Abstract interface to hold constants.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public interface Constants
  {
      //Constants to indicate the build of Myrmidon
      String BUILD_DATE = "@@DATE@@";
      String BUILD_VERSION = "@@VERSION@@";
  
      String BUILD_DESCRIPTION = "Myrmidon " + BUILD_VERSION + " compiled on " + BUILD_DATE;
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/AbstractContainerTask.java
  
  Index: AbstractContainerTask.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;
  
  import org.apache.aut.converter.Converter;
  import org.apache.aut.converter.ConverterException;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.myrmidon.api.AbstractTask;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.interfaces.configurer.Configurer;
  import org.apache.myrmidon.interfaces.executor.ExecutionFrame;
  import org.apache.myrmidon.interfaces.executor.Executor;
  import org.apache.myrmidon.interfaces.role.RoleInfo;
  import org.apache.myrmidon.interfaces.role.RoleManager;
  import org.apache.myrmidon.interfaces.type.TypeException;
  import org.apache.myrmidon.interfaces.type.TypeFactory;
  import org.apache.myrmidon.interfaces.type.TypeManager;
  
  /**
   * This is the class that Task writers should extend to provide custom tasks.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public abstract class AbstractContainerTask
      extends AbstractTask
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( AbstractContainerTask.class );
  
      ///For converting own attributes
      private Converter m_converter;
  
      ///For configuring own sub-elements
      private Configurer m_configurer;
  
      ///For executing sub-elements as tasks
      private Executor m_executor;
      private ExecutionFrame m_frame;
  
      /**
       * Retrieve context from container.
       *
       * @param context the context
       */
      public void contextualize( TaskContext context )
          throws TaskException
      {
          super.contextualize( context );
          m_configurer = (Configurer)getService( Configurer.class );
          m_converter = (Converter)getService( Converter.class );
          m_executor = (Executor)getService( Executor.class );
          m_frame = (ExecutionFrame)getService( ExecutionFrame.class );
      }
  
      /**
       * Helper method to convert an object to a specific type.
       *
       * @param to type to convert object to
       * @param object the object to convert
       * @return the converted object
       * @exception ConfigurationException if an error occurs
       */
      protected final Object convert( final Class to, final Object object )
          throws ConfigurationException
      {
          try
          {
              return m_converter.convert( to, object, getContext() );
          }
          catch( final ConverterException ce )
          {
              final String message = REZ.getString( "container.bad-config.error" );
              throw new ConfigurationException( message, ce );
          }
      }
  
      /**
       * Configure an object using specific configuration element.
       *
       * @param object the object
       * @param element the configuration element
       * @exception ConfigurationException if an error occurs
       */
      protected final void configureElement( final Object object,
                                             final Configuration element )
          throws ConfigurationException
      {
          m_configurer.configureElement( object, element, getContext() );
      }
  
      /**
       * Configure an object using specific configuration element.
       *
       * @param object the object
       * @param clazz the class to use when configuring element
       * @param element the configuration element
       * @exception ConfigurationException if an error occurs
       */
      protected final void configureElement( final Object object,
                                             final Class clazz,
                                             final Configuration element )
          throws ConfigurationException
      {
          m_configurer.configureElement( object, clazz, element, getContext() );
      }
  
      /**
       * Configure an objects attribute using parameters.
       *
       * @param object the object
       * @param name the attibute name
       * @param value the attibute value
       * @exception ConfigurationException if an error occurs
       */
      protected final void configureAttribute( final Object object, final String name, final String value )
          throws ConfigurationException
      {
          m_configurer.configureAttribute( object, name, value, getContext() );
      }
  
      /**
       * Configure an objects attribute using parameters.
       *
       * @param object the object
       * @param clazz the class to use when configuring element
       * @param name the attibute name
       * @param value the attibute value
       * @exception ConfigurationException if an error occurs
       */
      protected final void configureAttribute( final Object object,
                                               final Class clazz,
                                               final String name, final String value )
          throws ConfigurationException
      {
          m_configurer.configureAttribute( object, clazz, name, value, getContext() );
      }
  
      /**
       * Utility method to execute specified tasks in current ExecutionFrame.
       */
      protected final void executeTasks( final Configuration[] tasks )
          throws TaskException
      {
          for( int i = 0; i < tasks.length; i++ )
          {
              final Configuration task = tasks[ i ];
              executeTask( task );
          }
      }
  
      /**
       * Utility method to execute specified task in current ExecutionFrame.
       */
      protected final void executeTask( final Configuration task )
          throws TaskException
      {
          m_executor.execute( task, m_frame );
      }
  
      /**
       * Create an instance of type with specified type and in specified role.
       */
      protected final Object newInstance( final Class roleType, final String typeName )
          throws TaskException
      {
          try
          {
              final RoleInfo role = getRoleByType( roleType );
              final TypeFactory typeFactory = getTypeFactory( role.getName() );
              return typeFactory.create( typeName );
          }
          catch( Exception e )
          {
              final String message =
                  REZ.getString( "container.no-create-type-for-type.error", roleType.getName(), typeName );
              throw new TaskException( message, e );
          }
      }
  
      /**
       * Create an instance of type with specified type and in specified role.
       */
      protected final Object newInstance( final String roleName, final String typeName )
          throws TaskException
      {
          try
          {
              final TypeFactory typeFactory = getTypeFactory( roleName );
              return typeFactory.create( typeName );
          }
          catch( final Exception e )
          {
              final String message =
                  REZ.getString( "container.no-create-type.error", roleName, typeName );
              throw new TaskException( message, e );
          }
      }
  
      /**
       * Looks up a role using the role type.
       */
      protected final RoleInfo getRoleByType( final Class roleType )
          throws TaskException
      {
          final RoleManager roleManager = (RoleManager)getService( RoleManager.class );
          final RoleInfo role = roleManager.getRoleByType( roleType );
          if( role == null )
          {
              final String message = REZ.getString( "container.unknown-role-type.error", roleType.getName() );
              throw new TaskException( message );
          }
          return role;
      }
  
      /**
       * Locates a type factory.
       */
      protected final TypeFactory getTypeFactory( final String roleName )
          throws TaskException
      {
          try
          {
              final TypeManager typeManager = (TypeManager)getService( TypeManager.class );
              return typeManager.getFactory( roleName );
          }
          catch( final TypeException te )
          {
              final String message = REZ.getString( "container.no-factory.error", roleName );
              throw new TaskException( message, te );
          }
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/AbstractFacadeTask.java
  
  Index: AbstractFacadeTask.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;
  
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.configuration.DefaultConfiguration;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * Abstract task used to write tasks that delegate to facades
   * such as Javac, Jspc and so forth.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public abstract class AbstractFacadeTask
      extends AbstractContainerTask
      implements Configurable
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( AbstractFacadeTask.class );
  
      /**
       * The name of the attribute used to select specific
       * implementation of facade.
       */
      private final String m_selector;
  
      /**
       * The Class type for the facade (also used as the role
       * when looking up TypeManager).
       */
      private final Class m_facadeType;
  
      /**
       * The default name of implementation if none are specified.
       */
      private final String m_defaultName;
  
      /**
       * The configuration used to configure the facade implementation.
       */
      private Configuration m_configuration;
  
      /**
       * Create the facade task that works with specified facade class,
       * using the selector attribute to find implementation or using
       * defaultName if selector attribute not specified.
       */
      protected AbstractFacadeTask( final String selector,
                                    final Class facadeType,
                                    final String defaultName )
      {
          m_selector = selector;
          m_facadeType = facadeType;
          m_defaultName = defaultName;
      }
  
      /**
       * Supply the configuration for this task.
       */
      public void configure( final Configuration configuration )
          throws ConfigurationException
      {
          m_configuration = configuration;
      }
  
      /**
       * Utility method to create and configure the facade
       * implementation.
       */
      protected Object prepareFacade()
          throws TaskException
      {
          final Object facade = createFacade();
          configureFacade( facade );
          return facade;
      }
  
      /**
       * Utility method to configure the specified facade.
       * It will be configured according to normal resolution
       * rules using the configuration data supplied to task
       * minus the selector attribute if present.
       */
      protected void configureFacade( final Object facade )
          throws TaskException
      {
          Configuration configuration = m_configuration;
  
          if( null != m_selector &&
              null != m_configuration.getAttribute( m_selector, null ) )
          {
              configuration = rebuildConfiguration( m_configuration, m_selector );
          }
  
          try
          {
              configureElement( facade, m_facadeType, configuration );
          }
          catch( final ConfigurationException ce )
          {
              throw new TaskException( ce.getMessage(), ce );
          }
      }
  
      /**
       * Rebuild the configuration tree with the attribute with specified
       * name removed from top-level element.
       */
      private Configuration rebuildConfiguration( final Configuration configuration,
                                                  final String attribute )
      {
          final DefaultConfiguration newConfiguration =
              new DefaultConfiguration( configuration.getName(),
                                        configuration.getLocation() );
  
          //Add all the attributes from old configuration except the one
          //that was used to select the particular implementation
          final String[] names = configuration.getAttributeNames();
          for( int i = 0; i < names.length; i++ )
          {
              final String name = names[ i ];
              if( !name.equals( attribute ) )
              {
                  final String value = configuration.getAttribute( name, null );
                  newConfiguration.setAttribute( name, value );
              }
          }
  
          //Add all elements to new configuration element in the
          //correct order
          final Configuration[] children = configuration.getChildren();
          for( int i = 0; i < children.length; i++ )
          {
              newConfiguration.addChild( children[ i ] );
          }
  
          return newConfiguration;
      }
  
      /**
       * Create the instance of the facade. It looks up the name
       * of the implementation via the <code>getImplementation()</code>
       * method and then creates a new instance from a TypeFactory
       * using that name and the facadeType (specified in the
       * constructor).
       */
      protected Object createFacade()
          throws TaskException
      {
          final String implementation = getImplementation();
          if( null == implementation )
          {
              final String message =
                  REZ.getString( "facade.missing-impl.error", getContext().getName() );
              throw new TaskException( message );
          }
          return newInstance( m_facadeType, implementation );
      }
  
      /**
       * Get the shortname of the implementation
       * to use. It assumes that the implementation is registered in
       * the TypeFactory under this shortname.
       */
      protected String getImplementation()
      {
          if( null != m_selector )
          {
              return m_configuration.getAttribute( m_selector, m_defaultName );
          }
          else
          {
              return m_defaultName;
          }
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/AbstractFileSet.java
  
  Index: AbstractFileSet.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;
  
  /**
   * An abstract base class for all FileSets.
   * FileSets represent a pattern anchored by a root.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public class AbstractFileSet
      extends PatternSet
  {
      private boolean m_defaultExcludes = true;
  
      /**
       * Add the default excludes to FileSet.
       */
      public final void setDefaultExcludes( final boolean defaultExcludes )
      {
          m_defaultExcludes = defaultExcludes;
      }
  
      public final boolean includeDefaultExcludes()
      {
          return m_defaultExcludes;
      }
  
      /**
       * Merge specified PatternSet into this patternSet.
       */
      public final void addPatternSet( final PatternSet set )
      {
          append( set );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/AbstractMatchingTask.java
  
  Index: AbstractMatchingTask.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;
  
  import org.apache.myrmidon.api.AbstractTask;
  
  /**
   * An abstract base class for tasks that wish to operate on
   * a set of files. This class is based on the ant1.x MatchingTask and
   * should fullfill similar requirements.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public abstract class AbstractMatchingTask
      extends AbstractTask
  {
      private FileSet m_fileset = new FileSet();
  
      /**
       * Retrieve fileset for Matching task.
       */
      protected FileSet getFileSet()
      {
          return m_fileset;
      }
  
      /**
       * The attribute that contains a list of itesm to be included.
       */
      public void setIncludes( final String includes )
      {
          m_fileset.setIncludes( includes );
      }
  
      /**
       * The attribute that contains a list of items to be excluded.
       */
      public void setExcludes( final String excludes )
      {
          m_fileset.setExcludes( excludes );
      }
  
      /**
       * Set this to true to use the defaul exclude patterns.
       */
      public void setDefaultexcludes( final boolean useDefaultExcludes )
      {
          m_fileset.setDefaultExcludes( useDefaultExcludes );
      }
  
      public void addInclude( final Pattern pattern )
      {
          m_fileset.addInclude( pattern );
      }
  
      public void addExclude( final Pattern pattern )
      {
          m_fileset.addExclude( pattern );
      }
  
      public void addPatternSet( final PatternSet set )
      {
          m_fileset.addPatternSet( set );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/AbstractTypeDef.java
  
  Index: AbstractTypeDef.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;
  
  import java.io.File;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.interfaces.deployer.Deployer;
  import org.apache.myrmidon.interfaces.deployer.DeploymentException;
  import org.apache.myrmidon.interfaces.deployer.TypeDefinition;
  import org.apache.myrmidon.interfaces.deployer.TypeDeployer;
  
  /**
   * Abstract task to extend to define a type.
   *
   * TODO: Make this support classpath sub-element in future
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public abstract class AbstractTypeDef
      extends AbstractContainerTask
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( AbstractTypeDef.class );
  
      // TODO - replace lib with class-path
      private File m_lib;
      private String m_name;
      private String m_classname;
  
      protected void setName( final String name )
      {
          m_name = name;
      }
  
      public void setClassname( final String classname )
      {
          m_classname = classname;
      }
  
      public void setLib( final File lib )
      {
          m_lib = lib;
      }
  
      protected final String getName()
      {
          return m_name;
      }
  
      protected final String getClassname()
      {
          return m_classname;
      }
  
      /**
       * Executes the task.
       */
      public void execute()
          throws TaskException
      {
          if( null == m_lib )
          {
              final String message = REZ.getString( "typedef.no-lib.error" );
              throw new TaskException( message );
          }
  
          try
          {
              // Locate the deployer, and use it to deploy the type
              final Deployer deployer = (Deployer)getService( Deployer.class );
              final TypeDeployer typeDeployer = deployer.createDeployer( m_lib );
              final TypeDefinition typeDef = createTypeDefinition();
              typeDeployer.deployType( typeDef );
          }
          catch( DeploymentException e )
          {
              throw new TaskException( e.getMessage(), e );
          }
      }
  
      /**
       * Creates the definition for the type to be deployed.
       */
      protected abstract TypeDefinition createTypeDefinition();
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/ChainFileNameMapper.java
  
  Index: ChainFileNameMapper.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;
  
  import java.util.ArrayList;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * A mapper that applies a chain of mappers.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   *
   * @ant.type type="mapper" name="chain"
   */
  public class ChainFileNameMapper
      implements FileNameMapper
  {
      private final ArrayList m_mappers = new ArrayList();
  
      /**
       * Adds a nested mapper.
       */
      public void add( final FileNameMapper mapper )
      {
          m_mappers.add( mapper );
      }
  
      /**
       * Returns an array containing the target filename(s) for the given source
       * file.
       */
      public String[] mapFileName( final String sourceFileName,
                                   final TaskContext context )
          throws TaskException
      {
          ArrayList names = new ArrayList();
          names.add( sourceFileName );
  
          final int count = m_mappers.size();
          for( int i = 0; i < count; i++ )
          {
              final FileNameMapper mapper = (FileNameMapper)m_mappers.get( i );
              names = mapNames( mapper, names, context );
          }
  
          return (String[])names.toArray( new String[ names.size() ] );
      }
  
      /**
       * Maps a set of names.
       */
      private ArrayList mapNames( final FileNameMapper mapper,
                                  final ArrayList names,
                                  final TaskContext context )
          throws TaskException
      {
          final ArrayList retval = new ArrayList();
  
          // Map each of the supplied names
          final int count = names.size();
          for( int i = 0; i < count; i++ )
          {
              final String name = (String)names.get( i );
              final String[] newNames = mapper.mapFileName( name, context );
              if( newNames == null )
              {
                  continue;
              }
              for( int j = 0; j < newNames.length; j++ )
              {
                  final String newName = newNames[ j ];
                  retval.add( newName );
              }
          }
  
          return retval;
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/DataType.java
  
  Index: DataType.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;
  
  /**
   * Base class for those classes that can appear inside the build file
   * as stand alone data types.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @ant:role shorthand="data-type"
   */
  public interface DataType
  {
      String ROLE = DataType.class.getName();
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/FileNameMapper.java
  
  Index: FileNameMapper.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;
  
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * Interface to be used by SourceFileScanner. <p>
   *
   * Used to find the name of the target file(s) corresponding to a source file.
   * </p> <p>
   *
   * The rule by which the file names are transformed is specified via the setFrom
   * and setTo methods. The exact meaning of these is implementation dependent.
   * </p>
   *
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   *
   * @ant:role shorthand="mapper"
   */
  public interface FileNameMapper
  {
      /**
       * Returns an array containing the target filename(s) for the given source
       * file.
       *
       * <p>if the given rule doesn't apply to the source file, implementation
       * must return null. SourceFileScanner will then omit the source file in
       * question.</p>
       *
       * @param sourceFileName the name of the source file relative to some given
       *      basedirectory.
       * @param context the context to perform the mapping in.
       * @return Description of the Returned Value
       */
      String[] mapFileName( String sourceFileName, TaskContext context )
          throws TaskException;
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/FileSet.java
  
  Index: FileSet.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;
  
  import java.io.File;
  
  /**
   * A FileSet represents a set of files selected by patterns with a
   * specified root.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   *
   * @ant.data-type name="fileset"
   */
  public class FileSet
      extends AbstractFileSet
  {
      private File m_dir;
  
      /**
       * Specify the base directory at which the file set is rooted.
       */
      public final void setDir( File dir )
      {
          m_dir = dir;
      }
  
      public final File getDir()
      {
          return m_dir;
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/JavaVersion.java
  
  Index: JavaVersion.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;
  
  import org.apache.avalon.framework.ValuedEnum;
  
  /**
   * Type safe wrapper class for Java Version enums.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public final class JavaVersion
      extends ValuedEnum
  {
      //standard enums for version of JVM
      public static final JavaVersion JAVA1_0 = new JavaVersion( "Java 1.0", 100 );
      public static final JavaVersion JAVA1_1 = new JavaVersion( "Java 1.1", 110 );
      public static final JavaVersion JAVA1_2 = new JavaVersion( "Java 1.2", 120 );
      public static final JavaVersion JAVA1_3 = new JavaVersion( "Java 1.3", 130 );
      public static final JavaVersion JAVA1_4 = new JavaVersion( "Java 1.4", 140 );
  
      private static final JavaVersion CURRENT = determineCurrentJavaVersion();
  
      /**
       * Method to retrieve the current JVM version.
       *
       * @return the current JVM version
       */
      public static final JavaVersion getCurrentJavaVersion()
      {
          return CURRENT;
      }
  
      /**
       * Private constructor so no instance except here can be defined.
       *
       * @param name the java version name
       * @param value the version * 100
       */
      private JavaVersion( final String name, final int value )
      {
          super( name, value );
      }
  
      /**
       * Helper method to retrieve current JVM version.
       *
       * @return the current JVM version
       */
      private static final JavaVersion determineCurrentJavaVersion()
      {
          JavaVersion version = JavaVersion.JAVA1_0;
  
          try
          {
              Class.forName( "java.lang.Void" );
              version = JAVA1_1;
              Class.forName( "java.lang.ThreadLocal" );
              version = JAVA1_2;
              Class.forName( "java.lang.StrictMath" );
              version = JAVA1_3;
              Class.forName( "java.lang.CharSequence" );
              version = JAVA1_4;
          }
          catch( final ClassNotFoundException cnfe )
          {
          }
  
          return version;
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/LogLevel.java
  
  Index: LogLevel.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;
  
  import java.util.HashMap;
  import java.util.Set;
  import org.apache.avalon.framework.Enum;
  import org.apache.myrmidon.api.TaskContext;
  
  /**
   * Type safe Enum for Log Levels and utility method
   * for using enum to write to logger.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public final class LogLevel
      extends Enum
  {
      //Map for all the levels
      private static final HashMap c_levels = new HashMap();
  
      //standard enums for version of JVM
      public static final LogLevel ERROR = new LogLevel( "error" );
      public static final LogLevel WARN = new LogLevel( "warn" );
      public static final LogLevel INFO = new LogLevel( "info" );
      public static final LogLevel VERBOSE = new LogLevel( "verbose" );
      public static final LogLevel DEBUG = new LogLevel( "debug" );
  
      /**
       * Retrieve the log level for the specified name.
       *
       * @param name the name of the LogLevel object to retrieve
       * @returns The LogLevel for specified name or null
       */
      public static LogLevel getByName( final String name )
      {
          return (LogLevel)c_levels.get( name );
      }
  
      /**
       * Retrieve the names of all the LogLevels.
       *
       * @returns The names of all the LogLevels
       */
      public static String[] getNames()
      {
          final Set keys = c_levels.keySet();
          return (String[])keys.toArray( new String[ keys.size() ] );
      }
  
      /**
       * Log a message.
       *
       * @param level the level to write the log message at.
       * @param message the message to write.
       */
      public static void log( final TaskContext context,
                              final LogLevel level,
                              final String message )
      {
          if( ERROR == level )
          {
              context.error( message );
          }
          else if( WARN == level )
          {
              context.warn( message );
          }
          else if( INFO == level )
          {
              context.info( message );
          }
          else if( VERBOSE == level )
          {
              context.verbose( message );
          }
          else
          {
              context.debug( message );
          }
      }
  
      /**
       * Log a message.
       *
       * @param level the level to write the log message at.
       * @param message the message to write.
       * @param throwable the throwable.
       */
      public static void log( final TaskContext context,
                              final LogLevel level,
                              final String message,
                              final Throwable throwable )
      {
          if( ERROR == level )
          {
              context.error( message, throwable );
          }
          else if( WARN == level )
          {
              context.warn( message, throwable );
          }
          else if( INFO == level )
          {
              context.info( message, throwable );
          }
          else if( VERBOSE == level )
          {
              context.verbose( message, throwable );
          }
          else
          {
              context.debug( message, throwable );
          }
      }
  
      /**
       * Private constructor so no instance except here can be defined.
       *
       * @param name the name of Log Level
       */
      private LogLevel( final String name )
      {
          super( name, c_levels );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/Pattern.java
  
  Index: Pattern.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;
  
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.framework.conditions.Condition;
  import org.apache.myrmidon.framework.conditions.IsTrueCondition;
  import org.apache.myrmidon.framework.conditions.NotCondition;
  
  /**
   * Basic data type for holding patterns.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   * @ant.data-type name="pattern"
   */
  public class Pattern
      implements DataType
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( Pattern.class );
  
      private String m_name;
      private Condition m_condition;
  
      public Pattern()
      {
      }
  
      public Pattern( final String name )
      {
          m_name = name;
      }
  
      /**
       * Retrieve value of pattern.
       *
       * @return the value of pattern
       */
      public String getName()
      {
          return m_name;
      }
  
      /**
       * Get condition associated with pattern if any.
       *
       * @return the Condition
       */
      public Condition getCondition()
      {
          return m_condition;
      }
  
      /**
       * Setter method for name of pattern.
       *
       * @param name the name
       */
      public void setName( final String name )
      {
          m_name = name;
      }
  
      /**
       * Set if clause on pattern.
       *
       * @param condition the condition
       * @exception TaskException if an error occurs
       */
      public void setIf( final String condition )
          throws TaskException
      {
          verifyConditionNull();
          m_condition = new IsTrueCondition( condition );
      }
  
      /**
       * Set unless clause of pattern.
       *
       * @param condition the unless clause
       * @exception TaskException if an error occurs
       */
      public void setUnless( final String condition )
          throws TaskException
      {
          verifyConditionNull();
          m_condition = new NotCondition( new IsTrueCondition( condition ) );
      }
  
      public String evaluateName( final TaskContext context )
      {
          try
          {
              final Condition condition = getCondition();
              final boolean result = ( condition == null || condition.evaluate( context ) );
              if( result )
              {
                  return getName();
              }
          }
          catch( final TaskException te )
          {
              //ignore for the moment
          }
          return null;
      }
  
      public String toString()
      {
          String result = "Pattern['" + m_name + "',";
          if( null != m_condition )
          {
              result = result + m_condition;
          }
          return result + "]";
      }
  
      /**
       * Utility method to make sure condition unset.
       * Made so that it is not possible for both if and unless to be set.
       *
       * @exception TaskException if an error occurs
       */
      private void verifyConditionNull()
          throws TaskException
      {
          if( null != m_condition )
          {
              final String message = REZ.getString( "pattern.ifelse-duplicate.error" );
              throw new TaskException( message );
          }
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/PatternSet.java
  
  Index: PatternSet.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;
  
  import java.util.ArrayList;
  import java.util.StringTokenizer;
  
  /**
   * Named collection of include/exclude tags. <p>
   *
   * @author <a href="mailto:ajkuiper@wxs.nl">Arnout J. Kuiper</a>
   * @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>
   * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a>
   * @author <a href="mailto:jon@clearink.com">Jon S. Stevens</a>
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public class PatternSet
  {
      private ArrayList m_includes = new ArrayList();
      private ArrayList m_excludes = new ArrayList();
  
      /**
       * Sets the set of exclude patterns. Patterns may be separated by a comma or
       * a space.
       *
       * @param excludes the string containing the exclude patterns
       */
      public void setExcludes( final String excludes )
      {
          final Pattern[] patterns = parsePatterns( excludes );
          for( int i = 0; i < patterns.length; i++ )
          {
              addExclude( patterns[ i ] );
          }
      }
  
      /**
       * Sets the set of include patterns. Patterns may be separated by a comma or
       * a space.
       *
       * @param includes the string containing the include patterns
       */
      public void setIncludes( final String includes )
      {
          final Pattern[] patterns = parsePatterns( includes );
          for( int i = 0; i < patterns.length; i++ )
          {
              addInclude( patterns[ i ] );
          }
      }
  
      /**
       * add a name entry on the exclude list
       */
      public void addExclude( final Pattern pattern )
      {
          m_excludes.add( pattern );
      }
  
      /**
       * add a name entry on the include list
       */
      public void addInclude( final Pattern pattern )
      {
          m_includes.add( pattern );
      }
  
      public final ArrayList getIncludes()
      {
          return m_includes;
      }
  
      public final ArrayList getExcludes()
      {
          return m_excludes;
      }
  
      /**
       * Adds the patterns of the other instance to this set.
       */
      public void append( final PatternSet other )
      {
          m_includes.addAll( other.m_includes );
          m_excludes.addAll( other.m_excludes );
      }
  
      public String toString()
      {
          return "PatternSet [ includes: " + m_includes +
              " excludes: " + m_excludes + " ]";
      }
  
      private Pattern[] parsePatterns( final String patternString )
      {
          final ArrayList patterns = new ArrayList();
          if( patternString != null && patternString.length() > 0 )
          {
              StringTokenizer tok = new StringTokenizer( patternString, ", ", false );
              while( tok.hasMoreTokens() )
              {
                  final Pattern pattern = new Pattern( tok.nextToken() );
                  patterns.add( pattern );
              }
          }
  
          return (Pattern[])patterns.toArray( new Pattern[ patterns.size() ] );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/PatternUtil.java
  
  Index: PatternUtil.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;
  
  import java.util.ArrayList;
  import java.util.Iterator;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   *
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public class PatternUtil
  {
      /**
       * Returns the filtered include patterns.
       */
      public static String[] getIncludePatterns( final PatternSet set,
                                                 final TaskContext context )
          throws TaskException
      {
          return toArray( set.getIncludes(), context );
      }
  
      public static String[] getExcludePatterns( final PatternSet set,
                                                 final TaskContext context )
          throws TaskException
      {
          return toArray( set.getExcludes(), context );
      }
  
      /**
       * Convert a vector of Pattern elements into an array of Strings.
       */
      private static String[] toArray( final ArrayList list, final TaskContext context )
      {
          if( list.size() == 0 )
          {
              return null;
          }
  
          final ArrayList names = new ArrayList();
          final Iterator patterns = list.iterator();
          while( patterns.hasNext() )
          {
              final Pattern pattern = (Pattern)patterns.next();
              final String result = pattern.evaluateName( context );
              if( null != result && result.length() > 0 )
              {
                  names.add( result );
              }
          }
  
          return (String[])names.toArray( new String[ names.size() ] );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  container.null-value.error=Value ({0}) resolved to null.
  container.bad-resolve.error=Error resolving value ({0}).
  container.bad-config.error=Error converting value.
  container.no-factory.error=Could not locate the type factory for role "{0}".
  container.no-create-type.error=Could not create an instance of role "{0}" with type name "{1}".
  container.no-create-type-for-type.error=Could not create an instance of class "{0}" with type name "{1}".
  container.unknown-role-type.error=Could not determine the role for class "{0}".
  
  typedef.no-lib.error=Must specify the lib parameter.
  
  condition.no-resolve.error=Error resolving {0}.
  
  pattern.ifelse-duplicate.error=Can only set one of if/else for pattern data type.
  
  type.no-create.error=Unable to create datatype.
  type.no-id.error=Id must be specified.
  
  unknown-family=Don't know how to detect os family "{0}"
  
  facade.missing-impl.error=Unable to determine the name of implementation for facade task "{0}".
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/TaskList.java
  
  Index: TaskList.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;
  
  import java.util.ArrayList;
  import org.apache.avalon.framework.configuration.Configuration;
  
  /**
   * This object contains an ordered list of tasks.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public class TaskList
  {
      private ArrayList m_tasks = new ArrayList();
  
      public void add( final Configuration task )
      {
          m_tasks.add( task );
      }
  
      public Configuration[] getTasks()
      {
          return (Configuration[])m_tasks.toArray( new Configuration[ m_tasks.size() ] );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/TypeInstanceTask.java
  
  Index: TypeInstanceTask.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;
  
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.configuration.DefaultConfiguration;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * This is the property "task" to declare a binding of a datatype to a name.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:13 $
   */
  public class TypeInstanceTask
      extends AbstractContainerTask
      implements Configurable
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( TypeInstanceTask.class );
  
      private String m_id;
      private Object m_value;
  
      public void configure( final Configuration configuration )
          throws ConfigurationException
      {
          final DefaultConfiguration newConfiguration =
              new DefaultConfiguration( configuration.getName(), configuration.getLocation() );
  
          final String[] attributes = configuration.getAttributeNames();
          for( int i = 0; i < attributes.length; i++ )
          {
              final String name = attributes[ i ];
              final String value = configuration.getAttribute( name );
  
              if( name.equals( "id" ) || name.equals( "local-scope" ) )
              {
                  configureAttribute( this, name, value );
              }
              else
              {
                  newConfiguration.setAttribute( name, value );
              }
          }
  
          final Configuration[] children = configuration.getChildren();
          for( int i = 0; i < children.length; i++ )
          {
              newConfiguration.addChild( children[ i ] );
          }
  
          try
          {
              m_value = newInstance( DataType.ROLE, configuration.getName() );
          }
          catch( final Exception e )
          {
              final String message = REZ.getString( "type.no-create.error" );
              throw new ConfigurationException( message, e );
          }
  
          configureElement( m_value, newConfiguration );
      }
  
      public void setId( final String id )
      {
          m_id = id;
      }
  
      public void execute()
          throws TaskException
      {
          if( null == m_id )
          {
              final String message = REZ.getString( "type.no-id.error" );
              throw new TaskException( message );
          }
  
          getContext().setProperty( m_id, m_value );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/conditions/AndCondition.java
  
  Index: AndCondition.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.conditions;
  
  import java.util.ArrayList;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * &lt;and&gt; condition container. <p>
   *
   * Iterates over all conditions and returns false as soon as one evaluates to
   * false.  An empty and condition returns true.</p>
   *
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   * @version $Revision: 1.1 $
   *
   * @ant.type type="condition" name="and"
   */
  public class AndCondition
      implements Condition
  {
      private final ArrayList m_conditions = new ArrayList();
  
      /**
       * Adds a condition.
       */
      public void add( final Condition condition )
      {
          m_conditions.add( condition );
      }
  
      /**
       * Evaluates the condition.
       *
       */
      public boolean evaluate( final TaskContext context )
          throws TaskException
      {
          final int count = m_conditions.size();
          for( int i = 0; i < count; i++ )
          {
              final Condition condition = (Condition)m_conditions.get( i );
              if( !condition.evaluate( context ) )
              {
                  return false;
              }
          }
          return true;
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/conditions/Condition.java
  
  Index: Condition.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.conditions;
  
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * Class representing a condition.
   *
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   *
   * @ant:role shorthand="condition"
   */
  public interface Condition
  {
      /**
       * Evaluates this condition.
       *
       * @param context
       *      The context to evaluate the condition in.
       */
      boolean evaluate( final TaskContext context )
          throws TaskException;
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/conditions/IsSetCondition.java
  
  Index: IsSetCondition.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.conditions;
  
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * A {@link Condition} that is true when a property is set.
   *
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   *
   * @ant.type type="condition" name="is-set"
   */
  public class IsSetCondition
      implements Condition
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( IsSetCondition.class );
  
      private String m_property;
  
      public IsSetCondition( final String propName )
      {
          m_property = propName;
      }
  
      public IsSetCondition()
      {
      }
  
      /**
       * Set the property name to test.
       */
      public void setProperty( final String propName )
      {
          m_property = propName;
      }
  
      /**
       * Evaluates the condition.
       */
      public boolean evaluate( final TaskContext context )
          throws TaskException
      {
          if( m_property == null )
          {
              final String message = REZ.getString( "isset.no-property.error" );
              throw new TaskException( message );
          }
  
          // Resolve the condition
          final Object object = context.getProperty( m_property );
          return ( object != null );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/conditions/IsTrueCondition.java
  
  Index: IsTrueCondition.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.conditions;
  
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.aut.converter.Converter;
  import org.apache.aut.converter.ConverterException;
  
  /**
   * A {@link Condition} that is true when a property is set, but not set to
   * 'false'.
   *
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   *
   * @ant.type type="condition" name="is-true"
   */
  public class IsTrueCondition
      implements Condition
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( IsTrueCondition.class );
  
      private String m_property;
  
      public IsTrueCondition( final String propName )
      {
          m_property = propName;
      }
  
      public IsTrueCondition()
      {
      }
  
      /**
       * Set the property name to test.
       */
      public void setProperty( final String propName )
      {
          m_property = propName;
      }
  
      /**
       * Evaluates the condition.
       */
      public boolean evaluate( final TaskContext context )
          throws TaskException
      {
          if( m_property == null )
          {
              final String message = REZ.getString( "isset.no-property.error" );
              throw new TaskException( message );
          }
  
          // Resolve the property name
          final Object object = context.getProperty( m_property );
          if( object == null )
          {
              return false;
          }
  
          // Convert value to boolean
          try
          {
              final Converter converter = (Converter)context.getService( Converter.class );
              final Boolean value = (Boolean)converter.convert( Boolean.class, object, context );
              return value.booleanValue();
          }
          catch( final ConverterException e )
          {
              throw new TaskException( e.getMessage(), e );
          }
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/conditions/NotCondition.java
  
  Index: NotCondition.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.conditions;
  
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  
  /**
   * &lt;not&gt; condition. Evaluates to true if the single condition nested into
   * it is false and vice versa.
   *
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   * @version $Revision: 1.1 $
   *
   * @ant.type type="condition" name="not"
   */
  public class NotCondition
      implements Condition
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( NotCondition.class );
  
      private Condition m_condition;
  
      public NotCondition()
      {
      }
  
      public NotCondition( final Condition condition )
      {
          m_condition = condition;
      }
  
      /**
       * Adds a nested condition.
       */
      public void add( final Condition condition )
          throws TaskException
      {
          if( m_condition != null )
          {
              final String message = REZ.getString( "not.too-many-conditions.error" );
              throw new TaskException( message );
          }
          m_condition = condition;
      }
  
      /**
       * Evaluates the condition.
       */
      public boolean evaluate( final TaskContext context )
          throws TaskException
      {
          if( m_condition == null )
          {
              final String message = REZ.getString( "not.no-condition.error" );
              throw new TaskException( message );
          }
  
          return ! m_condition.evaluate( context );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/conditions/OrCondition.java
  
  Index: OrCondition.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.conditions;
  
  import java.util.ArrayList;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * &lt;or&gt; condition container. <p>
   *
   * Iterates over all conditions and returns true as soon as one evaluates to
   * true.  An empty container evaluates to true</p>
   *
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   * @version $Revision: 1.1 $
   *
   * @ant.type type="condition" name="or"
   */
  public class OrCondition
      implements Condition
  {
      private final ArrayList m_conditions = new ArrayList();
  
      /**
       * Adds a condition.
       */
      public void add( final Condition condition )
      {
          m_conditions.add( condition );
      }
  
      /**
       * Evaluates the condition.
       *
       */
      public boolean evaluate( final TaskContext context )
          throws TaskException
      {
          final int count = m_conditions.size();
          for( int i = 0; i < count; i++ )
          {
              final Condition condition = (Condition)m_conditions.get( i );
              if( condition.evaluate( context ) )
              {
                  return true;
              }
          }
          return (count == 0);
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/conditions/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  isset.no-property.error=No property specified to test.
  istrue.no-property.error=No property specified to test.
  not.no-condition.error=No condition specified.
  not.too-many-conditions.error=Too many conditions specified.
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/factories/ExecManagerFactory.java
  
  Index: ExecManagerFactory.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.factories;
  
  import java.io.File;
  import org.apache.aut.nativelib.impl.DefaultExecManager;
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.context.ContextException;
  import org.apache.avalon.framework.context.Contextualizable;
  import org.apache.myrmidon.interfaces.service.AntServiceException;
  import org.apache.myrmidon.interfaces.service.ServiceFactory;
  
  /**
   * A Factory responsible for creating the ExecManager service.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   */
  public class ExecManagerFactory
      implements ServiceFactory, Contextualizable
  {
      private File m_homeDir;
  
      public void contextualize( final Context context ) throws ContextException
      {
          m_homeDir = (File)context.get( "myrmidon.home" );
      }
  
      /**
       * Create the ExecManager Service.
       */
      public Object createService()
          throws AntServiceException
      {
          try
          {
              return new DefaultExecManager( m_homeDir );
          }
          catch( final Exception ee )
          {
              throw new AntServiceException( ee.getMessage(), ee );
          }
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/factories/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  missing-home-dir.error=Cannot locate antRun scripts: Property 'myrmidon.home' not specified
  create-provider.error=Could not create file system provider "{0}".
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/factories/VfsManager.java
  
  Index: VfsManager.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.factories;
  
  import org.apache.aut.vfs.FileSystemException;
  import org.apache.aut.vfs.impl.DefaultFileSystemManager;
  import org.apache.aut.vfs.provider.FileSystemProvider;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.framework.activity.Initializable;
  import org.apache.avalon.framework.service.ServiceException;
  import org.apache.avalon.framework.service.ServiceManager;
  import org.apache.avalon.framework.service.Serviceable;
  import org.apache.myrmidon.interfaces.type.TypeFactory;
  import org.apache.myrmidon.interfaces.type.TypeManager;
  
  /**
   * The myrmidon FileSystemManager implementation.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   */
  public class VfsManager
      extends DefaultFileSystemManager
      implements Serviceable, Initializable
  {
      private static final Resources REZ
          = ResourceManager.getPackageResources( VfsManager.class );
  
      private TypeManager m_typeManager;
  
      /**
       * Locate the services used by this service.
       */
      public void service( final ServiceManager serviceManager ) throws ServiceException
      {
          m_typeManager = (TypeManager)serviceManager.lookup( TypeManager.ROLE );
      }
  
      /**
       * Initialises this service.
       */
      public void initialize() throws Exception
      {
          final TypeFactory factory = m_typeManager.getFactory( FileSystemProvider.ROLE );
  
          // TODO - make this list configurable
  
          // Required providers
          addProvider( factory, new String[]{"file"}, "file", false );
          addProvider( factory, new String[]{"zip", "jar"}, "zip", false );
  
          // Optional providers
          addProvider( factory, new String[]{"smb"}, "smb", true );
          addProvider( factory, new String[]{"ftp"}, "ftp", true );
      }
  
      /**
       * Registers a file system provider.
       */
      private void addProvider( final TypeFactory factory,
                                final String[] urlSchemes,
                                final String providerName,
                                final boolean ignoreIfNotPresent )
          throws FileSystemException
      {
          // Create an instance
          if( ignoreIfNotPresent && !factory.canCreate( providerName ) )
          {
              return;
          }
  
          final FileSystemProvider provider;
          try
          {
              provider = (FileSystemProvider)factory.create( providerName );
          }
          catch( Exception e )
          {
              final String message = REZ.getString( "create-provider.error", providerName );
              throw new FileSystemException( message, e );
          }
  
          // Register the provider
          addProvider( urlSchemes, provider );
      }
  
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/factories/VfsManagerFactory.java
  
  Index: VfsManagerFactory.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.factories;
  
  import org.apache.aut.vfs.FileSystemManager;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.myrmidon.interfaces.service.AntServiceException;
  import org.apache.myrmidon.interfaces.service.ServiceFactory;
  
  /**
   * A factory that creates the {@link FileSystemManager} service.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   */
  public class VfsManagerFactory
      implements ServiceFactory
  {
      private static final Resources REZ
          = ResourceManager.getPackageResources( VfsManagerFactory.class );
  
      /**
       * Create a service that coresponds to this factory.
       */
      public Object createService()
          throws AntServiceException
      {
          return new VfsManager();
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/file/ArrayFileList.java
  
  Index: ArrayFileList.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.file;
  
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * A PathElement made up of an array of strings.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   */
  public class ArrayFileList
      implements FileList
  {
      private final String[] m_parts;
  
      public ArrayFileList( final String part )
      {
          m_parts = new String[] { part } ;
      }
  
      public ArrayFileList( final String[] parts )
      {
          m_parts = parts;
      }
  
      public String[] listFiles( final TaskContext context )
          throws TaskException
      {
          return m_parts;
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/file/FileList.java
  
  Index: FileList.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.file;
  
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * A list of files.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   *
   * @ant:role shorthand="path"
   */
  public interface FileList
  {
      /**
       * Returns the files in this list.
       *
       * @param context the context to use to evaluate the list.
       * @return The names of the files in this list.  All names are absolute paths.
       */
      String[] listFiles( TaskContext context )
          throws TaskException;
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/file/FileListToStringConverter.java
  
  Index: FileListToStringConverter.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.file;
  
  import org.apache.aut.converter.AbstractConverter;
  import org.apache.aut.converter.ConverterException;
  import org.apache.aut.nativelib.PathUtil;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.framework.file.FileList;
  
  /**
   * Converters from FileList to String.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   *
   * @ant.converter source="org.apache.myrmidon.framework.file.FileList" destination="java.lang.String"
   */
  public class FileListToStringConverter
      extends AbstractConverter
  {
      public FileListToStringConverter()
      {
          super( FileList.class, String.class );
      }
  
      protected Object convert( final Object original, final Object context )
          throws ConverterException
      {
          try
          {
              final TaskContext taskContext = (TaskContext)context;
              final FileList fileList = (FileList)original;
              final String[] files = fileList.listFiles( taskContext );
              return PathUtil.formatPath( files );
          }
          catch( final TaskException e )
          {
              throw new ConverterException( e.getMessage(), e );
          }
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/file/FileListUtil.java
  
  Index: FileListUtil.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.file;
  
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.interfaces.classloader.ClassLoaderManager;
  import org.apache.myrmidon.interfaces.classloader.ClassLoaderException;
  import org.apache.aut.nativelib.PathUtil;
  import java.io.File;
  import java.io.IOException;
  import java.net.URL;
  
  /**
   * Utility methods for dealing with {@link FileList} objects.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   */
  public final class FileListUtil
  {
      private FileListUtil()
      {
      }
  
      /**
       * Formats a path into its native representation.
       */
      public static String formatPath( final FileList path, final TaskContext context )
          throws TaskException
      {
          final String[] list = path.listFiles( context );
          return PathUtil.formatPath( list );
      }
  
      /**
       * Converts a path into an array of Files.
       */
      public static File[] toFiles( final FileList path, final TaskContext context )
          throws TaskException
      {
          final String[] list = path.listFiles( context );
          final File[] result = new File[ list.length ];
          for( int i = 0; i < list.length; i++ )
          {
              result[ i ] = new File( list[ i ] );
          }
          return result;
      }
  
      /**
       * Converts a path into an array of URLs - useful for building a ClassLoader.
       */
      public static URL[] toURLs( final FileList path, final TaskContext context )
          throws TaskException
      {
          try
          {
              final String[] list = path.listFiles( context );
  
              final URL[] result = new URL[ list.length ];
  
              // path containing one or more elements
              for( int i = 0; i < list.length; i++ )
              {
                  result[ i ] = new File( list[ i ] ).toURL();
              }
  
              return result;
          }
          catch( final IOException ioe )
          {
              throw new TaskException( "Malformed path entry.", ioe );
          }
      }
  
      /**
       * Creates a ClassLoader from a class-path.
       */
      public static ClassLoader createClassLoader( final FileList classpath,
                                                   final TaskContext context )
          throws TaskException
      {
          final File[] files = toFiles( classpath, context );
          final ClassLoaderManager manager = (ClassLoaderManager)context.getService( ClassLoaderManager.class );
          try
          {
              return manager.createClassLoader( files );
          }
          catch( final ClassLoaderException e )
          {
              throw new TaskException( e.getMessage(), e );
          }
      }
  
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/file/ParsedPathElement.java
  
  Index: ParsedPathElement.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.file;
  
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.framework.file.FileList;
  import org.apache.tools.todo.util.FileUtils;
  
  /**
   * A PathElement that is parsed from a string.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   */
  public class ParsedPathElement
      implements FileList
  {
      private final String m_path;
  
      public ParsedPathElement( final String path )
      {
          m_path = path;
      }
  
      public String[] listFiles( final TaskContext context )
          throws TaskException
      {
          return FileUtils.translatePath( context.getBaseDirectory(), m_path );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/file/Path.java
  
  Index: Path.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.file;
  
  import java.io.File;
  import java.util.ArrayList;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.framework.DataType;
  import org.apache.myrmidon.framework.FileSet;
  import org.apache.myrmidon.framework.file.ArrayFileList;
  import org.apache.myrmidon.framework.file.FileList;
  import org.apache.tools.todo.util.FileUtils;
  import org.apache.tools.todo.types.DirectoryScanner;
  import org.apache.tools.todo.types.ScannerUtil;
  
  /**
   * This object represents a path as used by CLASSPATH or PATH environment
   * variable. <p>
   *
   * <code>
   * &lt;sometask&gt;<br>
   * &nbsp;&nbsp;&lt;somepath&gt;<br>
   * &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement location="/path/to/file.jar" /&gt;
   * <br>
   * &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement
   * path="/path/to/file2.jar:/path/to/class2;/path/to/class3" /&gt;<br>
   * &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement location="/path/to/file3.jar" /&gt;
   * <br>
   * &nbsp;&nbsp;&nbsp;&nbsp;&lt;pathelement location="/path/to/file4.jar" /&gt;
   * <br>
   * &nbsp;&nbsp;&lt;/somepath&gt;<br>
   * &lt;/sometask&gt;<br>
   * </code> <p>
   *
   * The object implemention <code>sometask</code> must provide a method called
   * <code>createSomepath</code> which returns an instance of <code>Path</code>.
   * Nested path definitions are handled by the Path object and must be labeled
   * <code>pathelement</code>.<p>
   *
   * The path element takes a parameter <code>path</code> which will be parsed and
   * split into single elements. It will usually be used to define a path from an
   * environment variable.
   *
   * @author Thomas.Haas@softwired-inc.com
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   *
   * @ant.data-type name="path"
   */
  public class Path
      implements DataType, FileList
  {
      private final ArrayList m_elements = new ArrayList();
  
      public Path( final String path )
      {
          add( path );
      }
  
      public Path()
      {
      }
  
      /**
       * Adds a String to the ArrayList if it isn't already included.
       */
      private void addUnlessPresent( final ArrayList list, final String entry )
      {
          if( !list.contains( entry ) )
          {
              list.add( entry );
          }
      }
  
      /**
       * Adds an element to the path.
       */
      public void setLocation( final File location )
      {
          addLocation( location );
      }
  
      /**
       * Adds a element definition to the path.
       *
       * @param location the location of the element to add (must not be <code>null</code>
       *      nor empty.
       */
      public void addLocation( final File location )
      {
          final FileList pathElement = new ArrayFileList( location.getAbsolutePath() );
          m_elements.add( pathElement );
      }
  
      /**
       * Adds a nested <code>&lt;fileset&gt;</code> element.
       */
      public void addFileset( final FileSet fileSet )
      {
          m_elements.add( fileSet );
      }
  
      /**
       * Adds a path.
       */
      public void setPath( final String path )
      {
          add( path );
      }
  
      /**
       * Adds a path.
       */
      public void add( final String path )
      {
          final FileList pathElement = new ParsedPathElement( path );
          m_elements.add( pathElement );
      }
  
      /**
       * Adds a path.
       */
      public void add( final String[] path )
      {
          final FileList pathElement = new ArrayFileList( path );
          m_elements.add( pathElement );
      }
  
      /**
       * Adds a path.
       */
      public void add( final FileList list )
      {
          m_elements.add( list );
      }
  
      /**
       * Returns all path elements defined by this and nested path objects.
       * The paths returned by this method are absolute.
       */
      public String[] listFiles( final TaskContext context )
          throws TaskException
      {
          ArrayList result = new ArrayList( 2 * m_elements.size() );
          for( int i = 0; i < m_elements.size(); i++ )
          {
              Object o = m_elements.get( i );
              if( o instanceof FileList )
              {
                  final FileList element = (FileList)o;
                  final String[] parts = element.listFiles( context );
                  for( int j = 0; j < parts.length; j++ )
                  {
                      addUnlessPresent( result, parts[ j ] );
                  }
              }
              else if( o instanceof FileSet )
              {
                  final FileSet fs = (FileSet)o;
                  final DirectoryScanner ds = ScannerUtil.getDirectoryScanner( fs );
                  final String[] s = ds.getIncludedFiles();
                  final File dir = fs.getDir();
                  for( int j = 0; j < s.length; j++ )
                  {
                      File f = new File( dir, s[ j ] );
                      String absolutePath = f.getAbsolutePath();
                      addUnlessPresent( result, FileUtils.translateFile( absolutePath ) );
                  }
              }
          }
          return (String[])result.toArray( new String[ result.size() ] );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/file/StringToPathConverter.java
  
  Index: StringToPathConverter.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.file;
  
  import org.apache.aut.converter.AbstractConverter;
  import org.apache.aut.converter.ConverterException;
  import org.apache.myrmidon.framework.file.Path;
  
  /**
   * A converter from String to Path.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   *
   * @ant.converter source="java.lang.String" destination="org.apache.myrmidon.framework.file.Path"
   */
  public class StringToPathConverter
      extends AbstractConverter
  {
      /**
       * Constructors a converter.
       */
      public StringToPathConverter()
      {
          super( String.class, Path.class );
      }
  
      /**
       * Converts from String to Path
       *
       * @param original the original Object
       * @param context the context in which to convert
       * @return the converted object
       */
      protected Object convert( final Object original, final Object context )
          throws ConverterException
      {
          String path = (String)original;
          Path retval = new Path( path );
          return retval;
      }
  }
  
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/filters/LineFilter.java
  
  Index: LineFilter.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.filters;
  
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * Filters lines of text.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   *
   * @ant:role shorthand="line-filter"
   */
  public interface LineFilter
  {
      /**
       * Filters a line of text.
       *
       * @param line the text to filter.
       * @param context the context to use when filtering.
       */
      void filterLine( StringBuffer line, TaskContext context )
          throws TaskException;
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/filters/LineFilterSet.java
  
  Index: LineFilterSet.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.filters;
  
  import java.util.ArrayList;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * A collection of line filters.
   *
   * @ant.data-type name="filterset"
   * @ant.type type="line-filter" name="filterset"
   */
  public class LineFilterSet
      implements LineFilter
  {
      private ArrayList m_filterSets = new ArrayList();
  
      public void add( final LineFilter filter )
      {
          m_filterSets.add( filter );
      }
  
      /**
       * Filters a line of text.
       *
       * @param line the text to filter.
       * @param context the context to use when filtering.
       */
      public void filterLine( final StringBuffer line, final TaskContext context )
          throws TaskException
      {
          final int count = m_filterSets.size();
          for( int i = 0; i < count; i++ )
          {
              final LineFilter filter = (LineFilter)m_filterSets.get( i );
              filter.filterLine( line, context );
          }
      }
  }
  
  
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/filters/TokenLineFilter.java
  
  Index: TokenLineFilter.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.filters;
  
  import java.util.ArrayList;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * A line filter that replaces tokens.  May have begintoken and endtokens defined.
   *
   * @author <A href="mailto:gholam@xtra.co.nz"> Michael McCallum </A>
   *
   * @ant.type type="line-filter" name="token-filter"
   */
  public class TokenLineFilter
      implements LineFilter
  {
      /**
       * The default token start string
       */
      private static final char[] DEFAULT_TOKEN_START = {'@'};
  
      /**
       * The default token end string
       */
      private static final char[] DEFAULT_TOKEN_END = {'@'};
  
      /**
       * List of ordered filters and filter files.
       */
      private ArrayList m_tokenSets = new ArrayList();
  
      /**
       * Adds a TokenSet to this filter.
       */
      public void add( final TokenSet tokens )
      {
          m_tokenSets.add( tokens );
      }
  
      /**
       * Filters a line of text.
       *
       * @param line the text to filter.
       * @param context the context to use when filtering.
       */
      public void filterLine( final StringBuffer line, final TaskContext context )
          throws TaskException
      {
          int index = 0;
          while( index < line.length() )
          {
              // Find the start of the next token
              final int startToken = indexOf( line, DEFAULT_TOKEN_START, index );
              if( startToken == -1 )
              {
                  break;
              }
              final int startTokenName = startToken + DEFAULT_TOKEN_START.length;
  
              // Find the end of the next token
              int endTokenName = indexOf( line, DEFAULT_TOKEN_END, startTokenName );
              if( endTokenName == -1 )
              {
                  break;
              }
              int endToken = endTokenName + DEFAULT_TOKEN_END.length;
              if( endTokenName == startTokenName )
              {
                  // Empty token name - skip
                  index = endToken;
                  continue;
              }
  
              // Extract token name figure out the value
              final String token = line.substring( startTokenName, endTokenName );
              final String value = getTokenValue( token, context );
              if( value == null )
              {
                  // Unknown token - skip
                  index = endToken;
                  continue;
              }
  
              // Replace token with its value
              line.delete( startToken, endToken );
              line.insert( startToken, value );
  
              index = startToken + value.length();
          }
      }
  
      /**
       * Returns the value of a token.
       */
      private String getTokenValue( final String token, final TaskContext context )
          throws TaskException
      {
          String value = null;
          final int count = m_tokenSets.size();
          for( int i = 0; value == null && i < count; i++ )
          {
              final TokenSet tokenSet = (TokenSet)m_tokenSets.get( i );
              value = tokenSet.getValue( token, context );
          }
          return value;
      }
  
      /**
       * Returns the location of a string in a stringbuffer.
       */
      private int indexOf( final StringBuffer buffer,
                           final char[] str,
                           final int index )
      {
          final int maxIndex = buffer.length() - str.length + 1;
          outer: for( int i = index; i < maxIndex; i++ )
          {
              for( int j = 0; j < str.length; j++ )
              {
                  if( buffer.charAt( i + j ) != str[ j ] )
                  {
                      continue outer;
                  }
              }
              return i;
          }
          return -1;
      }
  }
  
  
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/filters/TokenSet.java
  
  Index: TokenSet.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.filters;
  
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  
  /**
   * A set of tokens.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   *
   * @ant:role shorthand="token-set"
   */
  public interface TokenSet
  {
      /**
       * Evaluates the value for a token.
       *
       * @param token the token to evaluate.
       * @param context the context to use to evaluate the token.
       * @return the value for the token, or null if the token is unknown.
       */
      String getValue( String token, TaskContext context )
          throws TaskException;
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/java/ExecuteJava.java
  
  Index: ExecuteJava.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.java;
  
  import java.io.File;
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  import org.apache.aut.nativelib.Os;
  import org.apache.aut.nativelib.PathUtil;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.framework.nativelib.Execute;
  import org.apache.myrmidon.framework.file.Path;
  import org.apache.myrmidon.framework.file.FileListUtil;
  import org.apache.myrmidon.framework.nativelib.EnvironmentData;
  import org.apache.tools.todo.types.SysProperties;
  import org.apache.myrmidon.framework.nativelib.ArgumentList;
  import org.apache.tools.todo.util.FileUtils;
  
  /**
   * A utility class that takes care of executing a Java application.  This
   * class can execute Java apps in the current JVM, or a forked JVM.
   *
   * <p>To execute a Java application, create an instance of this class,
   * configure it, and call one of the following methods:
   * <ul>
   * <li>{@link #execute}
   * <li>{@link #executeForked}
   * <li>{@link #executeNonForked}
   * </ul>
   *
   * @author thomas.haas@softwired-inc.com
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   */
  public class ExecuteJava
  {
      private static final Resources REZ
          = ResourceManager.getPackageResources( ExecuteJava.class );
  
      private final Path m_classPath = new Path();
      private final EnvironmentData m_sysProperties = new EnvironmentData();
      private final ArgumentList m_args = new ArgumentList();
      private final ArgumentList m_vmArgs = new ArgumentList();
      private boolean m_fork;
      private File m_workingDirectory;
      private File m_jar;
      private String m_jvm;
      private String m_className;
      private String m_maxMemory;
      private boolean m_ignoreReturnCode;
  
      /**
       * Sets the main class of the application.
       */
      public void setClassName( final String className )
      {
          m_className = className;
      }
  
      /**
       * Sets the executable jar file to use to execute the application.
       * Can only be used in forked mode.
       */
      public void setJar( final File jar )
      {
          m_jar = jar;
      }
  
      /**
       * Enables forked mode.
       */
      public void setFork( final boolean fork )
      {
          m_fork = fork;
      }
  
      /**
       * Sets the max memory allocation pool size to use when running the
       * application.  Only used in forked mode.
       *
       * @param maxMemory the maximum memory pool size, or null for the default.
       */
      public void setMaxMemory( final String maxMemory )
      {
          m_maxMemory = maxMemory;
      }
  
      /**
       * Sets the working directory for the application.  Only used in forked mode.
       */
      public void setWorkingDirectory( final File workingDirectory )
      {
          m_workingDirectory = workingDirectory;
      }
  
      /**
       * Disables checking of the application's return code.  Only used in forked
       * mode.
       *
       * @param ignore If true, the return code of the application is ignored.
       *               If false, an exception is thrown if the application does
       *               no exit with a 0 return code.
       */
      public void setIgnoreReturnCode( boolean ignore )
      {
          m_ignoreReturnCode = ignore;
      }
  
      /**
       * Sets the JVM executable to use to run the application in a forked JVM.
       *
       * @param jvm the path to the JVM executable, or null to use the default
       *            JVM executable.
       */
      public void setJvm( final String jvm )
      {
          m_jvm = jvm;
      }
  
      /**
       * Returns the classpath that will be used to execute the application.
       *
       * @return the application's classpath.  This path can be modified.
       */
      public Path getClassPath()
      {
          return m_classPath;
      }
  
      /**
       * Returns the system properties that will be used for the application.
       * Only used in forked mode.
       *
       * @return the application's system properties.  Can be modified.
       */
      public EnvironmentData getSysProperties()
      {
          return m_sysProperties;
      }
  
      /**
       * Returns the arguments that will be used for the application.
       *
       * @return the application's arguments.  Can be modified.
       */
      public ArgumentList getArguments()
      {
          return m_args;
      }
  
      /**
       * Returns the JVM arguments that will be used to execute the application.
       * Only used in forked mode.
       *
       * @return the JVM aguments.  Can be modified.
       */
      public ArgumentList getVmArguments()
      {
          return m_vmArgs;
      }
  
      /**
       * Executes the application.
       */
      public void execute( final TaskContext context )
          throws TaskException
      {
          if( m_fork )
          {
              executeForked( context );
          }
          else
          {
              executeNonForked( context );
          }
      }
  
      /**
       * Executes the application in this JVM.
       */
      public void executeNonForked( final TaskContext context )
          throws TaskException
      {
          if( m_className == null )
          {
              final String message = REZ.getString( "executejava.no-classname.error" );
              throw new TaskException( message );
          }
          if( m_jar != null )
          {
              final String message = REZ.getString( "executejava.jar-no-fork.error" );
              throw new TaskException( message );
          }
          if( m_vmArgs.getArguments().length > 0 )
          {
              final String message = REZ.getString( "executejava.ignore-jvm-args.notice" );
              context.warn( message );
          }
          if( m_workingDirectory != null )
          {
              final String message = REZ.getString( "executejava.ignore-dir.notice" );
              context.warn( message );
          }
          if( m_maxMemory != null )
          {
              final String message = REZ.getString( "executejava.ignore-maxmem.notice" );
              context.warn( message );
          }
          if( m_sysProperties.size() > 0 )
          {
              final String message = REZ.getString( "executejava.ignore-sys-props.notice" );
              context.warn( message );
          }
  
          final String[] args = m_args.getArguments();
  
          // Log message
          if( context.isVerboseEnabled() )
          {
              final String debugMessage
                  = REZ.getString( "executejava.exec-in-jvm.notice",
                                   m_className,
                                   FileUtils.formatCommandLine( args ) );
              context.verbose( debugMessage );
          }
  
          // Locate the class
          Class target;
          try
          {
              final ClassLoader classLoader = FileListUtil.createClassLoader( m_classPath, context );
              target = classLoader.loadClass( m_className );
          }
          catch( final Exception e )
          {
              final String message = REZ.getString( "executejava.find-class.error", m_className );
              throw new TaskException( message, e );
          }
  
          // Call the main method
          try
          {
              final Class[] params = { args.getClass() };
              final Method main = target.getMethod( "main", params );
              main.invoke( null, new Object[] { args } );
          }
          catch( final InvocationTargetException e )
          {
              final Throwable t = e.getTargetException();
              final String message = REZ.getString( "executejava.execute-app.error", m_className );
              throw new TaskException( message, t );
          }
          catch( final Exception e )
          {
              final String message = REZ.getString( "executejava.execute-app.error", m_className );
              throw new TaskException( message, e );
          }
      }
  
      /**
       * Executes the application in a separate JVM.
       */
      public int executeForked( final TaskContext context )
          throws TaskException
      {
          // Validate
          if( m_className != null && m_jar != null )
          {
              final String message = REZ.getString( "executejava.class-and-jar.error" );
              throw new TaskException( message );
          }
          if( m_className == null && m_jar == null )
          {
              final String message = REZ.getString( "executejava.no-classname.error" );
              throw new TaskException( message );
          }
  
          final Execute exe = new Execute();
          exe.setWorkingDirectory( m_workingDirectory );
          exe.setIgnoreReturnCode( m_ignoreReturnCode );
  
          // Setup the command line
  
          // Executable name
          if( m_jvm != null )
          {
              exe.setExecutable( m_jvm );
          }
          else
          {
              exe.setExecutable( getJavaExecutableName() );
          }
  
          // JVM arguments
          exe.addArguments( m_vmArgs );
  
          // Max memory size
          if( m_maxMemory != null )
          {
              exe.addArgument( "-Xmx" + m_maxMemory );
          }
  
          // System properties
          final String[] props = SysProperties.getJavaVariables( m_sysProperties );
          exe.addArguments( props );
  
          // Classpath
          final String[] classpath = m_classPath.listFiles( context );
          if( classpath.length > 0 )
          {
              exe.addArgument( "-classpath" );
              exe.addArgument( PathUtil.formatPath( classpath ) );
          }
  
          // What to execute
          if( m_jar != null )
          {
              exe.addArgument( "-jar" );
              exe.addArgument( m_jar );
          }
          else
          {
              exe.addArgument( m_className );
          }
  
          // Java app arguments
          exe.addArguments( m_args );
  
          // Execute
          return exe.execute( context );
      }
  
      /**
       * Determines the executable name for the java command for this JVM.
       *
       * @todo Move this to somewhere in AUT.
       */
      public static String getJavaExecutableName()
      {
          if( Os.isFamily( Os.OS_FAMILY_NETWARE ) )
          {
              // NetWare may have a "java" in the JRE directory, but 99% of
              // the time, you don't want to execute it -- Jeff Tulley
              // <JTULLEY@novell.com>
              return "java";
          }
  
          // Figure out the basename
          final String baseName;
          if( Os.isFamily( Os.OS_FAMILY_WINDOWS) || Os.isFamily( Os.OS_FAMILY_DOS ) )
          {
              baseName = "java.exe";
          }
          else
          {
              baseName = "java";
          }
  
          // Look for java in the ${java.home{/../bin directory.  Unfortunately
          // on Windows java.home doesn't always refer to the correct location,
          // so we need to fall back to assuming java is somewhere on the
          // PATH.
          File javaExe =
              new File( System.getProperty( "java.home" ) + "/../bin/" + baseName );
  
          if( javaExe.exists() )
          {
              return javaExe.getAbsolutePath();
          }
          else
          {
              return "java";
          }
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/java/JavaRuntimeClassPath.java
  
  Index: JavaRuntimeClassPath.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.java;
  
  import org.apache.myrmidon.framework.file.FileList;
  import org.apache.myrmidon.framework.file.Path;
  import org.apache.myrmidon.framework.FileSet;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.aut.nativelib.Os;
  import java.util.Locale;
  import java.io.File;
  
  /**
   * A FileList that evaluates to the runtime class-path for this JVM.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:14 $
   *
   * @ant.type type="path" name="java-runtime"
   */
  public class JavaRuntimeClassPath
      implements FileList
  {
      /**
       * Returns the files in this list.
       *
       * @param context the context to use to evaluate the list.
       * @return The names of the files in this list.  All names are absolute paths.
       */
      public String[] listFiles( final TaskContext context )
          throws TaskException
      {
          final Path path = new Path();
  
          if( System.getProperty( "java.vendor" ).toLowerCase( Locale.US ).indexOf( "microsoft" ) >= 0 )
          {
              // Pull in *.zip from packages directory
              FileSet msZipFiles = new FileSet();
              msZipFiles.setDir( new File( System.getProperty( "java.home" ) + File.separator + "Packages" ) );
              msZipFiles.setIncludes( "*.ZIP" );
              path.addFileset( msZipFiles );
          }
          else if( "Kaffe".equals( System.getProperty( "java.vm.name" ) ) )
          {
              FileSet kaffeJarFiles = new FileSet();
              kaffeJarFiles.setDir( new File( System.getProperty( "java.home" )
                                              + File.separator + "share"
                                              + File.separator + "kaffe" ) );
  
              kaffeJarFiles.setIncludes( "*.jar" );
              path.addFileset( kaffeJarFiles );
          }
          else if( Os.isFamily( Os.OS_FAMILY_OSX ) )
          {
              // MacOS X
              final String classDir = System.getProperty( "java.home" ) +
                  File.separator + ".." + File.separator + "Classes";
              final File classes = new File( classDir, "classes.jar" );
              path.addLocation( classes );
              final File ui = new File( classDir, "ui.jar" );
              path.addLocation( ui );
          }
          else
          {
              // JDK > 1.1 sets java.home to the JRE directory.
              final String rt = System.getProperty( "java.home" ) +
                  File.separator + "lib" + File.separator + "rt.jar";
              final File rtJar = new File( rt );
              path.addLocation( rtJar );
          }
  
          return path.listFiles( context );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/java/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  executejava.exec-in-jvm.notice=Running in same VM: {0} {1}.
  executejava.ignore-jvm-args.notice=JVM args are ignored when using non-forked mode.
  executejava.ignore-dir.notice=Working directory is ignored when using non-forked mode.
  executejava.ignore-maxmem.notice=Maximum memory pool size is ignored when using non-forked mode.
  executejava.ignore-sys-props.notice=System properties are ignored when using non-forked mode.
  executejava.no-classname.error=No class-name specified.
  executejava.jar-no-fork.error=Cannot execute a jar in non-forked mode.
  executejava.find-class.error=Could not find main class "{0}".
  executejava.execute-app.error=Could not execute class "{0}".
  executejava.class-and-jar.error=Cannot specify both a Jar file and a main class.
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/nativelib/Argument.java
  
  Index: Argument.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.nativelib;
  
  import java.io.File;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.framework.file.Path;
  import org.apache.tools.todo.util.FileUtils;
  
  /**
   * Used for nested xml command line definitions.
   */
  public class Argument
  {
      private String[] m_parts;
  
      public Argument()
      {
      }
  
      public Argument( final String value )
      {
          setValue( value );
      }
  
      public Argument( final File file )
      {
          setFile( file );
      }
  
      /**
       * Sets a single commandline argument to the absolute filename of the
       * given file.
       *
       * @param value a single commandline argument.
       */
      public void setFile( final File value )
      {
          m_parts = new String[]{value.getAbsolutePath()};
      }
  
      /**
       * Line to split into several commandline arguments.
       *
       * @param line line to split into several commandline arguments
       */
      public void setLine( final String line )
          throws TaskException
      {
          m_parts = FileUtils.translateCommandline( line );
      }
  
      /**
       * Sets a single commandline argument and treats it like a PATH -
       * ensures the right separator for the local platform is used.
       *
       * @param value a single commandline argument.
       */
      public void setPath( final Path value ) throws TaskException
      {
          throw new TaskException( "Using a path not implemented." );
          //m_parts = new String[]{ PathUtil.formatPath( value ) };
      }
  
      /**
       * Sets a single commandline argument.
       *
       * @param value a single commandline argument.
       */
      public void setValue( final String value )
      {
          m_parts = new String[]{value};
      }
  
      /**
       * Returns the parts this Argument consists of.
       *
       * @return The Parts value
       */
      public String[] getParts()
      {
          return m_parts;
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/nativelib/ArgumentList.java
  
  Index: ArgumentList.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.nativelib;
  
  import java.util.ArrayList;
  import java.io.File;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.tools.todo.util.FileUtils;
  
  /**
   * A utility class to use to assemble a list of command-line arguments.
   *
   * @author thomas.haas@softwired-inc.com
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:15 $
   */
  public class ArgumentList
  {
      protected final ArrayList m_arguments = new ArrayList();
  
      /**
       * Returns all arguments defined by <code>addLine</code>, <code>addValue</code>
       * or the argument object.
       *
       * @return The Arguments value
       */
      public String[] getArguments()
      {
          final int size = m_arguments.size();
          final ArrayList result = new ArrayList( size * 2 );
          for( int i = 0; i < size; i++ )
          {
              final Argument arg = (Argument)m_arguments.get( i );
              final String[] s = arg.getParts();
              for( int j = 0; j < s.length; j++ )
              {
                  result.add( s[ j ] );
              }
          }
  
          final String[] res = new String[ result.size() ];
          return (String[])result.toArray( res );
      }
  
      /**
       * Sets the arguments, replacing the current value of this list.
       */
      public void setArguments( final ArgumentList list )
      {
          m_arguments.clear();
          addArguments( list );
      }
  
      public void addArguments( final String[] args )
      {
          for( int i = 0; i < args.length; i++ )
          {
              addArgument( args[ i ] );
          }
      }
  
      public void addArguments( final ArgumentList args )
      {
          addArguments( args.getArguments() );
      }
  
      public void addArgument( final File argument )
      {
          addArgument( new Argument( argument ) );
      }
  
      public void addArgument( final String argument )
      {
          addArgument( new Argument( argument ) );
      }
  
      public void addArgument( final Argument argument )
      {
          m_arguments.add( argument );
      }
  
      public void addLine( final String line )
          throws TaskException
      {
          final String[] parts = FileUtils.translateCommandline( line );
          addArguments( parts );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/nativelib/Commandline.java
  
  Index: Commandline.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.nativelib;
  
  
  
  /**
   * Commandline objects help handling command lines specifying processes to
   * execute. The class can be used to define a command line as nested elements or
   * as a helper to define a command line by an application. <p>
   *
   * <code>
   * &lt;someelement&gt;<br>
   * &nbsp;&nbsp;&lt;acommandline executable="/executable/to/run"&gt;<br>
   * &nbsp;&nbsp;&nbsp;&nbsp;&lt;argument value="argument 1" /&gt;<br>
   * &nbsp;&nbsp;&nbsp;&nbsp;&lt;argument line="argument_1 argument_2 argument_3"
   * /&gt;<br>
   * &nbsp;&nbsp;&nbsp;&nbsp;&lt;argument value="argument 4" /&gt;<br>
   * &nbsp;&nbsp;&lt;/acommandline&gt;<br>
   * &lt;/someelement&gt;<br>
   * </code> The element <code>someelement</code> must provide a method <code>createAcommandline</code>
   * which returns an instance of this class.
   *
   * @author thomas.haas@softwired-inc.com
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   */
  public class Commandline
      extends ArgumentList
  {
      private String m_executable;
  
      /**
       * Sets the executable to run.
       */
      public void setExecutable( final String executable )
      {
          m_executable = executable;
      }
  
      /**
       * Returns the executable to run.
       */
      public String getExecutable()
      {
          return m_executable;
      }
  
      /**
       * Sets the commandline, replacing its current value.
       */
      public void setCommandline( final Commandline command )
      {
          m_executable = command.getExecutable();
          setArguments( command );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/nativelib/EnvironmentData.java
  
  Index: EnvironmentData.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.nativelib;
  
  import java.util.ArrayList;
  import java.util.Properties;
  
  /**
   * Wrapper for environment variables.
   *
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   */
  public class EnvironmentData
  {
      protected final ArrayList m_variables = new ArrayList();
  
      public Properties getVariables()
      {
          final Properties environment = new Properties();
          final int size = m_variables.size();
          for( int i = 0; i < size; i++ )
          {
              final EnvironmentVariable variable = (EnvironmentVariable)m_variables.get( i );
              environment.setProperty( variable.getKey(), variable.getValue() );
          }
          return environment;
      }
  
      public void addVariable( EnvironmentVariable var )
      {
          m_variables.add( var );
      }
  
      public void addVariable( String key, String value )
      {
          final EnvironmentVariable var = new EnvironmentVariable();
          var.setKey( key );
          var.setValue( value );
          addVariable( var );
      }
  
      public void addVariables( EnvironmentData properties )
      {
          m_variables.addAll( properties.m_variables );
      }
  
      public int size()
      {
          return m_variables.size();
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/nativelib/EnvironmentVariable.java
  
  Index: EnvironmentVariable.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.nativelib;
  
  import java.io.File;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.framework.file.Path;
  
  public class EnvironmentVariable
  {
      private String m_key;
      private String m_value;
  
      public void setFile( final File file )
      {
          m_value = file.getAbsolutePath();
      }
  
      public void setKey( final String key )
      {
          m_key = key;
      }
  
      public void setPath( final Path path ) throws TaskException
      {
          throw new TaskException( "Using a path not implemented." );
          //m_value = PathUtil.formatPath( path );
      }
  
      public void setValue( final String value )
      {
          m_value = value;
      }
  
      public String getKey()
      {
          return m_key;
      }
  
      public String getValue()
      {
          return m_value;
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/nativelib/Execute.java
  
  Index: Execute.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.nativelib;
  
  import java.io.File;
  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.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.tools.todo.util.FileUtils;
  
  /**
   * This is a utility class designed to make executing native processes easier
   * in the context of ant.
   *
   * <p>To execute a native process, configure an instance of this class,
   * and then call its {@link #execute} method.
   *
   * @author <a href="mailto:peter@apache.org">Peter Donald</a>
   * @author <a href="mailto:thomas.haas@softwired-inc.com">Thomas Haas</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:15 $
   */
  public class Execute
      extends Commandline
  {
      private static final Resources REZ
          = ResourceManager.getPackageResources( Execute.class );
  
      private Properties m_environment = new Properties();
      private File m_workingDirectory;
      private boolean m_newEnvironment;
      private ExecOutputHandler m_handler;
      private long m_timeout;
      private int m_returnCode;
      private boolean m_ignoreReturnCode;
  
      /**
       * Sets the timeout, in milliseconds, for the process.  The process is
       * forcibly shutdown after this time.  Use 0 to allow the process to
       * run forever.  Default is 0.
       *
       * @param timeout the timeout, in milliseconds.
       */
      public void setTimeout( final long timeout )
      {
          m_timeout = timeout;
      }
  
      /**
       * Sets the handler for the process' output and error streams.  If not
       * provided, the process' output and error are written to the log using
       * the TaskContext's logging methods.
       *
       * @param handler the handler.
       */
      public void setExecOutputHandler( final ExecOutputHandler handler )
      {
          m_handler = handler;
      }
  
      /**
       * Sets the environment to use for the process.
       *
       * @param environment a map from environment variable name to value.
       */
      public void setEnvironment( final Properties environment )
      {
          if( null == environment )
          {
              throw new NullPointerException( "environment" );
          }
          m_environment = environment;
      }
  
      /**
       * If this variable is false then then the environment specified is
       * added to the environment variables for current process. If this
       * value is true then the specified environment replaces the environment
       * for the command.  Default is false.
       */
      public void setNewenvironment( final boolean newEnvironment )
      {
          m_newEnvironment = newEnvironment;
      }
  
      /**
       * Sets the working directory of the process to execute.  Default is the
       * project's base directory.
       *
       * @param workingDirectory the working directory of the process.  Use
       *        null for the project's base directory.
       */
      public void setWorkingDirectory( final File workingDirectory )
      {
          m_workingDirectory = workingDirectory;
      }
  
      /**
       * Sets the expected return code of the process.  If the process does not
       * exit with this return code, and exception is thrown by {@link #execute}.
       * Default is 0.
       *
       * @param returnCode the expected return code.
       */
      public void setReturnCode( final int returnCode )
      {
          m_returnCode = returnCode;
      }
  
      /**
       * If set to true, the return code of the process is ignore.  If false,
       * it is compared against the expected return code.  Default is false.
       */
      public void setIgnoreReturnCode( final boolean ignore )
      {
          m_ignoreReturnCode = ignore;
      }
  
      /**
       * Runs a process defined by the command line and returns its exit status.
       *
       * @return the exit status of the subprocess.
       */
      public int execute( final TaskContext context )
          throws TaskException
      {
          validate();
  
          try
          {
              // Build an output handler
              final ExecOutputHandler handler = buildOutputHandler( context );
  
              // Build the command meta-info
              final ExecManager execManager = (ExecManager)context.getService( ExecManager.class );
              final ExecMetaData metaData = buildExecMetaData( context, execManager );
  
              logExecDetails( metaData, context );
  
              // Execute the process and check return code
              final int returnCode = execManager.execute( metaData, handler, m_timeout );
              checkReturnCode( returnCode );
              return returnCode;
          }
          catch( final Exception e )
          {
              final String message = REZ.getString( "execute.failed.error", getExecutable() );
              throw new TaskException( message, e );
          }
      }
  
      /**
       * Logs the details of the command.
       */
      private void logExecDetails( final ExecMetaData metaData,
                                   final TaskContext context )
          throws TaskException
      {
          if( context.isVerboseEnabled() )
          {
              final String cmdline = FileUtils.formatCommandLine( metaData.getCommand() );
              final String message = REZ.getString( "execute.command.notice", cmdline );
              context.verbose( message );
          }
          if( context.isDebugEnabled() )
          {
              final String message = REZ.getString( "execute.env-vars.notice", metaData.getEnvironment() );
              context.debug( message );
          }
      }
  
      /**
       * Vaidates the arguments.
       */
      private void validate() throws TaskException
      {
          if( null == getExecutable() )
          {
              final String message = REZ.getString( "execute.no-executable.error" );
              throw new TaskException( message );
          }
          if( m_workingDirectory != null )
          {
              if( !m_workingDirectory.exists() )
              {
                  final String message = REZ.getString( "execute.dir-noexist.error", m_workingDirectory );
                  throw new TaskException( message );
              }
              else if( !m_workingDirectory.isDirectory() )
              {
                  final String message = REZ.getString( "execute.dir-notdir.error", m_workingDirectory );
                  throw new TaskException( message );
              }
          }
      }
  
      /**
       * Creates an output handler to use for the process' stdout and stderr.
       */
      private ExecOutputHandler buildOutputHandler( final TaskContext context )
      {
          ExecOutputHandler handler = m_handler;
          if( handler == null )
          {
              handler = new LoggingExecOutputHandler( context );
          }
          return handler;
      }
  
      /**
       * Utility method to verify that specified return code was the
       * return code expected (if any).
       */
      private void checkReturnCode( final int returnCode )
          throws TaskException
      {
          if( ! m_ignoreReturnCode && returnCode != m_returnCode )
          {
              final String message = REZ.getString( "execute.bad-resultcode.error",
                                                    getExecutable(),
                                                    new Integer(returnCode) );
              throw new TaskException( message );
          }
      }
  
      /**
       * Utility method to create an ExecMetaData object
       * to pass to the ExecManager service.
       */
      private ExecMetaData buildExecMetaData( final TaskContext context,
                                              final ExecManager execManager )
          throws ExecException
      {
          // Build the command line
          final String[] command = getCommandLine();
  
          // Build the environment
          final Properties newEnvironment = new Properties();
          if( !m_newEnvironment )
          {
              newEnvironment.putAll( execManager.getNativeEnvironment() );
          }
          newEnvironment.putAll( m_environment );
  
          // Determine the working directory
          File workingDir = m_workingDirectory;
          if( workingDir == null )
          {
              workingDir = context.getBaseDirectory();
          }
  
          return new ExecMetaData( command,
                                   newEnvironment,
                                   workingDir );
      }
  
      /**
       * Builds the command line.
       */
      private String[] getCommandLine()
      {
          final String[] args = getArguments();
          final String[] result = new String[ args.length + 1 ];
          result[ 0 ] = getExecutable().replace( '/', File.separatorChar ).replace( '\\', File.separatorChar );
          System.arraycopy( args, 0, result, 1, args.length );
          return result;
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/nativelib/LoggingExecOutputHandler.java
  
  Index: LoggingExecOutputHandler.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.nativelib;
  
  import org.apache.aut.nativelib.ExecOutputHandler;
  import org.apache.myrmidon.api.TaskContext;
  
  /**
   * An {@link org.apache.aut.nativelib.ExecOutputHandler} adaptor, that writes output to the logging
   * methods of a {@link org.apache.myrmidon.api.TaskContext}.
   *
   * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a>
   * @version $Revision: 1.1 $ $Date: 2002/04/14 09:30:15 $
   */
  public class LoggingExecOutputHandler
      implements ExecOutputHandler
  {
      private final TaskContext m_context;
  
      public LoggingExecOutputHandler( final TaskContext context )
      {
          m_context = context;
      }
  
      /**
       * Receive notification about the process writing
       * to standard output.
       */
      public void stdout( final String line )
      {
          m_context.info( line );
      }
  
      /**
       * Receive notification about the process writing
       * to standard error.
       */
      public void stderr( final String line )
      {
          m_context.error( line );
      }
  }
  
  
  
  1.1                  jakarta-ant-myrmidon/framework/src/java/org/apache/myrmidon/framework/nativelib/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  execute.no-executable.error=No executable specified.
  execute.dir-noexist.error=The specified working directory "{0}" does not exist.
  execute.dir-notdir.error=The specified working directory "{0}" is not a directory.
  execute.failed.error=Command "{0}" failed.
  execute.bad-resultcode.error=Command "{0}" returned unexpected exit code {1}.
  execute.command.notice=Executing: {0}
  execute.env-vars.notice=Using environment: {0}.
  
  
  

--
To unsubscribe, e-mail:   <mailto:ant-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:ant-dev-help@jakarta.apache.org>


Mime
View raw message