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/06/02 01:30:02 UTC

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

Author: hlship
Date: Wed Jun  1 23:30:02 2011
New Revision: 1130344

URL: http://svn.apache.org/viewvc?rev=1130344&view=rev
Log:
TAP5-1528: More (minor) speed/memory optimizations

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java?rev=1130344&r1=1130343&r2=1130344&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/UnclaimedFieldWorker.java Wed Jun  1 23:30:02 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2010 The Apache Software Foundation
+// Copyright 2006, 2007, 2010, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -19,26 +19,28 @@ import java.lang.reflect.Modifier;
 import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.internal.InternalComponentResources;
 import org.apache.tapestry5.internal.services.ComponentClassCache;
-import org.apache.tapestry5.ioc.services.FieldValueConduit;
 import org.apache.tapestry5.ioc.services.PerThreadValue;
 import org.apache.tapestry5.ioc.services.PerthreadManager;
 import org.apache.tapestry5.model.MutableComponentModel;
-import org.apache.tapestry5.services.ClassTransformation;
-import org.apache.tapestry5.services.ComponentClassTransformWorker;
-import org.apache.tapestry5.services.ComponentValueProvider;
-import org.apache.tapestry5.services.TransformField;
+import org.apache.tapestry5.plastic.ComputedValue;
+import org.apache.tapestry5.plastic.FieldConduit;
+import org.apache.tapestry5.plastic.InstanceContext;
+import org.apache.tapestry5.plastic.PlasticClass;
+import org.apache.tapestry5.plastic.PlasticField;
+import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
+import org.apache.tapestry5.services.transform.TransformationSupport;
 
 /**
  * Designed to be just about the last worker in the pipeline. Its job is to convert each otherwise unclaimed
  * field into a value stored in the {@link PerthreadManager}.
  */
-public final class UnclaimedFieldWorker implements ComponentClassTransformWorker
+public final class UnclaimedFieldWorker implements ComponentClassTransformWorker2
 {
     private final PerthreadManager perThreadManager;
 
     private final ComponentClassCache classCache;
 
-    static class UnclaimedFieldConduit implements FieldValueConduit
+    static class UnclaimedFieldConduit implements FieldConduit<Object>
     {
         private final InternalComponentResources resources;
 
@@ -56,12 +58,12 @@ public final class UnclaimedFieldWorker 
             this.fieldDefaultValue = fieldDefaultValue;
         }
 
-        public Object get()
+        public Object get(Object instance, InstanceContext context)
         {
             return fieldValue.get(fieldDefaultValue);
         }
 
-        public void set(Object newValue)
+        public void set(Object instance, InstanceContext context, Object newValue)
         {
             fieldValue.set(newValue);
 
@@ -71,7 +73,6 @@ public final class UnclaimedFieldWorker 
             if (!resources.isLoaded())
                 fieldDefaultValue = newValue;
         }
-
     }
 
     public UnclaimedFieldWorker(ComponentClassCache classCache, PerthreadManager perThreadManager)
@@ -80,36 +81,36 @@ public final class UnclaimedFieldWorker 
         this.perThreadManager = perThreadManager;
     }
 
-    public void transform(ClassTransformation transformation, MutableComponentModel model)
+    public void transform(PlasticClass plasticClass, TransformationSupport support, MutableComponentModel model)
     {
-        for (TransformField field : transformation.matchUnclaimedFields())
+        for (PlasticField field : plasticClass.getUnclaimedFields())
         {
             transformField(field);
         }
     }
 
-    private void transformField(TransformField field)
+    private void transformField(PlasticField field)
     {
         int modifiers = field.getModifiers();
 
         if (Modifier.isFinal(modifiers) || Modifier.isStatic(modifiers))
             return;
 
-        ComponentValueProvider<FieldValueConduit> provider = createFieldValueConduitProvider(field);
+        ComputedValue<FieldConduit<?>> computed = createComputedFieldConduit(field);
 
-        field.replaceAccess(provider);
+        field.setComputedConduit(computed);
     }
 
