You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2011/04/30 00:56:25 UTC

svn commit: r1098008 - in /tapestry/tapestry5/trunk/plastic/src: main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java test/groovy/org/apache/tapestry5/plastic/ObtainPlasticClass.groovy test/java/testsubjects/AlternateConstructor.java

Author: hlship
Date: Fri Apr 29 22:56:25 2011
New Revision: 1098008

URL: http://svn.apache.org/viewvc?rev=1098008&view=rev
Log:
TAP5-853: Replace the original no-args constructor (if present) with one that throws IllegalStateException, as with other constructors

Modified:
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
    tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/ObtainPlasticClass.groovy
    tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/AlternateConstructor.java

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java?rev=1098008&r1=1098007&r2=1098008&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticClassImpl.java Fri Apr 29 22:56:25 2011
@@ -1493,8 +1493,7 @@ public class PlasticClassImpl extends Lo
 
         methods = new ArrayList(classNode.methods.size());
 
-        String invalidConstructorMessage = String.format(
-                "Class %s has been transformed and may not be directly instantiated.", className);
+        String invalidConstructorMessage = invalidConstructorMessage();
 
         for (MethodNode node : (List<MethodNode>) classNode.methods)
         {
@@ -1608,6 +1607,11 @@ public class PlasticClassImpl extends Lo
         // Later on, we'll add the RETURN opcode
     }
 
+    private String invalidConstructorMessage()
+    {
+        return String.format("Class %s has been transformed and may not be directly instantiated.", className);
+    }
+
     public <T extends Annotation> boolean hasAnnotation(Class<T> annotationType)
     {
         check();
@@ -1679,12 +1683,22 @@ public class PlasticClassImpl extends Lo
 
             String initializerName = makeUnique(methodNames, "initializeInstance");
 
+            int originalAccess = originalConstructor.access;
+
             originalConstructor.access = ACC_PRIVATE;
             originalConstructor.name = initializerName;
 
             stripOutSuperConstructorCall(originalConstructor);
 
             constructorBuilder.loadThis().invokeVirtual(className, "void", initializerName);
+
+            // And replace it with a constructor that throws an exception
+
+            MethodNode replacementConstructor = new MethodNode(originalAccess, CONSTRUCTOR_NAME, NOTHING_TO_VOID, null, null);
+
+            newBuilder(replacementConstructor).throwException(IllegalStateException.class, invalidConstructorMessage());
+
+            classNode.methods.add(replacementConstructor);
         }
 
         constructorBuilder.returnResult();

Modified: tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/ObtainPlasticClass.groovy
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/ObtainPlasticClass.groovy?rev=1098008&r1=1098007&r2=1098008&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/ObtainPlasticClass.groovy (original)
+++ tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/ObtainPlasticClass.groovy Fri Apr 29 22:56:25 2011
@@ -106,7 +106,7 @@ class ObtainPlasticClass extends Specifi
         e.message == "Field shouldBePrivate of class testsubjects.NonPrivateInstanceField is not private. Class transformation requires that all instance fields be private."
     }
 
-    def "alternate constructors now throw exceptions"() {
+    def "original constructors now throw exceptions"() {
         setup:
 
         def delegate = new NoopDelegate()
@@ -127,5 +127,17 @@ class ObtainPlasticClass extends Specifi
         e.cause.getClass() == IllegalStateException.class
 
         e.cause.message == "Class testsubjects.AlternateConstructor has been transformed and may not be directly instantiated."
+
+        when:
+
+        clazz.getConstructor([] as Class[]).newInstance([] as Object[])
+
+        then:
+       
+        e = thrown(InvocationTargetException)
+
+        e.cause.getClass() == IllegalStateException.class
+
+        e.cause.message == "Class testsubjects.AlternateConstructor has been transformed and may not be directly instantiated."
     }
 }
\ No newline at end of file

Modified: tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/AlternateConstructor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/AlternateConstructor.java?rev=1098008&r1=1098007&r2=1098008&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/AlternateConstructor.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/AlternateConstructor.java Fri Apr 29 22:56:25 2011
@@ -4,6 +4,10 @@ public class AlternateConstructor
 {
     private String value;
 
+    public AlternateConstructor()
+    {
+    }
+
     public AlternateConstructor(String initialValue)
     {
         value = initialValue;