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 2010/01/26 17:02:27 UTC

svn commit: r903290 - in /tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5: internal/services/ internal/transform/ services/

Author: hlship
Date: Tue Jan 26 16:02:27 2010
New Revision: 903290

URL: http://svn.apache.org/viewvc?rev=903290&view=rev
Log:
Move replaceFieldAccess methods from ClassTransformation to TransformField

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/AbstractIncludeAssetWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BindParameterWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ClassTransformation.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TransformField.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java?rev=903290&r1=903289&r2=903290&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/InternalClassTransformationImpl.java Tue Jan 26 16:02:27 2010
@@ -112,6 +112,8 @@
     {
         private final CtField field;
 
+        private final String name;
+
         private final String type;
 
         private final boolean primitive;
@@ -125,6 +127,7 @@
         TransformFieldImpl(CtField field, boolean added)
         {
             this.field = field;
+            this.name = field.getName();
             this.added = added;
 
             try
@@ -141,7 +144,7 @@
 
         public String getName()
         {
-            return field.getName();
+            return name;
         }
 
         public String getType()
@@ -184,6 +187,47 @@
         {
             return claimTag != null;
         }
+
+        public void replaceAccess(ComponentValueProvider<FieldValueConduit> conduitProvider)
+        {
+            replaceAccess(addIndirectInjectedField(FieldValueConduit.class, name + "$conduit",
+                    conduitProvider));
+        }
+
+        public void replaceAccess(TransformField conduitField)
+        {
+            failIfFrozen();
+
+            String conduitFieldName = conduitField.getName();
+
+            String readMethodName = newMemberName("get", name);
+
+            TransformMethodSignature readSig = new TransformMethodSignature(Modifier.PRIVATE, type,
+                    readMethodName, null, null);
+
+            String cast = TransformUtils.getWrapperTypeName(type);
+
+            // The ($r) cast will convert the result to the method return type; generally
+            // this does nothing. but for primitive types, it will unwrap
+            // the wrapper type back to a primitive.
+
+            addMethod(readSig, String
+                    .format("return ($r) ((%s) %s.get());", cast, conduitFieldName));
+
+            replaceReadAccess(name, readMethodName);
+
+            String writeMethodName = newMemberName("set", name);
+
+            TransformMethodSignature writeSig = new TransformMethodSignature(Modifier.PRIVATE,
+                    "void", writeMethodName, new String[]
+                    { type }, null);
+
+            addMethod(writeSig, String.format("%s.set(($w) $1);", conduitFieldName));
+
+            replaceWriteAccess(name, writeMethodName);
+
+            removeField(name);
+        }
     }
 
     private final Map<TransformMethodSignature, TransformMethodImpl> methods = CollectionFactory
@@ -1016,6 +1060,9 @@
         return tmi == null ? null : tmi.method;
     }
 
+    // TODO: Rework this method for efficiency, i.e., so that we can leverage the methods
+    // map in parent InternalClassTransformImpls, rather than the exhaustive
+    // search.
     private CtMethod addOverrideOfSuperclassMethod(TransformMethodSignature methodSignature)
     {
         try
@@ -1278,10 +1325,17 @@
 
     public String addField(int modifiers, String type, String suggestedName)
     {
+        return addTransformField(modifiers, type, suggestedName).getName();
+    }
+
+    private TransformField addTransformField(int modifiers, String type, String suggestedName)
+    {
         failIfFrozen();
 
         String fieldName = newMemberName(suggestedName);
 
+        TransformFieldImpl result = null;
+
         try
         {
             CtClass ctType = convertNameToCtType(type);
@@ -1291,7 +1345,9 @@
 
             ctClass.addField(field);
 
-            fields.put(fieldName, new TransformFieldImpl(field, true));
+            result = new TransformFieldImpl(field, true);
+
+            fields.put(fieldName, result);
 
         }
         catch (NotFoundException ex)
@@ -1305,7 +1361,7 @@
 
         formatter.format("add field: %s %s %s;\n\n", Modifier.toString(modifiers), type, fieldName);
 
-        return fieldName;
+        return result;
     }
 
     public String addInjectedField(Class type, String suggestedName, Object value)
@@ -1332,13 +1388,13 @@
         return fieldName;
     }
 
