* 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. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271683 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,136 @@ | |||
| /* | |||
| * 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; | |||
| } | |||
| } | |||
| } | |||
| @@ -5,11 +5,12 @@ | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.tools.ant.taskdefs; | |||
| package org.apache.antlib.core; | |||
| 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; | |||
| /** | |||
| * <condition> task as a generalization of <available> and | |||
| @@ -22,58 +23,58 @@ import org.apache.tools.ant.taskdefs.condition.ConditionBase; | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| * | |||
| * @ant:task name="condition" | |||
| */ | |||
| public class ConditionTask extends ConditionBase | |||
| public class ConditionTask | |||
| extends AbstractTask | |||
| { | |||
| private String value = "true"; | |||
| private AndCondition m_condition = new AndCondition(); | |||
| private String m_property; | |||
| private String m_value = "true"; | |||
| private String property; | |||
| /** | |||
| * 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 | |||
| * @since 1.1 | |||
| */ | |||
| public void setProperty( String p ) | |||
| public void setProperty( final String p ) | |||
| { | |||
| property = p; | |||
| m_property = p; | |||
| } | |||
| /** | |||
| * The value for the property to set. Defaults to "true". | |||
| * | |||
| * @param v The new Value value | |||
| * @since 1.1 | |||
| */ | |||
| public void setValue( String v ) | |||
| public void setValue( final String v ) | |||
| { | |||
| value = v; | |||
| m_value = v; | |||
| } | |||
| /** | |||
| * See whether our nested condition holds and set the property. | |||
| * | |||
| * @exception TaskException Description of Exception | |||
| * @since 1.1 | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( countConditions() > 1 ) | |||
| { | |||
| throw new TaskException( "You must not nest more than one condition into <condition>" ); | |||
| } | |||
| if( countConditions() < 1 ) | |||
| if( m_property == null ) | |||
| { | |||
| throw new TaskException( "You must nest a condition into <condition>" ); | |||
| throw new TaskException( "No property was specified" ); | |||
| } | |||
| Condition c = (Condition)getConditions().nextElement(); | |||
| if( c.eval() ) | |||
| if( m_condition.evaluate( getContext() ) ) | |||
| { | |||
| final String name = property; | |||
| final Object value1 = value; | |||
| getContext().setProperty( name, value1 ); | |||
| getContext().setProperty( m_property, m_value ); | |||
| } | |||
| } | |||
| } | |||
| @@ -9,7 +9,6 @@ package org.apache.antlib.core; | |||
| 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 @@ public class Fail | |||
| extends AbstractTask | |||
| { | |||
| private String m_message; | |||
| private Condition m_condition; | |||
| public void setMessage( final String message ) | |||
| { | |||
| @@ -36,38 +34,16 @@ public class Fail | |||
| 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(); | |||
| } | |||
| } | |||
| @@ -80,12 +56,4 @@ public class Fail | |||
| throw new IllegalStateException( message ); | |||
| } | |||
| } | |||
| private void checkNullCondition() | |||
| { | |||
| if( null != m_condition ) | |||
| { | |||
| throw new IllegalStateException( "Condition already set!" ); | |||
| } | |||
| } | |||
| } | |||
| @@ -14,6 +14,8 @@ import org.apache.avalon.framework.configuration.Configuration; | |||
| 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; | |||
| @@ -44,7 +46,7 @@ public class IfTask | |||
| throws TaskException | |||
| { | |||
| verifyConditionNull(); | |||
| m_condition = new Condition( true, condition ); | |||
| m_condition = new IsSetCondition( condition ); | |||
| } | |||
| /** | |||
| @@ -57,7 +59,7 @@ public class IfTask | |||
| throws TaskException | |||
| { | |||
| verifyConditionNull(); | |||
| m_condition = new Condition( false, condition ); | |||
| m_condition = new NotCondition( new IsSetCondition( condition ) ); | |||
| } | |||
| public void add( final Configuration task ) | |||
| @@ -5,20 +5,22 @@ | |||
| * 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; | |||
| package org.apache.antlib.core; | |||
| import java.util.Locale; | |||
| 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$ | |||
| * | |||
| * @ant:type type="condition" name="os" | |||
| */ | |||
| public class OsCondition | |||
| extends ConditionBase | |||
| implements Condition | |||
| { | |||
| private String m_family; | |||
| @@ -29,18 +31,11 @@ public class OsCondition | |||
| /** | |||
| * Sets the desired OS family type | |||
| * | |||
| * @param f The OS family type desired<br /> | |||
| * Possible values:<br /> | |||
| * <ul><li>dos</li> | |||
| * <li>mac</li> | |||
| * <li>netware</li> | |||
| * <li>os/2</li> | |||
| * <li>unix</li> | |||
| * <li>windows</li></ul> | |||
| * @param family The OS family type desired. | |||
| */ | |||
| public void setFamily( final String family ) | |||
| { | |||
| m_family = family.toLowerCase( Locale.US ); | |||
| m_family = family; | |||
| } | |||
| /** | |||
| @@ -50,7 +45,7 @@ public class OsCondition | |||
| */ | |||
| public void setName( final String name ) | |||
| { | |||
| m_name = name.toLowerCase( Locale.US ); | |||
| m_name = name; | |||
| } | |||
| /** | |||
| @@ -60,7 +55,7 @@ public class OsCondition | |||
| */ | |||
| public void setArch( final String arch ) | |||
| { | |||
| m_arch = arch.toLowerCase( Locale.US ); | |||
| m_arch = arch; | |||
| } | |||
| /** | |||
| @@ -68,17 +63,15 @@ public class OsCondition | |||
| * | |||
| * @param version The OS version | |||
| */ | |||
| public void setVersion( String version ) | |||
| public void setVersion( final String version ) | |||
| { | |||
| this.m_version = version.toLowerCase( Locale.US ); | |||
| m_version = version; | |||
| } | |||
| /** | |||
| * Determines if the OS on which Ant is executing matches the type of | |||
| * that set in setFamily. | |||
| * @see Os#setFamily(String) | |||
| * Evaluates this condition. | |||
| */ | |||
| public boolean eval() | |||
| public boolean evaluate( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| return Os.isOs( m_family, m_name, m_arch, m_version ); | |||
| @@ -23,6 +23,9 @@ import org.apache.avalon.framework.configuration.ConfigurationException; | |||
| 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; | |||
| @@ -381,7 +384,7 @@ public class DefaultProjectBuilder | |||
| } | |||
| 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 @@ public class DefaultProjectBuilder | |||
| 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 @@ public class DefaultProjectBuilder | |||
| 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; | |||
| } | |||
| @@ -21,7 +21,6 @@ ant.import-no-library.error=Malformed import without a library attribute at {0}. | |||
| 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. | |||
| @@ -388,8 +388,7 @@ public class DefaultWorkspace | |||
| { | |||
| 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 ); | |||
| @@ -13,64 +13,20 @@ 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$ $Date$ | |||
| * | |||
| * @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; | |||
| } | |||
| @@ -11,6 +11,8 @@ 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.IsSetCondition; | |||
| import org.apache.myrmidon.framework.conditions.NotCondition; | |||
| /** | |||
| * Basic data type for holding patterns. | |||
| @@ -77,7 +79,7 @@ public class Pattern | |||
| throws TaskException | |||
| { | |||
| verifyConditionNull(); | |||
| m_condition = new Condition( true, condition ); | |||
| m_condition = new IsSetCondition( condition ); | |||
| } | |||
| /** | |||
| @@ -90,7 +92,7 @@ public class Pattern | |||
| throws TaskException | |||
| { | |||
| verifyConditionNull(); | |||
| m_condition = new Condition( false, condition ); | |||
| m_condition = new NotCondition( new IsSetCondition( condition ) ); | |||
| } | |||
| public String evaluateName( final TaskContext context ) | |||
| @@ -13,4 +13,4 @@ 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}" | |||
| unknown-family=Don't know how to detect os family "{0}" | |||
| @@ -0,0 +1,58 @@ | |||
| /* | |||
| * 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; | |||
| /** | |||
| * <and> 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$ | |||
| * | |||
| * @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; | |||
| } | |||
| } | |||
| @@ -0,0 +1,68 @@ | |||
| /* | |||
| * 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$ $Date$ | |||
| * | |||
| * @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" ) ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,58 @@ | |||
| /* | |||
| * 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; | |||
| /** | |||
| * <not> 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$ | |||
| * | |||
| * @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 ); | |||
| } | |||
| } | |||
| @@ -0,0 +1,58 @@ | |||
| /* | |||
| * 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; | |||
| /** | |||
| * <or> 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$ | |||
| * | |||
| * @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); | |||
| } | |||
| } | |||
| @@ -0,0 +1 @@ | |||
| isset.no-property.error=No property specified to test. | |||
| @@ -1,346 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs; | |||
| import java.io.File; | |||
| import java.net.URL; | |||
| import java.net.URLClassLoader; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.tools.ant.taskdefs.condition.Condition; | |||
| import org.apache.tools.ant.types.Path; | |||
| import org.apache.tools.ant.types.PathUtil; | |||
| /** | |||
| * Will set the given property if the requested 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> | |||
| */ | |||
| public class Available | |||
| extends AbstractTask | |||
| implements Condition | |||
| { | |||
| private String m_value = "true"; | |||
| private String m_classname; | |||
| private Path m_classpath; | |||
| private String m_file; | |||
| private Path m_filepath; | |||
| private ClassLoader m_classLoader; | |||
| private String m_property; | |||
| private String m_resource; | |||
| private FileDir m_type; | |||
| public void setClassname( String classname ) | |||
| { | |||
| if( !"".equals( classname ) ) | |||
| { | |||
| m_classname = classname; | |||
| } | |||
| } | |||
| /** | |||
| * Adds a classpath element. | |||
| */ | |||
| public void addClasspath( Path classpath ) | |||
| throws TaskException | |||
| { | |||
| if( m_classpath == null ) | |||
| { | |||
| m_classpath = classpath; | |||
| } | |||
| else | |||
| { | |||
| m_classpath.addPath( classpath ); | |||
| } | |||
| } | |||
| public void setFile( String file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| public void setProperty( String property ) | |||
| { | |||
| m_property = property; | |||
| } | |||
| public void setResource( String resource ) | |||
| { | |||
| m_resource = resource; | |||
| } | |||
| public void setType( FileDir type ) | |||
| { | |||
| m_type = type; | |||
| } | |||
| public void setValue( String value ) | |||
| { | |||
| m_value = value; | |||
| } | |||
| /** | |||
| * Adds a file search path element. | |||
| */ | |||
| public void addFilepath( Path path ) | |||
| throws TaskException | |||
| { | |||
| if( m_filepath == null ) | |||
| { | |||
| m_filepath = path; | |||
| } | |||
| else | |||
| { | |||
| m_filepath.addPath( path ); | |||
| } | |||
| } | |||
| public boolean eval() | |||
| throws TaskException | |||
| { | |||
| if( m_classname == null && m_file == null && m_resource == null ) | |||
| { | |||
| throw new TaskException( "At least one of (classname|file|resource) is required" ); | |||
| } | |||
| if( m_type != null ) | |||
| { | |||
| if( m_file == null ) | |||
| { | |||
| throw new TaskException( "The type attribute is only valid when specifying the file attribute." ); | |||
| } | |||
| } | |||
| if( m_classpath != null ) | |||
| { | |||
| final URL[] urls = PathUtil.toURLs( m_classpath ); | |||
| m_classLoader = new URLClassLoader( urls ); | |||
| } | |||
| if( ( m_classname != null ) && !checkClass( m_classname ) ) | |||
| { | |||
| getLogger().debug( "Unable to load class " + m_classname + " to set property " + m_property ); | |||
| return false; | |||
| } | |||
| if( ( m_file != null ) && !checkFile() ) | |||
| { | |||
| if( m_type != null ) | |||
| { | |||
| getLogger().debug( "Unable to find " + m_type + " " + m_file + " to set property " + m_property ); | |||
| } | |||
| else | |||
| { | |||
| getLogger().debug( "Unable to find " + m_file + " to set property " + m_property ); | |||
| } | |||
| return false; | |||
| } | |||
| if( ( m_resource != null ) && !checkResource( m_resource ) ) | |||
| { | |||
| getLogger().debug( "Unable to load resource " + m_resource + " to set property " + m_property ); | |||
| return false; | |||
| } | |||
| return true; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( m_property == null ) | |||
| { | |||
| throw new TaskException( "property attribute is required" ); | |||
| } | |||
| if( eval() ) | |||
| { | |||
| final String name = m_property; | |||
| final Object value = m_value; | |||
| getContext().setProperty( name, value ); | |||
| } | |||
| } | |||
| 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 checkFile() | |||
| throws TaskException | |||
| { | |||
| if( m_filepath == null ) | |||
| { | |||
| return checkFile( getContext().resolveFile( m_file ), m_file ); | |||
| } | |||
| else | |||
| { | |||
| String[] paths = m_filepath.list(); | |||
| for( int i = 0; i < paths.length; ++i ) | |||
| { | |||
| getLogger().debug( "Searching " + paths[ i ] ); | |||
| /* | |||
| * filepath can be a list of directory and/or | |||
| * file names (gen'd via <fileset>) | |||
| * | |||
| * look for: | |||
| * full-pathname specified == path in list | |||
| * full-pathname specified == parent dir of path in list | |||
| * simple name specified == path in list | |||
| * simple name specified == path in list + name | |||
| * simple name specified == parent dir + name | |||
| * simple name specified == parent of parent dir + name | |||
| * | |||
| */ | |||
| File path = new File( paths[ i ] ); | |||
| // ** full-pathname specified == path in list | |||
| // ** simple name specified == path in list | |||
| if( path.exists() && m_file.equals( paths[ i ] ) ) | |||
| { | |||
| if( m_type == null ) | |||
| { | |||
| getLogger().debug( "Found: " + path ); | |||
| return true; | |||
| } | |||
| else if( m_type.isDir() | |||
| && path.isDirectory() ) | |||
| { | |||
| getLogger().debug( "Found directory: " + path ); | |||
| return true; | |||
| } | |||
| else if( m_type.isFile() | |||
| && path.isFile() ) | |||
| { | |||
| getLogger().debug( "Found file: " + path ); | |||
| return true; | |||
| } | |||
| // not the requested type | |||
| return false; | |||
| } | |||
| File parent = path.getParentFile(); | |||
| // ** full-pathname specified == parent dir of path in list | |||
| if( parent != null && parent.exists() | |||
| && m_file.equals( parent.getAbsolutePath() ) ) | |||
| { | |||
| if( m_type == null ) | |||
| { | |||
| getLogger().debug( "Found: " + parent ); | |||
| return true; | |||
| } | |||
| else if( m_type.isDir() ) | |||
| { | |||
| getLogger().debug( "Found directory: " + parent ); | |||
| return true; | |||
| } | |||
| // not the requested type | |||
| return false; | |||
| } | |||
| // ** simple name specified == path in list + name | |||
| if( path.exists() && path.isDirectory() ) | |||
| { | |||
| if( checkFile( new File( path, m_file ), | |||
| m_file + " in " + path ) ) | |||
| { | |||
| return true; | |||
| } | |||
| } | |||
| // ** simple name specified == parent dir + name | |||
| if( parent != null && parent.exists() ) | |||
| { | |||
| if( checkFile( new File( parent, m_file ), | |||
| m_file + " in " + parent ) ) | |||
| { | |||
| return true; | |||
| } | |||
| } | |||
| // ** simple name specified == parent of parent dir + name | |||
| if( parent != null ) | |||
| { | |||
| File grandParent = parent.getParentFile(); | |||
| if( grandParent != null && grandParent.exists() ) | |||
| { | |||
| if( checkFile( new File( grandParent, m_file ), | |||
| m_file + " in " + grandParent ) ) | |||
| { | |||
| return true; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| private boolean checkFile( File f, String text ) | |||
| { | |||
| if( m_type != null ) | |||
| { | |||
| if( m_type.isDir() ) | |||
| { | |||
| if( f.isDirectory() ) | |||
| { | |||
| getLogger().debug( "Found directory: " + text ); | |||
| } | |||
| return f.isDirectory(); | |||
| } | |||
| else if( m_type.isFile() ) | |||
| { | |||
| if( f.isFile() ) | |||
| { | |||
| getLogger().debug( "Found file: " + text ); | |||
| } | |||
| return f.isFile(); | |||
| } | |||
| } | |||
| if( f.exists() ) | |||
| { | |||
| getLogger().debug( "Found: " + text ); | |||
| } | |||
| return f.exists(); | |||
| } | |||
| 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; | |||
| } | |||
| } | |||
| } | |||
| @@ -11,7 +11,6 @@ import java.io.File; | |||
| 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 @@ import org.apache.tools.ant.util.mappers.MergingMapper; | |||
| * @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(); | |||
| @@ -9,8 +9,9 @@ package org.apache.tools.ant.taskdefs; | |||
| 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 @@ import org.apache.tools.ant.types.EnumeratedAttribute; | |||
| * @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 class WaitFor extends ConditionBase | |||
| 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 @@ public class WaitFor extends ConditionBase | |||
| while( System.currentTimeMillis() < end ) | |||
| { | |||
| if( c.eval() ) | |||
| if( m_condition.evaluate( getContext() ) ) | |||
| { | |||
| return; | |||
| } | |||
| @@ -1,40 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import java.util.Enumeration; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * <and> condition container. <p> | |||
| * | |||
| * Iterates over all conditions and returns false as soon as one evaluates to | |||
| * false.</p> | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public class And | |||
| extends ConditionBase | |||
| implements Condition | |||
| { | |||
| public boolean eval() | |||
| throws TaskException | |||
| { | |||
| final Enumeration enum = getConditions(); | |||
| while( enum.hasMoreElements() ) | |||
| { | |||
| final Condition condition = (Condition)enum.nextElement(); | |||
| if( !condition.eval() ) | |||
| { | |||
| return false; | |||
| } | |||
| } | |||
| return true; | |||
| } | |||
| } | |||
| @@ -1,29 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Interface for conditions to use inside the <condition> task. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public interface Condition | |||
| { | |||
| /** | |||
| * Is this condition true? | |||
| * | |||
| * @return Description of the Returned Value | |||
| * @exception TaskException Description of Exception | |||
| */ | |||
| boolean eval() | |||
| throws TaskException; | |||
| } | |||
| @@ -1,205 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import java.util.ArrayList; | |||
| import java.util.Enumeration; | |||
| import java.util.NoSuchElementException; | |||
| import org.apache.tools.ant.ProjectComponent; | |||
| import org.apache.tools.ant.taskdefs.Available; | |||
| import org.apache.antlib.build.Checksum; | |||
| import org.apache.tools.ant.taskdefs.UpToDate; | |||
| /** | |||
| * Baseclass for the <condition> task as well as several conditions - | |||
| * ensures that the types of conditions inside the task and the "container" | |||
| * conditions are in sync. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public abstract class ConditionBase | |||
| extends ProjectComponent | |||
| { | |||
| private ArrayList m_conditions = new ArrayList(); | |||
| /** | |||
| * Add an <and> condition "container". | |||
| * | |||
| * @param a The feature to be added to the And attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addAnd( And a ) | |||
| { | |||
| m_conditions.add( a ); | |||
| } | |||
| /** | |||
| * Add an <available> condition. | |||
| * | |||
| * @param a The feature to be added to the Available attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addAvailable( Available a ) | |||
| { | |||
| m_conditions.add( a ); | |||
| } | |||
| /** | |||
| * Add an <checksum> condition. | |||
| * | |||
| * @param c The feature to be added to the Checksum attribute | |||
| * @since 1.4 | |||
| */ | |||
| public void addChecksum( Checksum c ) | |||
| { | |||
| m_conditions.add( c ); | |||
| } | |||
| /** | |||
| * Add an <equals> condition. | |||
| * | |||
| * @param e The feature to be added to the Equals attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addEquals( Equals e ) | |||
| { | |||
| m_conditions.add( e ); | |||
| } | |||
| /** | |||
| * Add an <http> condition. | |||
| * | |||
| * @param h The feature to be added to the Http attribute | |||
| * @since 1.7 | |||
| */ | |||
| public void addHttp( Http h ) | |||
| { | |||
| m_conditions.add( h ); | |||
| } | |||
| /** | |||
| * Add an <isset> condition. | |||
| * | |||
| * @param i The feature to be added to the IsSet attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addIsSet( IsSet i ) | |||
| { | |||
| m_conditions.add( i ); | |||
| } | |||
| /** | |||
| * Add an <not> condition "container". | |||
| * | |||
| * @param n The feature to be added to the Not attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addNot( Not n ) | |||
| { | |||
| m_conditions.add( n ); | |||
| } | |||
| /** | |||
| * Add an <or> condition "container". | |||
| * | |||
| * @param o The feature to be added to the Or attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addOr( Or o ) | |||
| { | |||
| m_conditions.add( o ); | |||
| } | |||
| /** | |||
| * Add an <os> condition. | |||
| * | |||
| * @param o The feature to be added to the Os attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addOs( final OsCondition o ) | |||
| { | |||
| m_conditions.add( o ); | |||
| } | |||
| /** | |||
| * Add a <socket> condition. | |||
| * | |||
| * @param s The feature to be added to the Socket attribute | |||
| * @since 1.7 | |||
| */ | |||
| public void addSocket( Socket s ) | |||
| { | |||
| m_conditions.add( s ); | |||
| } | |||
| /** | |||
| * Add an <uptodate> condition. | |||
| * | |||
| * @param u The feature to be added to the Uptodate attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addUptodate( UpToDate u ) | |||
| { | |||
| m_conditions.add( u ); | |||
| } | |||
| /** | |||
| * Iterate through all conditions. | |||
| * | |||
| * @return The Conditions value | |||
| * @since 1.1 | |||
| */ | |||
| protected final Enumeration getConditions() | |||
| { | |||
| return new ConditionEnumeration(); | |||
| } | |||
| /** | |||
| * Count the conditions. | |||
| * | |||
| * @return Description of the Returned Value | |||
| * @since 1.1 | |||
| */ | |||
| protected int countConditions() | |||
| { | |||
| return m_conditions.size(); | |||
| } | |||
| /** | |||
| * Inner class that configures those conditions with a project instance that | |||
| * need it. | |||
| * | |||
| * @author RT | |||
| * @since 1.1 | |||
| */ | |||
| private class ConditionEnumeration implements Enumeration | |||
| { | |||
| private int currentElement = 0; | |||
| public boolean hasMoreElements() | |||
| { | |||
| return countConditions() > currentElement; | |||
| } | |||
| public Object nextElement() | |||
| throws NoSuchElementException | |||
| { | |||
| Object o = null; | |||
| try | |||
| { | |||
| o = m_conditions.get( currentElement++ ); | |||
| } | |||
| catch( ArrayIndexOutOfBoundsException e ) | |||
| { | |||
| throw new NoSuchElementException(); | |||
| } | |||
| return o; | |||
| } | |||
| } | |||
| } | |||
| @@ -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$ | |||
| * | |||
| * @ant:type type="condition" nam="equals" | |||
| */ | |||
| public class Equals implements Condition | |||
| { | |||
| @@ -30,7 +33,13 @@ public class Equals implements Condition | |||
| 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 ) | |||
| @@ -12,6 +12,8 @@ import java.net.MalformedURLException; | |||
| 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 @@ import org.apache.tools.ant.ProjectComponent; | |||
| * 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 @@ public class Http | |||
| spec = url; | |||
| } | |||
| public boolean eval() | |||
| /** | |||
| * Evaluates this condition. | |||
| */ | |||
| public boolean evaluate( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( spec == null ) | |||
| @@ -1,40 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.tools.ant.ProjectComponent; | |||
| /** | |||
| * Condition that tests whether a given property has been set. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public class IsSet extends ProjectComponent implements Condition | |||
| { | |||
| private String property; | |||
| public void setProperty( String p ) | |||
| { | |||
| property = p; | |||
| } | |||
| public boolean eval() | |||
| throws TaskException | |||
| { | |||
| if( property == null ) | |||
| { | |||
| throw new TaskException( "No property specified for isset condition" ); | |||
| } | |||
| return getContext().getProperty( property ) != null; | |||
| } | |||
| } | |||
| @@ -1,36 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * <not> 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$ | |||
| */ | |||
| public class Not extends ConditionBase implements Condition | |||
| { | |||
| public boolean eval() | |||
| throws TaskException | |||
| { | |||
| if( countConditions() > 1 ) | |||
| { | |||
| throw new TaskException( "You must not nest more than one condition into <not>" ); | |||
| } | |||
| if( countConditions() < 1 ) | |||
| { | |||
| throw new TaskException( "You must nest a condition into <not>" ); | |||
| } | |||
| return !( (Condition)getConditions().nextElement() ).eval(); | |||
| } | |||
| } | |||
| @@ -1,40 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import java.util.Enumeration; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * <or> condition container. <p> | |||
| * | |||
| * Iterates over all conditions and returns true as soon as one evaluates to | |||
| * true.</p> | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public class Or extends ConditionBase implements Condition | |||
| { | |||
| public boolean eval() | |||
| throws TaskException | |||
| { | |||
| Enumeration enum = getConditions(); | |||
| while( enum.hasMoreElements() ) | |||
| { | |||
| Condition c = (Condition)enum.nextElement(); | |||
| if( c.eval() ) | |||
| { | |||
| return true; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| } | |||
| @@ -1,86 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import java.util.Locale; | |||
| import org.apache.aut.nativelib.Os; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Condition to check the current OS.</p> | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public class OsCondition | |||
| extends ConditionBase | |||
| 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 f The OS family type desired<br /> | |||
| * Possible values:<br /> | |||
| * <ul><li>dos</li> | |||
| * <li>mac</li> | |||
| * <li>netware</li> | |||
| * <li>os/2</li> | |||
| * <li>unix</li> | |||
| * <li>windows</li></ul> | |||
| */ | |||
| public void setFamily( final String family ) | |||
| { | |||
| m_family = family.toLowerCase( Locale.US ); | |||
| } | |||
| /** | |||
| * Sets the desired OS name | |||
| * | |||
| * @param name The OS name | |||
| */ | |||
| public void setName( final String name ) | |||
| { | |||
| m_name = name.toLowerCase( Locale.US ); | |||
| } | |||
| /** | |||
| * Sets the desired OS architecture | |||
| * | |||
| * @param arch The OS architecture | |||
| */ | |||
| public void setArch( final String arch ) | |||
| { | |||
| m_arch = arch.toLowerCase( Locale.US ); | |||
| } | |||
| /** | |||
| * Sets the desired OS version | |||
| * | |||
| * @param version The OS version | |||
| */ | |||
| public void setVersion( String version ) | |||
| { | |||
| this.m_version = version.toLowerCase( Locale.US ); | |||
| } | |||
| /** | |||
| * Determines if the OS on which Ant is executing matches the type of | |||
| * that set in setFamily. | |||
| * @see Os#setFamily(String) | |||
| */ | |||
| public boolean eval() | |||
| throws TaskException | |||
| { | |||
| return Os.isOs( m_family, m_name, m_arch, m_version ); | |||
| } | |||
| } | |||
| @@ -9,6 +9,8 @@ package org.apache.tools.ant.taskdefs.condition; | |||
| 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 @@ import org.apache.tools.ant.ProjectComponent; | |||
| * 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 @@ public class Socket | |||
| this.server = server; | |||
| } | |||
| public boolean eval() | |||
| /** | |||
| * Evaluates this condition. | |||
| */ | |||
| public boolean evaluate( TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( server == null ) | |||
| @@ -49,6 +56,7 @@ public class Socket | |||
| try | |||
| { | |||
| java.net.Socket socket = new java.net.Socket( server, port ); | |||
| socket.close(); | |||
| } | |||
| catch( IOException e ) | |||
| { | |||
| @@ -1,346 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs; | |||
| import java.io.File; | |||
| import java.net.URL; | |||
| import java.net.URLClassLoader; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.tools.ant.taskdefs.condition.Condition; | |||
| import org.apache.tools.ant.types.Path; | |||
| import org.apache.tools.ant.types.PathUtil; | |||
| /** | |||
| * Will set the given property if the requested 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> | |||
| */ | |||
| public class Available | |||
| extends AbstractTask | |||
| implements Condition | |||
| { | |||
| private String m_value = "true"; | |||
| private String m_classname; | |||
| private Path m_classpath; | |||
| private String m_file; | |||
| private Path m_filepath; | |||
| private ClassLoader m_classLoader; | |||
| private String m_property; | |||
| private String m_resource; | |||
| private FileDir m_type; | |||
| public void setClassname( String classname ) | |||
| { | |||
| if( !"".equals( classname ) ) | |||
| { | |||
| m_classname = classname; | |||
| } | |||
| } | |||
| /** | |||
| * Adds a classpath element. | |||
| */ | |||
| public void addClasspath( Path classpath ) | |||
| throws TaskException | |||
| { | |||
| if( m_classpath == null ) | |||
| { | |||
| m_classpath = classpath; | |||
| } | |||
| else | |||
| { | |||
| m_classpath.addPath( classpath ); | |||
| } | |||
| } | |||
| public void setFile( String file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| public void setProperty( String property ) | |||
| { | |||
| m_property = property; | |||
| } | |||
| public void setResource( String resource ) | |||
| { | |||
| m_resource = resource; | |||
| } | |||
| public void setType( FileDir type ) | |||
| { | |||
| m_type = type; | |||
| } | |||
| public void setValue( String value ) | |||
| { | |||
| m_value = value; | |||
| } | |||
| /** | |||
| * Adds a file search path element. | |||
| */ | |||
| public void addFilepath( Path path ) | |||
| throws TaskException | |||
| { | |||
| if( m_filepath == null ) | |||
| { | |||
| m_filepath = path; | |||
| } | |||
| else | |||
| { | |||
| m_filepath.addPath( path ); | |||
| } | |||
| } | |||
| public boolean eval() | |||
| throws TaskException | |||
| { | |||
| if( m_classname == null && m_file == null && m_resource == null ) | |||
| { | |||
| throw new TaskException( "At least one of (classname|file|resource) is required" ); | |||
| } | |||
| if( m_type != null ) | |||
| { | |||
| if( m_file == null ) | |||
| { | |||
| throw new TaskException( "The type attribute is only valid when specifying the file attribute." ); | |||
| } | |||
| } | |||
| if( m_classpath != null ) | |||
| { | |||
| final URL[] urls = PathUtil.toURLs( m_classpath ); | |||
| m_classLoader = new URLClassLoader( urls ); | |||
| } | |||
| if( ( m_classname != null ) && !checkClass( m_classname ) ) | |||
| { | |||
| getLogger().debug( "Unable to load class " + m_classname + " to set property " + m_property ); | |||
| return false; | |||
| } | |||
| if( ( m_file != null ) && !checkFile() ) | |||
| { | |||
| if( m_type != null ) | |||
| { | |||
| getLogger().debug( "Unable to find " + m_type + " " + m_file + " to set property " + m_property ); | |||
| } | |||
| else | |||
| { | |||
| getLogger().debug( "Unable to find " + m_file + " to set property " + m_property ); | |||
| } | |||
| return false; | |||
| } | |||
| if( ( m_resource != null ) && !checkResource( m_resource ) ) | |||
| { | |||
| getLogger().debug( "Unable to load resource " + m_resource + " to set property " + m_property ); | |||
| return false; | |||
| } | |||
| return true; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( m_property == null ) | |||
| { | |||
| throw new TaskException( "property attribute is required" ); | |||
| } | |||
| if( eval() ) | |||
| { | |||
| final String name = m_property; | |||
| final Object value = m_value; | |||
| getContext().setProperty( name, value ); | |||
| } | |||
| } | |||
| 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 checkFile() | |||
| throws TaskException | |||
| { | |||
| if( m_filepath == null ) | |||
| { | |||
| return checkFile( getContext().resolveFile( m_file ), m_file ); | |||
| } | |||
| else | |||
| { | |||
| String[] paths = m_filepath.list(); | |||
| for( int i = 0; i < paths.length; ++i ) | |||
| { | |||
| getLogger().debug( "Searching " + paths[ i ] ); | |||
| /* | |||
| * filepath can be a list of directory and/or | |||
| * file names (gen'd via <fileset>) | |||
| * | |||
| * look for: | |||
| * full-pathname specified == path in list | |||
| * full-pathname specified == parent dir of path in list | |||
| * simple name specified == path in list | |||
| * simple name specified == path in list + name | |||
| * simple name specified == parent dir + name | |||
| * simple name specified == parent of parent dir + name | |||
| * | |||
| */ | |||
| File path = new File( paths[ i ] ); | |||
| // ** full-pathname specified == path in list | |||
| // ** simple name specified == path in list | |||
| if( path.exists() && m_file.equals( paths[ i ] ) ) | |||
| { | |||
| if( m_type == null ) | |||
| { | |||
| getLogger().debug( "Found: " + path ); | |||
| return true; | |||
| } | |||
| else if( m_type.isDir() | |||
| && path.isDirectory() ) | |||
| { | |||
| getLogger().debug( "Found directory: " + path ); | |||
| return true; | |||
| } | |||
| else if( m_type.isFile() | |||
| && path.isFile() ) | |||
| { | |||
| getLogger().debug( "Found file: " + path ); | |||
| return true; | |||
| } | |||
| // not the requested type | |||
| return false; | |||
| } | |||
| File parent = path.getParentFile(); | |||
| // ** full-pathname specified == parent dir of path in list | |||
| if( parent != null && parent.exists() | |||
| && m_file.equals( parent.getAbsolutePath() ) ) | |||
| { | |||
| if( m_type == null ) | |||
| { | |||
| getLogger().debug( "Found: " + parent ); | |||
| return true; | |||
| } | |||
| else if( m_type.isDir() ) | |||
| { | |||
| getLogger().debug( "Found directory: " + parent ); | |||
| return true; | |||
| } | |||
| // not the requested type | |||
| return false; | |||
| } | |||
| // ** simple name specified == path in list + name | |||
| if( path.exists() && path.isDirectory() ) | |||
| { | |||
| if( checkFile( new File( path, m_file ), | |||
| m_file + " in " + path ) ) | |||
| { | |||
| return true; | |||
| } | |||
| } | |||
| // ** simple name specified == parent dir + name | |||
| if( parent != null && parent.exists() ) | |||
| { | |||
| if( checkFile( new File( parent, m_file ), | |||
| m_file + " in " + parent ) ) | |||
| { | |||
| return true; | |||
| } | |||
| } | |||
| // ** simple name specified == parent of parent dir + name | |||
| if( parent != null ) | |||
| { | |||
| File grandParent = parent.getParentFile(); | |||
| if( grandParent != null && grandParent.exists() ) | |||
| { | |||
| if( checkFile( new File( grandParent, m_file ), | |||
| m_file + " in " + grandParent ) ) | |||
| { | |||
| return true; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| private boolean checkFile( File f, String text ) | |||
| { | |||
| if( m_type != null ) | |||
| { | |||
| if( m_type.isDir() ) | |||
| { | |||
| if( f.isDirectory() ) | |||
| { | |||
| getLogger().debug( "Found directory: " + text ); | |||
| } | |||
| return f.isDirectory(); | |||
| } | |||
| else if( m_type.isFile() ) | |||
| { | |||
| if( f.isFile() ) | |||
| { | |||
| getLogger().debug( "Found file: " + text ); | |||
| } | |||
| return f.isFile(); | |||
| } | |||
| } | |||
| if( f.exists() ) | |||
| { | |||
| getLogger().debug( "Found: " + text ); | |||
| } | |||
| return f.exists(); | |||
| } | |||
| 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,79 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.tools.ant.taskdefs.condition.Condition; | |||
| import org.apache.tools.ant.taskdefs.condition.ConditionBase; | |||
| /** | |||
| * <condition> task as a generalization of <available> and | |||
| * <uptodate> <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$ | |||
| */ | |||
| public class ConditionTask extends ConditionBase | |||
| { | |||
| private String value = "true"; | |||
| private String property; | |||
| /** | |||
| * The name of the property to set. Required. | |||
| * | |||
| * @param p The new Property value | |||
| * @since 1.1 | |||
| */ | |||
| public void setProperty( String p ) | |||
| { | |||
| property = p; | |||
| } | |||
| /** | |||
| * The value for the property to set. Defaults to "true". | |||
| * | |||
| * @param v The new Value value | |||
| * @since 1.1 | |||
| */ | |||
| public void setValue( String v ) | |||
| { | |||
| value = v; | |||
| } | |||
| /** | |||
| * See whether our nested condition holds and set the property. | |||
| * | |||
| * @exception TaskException Description of Exception | |||
| * @since 1.1 | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( countConditions() > 1 ) | |||
| { | |||
| throw new TaskException( "You must not nest more than one condition into <condition>" ); | |||
| } | |||
| if( countConditions() < 1 ) | |||
| { | |||
| throw new TaskException( "You must nest a condition into <condition>" ); | |||
| } | |||
| Condition c = (Condition)getConditions().nextElement(); | |||
| if( c.eval() ) | |||
| { | |||
| final String name = property; | |||
| final Object value1 = value; | |||
| getContext().setProperty( name, value1 ); | |||
| } | |||
| } | |||
| } | |||
| @@ -11,7 +11,6 @@ import java.io.File; | |||
| 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 @@ import org.apache.tools.ant.util.mappers.MergingMapper; | |||
| * @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(); | |||
| @@ -9,8 +9,9 @@ package org.apache.tools.ant.taskdefs; | |||
| 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 @@ import org.apache.tools.ant.types.EnumeratedAttribute; | |||
| * @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 class WaitFor extends ConditionBase | |||
| 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 @@ public class WaitFor extends ConditionBase | |||
| while( System.currentTimeMillis() < end ) | |||
| { | |||
| if( c.eval() ) | |||
| if( m_condition.evaluate( getContext() ) ) | |||
| { | |||
| return; | |||
| } | |||
| @@ -1,40 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import java.util.Enumeration; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * <and> condition container. <p> | |||
| * | |||
| * Iterates over all conditions and returns false as soon as one evaluates to | |||
| * false.</p> | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public class And | |||
| extends ConditionBase | |||
| implements Condition | |||
| { | |||
| public boolean eval() | |||
| throws TaskException | |||
| { | |||
| final Enumeration enum = getConditions(); | |||
| while( enum.hasMoreElements() ) | |||
| { | |||
| final Condition condition = (Condition)enum.nextElement(); | |||
| if( !condition.eval() ) | |||
| { | |||
| return false; | |||
| } | |||
| } | |||
| return true; | |||
| } | |||
| } | |||
| @@ -1,29 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Interface for conditions to use inside the <condition> task. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public interface Condition | |||
| { | |||
| /** | |||
| * Is this condition true? | |||
| * | |||
| * @return Description of the Returned Value | |||
| * @exception TaskException Description of Exception | |||
| */ | |||
| boolean eval() | |||
| throws TaskException; | |||
| } | |||
| @@ -1,205 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import java.util.ArrayList; | |||
| import java.util.Enumeration; | |||
| import java.util.NoSuchElementException; | |||
| import org.apache.tools.ant.ProjectComponent; | |||
| import org.apache.tools.ant.taskdefs.Available; | |||
| import org.apache.antlib.build.Checksum; | |||
| import org.apache.tools.ant.taskdefs.UpToDate; | |||
| /** | |||
| * Baseclass for the <condition> task as well as several conditions - | |||
| * ensures that the types of conditions inside the task and the "container" | |||
| * conditions are in sync. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public abstract class ConditionBase | |||
| extends ProjectComponent | |||
| { | |||
| private ArrayList m_conditions = new ArrayList(); | |||
| /** | |||
| * Add an <and> condition "container". | |||
| * | |||
| * @param a The feature to be added to the And attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addAnd( And a ) | |||
| { | |||
| m_conditions.add( a ); | |||
| } | |||
| /** | |||
| * Add an <available> condition. | |||
| * | |||
| * @param a The feature to be added to the Available attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addAvailable( Available a ) | |||
| { | |||
| m_conditions.add( a ); | |||
| } | |||
| /** | |||
| * Add an <checksum> condition. | |||
| * | |||
| * @param c The feature to be added to the Checksum attribute | |||
| * @since 1.4 | |||
| */ | |||
| public void addChecksum( Checksum c ) | |||
| { | |||
| m_conditions.add( c ); | |||
| } | |||
| /** | |||
| * Add an <equals> condition. | |||
| * | |||
| * @param e The feature to be added to the Equals attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addEquals( Equals e ) | |||
| { | |||
| m_conditions.add( e ); | |||
| } | |||
| /** | |||
| * Add an <http> condition. | |||
| * | |||
| * @param h The feature to be added to the Http attribute | |||
| * @since 1.7 | |||
| */ | |||
| public void addHttp( Http h ) | |||
| { | |||
| m_conditions.add( h ); | |||
| } | |||
| /** | |||
| * Add an <isset> condition. | |||
| * | |||
| * @param i The feature to be added to the IsSet attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addIsSet( IsSet i ) | |||
| { | |||
| m_conditions.add( i ); | |||
| } | |||
| /** | |||
| * Add an <not> condition "container". | |||
| * | |||
| * @param n The feature to be added to the Not attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addNot( Not n ) | |||
| { | |||
| m_conditions.add( n ); | |||
| } | |||
| /** | |||
| * Add an <or> condition "container". | |||
| * | |||
| * @param o The feature to be added to the Or attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addOr( Or o ) | |||
| { | |||
| m_conditions.add( o ); | |||
| } | |||
| /** | |||
| * Add an <os> condition. | |||
| * | |||
| * @param o The feature to be added to the Os attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addOs( final OsCondition o ) | |||
| { | |||
| m_conditions.add( o ); | |||
| } | |||
| /** | |||
| * Add a <socket> condition. | |||
| * | |||
| * @param s The feature to be added to the Socket attribute | |||
| * @since 1.7 | |||
| */ | |||
| public void addSocket( Socket s ) | |||
| { | |||
| m_conditions.add( s ); | |||
| } | |||
| /** | |||
| * Add an <uptodate> condition. | |||
| * | |||
| * @param u The feature to be added to the Uptodate attribute | |||
| * @since 1.1 | |||
| */ | |||
| public void addUptodate( UpToDate u ) | |||
| { | |||
| m_conditions.add( u ); | |||
| } | |||
| /** | |||
| * Iterate through all conditions. | |||
| * | |||
| * @return The Conditions value | |||
| * @since 1.1 | |||
| */ | |||
| protected final Enumeration getConditions() | |||
| { | |||
| return new ConditionEnumeration(); | |||
| } | |||
| /** | |||
| * Count the conditions. | |||
| * | |||
| * @return Description of the Returned Value | |||
| * @since 1.1 | |||
| */ | |||
| protected int countConditions() | |||
| { | |||
| return m_conditions.size(); | |||
| } | |||
| /** | |||
| * Inner class that configures those conditions with a project instance that | |||
| * need it. | |||
| * | |||
| * @author RT | |||
| * @since 1.1 | |||
| */ | |||
| private class ConditionEnumeration implements Enumeration | |||
| { | |||
| private int currentElement = 0; | |||
| public boolean hasMoreElements() | |||
| { | |||
| return countConditions() > currentElement; | |||
| } | |||
| public Object nextElement() | |||
| throws NoSuchElementException | |||
| { | |||
| Object o = null; | |||
| try | |||
| { | |||
| o = m_conditions.get( currentElement++ ); | |||
| } | |||
| catch( ArrayIndexOutOfBoundsException e ) | |||
| { | |||
| throw new NoSuchElementException(); | |||
| } | |||
| return o; | |||
| } | |||
| } | |||
| } | |||
| @@ -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$ | |||
| * | |||
| * @ant:type type="condition" nam="equals" | |||
| */ | |||
| public class Equals implements Condition | |||
| { | |||
| @@ -30,7 +33,13 @@ public class Equals implements Condition | |||
| 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 ) | |||
| @@ -12,6 +12,8 @@ import java.net.MalformedURLException; | |||
| 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 @@ import org.apache.tools.ant.ProjectComponent; | |||
| * 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 @@ public class Http | |||
| spec = url; | |||
| } | |||
| public boolean eval() | |||
| /** | |||
| * Evaluates this condition. | |||
| */ | |||
| public boolean evaluate( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( spec == null ) | |||
| @@ -1,40 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.tools.ant.ProjectComponent; | |||
| /** | |||
| * Condition that tests whether a given property has been set. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public class IsSet extends ProjectComponent implements Condition | |||
| { | |||
| private String property; | |||
| public void setProperty( String p ) | |||
| { | |||
| property = p; | |||
| } | |||
| public boolean eval() | |||
| throws TaskException | |||
| { | |||
| if( property == null ) | |||
| { | |||
| throw new TaskException( "No property specified for isset condition" ); | |||
| } | |||
| return getContext().getProperty( property ) != null; | |||
| } | |||
| } | |||
| @@ -1,36 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * <not> 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$ | |||
| */ | |||
| public class Not extends ConditionBase implements Condition | |||
| { | |||
| public boolean eval() | |||
| throws TaskException | |||
| { | |||
| if( countConditions() > 1 ) | |||
| { | |||
| throw new TaskException( "You must not nest more than one condition into <not>" ); | |||
| } | |||
| if( countConditions() < 1 ) | |||
| { | |||
| throw new TaskException( "You must nest a condition into <not>" ); | |||
| } | |||
| return !( (Condition)getConditions().nextElement() ).eval(); | |||
| } | |||
| } | |||
| @@ -1,40 +0,0 @@ | |||
| /* | |||
| * 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.tools.ant.taskdefs.condition; | |||
| import java.util.Enumeration; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * <or> condition container. <p> | |||
| * | |||
| * Iterates over all conditions and returns true as soon as one evaluates to | |||
| * true.</p> | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| */ | |||
| public class Or extends ConditionBase implements Condition | |||
| { | |||
| public boolean eval() | |||
| throws TaskException | |||
| { | |||
| Enumeration enum = getConditions(); | |||
| while( enum.hasMoreElements() ) | |||
| { | |||
| Condition c = (Condition)enum.nextElement(); | |||
| if( c.eval() ) | |||
| { | |||
| return true; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| } | |||
| @@ -9,6 +9,8 @@ package org.apache.tools.ant.taskdefs.condition; | |||
| 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 @@ import org.apache.tools.ant.ProjectComponent; | |||
| * 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 @@ public class Socket | |||
| this.server = server; | |||
| } | |||
| public boolean eval() | |||
| /** | |||
| * Evaluates this condition. | |||
| */ | |||
| public boolean evaluate( TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( server == null ) | |||
| @@ -49,6 +56,7 @@ public class Socket | |||
| try | |||
| { | |||
| java.net.Socket socket = new java.net.Socket( server, port ); | |||
| socket.close(); | |||
| } | |||
| catch( IOException e ) | |||
| { | |||