Author: hlship Date: Sat Apr 22 15:11:30 2006 New Revision: 396172 URL: http://svn.apache.org/viewcvs?rev=396172&view=rev Log: Use aspects to enforce certain coding standards
Added: 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/InternalUtilityAspect.aj tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/InternalUtilityAspectTest.java Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/TransformConstants.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/UtilMessages.java tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml Added: tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/AbstractUtilityAspect.aj URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/AbstractUtilityAspect.aj?rev=396172&view=auto ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/AbstractUtilityAspect.aj (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/AbstractUtilityAspect.aj Sat Apr 22 15:11:30 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 AbstractUtilityAspect +{ + /** + * 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); + } + +} Added: 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/InternalUtilityAspect.aj?rev=396172&view=auto ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityAspect.aj (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/aspect/org/apache/tapestry/internal/aspects/InternalUtilityAspect.aj Sat Apr 22 15:11:30 2006 @@ -0,0 +1,13 @@ +package org.apache.tapestry.internal.aspects; + +/** + * Targets [EMAIL PROTECTED] AbstractUtilityAspect} at all the visible classes within org.apache.tapestry. + * + * @author Howard M. Lewis Ship + */ +public aspect InternalUtilityAspect extends AbstractUtilityAspect +{ + pointcut targetClasses() : + within(org.apache.tapestry..*); + +} Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java?rev=396172&r1=396171&r2=396172&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java Sat Apr 22 15:11:30 2006 @@ -18,20 +18,17 @@ import org.apache.hivemind.Messages; import org.apache.hivemind.impl.MessageFormatter; +import org.apache.tapestry.internal.annotations.Utility; import org.apache.tapestry.transform.MethodSignature; /** * @author Howard M. Lewis Ship */ [EMAIL PROTECTED] final class TransformMessages { private static final Messages MESSAGES = new MessageFormatter(TransformMessages.class); - - /** Prevent instantiation. */ - private TransformMessages() - { - } - + static String noConstructorFound(Class instanceClass) { return MESSAGES.format("no-constructor-found", instanceClass.getName()); Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/TransformConstants.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/TransformConstants.java?rev=396172&r1=396171&r2=396172&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/TransformConstants.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/TransformConstants.java Sat Apr 22 15:11:30 2006 @@ -14,11 +14,14 @@ package org.apache.tapestry.transform; +import org.apache.tapestry.internal.annotations.Utility; + /** * Constants used by implementations of [EMAIL PROTECTED] org.apache.tapestry.transform.ClassTransformWorker}. * * @author Howard M. Lewis Ship */ [EMAIL PROTECTED] public final class TransformConstants { /** @@ -37,9 +40,4 @@ */ public static final MethodSignature CONTAINING_PAGE_DID_DETACH_SIGNATURE = new MethodSignature( "containingPageDidDetach"); - - /** Prevent instantiation. */ - private TransformConstants() - { - } } 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=396172&r1=396171&r2=396172&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 15:11:30 2006 @@ -14,11 +14,14 @@ package org.apache.tapestry.util; +import org.apache.tapestry.internal.annotations.Utility; + /** * Static utility methods for defensive programming. * * @author Howard M. Lewis Ship */ [EMAIL PROTECTED] public final class Defense { @@ -37,16 +40,12 @@ */ public static <T> T notNull(T value, String parameterName) { - if (value == null) throw new NullPointerException(UtilMessages.parameterWasNull(parameterName)); + if (value == null) + throw new NullPointerException(UtilMessages.parameterWasNull(parameterName)); return value; } - /** Prevent instantiation. */ - private Defense() - { - } - /** * Checks that a parameter value is not null and not empty. * @@ -64,9 +63,10 @@ { String trimmedValue = value.trim(); - if (!trimmedValue.equals("")) return trimmedValue; + if (!trimmedValue.equals("")) + return trimmedValue; } - + throw new IllegalArgumentException(UtilMessages.parameterWasBlank(parameterName)); } } Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/UtilMessages.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/UtilMessages.java?rev=396172&r1=396171&r2=396172&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/UtilMessages.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/util/UtilMessages.java Sat Apr 22 15:11:30 2006 @@ -16,21 +16,17 @@ import org.apache.hivemind.Messages; import org.apache.hivemind.impl.MessageFormatter; +import org.apache.tapestry.internal.annotations.Utility; /** * Static messages * * @author Howard M. Lewis Ship */ [EMAIL PROTECTED] final class UtilMessages { - private static final Messages MESSAGES = new MessageFormatter(UtilMessages.class); - - /** Prevent instantiaton. */ - private UtilMessages() - { - } static String parameterWasNull(String parameterName) { Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml?rev=396172&r1=396171&r2=396172&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/conf/testng.xml Sat Apr 22 15:11:30 2006 @@ -21,6 +21,7 @@ <package name="org.apache.tapestry.transform"/> <package name="org.apache.tapestry.internal.transform"/> <package name="org.apache.tapestry.internal.transform.worker"/> + <package name="org.apache.tapestry.internal.aspects"/> <package name="org.apache.tapestry.util"/> </packages> </test> Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/InternalUtilityAspectTest.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/InternalUtilityAspectTest.java?rev=396172&view=auto ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/InternalUtilityAspectTest.java (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/InternalUtilityAspectTest.java Sat Apr 22 15:11:30 2006 @@ -0,0 +1,28 @@ +package org.apache.tapestry.internal.aspects; + +import org.apache.tapestry.test.TestBase; +import org.apache.tapestry.transform.TransformConstants; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; + +/** @author Howard M. Lewis Ship */ +public class InternalUtilityAspectTest extends TestBase +{ + /** Try to instantiate a utility class to see that it can't be done. */ + @Test + public void ensureUtilitiesMayNotBeInstantiated() + { + try + { + new TransformConstants(); + unreachable(); + } + catch (RuntimeException ex) + { + assertEquals( + ex.getMessage(), + "Class org.apache.tapestry.transform.TransformConstants has been marked as a utility class (with the @Utility annotation) and can not be instantiated."); + } + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]