-    public <T> String addIndirectInjectedField(Class<T> type, String suggestedName,
+    public <T> TransformField addIndirectInjectedField(Class<T> type, String suggestedName,
             ComponentValueProvider<T> provider)
     {
         Defense.notNull(type, "type");
         Defense.notNull(provider, "provider");
-
-        String fieldName = addField(Modifier.PRIVATE | Modifier.FINAL, type.getName(),
+        
+        TransformField field = addTransformField(Modifier.PRIVATE | Modifier.FINAL, type.getName(),
                 suggestedName);
 
         String argName = addConstructorArg(providerType, provider);
@@ -1348,10 +1404,10 @@
         // field type and assign. This will likely not work with
         // primitives and arrays, but that's ok for now.
 
-        extendConstructor(String.format("  %s = (%s) %s.get(%s);", fieldName, type.getName(),
+        extendConstructor(String.format("  %s = (%s) %s.get(%s);", field.getName(), type.getName(),
                 argName, resourcesFieldName));
 
-        return fieldName;
+        return field;
     }
 
     private CtClass toCtClass(Class type)
@@ -2066,43 +2122,4 @@
 
         makeReadOnly(fieldName);
     }
-
-    public void replaceFieldAccess(String fieldName,
-            ComponentValueProvider<FieldValueConduit> conduitProvider)
-    {
-        replaceFieldAccess(fieldName, addIndirectInjectedField(FieldValueConduit.class, fieldName
-                + "$conduit", conduitProvider));
-    }
-
-    public void replaceFieldAccess(String fieldName, String conduitFieldName)
-    {
-        String fieldType = getFieldType(fieldName);
-
-        String readMethodName = newMemberName("get", fieldName);
-
-        TransformMethodSignature readSig = new TransformMethodSignature(Modifier.PRIVATE,
-                fieldType, readMethodName, null, null);
-
-        String cast = TransformUtils.getWrapperTypeName(fieldType);
-
-        // The ($r) cast will convert the result to the method return type; generally
-        // this does nothing. but for primitive types, it will unwrap
-        // the wrapper type back to a primitive.
-
-        addMethod(readSig, String.format("return ($r) ((%s) %s.get());", cast, conduitFieldName));
-
-        replaceReadAccess(fieldName, readMethodName);
-
-        String writeMethodName = newMemberName("set", fieldName);
-
-        TransformMethodSignature writeSig = new TransformMethodSignature(Modifier.PRIVATE, "void",
-                writeMethodName, new String[]
-                { fieldType }, null);
-
-        addMethod(writeSig, String.format("%s.set(($w) $1);", conduitFieldName));
-
-        replaceWriteAccess(fieldName, writeMethodName);
-
-        removeField(fieldName);
-    }
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/AbstractIncludeAssetWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/AbstractIncludeAssetWorker.java?rev=903290&r1=903289&r2=903290&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/AbstractIncludeAssetWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/AbstractIncludeAssetWorker.java Tue Jan 26 16:02:27 2010
@@ -29,6 +29,7 @@
 import org.apache.tapestry5.services.ComponentClassTransformWorker;
 import org.apache.tapestry5.services.ComponentValueProvider;
 import org.apache.tapestry5.services.TransformConstants;
+import org.apache.tapestry5.services.TransformField;
 
 /**
  * Base class for workers that automatically include assets in the page (via methods on
@@ -103,11 +104,11 @@
             }
         };
 
-        String runnableFieldName = transformation.addIndirectInjectedField(Runnable.class,
+        TransformField runnableField = transformation.addIndirectInjectedField(Runnable.class,
                 "includeAssets", provider);
 
         transformation.extendMethod(TransformConstants.SETUP_RENDER_SIGNATURE, String.format(
-                "%s.run();", runnableFieldName));
+                "%s.run();", runnableField.getName()));
 
         model.addRenderPhase(SetupRender.class);
     }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BindParameterWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BindParameterWorker.java?rev=903290&r1=903289&r2=903290&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BindParameterWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/BindParameterWorker.java Tue Jan 26 16:02:27 2010
@@ -133,7 +133,7 @@
             }
         };
 
-        transformation.replaceFieldAccess(fieldName, provider);
+        transformation.getField(fieldName).replaceAccess(provider);
     }
 
     private String identifyParameterName(ComponentResources resources, String firstGuess,

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java?rev=903290&r1=903289&r2=903290&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/ParameterWorker.java Tue Jan 26 16:02:27 2010
@@ -34,6 +34,7 @@
 import org.apache.tapestry5.services.ComponentValueProvider;
 import org.apache.tapestry5.services.MethodFilter;
 import org.apache.tapestry5.services.TransformConstants;
+import org.apache.tapestry5.services.TransformField;
 import org.apache.tapestry5.services.TransformMethodSignature;
 
 /**
@@ -342,12 +343,14 @@
 
         // This has to be done in the constructor, to handle any field initializations
 
-        String conduitFieldName = transformation.addIndirectInjectedField(ParameterConduit.class,
-                parameterName + "$conduit", provider);
+        TransformField conduitField = transformation.addIndirectInjectedField(
+                ParameterConduit.class, parameterName + "$conduit", provider);
+
+        String conduitFieldName = conduitField.getName();
 
         addCodeForParameterDefaultMethod(transformation, parameterName, conduitFieldName);
 
-        transformation.replaceFieldAccess(fieldName, conduitFieldName);
+        transformation.getField(fieldName).replaceAccess(conduitField);
 
         transformation.extendMethod(TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE, String
                 .format("%s.load();", conduitFieldName));

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ClassTransformation.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ClassTransformation.java?rev=903290&r1=903289&r2=903290&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ClassTransformation.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/ClassTransformation.java Tue Jan 26 16:02:27 2010
@@ -273,7 +273,7 @@
      * @return the actual name of the injected field
      * @since 5.2
      */
-    <T> String addIndirectInjectedField(Class<T> type, String suggestedName,
+    <T> TransformField addIndirectInjectedField(Class<T> type, String suggestedName,
             ComponentValueProvider<T> provider);
 
     /**
@@ -527,28 +527,4 @@
      */
     <T> void assignFieldIndirect(String fieldName, TransformMethodSignature methodSig,
             ComponentValueProvider<T> provider);
-
-    /**
-     * Replaces read and write field access with a conduit. The field will be deleted.
-     * 
-     * @param fieldName
-     *            field to replace
-     * @param conduitProvider
-     *            provides the actual conduit at class instantiation time
-     * @since 5.2.0
-     */
-    void replaceFieldAccess(String fieldName,
-            ComponentValueProvider<FieldValueConduit> conduitProvider);
-
-    /**
-     * Replaces read and write field access with a previously injected conduit (identified by its
-     * field name). The conduit must implement {@link FieldValueConduit}. The field will be removed.
-     * 
-     * @since 5.2.0
-     * @param fieldName
-     *            field to replace
-     * @param conduitFieldName
-     *            name of field which will have an instance of {@link FieldValueConduit}
-     */
-    void replaceFieldAccess(String fieldName, String conduitFieldName);
-}
+ }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TransformField.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TransformField.java?rev=903290&r1=903289&r2=903290&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TransformField.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TransformField.java Tue Jan 26 16:02:27 2010
@@ -56,4 +56,20 @@
      *             if the field is already claimed for some other tag
      */
     void claim(Object tag);
+
+    /**
+     * Replaces read and write field access with a conduit. The field will be deleted.
+     * 
+     * @param conduitProvider
+     *            provides the actual conduit at class instantiation time
+     */
+    void replaceAccess(ComponentValueProvider<FieldValueConduit> conduitProvider);
+
+    /**
+     * Replaces read and write field access with a conduit. The field itself will be deleted.
+     * 
+     * @param conduitField
+     *            identifies the field containing (via injection) an instance of {@link FieldValueConduit}
+     */
+    void replaceAccess(TransformField conduitField);
 }