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:15 UTC
svn commit: r1098006 - in /tapestry/tapestry5/trunk/plastic/src:
main/java/org/apache/tapestry5/internal/plastic/
test/groovy/org/apache/tapestry5/plastic/
test/java/org/apache/tapestry5/plastic/test/ test/java/testsubjects/
Author: hlship
Date: Fri Apr 29 22:56:15 2011
New Revision: 1098006
URL: http://svn.apache.org/viewvc?rev=1098006&view=rev
Log:
TAP5-853: Transform field access inside static methods as well as instance methods
Added:
tapestry/tapestry5/trunk/plastic/src/test/java/org/apache/tapestry5/plastic/test/IndirectAccess.java
tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/AccessMethodsSubject.java
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/FieldConduitTests.groovy
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=1098006&r1=1098005&r2=1098006&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:15 2011
@@ -1514,8 +1514,23 @@ public class PlasticClassImpl extends Lo
continue;
}
+ /**
+ * Static methods are not visible to the main API methods, but they must still be transformed,
+ * incase they directly access fields. In addition, track their names to avoid collisions.
+ */
if (Modifier.isStatic(node.access))
+ {
+ if (!Modifier.isPrivate(node.access))
+ {
+ methodBundle.addMethod(node.name, node.desc);
+ }
+
+ methodNames.add(node.name);
+
+ fieldTransformMethods.add(node);
+
continue;
+ }
if (!Modifier.isAbstract(node.access))
fieldTransformMethods.add(node);
@@ -1532,7 +1547,7 @@ public class PlasticClassImpl extends Lo
}
methodNames.addAll(parentMethodBundle.methodNames());
-
+
Collections.sort(methods);
fields = new ArrayList(classNode.fields.size());
@@ -1918,7 +1933,7 @@ public class PlasticClassImpl extends Lo
createNewMethodImpl(description, methodNode);
addMethod(methodNode);
-
+
return new PlasticMethodImpl(methodNode);
}
Modified: tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/FieldConduitTests.groovy
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/FieldConduitTests.groovy?rev=1098006&r1=1098005&r2=1098006&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/FieldConduitTests.groovy (original)
+++ tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/plastic/FieldConduitTests.groovy Fri Apr 29 22:56:15 2011
@@ -91,4 +91,42 @@ class FieldConduitTests extends Specific
1 * fc.set(_, _, 100)
}
+
+ /**
+ * When an inner class accesses private members of its containing class, the compiler generates
+ * synthetic static methods (package private visibility). This ensures that those methods are
+ * also subject to field access transformations.
+ */
+ def "inner class access methods are routed through field conduit"() {
+
+ FieldConduit fc = Mock()
+
+ def mgr = new PlasticManager (Thread.currentThread().contextClassLoader, [
+ transform: { PlasticClass pc ->
+ pc.allFields.first().setConduit(fc)
+ },
+ configureInstantiator: { className, instantiator -> instantiator }
+ ] as PlasticManagerDelegate , ["testsubjects"] as Set)
+
+
+ def o = mgr.getClassInstantiator("testsubjects.AccessMethodsSubject").newInstance()
+
+ def i = o.valueAccess
+
+ when:
+
+ i.set("funky")
+
+ then:
+
+ 1 * fc.set(o, _, "funky")
+
+ when:
+
+ assert i.get() == "plastic"
+
+ then:
+
+ 1 * fc.get(o, _) >> "plastic"
+ }
}
Added: tapestry/tapestry5/trunk/plastic/src/test/java/org/apache/tapestry5/plastic/test/IndirectAccess.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/test/java/org/apache/tapestry5/plastic/test/IndirectAccess.java?rev=1098006&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/test/java/org/apache/tapestry5/plastic/test/IndirectAccess.java (added)
+++ tapestry/tapestry5/trunk/plastic/src/test/java/org/apache/tapestry5/plastic/test/IndirectAccess.java Fri Apr 29 22:56:15 2011
@@ -0,0 +1,8 @@
+package org.apache.tapestry5.plastic.test;
+
+public interface IndirectAccess<T>
+{
+ T get();
+
+ void set(T newValue);
+}
Added: tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/AccessMethodsSubject.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/AccessMethodsSubject.java?rev=1098006&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/AccessMethodsSubject.java (added)
+++ tapestry/tapestry5/trunk/plastic/src/test/java/testsubjects/AccessMethodsSubject.java Fri Apr 29 22:56:15 2011
@@ -0,0 +1,25 @@
+package testsubjects;
+
+import org.apache.tapestry5.plastic.test.IndirectAccess;
+
+public class AccessMethodsSubject
+{
+ private String value;
+
+ public IndirectAccess<String> getValueAccess()
+ {
+ return new IndirectAccess<String>()
+ {
+ public String get()
+ {
+ return value;
+ }
+
+ public void set(String newValue)
+ {
+ value = newValue;
+ }
+
+ };
+ }
+}