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;