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