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

Reply via email to