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;
+            }
+
+        };
+    }
+}