-    private ComponentValueProvider<FieldValueConduit> createFieldValueConduitProvider(TransformField field)
+    private ComputedValue<FieldConduit<?>> createComputedFieldConduit(PlasticField field)
     {
-        final String fieldName = field.getName();
-        final String fieldType = field.getType();
+        final String fieldType = field.getTypeName();
 
-        return new ComponentValueProvider<FieldValueConduit>()
+        return new ComputedValue<FieldConduit<?>>()
         {
-            public FieldValueConduit get(ComponentResources resources)
+            public FieldConduit<?> get(InstanceContext context)
             {
                 Object fieldDefaultValue = classCache.defaultValueForType(fieldType);
+                ComponentResources resources = context.get(ComponentResources.class);
 
                 return new UnclaimedFieldConduit((InternalComponentResources) resources,
                         perThreadManager.createValue(), fieldDefaultValue);

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=1130344&r1=1130343&r2=1130344&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Wed Jun  1 23:30:02 2011
@@ -200,6 +200,7 @@ import org.apache.tapestry5.ioc.services
 import org.apache.tapestry5.ioc.services.CoercionTuple;
 import org.apache.tapestry5.ioc.services.LazyAdvisor;
 import org.apache.tapestry5.ioc.services.MasterObjectProvider;
+import org.apache.tapestry5.ioc.services.PerThreadValue;
 import org.apache.tapestry5.ioc.services.PerthreadManager;
 import org.apache.tapestry5.ioc.services.PipelineBuilder;
 import org.apache.tapestry5.ioc.services.PlasticProxyFactory;
@@ -636,6 +637,8 @@ public final class TapestryModule
      * <dd>Generates accessor methods if {@link org.apache.tapestry5.annotations.Property} annotation is present</dd> *
      * <dt>Import</dt>
      * <dd>Supports the {@link Import} annotation</dd>
+     * <dt>UnclaimedField</dt>
+     * <dd>Manages unclaimed fields, storing their value in a {@link PerThreadValue}</dd>
      * </ul>
      */
     @Contribute(ComponentClassTransformWorker2.class)
@@ -643,6 +646,12 @@ public final class TapestryModule
     {
         configuration.add("Property", new PropertyWorker());
         configuration.addInstance("Import", ImportWorker.class, "after:SetupRender");
+
+        // This one is always last. Any additional private fields that aren't
+        // annotated will
+        // be converted to clear out at the end of the request.
+
+        configuration.addInstance("UnclaimedField", UnclaimedFieldWorker.class, "after:*");
     }
 
     /**
@@ -675,8 +684,6 @@ public final class TapestryModule
      * <dd>Checks for meta data annotations and adds it to the component model</dd>
      * <dt>ApplicationState</dt>
      * <dd>Converts fields that reference application state objects
-     * <dt>UnclaimedField</dt>
-     * <dd>Identifies unclaimed fields and resets them to null/0/false at the end of the request</dd>
      * <dt>RenderCommand</dt>
      * <dd>Ensures all components also implement {@link org.apache.tapestry5.runtime.RenderCommand}</dd>
      * <dt>RenderPhase</dt>
@@ -763,12 +770,6 @@ public final class TapestryModule
 
         configuration.addInstance("PageReset", PageResetAnnotationWorker.class);
 
-        // This one is always last. Any additional private fields that aren't
-        // annotated will
-        // be converted to clear out at the end of the request.
-
-        configuration.addInstance("UnclaimedField", UnclaimedFieldWorker.class, "after:*");
-
         configuration.add("PageActivationContext", new PageActivationContextWorker(), "after:OnEvent");
 
         configuration.addInstance("SessionAttribute", SessionAttributeWorker.class);

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java?rev=1130344&r1=1130343&r2=1130344&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/PerthreadManagerImpl.java Wed Jun  1 23:30:02 2011
@@ -16,6 +16,7 @@ package org.apache.tapestry5.ioc.interna
 
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
@@ -49,6 +50,8 @@ public class PerthreadManagerImpl implem
 
     private final MapHolder holder = new MapHolder();
 
+    private final AtomicInteger uuidGenerator = new AtomicInteger();
+
     public PerthreadManagerImpl(Logger logger)
     {
         this(logger, JDKUtils.JDK_1_5);
@@ -181,7 +184,7 @@ public class PerthreadManagerImpl implem
 
     public <T> PerThreadValue<T> createValue()
     {
-        return createValue(InternalUtils.nextUUID());
+        return createValue(uuidGenerator.getAndIncrement());
     }
 
     public void run(Runnable runnable)