On Wed, May 26, 2010 at 16:10, Thiago H. de Paula Figueiredo < thiag...@gmail.com> wrote:
> On Wed, 26 May 2010 02:31:34 -0300, Dmitry Gusev <dmitry.gu...@gmail.com> > wrote: > > May be during transformation in non-production mode T5 should assign value >> to corresponding field also, not just to conduit? >> > > No, because there's no field to be set. > > Not true. If there was no field eclipse wouldn't show it in debugger. What I mean is add some logic to PropertyConduit implementors to also change fields values they're wrapping. Here's what I did for UnclaimedFieldWorker: .../internal/transform/UnclaimedFieldWorker.java | 20 +++++++++++++++++--- 1 files changed, 17 insertions(+), 3 deletions(-) diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java index 115c4e9..d2041bb 100644 --- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java +++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java @@ -14,6 +14,7 @@ package org.apache.tapestry5.internal.transform; +import java.lang.reflect.Field; import java.lang.reflect.Modifier; import org.apache.tapestry5.ComponentResources; @@ -41,13 +42,15 @@ public final class UnclaimedFieldWorker implements ComponentClassTransformWorker private final InternalComponentResources resources; private Object fieldValue, fieldDefaultValue; + private String fieldName; - private UnclaimedFieldConduit(InternalComponentResources resources, Object fieldDefaultValue) + private UnclaimedFieldConduit(InternalComponentResources resources, Object fieldDefaultValue, TransformField originalField) { this.resources = resources; this.fieldValue = fieldDefaultValue; this.fieldDefaultValue = fieldDefaultValue; + this.fieldName = originalField.getName(); resources.addPageLifecycleListener(new PageLifecycleAdapter() { @@ -70,6 +73,17 @@ public final class UnclaimedFieldWorker implements ComponentClassTransformWorker if (!resources.isLoaded()) fieldDefaultValue = newValue; + + try { + // XXX This code is for debugging purposes only, its very slow + Object component = resources.getComponent(); + Field field = component.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(component, newValue); + field.setAccessible(false); + } catch (Exception ex) { + // Skip this exception and continue + } } public void reset() @@ -103,7 +117,7 @@ public final class UnclaimedFieldWorker implements ComponentClassTransformWorker field.replaceAccess(provider); } - private ComponentValueProvider<FieldValueConduit> createFieldValueConduitProvider(TransformField field) + private ComponentValueProvider<FieldValueConduit> createFieldValueConduitProvider(final TransformField field) { final String fieldType = field.getType(); @@ -113,7 +127,7 @@ public final class UnclaimedFieldWorker implements ComponentClassTransformWorker { Object fieldDefaultValue = classCache.defaultValueForType(fieldType); - return new UnclaimedFieldConduit((InternalComponentResources) resources, fieldDefaultValue); + return new UnclaimedFieldConduit((InternalComponentResources) resources, fieldDefaultValue, field); } }; } I think you got the idea. We may also do the same for InternalClassTransformationImpl lines 1694-1695: addToConstructor(String.format(" %s = (%s) (%s).get(%s);", > field.getName(), type.getName(), argReference, > resourcesFieldName)); > by changing the code to also update original field and also for line 668: addNewMethod(writeSig, String.format("%s.set(($w) $1);", > conduitFieldName)); > Of cource we should do this only if T5 runs in non-production mode. What do you think? > -- > Thiago H. de Paula Figueiredo > Independent Java, Apache Tapestry 5 and Hibernate consultant, developer, > and instructor > Owner, Ars Machina Tecnologia da Informação Ltda. > http://www.arsmachina.com.br > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > For additional commands, e-mail: users-h...@tapestry.apache.org > > -- Dmitry Gusev AnjLab Team http://anjlab.com