Author: hlship Date: Sat Apr 22 23:55:55 2006 New Revision: 396226 URL: http://svn.apache.org/viewcvs?rev=396226&view=rev Log: More tweaks to the CheckNullParameters aspect support
Added: tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/CatchNullParameters.aj tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalCatchNullParameters.aj - copied, changed from r396187, tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalCatchNullParametersAspect.aj tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityChecks.aj - copied, changed from r396172, tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityAspect.aj tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/UtilityChecks.aj Removed: tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/AbstractCatchNullParametersAspect.aj tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/AbstractUtilityAspect.aj tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalCatchNullParametersAspect.aj tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityAspect.aj Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TestBase.java tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/Defense.java tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/IdAllocator.java tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/CatchNullParametersAspectTest.java tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/NullTarget.java tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/util/DefenseTest.java Added: tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/CatchNullParameters.aj URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/CatchNullParameters.aj?rev=396226&view=auto ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/CatchNullParameters.aj (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/CatchNullParameters.aj Sat Apr 22 23:55:55 2006 @@ -0,0 +1,78 @@ +package org.apache.tapestry.internal.aspects; + +import org.apache.tapestry.internal.annotations.SuppressNullCheck; + +/** + * Adds code to targeted methods and constructors that prevents null values from being passed in as + * parameters. + * + * @author Howard M. Lewis Ship + */ [EMAIL PROTECTED] +public abstract aspect CatchNullParameters +{ + /** + * Overridden in concrete aspects to identify which classes are affected (typically, all within + * a particular package). + */ + abstract pointcut targetClasses(); + + pointcut typeNotMarkedAsSuppressed() : + !within(@SuppressNullCheck Object+); + + /** Look for methods and constructors that do NOT have the SuppressNullCheck annotation. */ + pointcut executionNotSuppressed() : + execution([EMAIL PROTECTED] !private * *(..)) || + execution([EMAIL PROTECTED] !private new(..)); + + /** + * Exclude methods (and constructors) with no parameters. Also, exclude equals() since it has to + * accept null (and we don't want to force you to put the + * + * @SupportNullCheck annotation on every class that overrides equals(). + */ + pointcut excludedMethods() : + execution(boolean equals(Object)); + + /** + * Find methods to check, within the set of target classes, where neither the entire class, nor + * the specific method, have the + * + * @SuppressNullCheck annotation, and limit to only applicable methods. + */ + pointcut methodsToCheck() : + targetClasses() && + typeNotMarkedAsSuppressed() && + executionNotSuppressed() && + !excludedMethods(); + + /** + * Selects each parameter. The specific useage here ensures that no-argument methods and + * constructors are skipped. Still trying to limit this so that primitive arguments aren't + * checked (currently, AspectJ is converting primitives to wrapper types and passing them into + * the advice method). + */ + pointcut parametersToCheck(Object argumentValue) : + args(.., argumentValue); + + /** + * Here's where the real work gets done. I think there may be a way to do this more efficiently + * where much more static logic is injected, triggered by arguments. + */ + before(Object argumentValue) : methodsToCheck() && parametersToCheck(argumentValue) + { + if (argumentValue == null) + { + // The method signature could provide the parameterName (which would be awesome), + // but we need to know the parameter index. + + String message = String.format( + "Parameter passed to method %s (at %s) was null.", + thisJoinPoint.getSignature().toString(), + thisJoinPoint.getSourceLocation()); + + throw new IllegalArgumentException(message); + + } + } +} Copied: tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalCatchNullParameters.aj (from r396187, tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalCatchNullParametersAspect.aj) URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalCatchNullParameters.aj?p2=tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalCatchNullParameters.aj&p1=tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalCatchNullParametersAspect.aj&r1=396187&r2=396226&rev=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalCatchNullParametersAspect.aj (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalCatchNullParameters.aj Sat Apr 22 23:55:55 2006 @@ -1,14 +1,11 @@ package org.apache.tapestry.internal.aspects; -import org.apache.tapestry.internal.annotations.SuppressNullCheck; - /** * Targets null checks to all the org.apache.tapestry classes. * * @author Howard M. Lewis Ship */ [EMAIL PROTECTED] -public aspect InternalCatchNullParametersAspect extends AbstractCatchNullParametersAspect +public aspect InternalCatchNullParameters extends CatchNullParameters { pointcut targetClasses() : within(org.apache.tapestry..*); Copied: tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityChecks.aj (from r396172, tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityAspect.aj) URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityChecks.aj?p2=tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityChecks.aj&p1=tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityAspect.aj&r1=396172&r2=396226&rev=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityAspect.aj (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityChecks.aj Sat Apr 22 23:55:55 2006 @@ -1,11 +1,11 @@ package org.apache.tapestry.internal.aspects; /** - * Targets [EMAIL PROTECTED] AbstractUtilityAspect} at all the visible classes within org.apache.tapestry. + * Targets [EMAIL PROTECTED] UtilityChecks} at all the visible classes within org.apache.tapestry. * * @author Howard M. Lewis Ship */ -public aspect InternalUtilityAspect extends AbstractUtilityAspect +public aspect InternalUtilityChecks extends UtilityChecks { pointcut targetClasses() : within(org.apache.tapestry..*); Added: tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/UtilityChecks.aj URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/UtilityChecks.aj?rev=396226&view=auto ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/UtilityChecks.aj (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/UtilityChecks.aj Sat Apr 22 23:55:55 2006 @@ -0,0 +1,42 @@ +package org.apache.tapestry.internal.aspects; + +import org.apache.tapestry.internal.annotations.Utility; + +/** + * Abstract aspect that implements the rules for the [EMAIL PROTECTED] Utility} annotation. + * + * @author Howard M. Lewis Ship + */ +public abstract aspect UtilityChecks +{ + /** + * Overridden in concrete aspects to identify which classes are affected (typically, all within + * a particular package). + */ + abstract pointcut targetClasses(); + + pointcut markedClasses(): @within(Utility) && targetClasses(); + + pointcut instanceMethods(): + markedClasses() && execution(!static * *(..)); + + /** Matches anything but the default, no arguments constructor. */ + pointcut constructors(): markedClasses() && execution(new(*)); + + declare error : instanceMethods() : + "Utility classes may not have instance methods."; + + declare error : constructors() : + "Utility classes may not be instantiated, and are not allowed to declare constructors."; + + before() : markedClasses() && execution(new()) + { + String message = String + .format( + "Class %s has been marked as a utility class (with the @Utility annotation) and can not be instantiated.", + thisJoinPoint.getThis().getClass().getName()); + + throw new RuntimeException(message); + } + +} Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java?rev=396226&r1=396225&r2=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java Sat Apr 22 23:55:55 2006 @@ -24,7 +24,6 @@ import org.apache.tapestry.transform.ClassTransformWorker; import static org.apache.tapestry.util.CollectionFactory.newMap; -import static org.apache.tapestry.util.Defense.notNull; /** * Implementation of [EMAIL PROTECTED] org.apache.tapestry.internal.transform.ClassTransformer}. @@ -64,7 +63,7 @@ public Instantiator createInstantiator(Class componentClass) { - String className = notNull(componentClass, "componentClass").getName(); + String className = componentClass.getName(); InternalClassTransformation ct = _nameToClassTransformation.get(className); Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java?rev=396226&r1=396225&r2=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java Sat Apr 22 23:55:55 2006 @@ -32,7 +32,6 @@ import static org.apache.tapestry.util.CollectionFactory.newMap; import static org.apache.tapestry.util.CollectionFactory.newSet; -import static org.apache.tapestry.util.Defense.notNull; /** * A wrapper around a Javassist class loader that allows certain classes to be modified as they are @@ -71,7 +70,7 @@ public ComponentInstantiatorSourceImpl(ClassLoader parent) { - _parent = notNull(parent, "parent"); + _parent = parent; } public void initializeService() Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java?rev=396226&r1=396225&r2=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java Sat Apr 22 23:55:55 2006 @@ -141,9 +141,6 @@ public <T extends Annotation> T getFieldAnnotation(String fieldName, Class<T> annotationClass) { - notNull(fieldName, "fieldName"); - notNull(annotationClass, "annotationClass"); - Object[] annotations = findFieldAnnotations(fieldName); return findAnnotationInList(annotationClass, annotations); @@ -323,7 +320,7 @@ public void addImplementedInterface(Class interfaceClass) { - String interfaceName = notNull(interfaceClass, "interfaceClass").getName(); + String interfaceName = interfaceClass.getName(); try { @@ -431,7 +428,6 @@ public void claimField(String fieldName, Object tag) { notBlank(fieldName, "fieldName"); - notNull(tag, "tag"); Object existing = _claimedFields.get(fieldName); @@ -517,8 +513,6 @@ public List<String> findFieldsWithAnnotation(Class<? extends Annotation> annotationClass) { - notNull(annotationClass, "annotationClass"); - List<String> result = newList(); for (CtField field : _ctClass.getDeclaredFields()) Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java?rev=396226&r1=396225&r2=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java Sat Apr 22 23:55:55 2006 @@ -19,8 +19,6 @@ import org.apache.tapestry.ResourceAware; import org.apache.tapestry.internal.InternalComponentResources; -import static org.apache.tapestry.util.Defense.notNull; - /** * Implementation of [EMAIL PROTECTED] Instantiator} based on a class, a list of parameters to the class' * constructor, and a instance of [EMAIL PROTECTED] org.apache.tapestry.internal.InternalComponentResources}. @@ -45,11 +43,9 @@ */ ReflectiveInstantiator(Class instanceClass, Object[] constructorParameters) { - _constructorParameters = notNull(constructorParameters, "constructorParameters"); + _constructorParameters = constructorParameters; - _constructor = findConstructor( - notNull(instanceClass, "instanceClass"), - constructorParameters.length); + _constructor = findConstructor(instanceClass, constructorParameters.length); } Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TestBase.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TestBase.java?rev=396226&r1=396225&r2=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TestBase.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/test/TestBase.java Sat Apr 22 23:55:55 2006 @@ -14,6 +14,7 @@ package org.apache.tapestry.test; +import org.apache.tapestry.internal.annotations.SuppressNullCheck; import org.easymock.EasyMock; import org.easymock.IMocksControl; import org.testng.annotations.Configuration; @@ -83,6 +84,7 @@ * @param returnValue * value to be returned from the method call */ + @SuppressNullCheck protected final void setReturnValue(Object returnValue) { expectLastCall().andReturn(returnValue); Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/Defense.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/Defense.java?rev=396226&r1=396225&r2=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/Defense.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/Defense.java Sat Apr 22 23:55:55 2006 @@ -22,12 +22,16 @@ * * @author Howard M. Lewis Ship */ [EMAIL PROTECTED] @SuppressNullCheck [EMAIL PROTECTED] [EMAIL PROTECTED] public final class Defense { /** - * Checks that a method parameter value is not null, and returns it. + * Checks that a method parameter value is not null, and returns it. This method is used in + * situations where some of the parameters to a method are allowed to be null and other's arent. + * In that situation, the method will be annotated with [EMAIL PROTECTED] SuppressNullCheck}, and the + * relevent null checks will occur inside the method implementation. * * @param <T> * the value type @@ -36,13 +40,13 @@ * @param parameterName * the name of the parameter, used for exception messages * @return the value - * @throws NullPointerException + * @throws IllegalArgumentException * if the value is null */ public static <T> T notNull(T value, String parameterName) { if (value == null) - throw new NullPointerException(UtilMessages.parameterWasNull(parameterName)); + throw new IllegalArgumentException(UtilMessages.parameterWasNull(parameterName)); return value; } Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/IdAllocator.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/IdAllocator.java?rev=396226&r1=396225&r2=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/IdAllocator.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/IdAllocator.java Sat Apr 22 23:55:55 2006 @@ -14,13 +14,12 @@ package org.apache.tapestry.util; -import static org.apache.tapestry.util.CollectionFactory.newMap; -import static org.apache.tapestry.util.Defense.notNull; - import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; +import static org.apache.tapestry.util.CollectionFactory.newMap; + /** * Used to "uniquify" names within a given context. A base name is passed in, and the return value * is the base name, or the base name extended with a suffix to make it unique. @@ -83,7 +82,7 @@ private IdAllocator(String namespace, Map<String, NameGenerator> generatorMap) { - _namespace = notNull(namespace, "namespace"); + _namespace = namespace; _generatorMap = generatorMap; } Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/CatchNullParametersAspectTest.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/CatchNullParametersAspectTest.java?rev=396226&r1=396225&r2=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/CatchNullParametersAspectTest.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/CatchNullParametersAspectTest.java Sat Apr 22 23:55:55 2006 @@ -14,6 +14,8 @@ package org.apache.tapestry.internal.aspects; +import java.util.Collections; + import org.apache.tapestry.test.TestBase; import org.testng.annotations.Test; @@ -54,6 +56,45 @@ public void equalsAlwaysSuppressed() { new NullTarget("not null").equals(null); + } + + @Test + public void allParametersChecked() + { + NullTarget t = new NullTarget("not null"); + + try + { + t.manyParameters(null, null, null); + unreachable(); + } + catch (IllegalArgumentException ex) + { + // Expected. + } + + try + { + t.manyParameters(this, null, null); + unreachable(); + } + catch (IllegalArgumentException ex) + { + // Expected. + } + + try + { + t.manyParameters(this, "ok", null); + unreachable(); + } + catch (IllegalArgumentException ex) + { + // Expected. + } + + t.manyParameters(this, "ok", Collections.EMPTY_MAP); + } @Test Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/NullTarget.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/NullTarget.java?rev=396226&r1=396225&r2=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/NullTarget.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/NullTarget.java Sat Apr 22 23:55:55 2006 @@ -14,6 +14,8 @@ package org.apache.tapestry.internal.aspects; +import java.util.Map; + /** * Used to test the CatchNullParametersAspect. * @@ -28,6 +30,16 @@ // Null check enforced public NullTarget(String parameter) + { + + } + + public void primitiveParameter(int foo) + { + + } + + public void manyParameters(Object p1, String p2, Map p3) { } Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/util/DefenseTest.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/util/DefenseTest.java?rev=396226&r1=396225&r2=396226&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/util/DefenseTest.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/util/DefenseTest.java Sat Apr 22 23:55:55 2006 @@ -14,14 +14,14 @@ package org.apache.tapestry.util; +import org.apache.tapestry.test.TestBase; +import org.testng.annotations.Test; + import static org.apache.tapestry.util.Defense.notBlank; import static org.apache.tapestry.util.Defense.notNull; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertSame; -import org.apache.tapestry.test.TestBase; -import org.testng.annotations.Test; - /** * @author Howard M. Lewis Ship */ @@ -38,8 +38,7 @@ } /** - * Check that [EMAIL PROTECTED] Defense#notNull(T, String)} throws NPE when null, and - * check the message. + * Check that [EMAIL PROTECTED] Defense#notNull(T, String)} throws NPE when null, and check the message. */ @Test @@ -50,7 +49,7 @@ notNull(null, "foo"); unreachable(); } - catch (NullPointerException ex) + catch (IllegalArgumentException ex) { assertEquals(ex.getMessage(), "Parameter foo was null."); } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]