diff --git a/proposal/myrmidon/ant1compat.xml b/proposal/myrmidon/ant1compat.xml index 894d444d9..94d3fae14 100644 --- a/proposal/myrmidon/ant1compat.xml +++ b/proposal/myrmidon/ant1compat.xml @@ -62,6 +62,7 @@ + diff --git a/proposal/myrmidon/src/ant1compat/README.txt b/proposal/myrmidon/src/ant1compat/README.txt index 69a20a74e..c3926ba20 100644 --- a/proposal/myrmidon/src/ant1compat/README.txt +++ b/proposal/myrmidon/src/ant1compat/README.txt @@ -18,7 +18,7 @@ it may can mimic the Ant1 configuration policy using the IntrospectionHelper. The idea is to provide hooks between the Ant1 project and the Myrmidon project, eg logging: done - properties: done but not quite working + properties: done references: not done Task definitions: done. @@ -51,10 +51,8 @@ BUILD INSTRUCTIONS TODO ---- * Convert this to an Xdoc document -* Try out automatic registration of tasks - remove everything - from ant-descriptor.xml and just use Project.addTaskDefinition() - to register tasks? (similar for DataTypes) * Get a version of and working * Test heaps more tasks -* Check that "if" and "unless" conversions are working. +* Provide hooks between Ant1 references and Myrmidon properties. Need to use + converters for adapting Ant2 objects (like Ant2 or ) as Ant1 types. diff --git a/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/Ant1CompatProject.java b/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/Ant1CompatProject.java index fb2cd63da..49542b7fb 100644 --- a/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/Ant1CompatProject.java +++ b/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/Ant1CompatProject.java @@ -7,13 +7,22 @@ */ package org.apache.tools.ant; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.Map; import java.util.Properties; +import java.util.Set; import org.apache.myrmidon.api.TaskContext; +import org.apache.myrmidon.api.TaskException; import org.apache.myrmidon.interfaces.type.DefaultTypeFactory; import org.apache.myrmidon.interfaces.type.TypeManager; +import org.apache.myrmidon.interfaces.property.PropertyResolver; +import org.apache.myrmidon.components.property.ClassicPropertyResolver; /** * Ant1 Project proxy for Myrmidon. Provides hooks between Myrmidon TaskContext @@ -27,9 +36,14 @@ import org.apache.myrmidon.interfaces.type.TypeManager; */ public class Ant1CompatProject extends Project { - private TaskContext m_context; public static final String ANT1_TASK_PREFIX = "ant1."; + private static final PropertyResolver c_ant1PropertyResolver = + new ClassicPropertyResolver(); + + private Set m_userProperties = new HashSet(); + private TaskContext m_context; + public Ant1CompatProject( TaskContext context ) { super(); @@ -244,4 +258,242 @@ public class Ant1CompatProject extends Project typeManager.registerType( roleType, typeName, factory ); } + /** + * Sets a property. Any existing property of the same name + * is overwritten, unless it is a user property. + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + */ + public void setProperty( String name, String value ) + { + if( m_userProperties.contains( name ) ) + { + log( "Override ignored for user property " + name, MSG_VERBOSE ); + return; + } + + if( null != m_context.getProperty( name ) ) + { + log( "Overriding previous definition of property " + name, + MSG_VERBOSE ); + } + + log( "Setting project property: " + name + " -> " + + value, MSG_DEBUG ); + doSetProperty( name, value ); + } + + /** + * Sets a property if no value currently exists. If the property + * exists already, a message is logged and the method returns with + * no other effect. + * + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + * @since 1.5 + */ + public void setNewProperty( String name, String value ) + { + if( null != m_context.getProperty( name ) ) + { + log( "Override ignored for property " + name, MSG_VERBOSE ); + return; + } + + log( "Setting project property: " + name + " -> " + + value, MSG_DEBUG ); + doSetProperty( name, value ); + } + + /** + * Sets a user property, which cannot be overwritten by + * set/unset property calls. Any previous value is overwritten. + * @param name The name of property to set. + * Must not be null. + * @param value The new value of the property. + * Must not be null. + * @see #setProperty(String,String) + */ + public void setUserProperty( String name, String value ) + { + log( "Setting ro project property: " + name + " -> " + + value, MSG_DEBUG ); + m_userProperties.add( name ); + doSetProperty( name, value ); + } + + /** + * Sets a property value in the context, wrapping exceptions as + * Ant1 BuildExceptions. + * @param name property name + * @param value property value + */ + private void doSetProperty( String name, String value ) + { + try + { + m_context.setProperty( name, value ); + } + catch( TaskException e ) + { + throw new BuildException( "Could not set property: " + name, e ); + } + } + + /** + * Returns the value of a property, if it is set. + * + * @param name The name of the property. + * May be null, in which case + * the return value is also null. + * @return the property value, or null for no match + * or if a null name is provided. + */ + public String getProperty( String name ) + { + Object value = m_context.getProperty( name ); + + // In Ant1, all properties are strings. + if( value instanceof String ) + { + return (String)value; + } + else + { + return null; + } + } + + /** + * Returns the value of a user property, if it is set. + * + * @param name The name of the property. + * May be null, in which case + * the return value is also null. + * @return the property value, or null for no match + * or if a null name is provided. + */ + public String getUserProperty( String name ) + { + if( m_userProperties.contains( name ) ) + { + return getProperty( name ); + } + else + { + return null; + } + } + + /** + * Returns a copy of the properties table. + * @return a hashtable containing all properties + * (including user properties). + */ + public Hashtable getProperties() + { + Hashtable propsCopy = new Hashtable(); + + Map contextProps = m_context.getProperties(); + Iterator propNames = contextProps.keySet().iterator(); + while( propNames.hasNext() ) + { + String name = (String)propNames.next(); + + // Use getProperty() to only return Strings. + String value = getProperty( name ); + if( value != null ) + { + propsCopy.put( name, value ); + } + } + + return propsCopy; + } + + /** + * Returns a copy of the user property hashtable + * @return a hashtable containing just the user properties + */ + public Hashtable getUserProperties() + { + Hashtable propsCopy = new Hashtable(); + + Iterator userPropNames = m_userProperties.iterator(); + while( userPropNames.hasNext() ) + { + String name = (String)userPropNames.next(); + String value = getProperty( name ); + propsCopy.put( name, value ); + } + + return propsCopy; + } + + /** + * Replaces ${} style constructions in the given value with the + * string value of the corresponding data types. + * + * @param value The string to be scanned for property references. + * May be null. + * + * @return the given string with embedded property names replaced + * by values, or null if the given string is + * null. + * + * @exception BuildException if the given value has an unclosed + * property name, e.g. ${xxx + */ + public String replaceProperties( String value ) + throws BuildException + { + try + { + return (String)c_ant1PropertyResolver.resolveProperties( value, + m_context ); + } + catch( TaskException e ) + { + throw new BuildException( "Error resolving value: '" + value + "'", e ); + } + } + + /** + * Make the Ant1 project set the java version property, and then + * copy it into the context properties. + * + * @exception BuildException if this Java version is not supported + * + * @see #getJavaVersion() + */ + public void setJavaVersionProperty() throws BuildException + { + String javaVersion = getJavaVersion(); + doSetProperty( "ant.java.version", javaVersion ); + + log( "Detected Java version: " + javaVersion + " in: " + + System.getProperty( "java.home" ), MSG_VERBOSE ); + + log( "Detected OS: " + System.getProperty( "os.name" ), MSG_VERBOSE ); + } + + /** + * Sets the base directory for the project, checking that + * the given filename exists and is a directory. + * + * @param baseD The project base directory. + * Must not be null. + * + * @exception BuildException if the directory if invalid + */ + public void setBaseDir( File baseD ) throws BuildException + { + super.setBaseDir( baseD ); + doSetProperty( "basedir", super.getProperty( "basedir" ) ); + } + } diff --git a/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/BuildException.java b/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/BuildException.java new file mode 100644 index 000000000..38a6cd0b0 --- /dev/null +++ b/proposal/myrmidon/src/ant1compat/org/apache/tools/ant/BuildException.java @@ -0,0 +1,255 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2000-2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ +package org.apache.tools.ant; + +import java.io.PrintWriter; +import java.io.PrintStream; +import org.apache.tools.ant.Location; + +/** + *----------------------------------------------------------------- + * Ant1Compatability layer version of BuildException, modified slightly + * from original Ant1 BuildException, to provide a Myrmidon-friendly + * getCause(), so that cascading exceptions are followed. + * ----------------------------------------------------------------- + * + * Signals an error condition during a build + * + * @author James Duncan Davidson + */ +public class BuildException extends RuntimeException { + + /** Exception that might have caused this one. */ + private Throwable cause; + + /** Location in the build file where the exception occured */ + private Location location = Location.UNKNOWN_LOCATION; + + /** + * Constructs a build exception with no descriptive information. + */ + public BuildException() { + super(); + } + + /** + * Constructs an exception with the given descriptive message. + * + * @param msg A description of or information about the exception. + * Should not be null. + */ + public BuildException(String msg) { + super(msg); + } + + /** + * Constructs an exception with the given message and exception as + * a root cause. + * + * @param msg A description of or information about the exception. + * Should not be null unless a cause is specified. + * @param cause The exception that might have caused this one. + * May be null. + */ + public BuildException(String msg, Throwable cause) { + super(msg); + this.cause = cause; + } + + /** + * Constructs an exception with the given message and exception as + * a root cause and a location in a file. + * + * @param msg A description of or information about the exception. + * Should not be null unless a cause is specified. + * @param cause The exception that might have caused this one. + * May be null. + * @param location The location in the project file where the error + * occurred. Must not be null. + */ + public BuildException(String msg, Throwable cause, Location location) { + this(msg, cause); + this.location = location; + } + + /** + * Constructs an exception with the given exception as a root cause. + * + * @param cause The exception that might have caused this one. + * Should not be null. + */ + public BuildException(Throwable cause) { + super(cause.toString()); + this.cause = cause; + } + + /** + * Constructs an exception with the given descriptive message and a + * location in a file. + * + * @param msg A description of or information about the exception. + * Should not be null. + * @param location The location in the project file where the error + * occurred. Must not be null. + */ + public BuildException(String msg, Location location) { + super(msg); + this.location = location; + } + + /** + * Constructs an exception with the given exception as + * a root cause and a location in a file. + * + * @param cause The exception that might have caused this one. + * Should not be null. + * @param location The location in the project file where the error + * occurred. Must not be null. + */ + public BuildException(Throwable cause, Location location) { + this(cause); + this.location = location; + } + + /** + * Returns the nested exception, if any. + * + * @return the nested exception, or null if no + * exception is associated with this one + */ + public Throwable getException() { + return cause; + } + + /** + * Returns the location of the error and the error message. + * + * @return the location of the error and the error message + */ + public String toString() { + return location.toString() + getMessage(); + } + + /** + * Sets the file location where the error occurred. + * + * @param location The file location where the error occurred. + * Must not be null. + */ + public void setLocation(Location location) { + this.location = location; + } + + /** + * Returns the file location where the error occurred. + * + * @return the file location where the error occurred. + */ + public Location getLocation() { + return location; + } + + /** + * Prints the stack trace for this exception and any + * nested exception to System.err. + */ + public void printStackTrace() { + printStackTrace(System.err); + } + + /** + * Prints the stack trace of this exception and any nested + * exception to the specified PrintStream. + * + * @param ps The PrintStream to print the stack trace to. + * Must not be null. + */ + public void printStackTrace(PrintStream ps) { + synchronized (ps) { + super.printStackTrace(ps); + if (cause != null) { + ps.println("--- Nested Exception ---"); + cause.printStackTrace(ps); + } + } + } + + /** + * Prints the stack trace of this exception and any nested + * exception to the specified PrintWriter. + * + * @param pw The PrintWriter to print the stack trace to. + * Must not be null. + */ + public void printStackTrace(PrintWriter pw) { + synchronized (pw) { + super.printStackTrace(pw); + if (cause != null) { + pw.println("--- Nested Exception ---"); + cause.printStackTrace(pw); + } + } + } + + //-------------------Modified from Ant1 --------------------- + /** + * Myrmidon-friendly cascading exception method. + * @return the cascading cause of this exception. + */ + public Throwable getCause() + { + return cause; + } + //--------------------- End modified section --------------- +} diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/property/ClassicPropertyResolver.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/property/ClassicPropertyResolver.java index 8b856efbd..5a4ced622 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/property/ClassicPropertyResolver.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/property/ClassicPropertyResolver.java @@ -7,9 +7,8 @@ */ package org.apache.myrmidon.components.property; -import org.apache.avalon.framework.context.Context; -import org.apache.avalon.framework.context.ContextException; import org.apache.myrmidon.interfaces.property.PropertyResolver; +import org.apache.myrmidon.api.TaskContext; /** * A {@link PropertyResolver} implementation which resolves properties @@ -30,15 +29,16 @@ public class ClassicPropertyResolver * @param context the set of known properties */ protected Object getPropertyValue( final String propertyName, - final Context context ) + final TaskContext context ) { - try + Object propertyValue = context.getProperty( propertyName ); + if ( propertyValue == null ) { - return context.get( propertyName ); + return "${" + propertyName + "}"; } - catch( ContextException e ) + else { - return "${" + propertyName + "}"; + return propertyValue; } } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/property/DefaultPropertyResolver.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/property/DefaultPropertyResolver.java index bf02d690e..77b4dbdb4 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/property/DefaultPropertyResolver.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/property/DefaultPropertyResolver.java @@ -9,9 +9,8 @@ package org.apache.myrmidon.components.property; import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.avalon.framework.context.Context; -import org.apache.avalon.framework.context.ContextException; import org.apache.myrmidon.api.TaskException; +import org.apache.myrmidon.api.TaskContext; import org.apache.myrmidon.interfaces.property.PropertyResolver; /** @@ -43,7 +42,7 @@ public class DefaultPropertyResolver * @exception TaskException if an error occurs */ public Object resolveProperties( final String content, - final Context context ) + final TaskContext context ) throws TaskException { int start = findNextProperty( content, 0 ); @@ -100,7 +99,7 @@ public class DefaultPropertyResolver * @exception TaskException if an error occurs */ private Object recursiveResolveProperty( final String content, - final Context context ) + final TaskContext context ) throws TaskException { int start = findNextProperty( content, 0 ); @@ -238,18 +237,19 @@ public class DefaultPropertyResolver * @exception TaskException if the property is undefined */ protected Object getPropertyValue( final String propertyName, - final Context context ) + final TaskContext context ) throws TaskException { - try - { - return context.get( propertyName ); - } - catch( ContextException e ) + Object propertyValue = context.getProperty( propertyName ); + if ( propertyValue == null ) { final String message = REZ.getString( "prop.missing-value.error", propertyName ); throw new TaskException( message ); } + else + { + return propertyValue; + } } } diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultTaskContext.java b/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultTaskContext.java index 0824c5ba1..7933ebe92 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultTaskContext.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/components/workspace/DefaultTaskContext.java @@ -10,11 +10,10 @@ package org.apache.myrmidon.components.workspace; import java.io.File; import java.util.Hashtable; import java.util.Map; +import java.util.HashMap; import org.apache.avalon.excalibur.i18n.ResourceManager; import org.apache.avalon.excalibur.i18n.Resources; import org.apache.avalon.excalibur.io.FileUtil; -import org.apache.avalon.framework.context.Context; -import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceManager; @@ -30,17 +29,19 @@ import org.apache.myrmidon.interfaces.property.PropertyResolver; * @version $Revision$ $Date$ */ public class DefaultTaskContext - implements TaskContext, Context + implements TaskContext { private final static Resources REZ = ResourceManager.getPackageResources( DefaultTaskContext.class ); // Property name validator allows digits, but no internal whitespace. - private static DefaultNameValidator c_propertyNameValidator = new DefaultNameValidator(); + private static DefaultNameValidator c_propertyNameValidator = + new DefaultNameValidator(); static { c_propertyNameValidator.setAllowInternalWhitespace( false ); + c_propertyNameValidator.setAdditionalInternalCharacters( "_-.+" ); } private final Map m_contextData = new Hashtable(); @@ -193,7 +194,7 @@ public class DefaultTaskContext */ public Map getProperties() { - return null; + return new HashMap( m_contextData ); } /** @@ -354,20 +355,6 @@ public class DefaultTaskContext return context; } - /** - * Returns a property. - */ - public Object get( final Object key ) throws ContextException - { - final Object value = getProperty( (String)key ); - if( value == null ) - { - final String message = REZ.getString( "unknown-property.error", key ); - throw new ContextException( message ); - } - return value; - } - /** * Checks that the supplied property name is valid. */ diff --git a/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/property/PropertyResolver.java b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/property/PropertyResolver.java index 576121957..835dd82b2 100644 --- a/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/property/PropertyResolver.java +++ b/proposal/myrmidon/src/java/org/apache/myrmidon/interfaces/property/PropertyResolver.java @@ -7,8 +7,8 @@ */ package org.apache.myrmidon.interfaces.property; -import org.apache.avalon.framework.context.Context; import org.apache.myrmidon.api.TaskException; +import org.apache.myrmidon.api.TaskContext; /** * @@ -33,6 +33,6 @@ public interface PropertyResolver * @exception TaskException if an error occurs */ Object resolveProperties( final String value, - final Context context ) + final TaskContext context ) throws TaskException; } diff --git a/proposal/myrmidon/src/test/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java b/proposal/myrmidon/src/test/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java index 21aba6d3d..ef99004d7 100644 --- a/proposal/myrmidon/src/test/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java +++ b/proposal/myrmidon/src/test/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java @@ -10,9 +10,9 @@ package org.apache.myrmidon.components.property.test; import java.io.File; import java.util.Date; import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.avalon.framework.context.Context; import org.apache.myrmidon.AbstractMyrmidonTest; import org.apache.myrmidon.api.TaskException; +import org.apache.myrmidon.api.TaskContext; import org.apache.myrmidon.components.workspace.DefaultTaskContext; import org.apache.myrmidon.interfaces.property.PropertyResolver; @@ -117,7 +117,7 @@ public abstract class AbstractPropertyResolverTestCase */ protected void doTestResolution( final String value, final Object expected, - final Context context ) + final TaskContext context ) throws Exception { final Object resolved = m_resolver.resolveProperties( value, context ); @@ -131,7 +131,7 @@ public abstract class AbstractPropertyResolverTestCase */ protected void doTestFailure( final String value, final String expectedErrorMessage, - final Context context ) + final TaskContext context ) { try { diff --git a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java index 21aba6d3d..ef99004d7 100644 --- a/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java +++ b/proposal/myrmidon/src/testcases/org/apache/myrmidon/components/property/test/AbstractPropertyResolverTestCase.java @@ -10,9 +10,9 @@ package org.apache.myrmidon.components.property.test; import java.io.File; import java.util.Date; import org.apache.avalon.excalibur.i18n.Resources; -import org.apache.avalon.framework.context.Context; import org.apache.myrmidon.AbstractMyrmidonTest; import org.apache.myrmidon.api.TaskException; +import org.apache.myrmidon.api.TaskContext; import org.apache.myrmidon.components.workspace.DefaultTaskContext; import org.apache.myrmidon.interfaces.property.PropertyResolver; @@ -117,7 +117,7 @@ public abstract class AbstractPropertyResolverTestCase */ protected void doTestResolution( final String value, final Object expected, - final Context context ) + final TaskContext context ) throws Exception { final Object resolved = m_resolver.resolveProperties( value, context ); @@ -131,7 +131,7 @@ public abstract class AbstractPropertyResolverTestCase */ protected void doTestFailure( final String value, final String expectedErrorMessage, - final Context context ) + final TaskContext context ) { try {