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]