You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by ad...@apache.org on 2002/03/03 03:19:11 UTC

cvs commit: jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core Available.java ConditionTask.java OsCondition.java Fail.java IfTask.java

adammurdoch    02/03/02 18:19:11

  Modified:    proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs
                        UpToDate.java WaitFor.java
               proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/condition
                        Equals.java Http.java Socket.java
               proposal/myrmidon/src/java/org/apache/myrmidon/components/builder
                        DefaultProjectBuilder.java Resources.properties
               proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace
                        DefaultWorkspace.java
               proposal/myrmidon/src/java/org/apache/myrmidon/framework
                        Condition.java Pattern.java Resources.properties
               proposal/myrmidon/src/java/org/apache/antlib/core Fail.java
                        IfTask.java
  Added:       proposal/myrmidon/src/java/org/apache/myrmidon/framework/conditions
                        AndCondition.java IsSetCondition.java
                        NotCondition.java OrCondition.java
                        Resources.properties
               proposal/myrmidon/src/java/org/apache/antlib/core
                        Available.java ConditionTask.java OsCondition.java
  Removed:     proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs
                        Available.java ConditionTask.java
               proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/condition
                        And.java Condition.java ConditionBase.java
                        IsSet.java Not.java Or.java OsCondition.java
  Log:
  Restructured the conditional tasks:
  
  * Made framework.Condition an interface.
  
  * Converted old framework.Condition into <is-set> condition.
  
  * Ported all Ant 1 conditions to the new Condition interface, and removed
    the old Condition and ConditionBase classes.
  
  * Moved <and>, <or>, <not> conditions to framework.conditions.
  
  * Moved <condition> task and <os> condition to antlib.
  
  * Moved <available> to antlib.  This is no longer a task, just a condition.
    Removed all file checking, which will be done by other condition
    implementations.
  
  * Removed conditions from <fail>, as it can be wrapped in an <if> instead.
  
  * A target can now take both an "if" and an "unless" condition.
  
  Revision  Changes    Path
  1.22      +1 -2      jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/UpToDate.java
  
  Index: UpToDate.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/UpToDate.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- UpToDate.java	6 Feb 2002 13:38:21 -0000	1.21
  +++ UpToDate.java	3 Mar 2002 02:19:10 -0000	1.22
  @@ -11,7 +11,6 @@
   import java.util.ArrayList;
   import java.util.Iterator;
   import org.apache.myrmidon.api.TaskException;
  -import org.apache.tools.ant.taskdefs.condition.Condition;
   import org.apache.tools.ant.types.DirectoryScanner;
   import org.apache.tools.ant.types.FileSet;
   import org.apache.tools.ant.types.ScannerUtil;
  @@ -31,7 +30,7 @@
    * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
    */
   
  -public class UpToDate extends MatchingTask implements Condition
  +public class UpToDate extends MatchingTask
   {
       private ArrayList sourceFileSets = new ArrayList();
   
  
  
  
  1.7       +15 -14    jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/WaitFor.java
  
  Index: WaitFor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/WaitFor.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- WaitFor.java	6 Feb 2002 13:38:21 -0000	1.6
  +++ WaitFor.java	3 Mar 2002 02:19:10 -0000	1.7
  @@ -9,8 +9,9 @@
   
   import java.util.Hashtable;
   import org.apache.myrmidon.api.TaskException;
  -import org.apache.tools.ant.taskdefs.condition.Condition;
  -import org.apache.tools.ant.taskdefs.condition.ConditionBase;
  +import org.apache.myrmidon.api.AbstractTask;
  +import org.apache.myrmidon.framework.conditions.AndCondition;
  +import org.apache.myrmidon.framework.Condition;
   import org.apache.tools.ant.types.EnumeratedAttribute;
   
   /**
  @@ -35,13 +36,23 @@
    * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
    */
   
  -public class WaitFor extends ConditionBase
  +public class WaitFor
  +    extends AbstractTask
   {
       private long maxWaitMillis = 1000l * 60l * 3l;// default max wait time
       private long maxWaitMultiplier = 1l;
       private long checkEveryMillis = 500l;
       private long checkEveryMultiplier = 1l;
       private String timeoutProperty;
  +    private AndCondition m_condition = new AndCondition();
  +
  +    /**
  +     * Adds a condition.
  +     */
  +    public void add( final Condition condition )
  +    {
  +        m_condition.add( condition );
  +    }
   
       /**
        * Set the time between each check
  @@ -102,16 +113,6 @@
       public void execute()
           throws TaskException
       {
  -        if( countConditions() > 1 )
  -        {
  -            throw new TaskException( "You must not nest more than one condition into <waitfor>" );
  -        }
  -        if( countConditions() < 1 )
  -        {
  -            throw new TaskException( "You must nest a condition into <waitfor>" );
  -        }
  -        Condition c = (Condition)getConditions().nextElement();
  -
           maxWaitMillis *= maxWaitMultiplier;
           checkEveryMillis *= checkEveryMultiplier;
           long start = System.currentTimeMillis();
  @@ -119,7 +120,7 @@
   
           while( System.currentTimeMillis() < end )
           {
  -            if( c.eval() )
  +            if( m_condition.evaluate( getContext() ) )
               {
                   return;
               }
  
  
  
  1.4       +12 -3     jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/condition/Equals.java
  
  Index: Equals.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/condition/Equals.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- Equals.java	23 Dec 2001 06:34:23 -0000	1.3
  +++ Equals.java	3 Mar 2002 02:19:10 -0000	1.4
  @@ -5,15 +5,18 @@
    * version 1.1, a copy of which has been included with this distribution in
    * the LICENSE.txt file.
    */
  -package org.apache.tools.ant.taskdefs.condition;
   
   import org.apache.myrmidon.api.TaskException;
  +import org.apache.myrmidon.api.TaskContext;
  +import org.apache.myrmidon.framework.Condition;
   
   /**
    * Simple String comparison condition.
    *
    * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
  - * @version $Revision: 1.3 $
  + * @version $Revision: 1.4 $
  + *
  + * @ant:type type="condition" nam="equals"
    */
   public class Equals implements Condition
   {
  @@ -30,7 +33,13 @@
           arg2 = a2;
       }
   
  -    public boolean eval()
  +    /**
  +     * Evaluates this condition.
  +     *
  +     * @param context
  +     *      The context to evaluate the condition in.
  +     */
  +    public boolean evaluate( final TaskContext context )
           throws TaskException
       {
           if( arg1 == null || arg2 == null )
  
  
  
  1.6       +8 -1      jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/condition/Http.java
  
  Index: Http.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/condition/Http.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Http.java	23 Dec 2001 14:22:45 -0000	1.5
  +++ Http.java	3 Mar 2002 02:19:10 -0000	1.6
  @@ -12,6 +12,8 @@
   import java.net.URL;
   import java.net.URLConnection;
   import org.apache.myrmidon.api.TaskException;
  +import org.apache.myrmidon.api.TaskContext;
  +import org.apache.myrmidon.framework.Condition;
   import org.apache.tools.ant.ProjectComponent;
   
   /**
  @@ -19,6 +21,8 @@
    * the URL of the request.
    *
    * @author <a href="mailto:denis@network365.com">Denis Hennessy</a>
  + *
  + * @ant:type type="condition" nam="http"
    */
   public class Http
       extends ProjectComponent
  @@ -31,7 +35,10 @@
           spec = url;
       }
   
  -    public boolean eval()
  +    /**
  +     * Evaluates this condition.
  +     */
  +    public boolean evaluate( final TaskContext context )
           throws TaskException
       {
           if( spec == null )
  
  
  
  1.6       +9 -1      jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/condition/Socket.java
  
  Index: Socket.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/main/org/apache/tools/ant/taskdefs/condition/Socket.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- Socket.java	23 Dec 2001 14:22:45 -0000	1.5
  +++ Socket.java	3 Mar 2002 02:19:10 -0000	1.6
  @@ -9,6 +9,8 @@
   
   import java.io.IOException;
   import org.apache.myrmidon.api.TaskException;
  +import org.apache.myrmidon.api.TaskContext;
  +import org.apache.myrmidon.framework.Condition;
   import org.apache.tools.ant.ProjectComponent;
   
   /**
  @@ -16,6 +18,8 @@
    * are: server - the name of the server. port - the port number of the socket.
    *
    * @author <a href="mailto:denis@network365.com">Denis Hennessy</a>
  + *
  + * @ant:type type="condition" nam="socket"
    */
   public class Socket
       extends ProjectComponent
  @@ -34,7 +38,10 @@
           this.server = server;
       }
   
  -    public boolean eval()
  +    /**
  +     * Evaluates this condition.
  +     */
  +    public boolean evaluate( TaskContext context )
           throws TaskException
       {
           if( server == null )
  @@ -49,6 +56,7 @@
           try
           {
               java.net.Socket socket = new java.net.Socket( server, port );
  +            socket.close();
           }
           catch( IOException e )
           {
  
  
  
  1.35      +16 -14    jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/DefaultProjectBuilder.java
  
  Index: DefaultProjectBuilder.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/DefaultProjectBuilder.java,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- DefaultProjectBuilder.java	1 Mar 2002 10:33:56 -0000	1.34
  +++ DefaultProjectBuilder.java	3 Mar 2002 02:19:10 -0000	1.35
  @@ -23,6 +23,9 @@
   import org.apache.avalon.framework.configuration.SAXConfigurationHandler;
   import org.apache.avalon.framework.logger.AbstractLogEnabled;
   import org.apache.myrmidon.framework.Condition;
  +import org.apache.myrmidon.framework.conditions.AndCondition;
  +import org.apache.myrmidon.framework.conditions.IsSetCondition;
  +import org.apache.myrmidon.framework.conditions.NotCondition;
   import org.apache.myrmidon.interfaces.builder.ProjectBuilder;
   import org.apache.myrmidon.interfaces.model.Project;
   import org.apache.myrmidon.interfaces.model.Target;
  @@ -33,7 +36,7 @@
    * Default implementation to construct project from a build file.
    *
    * @author <a href="mailto:peter@apache.org">Peter Donald</a>
  - * @version $Revision: 1.34 $ $Date: 2002/03/01 10:33:56 $
  + * @version $Revision: 1.35 $ $Date: 2002/03/03 02:19:10 $
    * @ant:type type="project-builder" name="xml"
    * @ant:type type="project-builder" name="ant"
    */
  @@ -381,7 +384,7 @@
           }
   
           final String[] dependencies = buildDependsList( depends, target );
  -        final Condition condition = buildCondition( ifCondition, unlessCondition, target );
  +        final Condition condition = buildCondition( ifCondition, unlessCondition );
           final Target defaultTarget =
               new Target( condition, target.getChildren(), dependencies );
   
  @@ -442,17 +445,13 @@
           return dependencies;
       }
   
  -    private Condition buildCondition( final String ifCondition, final String unlessCondition, final Configuration target ) throws Exception
  +    private Condition buildCondition( final String ifCondition,
  +                                      final String unlessCondition )
  +        throws Exception
       {
  -        if( null != ifCondition && null != unlessCondition )
  -        {
  -            final String message =
  -                REZ.getString( "ant.target-bad-logic.error", target.getLocation() );
  -            throw new Exception( message );
  -        }
  -
  -        Condition condition = null;
  +        final AndCondition condition = new AndCondition();
   
  +        // Add the 'if' condition
           if( null != ifCondition )
           {
               if( getLogger().isDebugEnabled() )
  @@ -460,17 +459,20 @@
                   final String message = REZ.getString( "ant.target-if.notice", ifCondition );
                   getLogger().debug( message );
               }
  -            condition = new Condition( true, ifCondition );
  +            condition.add( new IsSetCondition( ifCondition ) );
           }
  -        else if( null != unlessCondition )
  +
  +        // Add the 'unless' condition
  +        if( null != unlessCondition )
           {
               if( getLogger().isDebugEnabled() )
               {
                   final String message = REZ.getString( "ant.target-unless.notice", unlessCondition );
                   getLogger().debug( message );
               }
  -            condition = new Condition( false, unlessCondition );
  +            condition.add( new NotCondition( new IsSetCondition( unlessCondition ) ) );
           }
  +
           return condition;
       }
   
  
  
  
  1.5       +0 -1      jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/builder/Resources.properties,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Resources.properties	2 Feb 2002 05:58:21 -0000	1.4
  +++ Resources.properties	3 Mar 2002 02:19:10 -0000	1.5
  @@ -21,7 +21,6 @@
   ant.import-malformed.error=Malformed import at {0}. If name or type attribute is specified, both attributes must be specified.
   ant.target-noname.error=Discovered un-named target at {0}.
   ant.target-bad-name.error=Target with an invalid name at {0}.
  -ant.target-bad-logic.error=Discovered invalid target that has both a if and unless condition at {0}.
   ant.target-bad-dependency.error=Discovered empty dependency in target {0} at {1}.
   ant.malformed.version=Malformed version string "{0}" specified in version attribute of project.
   ant.version-missing.error=Missing version attribute from project.
  
  
  
  1.28      +2 -3      jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java
  
  Index: DefaultWorkspace.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultWorkspace.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- DefaultWorkspace.java	25 Feb 2002 10:42:43 -0000	1.27
  +++ DefaultWorkspace.java	3 Mar 2002 02:19:10 -0000	1.28
  @@ -45,7 +45,7 @@
    * This is the default implementation of Workspace.
    *
    * @author <a href="mailto:peter@apache.org">Peter Donald</a>
  - * @version $Revision: 1.27 $ $Date: 2002/02/25 10:42:43 $
  + * @version $Revision: 1.28 $ $Date: 2002/03/03 02:19:10 $
    */
   public class DefaultWorkspace
       extends AbstractLogEnabled
  @@ -388,8 +388,7 @@
           {
               try
               {
  -                final boolean result =
  -                    condition.evaluate( frame.getContext() );
  +                final boolean result = condition.evaluate( frame.getContext() );
                   if( !result )
                   {
                       final String message = REZ.getString( "skip-target.notice", name );
  
  
  
  1.15      +13 -57    jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Condition.java
  
  Index: Condition.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Condition.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- Condition.java	21 Feb 2002 11:06:41 -0000	1.14
  +++ Condition.java	3 Mar 2002 02:19:10 -0000	1.15
  @@ -13,64 +13,20 @@
   /**
    * 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.14 $ $Date: 2002/02/21 11:06:41 $
  + * @version $Revision: 1.15 $ $Date: 2002/03/03 02:19:10 $
  + *
  + * @ant:role shorthand="condition"
    */
  -public class Condition
  +public interface Condition
   {
  -    private String m_condition;
  -    private boolean m_isIfCondition;
  -
  -    public Condition( final boolean isIfCondition, final String condition )
  -    {
  -        m_isIfCondition = isIfCondition;
  -        m_condition = condition;
  -    }
  -
  -    public String getCondition()
  -    {
  -        return m_condition;
  -    }
  -
  -    public boolean isIfCondition()
  -    {
  -        return m_isIfCondition;
  -    }
  -
  -    public boolean evaluate( final TaskContext context )
  -        throws TaskException
  -    {
  -        boolean result = false;
  -
  -        final Object resolved = context.resolveValue( getCondition() );
  -        if( null != resolved )
  -        {
  -            final Object object = context.getProperty( resolved.toString() );
  -            if( object != null && !object.toString().equals( "false" ) )
  -            {
  -                result = true;
  -            }
  -        }
  -
  -        if( !m_isIfCondition )
  -        {
  -            result = !result;
  -        }
  -
  -        return result;
  -    }
  -
  -    public String toString()
  -    {
  -        if( isIfCondition() )
  -        {
  -            return "if='" + getCondition() + "'";
  -        }
  -        else
  -        {
  -            return "unless='" + getCondition() + "'";
  -        }
  -    }
  +    /**
  +     * Evaluates this condition.
  +     *
  +     * @param context
  +     *      The context to evaluate the condition in.
  +     */
  +    boolean evaluate( final TaskContext context )
  +        throws TaskException;
   }
  -
  -
  
  
  
  1.17      +5 -3      jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Pattern.java
  
  Index: Pattern.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Pattern.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- Pattern.java	1 Mar 2002 02:13:35 -0000	1.16
  +++ Pattern.java	3 Mar 2002 02:19:10 -0000	1.17
  @@ -11,12 +11,14 @@
   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.IsSetCondition;
  +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.16 $ $Date: 2002/03/01 02:13:35 $
  + * @version $Revision: 1.17 $ $Date: 2002/03/03 02:19:10 $
    * @ant:data-type name="pattern"
    */
   public class Pattern
  @@ -77,7 +79,7 @@
           throws TaskException
       {
           verifyConditionNull();
  -        m_condition = new Condition( true, condition );
  +        m_condition = new IsSetCondition( condition );
       }
   
       /**
  @@ -90,7 +92,7 @@
           throws TaskException
       {
           verifyConditionNull();
  -        m_condition = new Condition( false, condition );
  +        m_condition = new NotCondition( new IsSetCondition( condition ) );
       }
   
       public String evaluateName( final TaskContext context )
  
  
  
  1.7       +1 -1      jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/myrmidon/framework/Resources.properties,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- Resources.properties	14 Feb 2002 10:21:12 -0000	1.6
  +++ Resources.properties	3 Mar 2002 02:19:11 -0000	1.7
  @@ -13,4 +13,4 @@
   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}"
  \ No newline at end of file
  +unknown-family=Don't know how to detect os family "{0}"
  
  
  
  1.1                  jakarta-ant/proposal/myrmidon/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.Enumeration;
  import java.util.ArrayList;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.framework.Condition;
  
  /**
   * &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
  {
      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/proposal/myrmidon/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.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.framework.Condition;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  
  /**
   * 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/03/03 02:19:11 $
   *
   * @ant:type type="condition" name="is-set"
   */
  public class IsSetCondition
      implements Condition
  {
      private final static 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 && !object.toString().equals( "false" ) );
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/myrmidon/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.TaskException;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.framework.Condition;
  
  /**
   * &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 Condition m_condition;
  
      public NotCondition()
      {
      }
  
      public NotCondition( final Condition condition )
      {
          m_condition = condition;
      }
  
      /**
       * Sets the nested condition.
       */
      public void set( final Condition condition )
      {
          m_condition = condition;
      }
  
      /**
       * Evaluates the condition.
       */
      public boolean evaluate( final TaskContext context )
          throws TaskException
      {
          if( m_condition == null )
          {
              throw new TaskException( "no condition set" );
          }
  
          return ! m_condition.evaluate( context );
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/myrmidon/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.Enumeration;
  import java.util.ArrayList;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.framework.Condition;
  
  /**
   * &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
  {
      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/proposal/myrmidon/src/java/org/apache/myrmidon/framework/conditions/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  isset.no-property.error=No property specified to test.
  
  
  
  1.7       +4 -36     jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core/Fail.java
  
  Index: Fail.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core/Fail.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- Fail.java	25 Jan 2002 23:18:18 -0000	1.6
  +++ Fail.java	3 Mar 2002 02:19:11 -0000	1.7
  @@ -9,7 +9,6 @@
   
   import org.apache.myrmidon.api.AbstractTask;
   import org.apache.myrmidon.api.TaskException;
  -import org.apache.myrmidon.framework.Condition;
   
   /**
    * This is a task used to throw a TaskException.
  @@ -22,7 +21,6 @@
       extends AbstractTask
   {
       private String m_message;
  -    private Condition m_condition;
   
       public void setMessage( final String message )
       {
  @@ -36,38 +34,16 @@
           m_message = message;
       }
   
  -    public void setIf( final String ifCondition )
  -    {
  -        checkNullCondition();
  -        m_condition = new Condition( true, ifCondition );
  -    }
  -
  -    public void setUnless( final String unlessCondition )
  -    {
  -        checkNullCondition();
  -        m_condition = new Condition( false, unlessCondition );
  -    }
  -
       public void execute()
           throws TaskException
       {
  -        boolean failed = true;
  -
  -        if( null != m_condition )
  +        if( null != m_message )
           {
  -            failed = m_condition.evaluate( getContext() );
  +            throw new TaskException( m_message );
           }
  -
  -        if( failed )
  +        else
           {
  -            if( null != m_message )
  -            {
  -                throw new TaskException( m_message );
  -            }
  -            else
  -            {
  -                throw new TaskException();
  -            }
  +            throw new TaskException();
           }
       }
   
  @@ -78,14 +54,6 @@
               final String message = "Message can only be set once by " +
                   "either nested content or the message attribute";
               throw new IllegalStateException( message );
  -        }
  -    }
  -
  -    private void checkNullCondition()
  -    {
  -        if( null != m_condition )
  -        {
  -            throw new IllegalStateException( "Condition already set!" );
           }
       }
   }
  
  
  
  1.4       +5 -3      jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core/IfTask.java
  
  Index: IfTask.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core/IfTask.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- IfTask.java	2 Mar 2002 06:24:09 -0000	1.3
  +++ IfTask.java	3 Mar 2002 02:19:11 -0000	1.4
  @@ -14,6 +14,8 @@
   import org.apache.myrmidon.api.TaskException;
   import org.apache.myrmidon.framework.AbstractContainerTask;
   import org.apache.myrmidon.framework.Condition;
  +import org.apache.myrmidon.framework.conditions.IsSetCondition;
  +import org.apache.myrmidon.framework.conditions.NotCondition;
   import org.apache.myrmidon.interfaces.executor.ExecutionFrame;
   import org.apache.myrmidon.interfaces.executor.Executor;
   
  @@ -22,7 +24,7 @@
    * then it will execute the inner tasks, else it won't.
    *
    * @author <a href="mailto:peter@apache.org">Peter Donald</a>
  - * @version $Revision: 1.3 $ $Date: 2002/03/02 06:24:09 $
  + * @version $Revision: 1.4 $ $Date: 2002/03/03 02:19:11 $
    * @ant:task name="if"
    */
   public class IfTask
  @@ -44,7 +46,7 @@
           throws TaskException
       {
           verifyConditionNull();
  -        m_condition = new Condition( true, condition );
  +        m_condition = new IsSetCondition( condition );
       }
   
       /**
  @@ -57,7 +59,7 @@
           throws TaskException
       {
           verifyConditionNull();
  -        m_condition = new Condition( false, condition );
  +        m_condition = new NotCondition( new IsSetCondition( condition ) );
       }
   
       public void add( final Configuration task )
  
  
  
  1.1                  jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core/Available.java
  
  Index: Available.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.antlib.core;
  
  import java.net.URL;
  import java.net.URLClassLoader;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.framework.Condition;
  import org.apache.tools.ant.types.Path;
  import org.apache.tools.ant.types.PathUtil;
  
  /**
   * A condition that evaluates to true if the requested class or resource
   * is available at runtime.
   *
   * @author Stefano Mazzocchi <a href="mailto:stefano@apache.org">
   *      stefano@apache.org</a>
   * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a>
   *
   * @ant:type type="condition" name="available"
   */
  public class Available
      implements Condition
  {
      private String m_classname;
      private Path m_classpath;
      private ClassLoader m_classLoader;
      private String m_resource;
  
      /**
       * Sets the name of the class to search for.
       */
      public void setClassname( final String classname )
      {
          if( !"".equals( classname ) )
          {
              m_classname = classname;
          }
      }
  
      /**
       * Adds a classpath element.
       */
      public void addClasspath( final Path classpath )
          throws TaskException
      {
          if( m_classpath == null )
          {
              m_classpath = classpath;
          }
          else
          {
              m_classpath.addPath( classpath );
          }
      }
  
      /**
       * Sets the name of the resource to look for.
       */
      public void setResource( final String resource )
      {
          m_resource = resource;
      }
  
      /**
       * Evaluates the condition.
       */
      public boolean evaluate( final TaskContext context )
          throws TaskException
      {
          if( m_classname == null && m_resource == null )
          {
              throw new TaskException( "At least one of (classname|file|resource) is required" );
          }
  
          if( m_classpath != null )
          {
              final URL[] urls = PathUtil.toURLs( m_classpath );
              m_classLoader = new URLClassLoader( urls );
          }
  
          if( ( m_classname != null ) && !checkClass( m_classname ) )
          {
              return false;
          }
  
          if( ( m_resource != null ) && !checkResource( m_resource ) )
          {
              return false;
          }
  
          return true;
      }
  
      private boolean checkClass( String classname )
      {
          try
          {
              final ClassLoader classLoader = getClassLoader();
              classLoader.loadClass( classname );
              return true;
          }
          catch( ClassNotFoundException e )
          {
              return false;
          }
          catch( NoClassDefFoundError e )
          {
              return false;
          }
      }
  
      private boolean checkResource( String resource )
      {
          final ClassLoader classLoader = getClassLoader();
          return ( null != classLoader.getResourceAsStream( resource ) );
      }
  
      private ClassLoader getClassLoader()
      {
          if( null == m_classLoader )
          {
              return ClassLoader.getSystemClassLoader();
          }
          else
          {
              return m_classLoader;
          }
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core/ConditionTask.java
  
  Index: ConditionTask.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.antlib.core;
  
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.api.AbstractTask;
  import org.apache.myrmidon.framework.conditions.AndCondition;
  import org.apache.myrmidon.framework.Condition;
  
  /**
   * &lt;condition&gt; task as a generalization of &lt;available&gt; and
   * &lt;uptodate&gt; <p>
   *
   * This task supports boolean logic as well as pluggable conditions to decide,
   * whether a property should be set.</p> <p>
   *
   * This task does not extend Task to take advantage of ConditionBase.</p>
   *
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   * @version $Revision: 1.1 $
   *
   * @ant:task name="condition"
   */
  public class ConditionTask
      extends AbstractTask
  {
      private AndCondition m_condition = new AndCondition();
      private String m_property;
      private String m_value = "true";
  
      /**
       * Adds a condition.
       */
      public void add( final Condition condition )
      {
          m_condition.add( condition );
      }
  
      /**
       * The name of the property to set. Required.
       *
       * @param p The new Property value
       */
      public void setProperty( final String p )
      {
          m_property = p;
      }
  
      /**
       * The value for the property to set. Defaults to "true".
       *
       * @param v The new Value value
       */
      public void setValue( final String v )
      {
          m_value = v;
      }
  
      /**
       * See whether our nested condition holds and set the property.
       */
      public void execute()
          throws TaskException
      {
          if( m_property == null )
          {
              throw new TaskException( "No property was specified" );
          }
  
          if( m_condition.evaluate( getContext() ) )
          {
              getContext().setProperty( m_property, m_value );
          }
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core/OsCondition.java
  
  Index: OsCondition.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.antlib.core;
  
  import org.apache.aut.nativelib.Os;
  import org.apache.myrmidon.api.TaskContext;
  import org.apache.myrmidon.api.TaskException;
  import org.apache.myrmidon.framework.Condition;
  
  /**
   * Condition to check the current OS.</p>
   *
   * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
   * @version $Revision: 1.1 $
   *
   * @ant:type type="condition" name="os"
   */
  public class OsCondition
      implements Condition
  {
      private String m_family;
      private String m_name;
      private String m_version;
      private String m_arch;
  
      /**
       * Sets the desired OS family type
       *
       * @param family The OS family type desired.
       */
      public void setFamily( final String family )
      {
          m_family = family;
      }
  
      /**
       * Sets the desired OS name
       *
       * @param name   The OS name
       */
      public void setName( final String name )
      {
          m_name = name;
      }
  
      /**
       * Sets the desired OS architecture
       *
       * @param arch   The OS architecture
       */
      public void setArch( final String arch )
      {
          m_arch = arch;
      }
  
      /**
       * Sets the desired OS version
       *
       * @param version   The OS version
       */
      public void setVersion( final String version )
      {
          m_version = version;
      }
  
      /**
       * Evaluates this condition.
       */
      public boolean evaluate( final TaskContext context )
          throws TaskException
      {
          return Os.isOs( m_family, m_name, m_arch, m_version );
      }
  }
  
  
  

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


Re: cvs commit: jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core Available.java ConditionTask.java OsCondition.java Fail.java IfTask.java

Posted by Peter Donald <pe...@apache.org>.
On Sun, 3 Mar 2002 16:40, Adam Murdoch wrote:
> > >   * A target can now take both an "if" and an "unless" condition.
> >
> > I don't like this because it complicates an already complex area.
> > Personally
> > I don't think targets should have conditions at all but I guess they are
> > going to need to for backwards compatability with ant1.x :(
>
> I have to agree.  I'd either like to see "if" and "unless" go, or I'd like
> to see a far more expressive model for dependency traversal.
>
> Let's go the simpler option, and axe the target conditions altogether, so
> that all the conditional stuff ends up as tasks inside the targets.

You read my mind ;)

When I reimport the XSLT sheet to do the ant1 --> ant2 transform I was 
thinking about munging it to do this.


-- 
Cheers,

Pete

*---------------------------------------------------------*
| Programming today is a race between software engineers  |
| striving to build bigger and better idiot-proof         |
| programs,and the universe trying to produce bigger and  |
| better idiots. So far, the universe is winning.         |
|                       - Richard Cook                    |
*---------------------------------------------------------*

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


RE: cvs commit: jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core Available.java ConditionTask.java OsCondition.java Fail.java IfTask.java

Posted by Adam Murdoch <ad...@yahoo.com>.

> -----Original Message-----
> From: Peter Donald [mailto:peter@apache.org]
> Sent: Sunday, 3 March 2002 2:27 PM
> To: Ant Developers List
> Subject: Re: cvs commit:
> jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core
> Available.java ConditionTask.java OsCondition.java Fail.java IfTask.java
> 
> 
> On Sun, 3 Mar 2002 13:19, adammurdoch@apache.org wrote:
> >   * Moved <available> to antlib.  This is no longer a task, just a
> > condition. Removed all file checking, which will be done by 
> other condition
> > implementations.
> 
> Can you describe what you mean here? How do you see conditions 
> being set. I 
> was going to eventually get around to having
> 
> <file-available/>
> <resources-available/>
> etc
> 
> How do you see it behaving?
> 

The same.  The plan was to chop up <available> into 3 or 4 separate conditions.  The new <available> checks for classes and resources in a classpath, so it probably could do with further splitting into <class-available> and <resource-available>.

As far as file checking goes, there's plenty of stuff we can do there.  I've added the <file-test> condition (ok, the name needs work), which can be used to test a (vfs) file using a set of file selectors:

<file-test file="some/vfs/file">
  <is-file/>
</file-test>

A condition that did the same for a set of files would probably be handy too.  And a condition that searches a path for a file.  Now that it is so easy to add these things, we can go nuts adding implementations.  I've added a few thoughts to the todo list.


> 
> >   * A target can now take both an "if" and an "unless" condition.
> 
> I don't like this because it complicates an already complex area. 
> Personally 
> I don't think targets should have conditions at all but I guess they are 
> going to need to for backwards compatability with ant1.x :(
> 

I have to agree.  I'd either like to see "if" and "unless" go, or I'd like to see a far more expressive model for dependency traversal.

Let's go the simpler option, and axe the target conditions altogether, so that all the conditional stuff ends up as tasks inside the targets.


Adam


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


Re: cvs commit: jakarta-ant/proposal/myrmidon/src/java/org/apache/antlib/core Available.java ConditionTask.java OsCondition.java Fail.java IfTask.java

Posted by Peter Donald <pe...@apache.org>.
On Sun, 3 Mar 2002 13:19, adammurdoch@apache.org wrote:
>   * Moved <available> to antlib.  This is no longer a task, just a
> condition. Removed all file checking, which will be done by other condition
> implementations.

Can you describe what you mean here? How do you see conditions being set. I 
was going to eventually get around to having

<file-available/>
<resources-available/>
etc

How do you see it behaving?


>   * A target can now take both an "if" and an "unless" condition.

I don't like this because it complicates an already complex area. Personally 
I don't think targets should have conditions at all but I guess they are 
going to need to for backwards compatability with ant1.x :(

-- 
Cheers,

Pete

*------------------------------------------------*
| The student who is never required to do what   |
|  he cannot do never does what he can do.       |
|                       - John Stuart Mill       |
*------------------------------------------------*

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