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]

Reply via email to