Author: hlship
Date: Mon Apr 24 17:52:01 2006
New Revision: 396751

URL: http://svn.apache.org/viewcvs?rev=396751&view=rev
Log:
Make ComponentLifecycle extend from ResourceAware.
Move core initialization logic (i.e., components implement ComponentLifecycle) 
into InternalComponentTransformationImpl.
Remove the readMeta() and writeMeta() methods from ComponentTransformation
Add getResourcesFieldName() method to ComponentTransformation
Modify the ComponentTransformation to be frozen after invoking finish()

Removed:
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/ImplementResourceAwareWorker.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/worker/ImplementResourceAwareWorkerTest.java
Modified:
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/events/ComponentLifecycle.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/Instantiator.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformation.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorker.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/ClassTransformation.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/TransformConstants.java
    
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/META-INF/org.apache.tapestry.internal.transform.xml
    
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/transform/TransformStrings.properties
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationAspectTest.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationTarget.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/InternalClassTransformationImplTest.java
    
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorkerTest.java

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/events/ComponentLifecycle.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/events/ComponentLifecycle.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/events/ComponentLifecycle.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/events/ComponentLifecycle.java
 Mon Apr 24 17:52:01 2006
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.events;
 
+import org.apache.tapestry.ResourceAware;
+
 /**
  * Interface that allows a component to define behavior as the page is loaded. 
This interface is
  * part of the public API for Tapestry, but is <em>not</em> expected to be 
directly implemented by
@@ -22,7 +24,7 @@
  * 
  * @author Howard M. Lewis Ship
  */
-public interface ComponentLifecycle
+public interface ComponentLifecycle extends ResourceAware
 {
     /**
      * Invoked when the page finishes loading (including the loading of all 
components).

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/Instantiator.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/Instantiator.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/Instantiator.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/Instantiator.java
 Mon Apr 24 17:52:01 2006
@@ -15,6 +15,7 @@
 package org.apache.tapestry.internal.transform;
 
 import org.apache.tapestry.ResourceAware;
+import org.apache.tapestry.events.ComponentLifecycle;
 import org.apache.tapestry.internal.InternalComponentResources;
 
 /**
@@ -31,5 +32,5 @@
      * Instantiates and returns a new instance of the desired class. Component 
classes are always
      * modified so that they implement [EMAIL PROTECTED] ResourceAware} (and 
often, other interfaces as well).
      */
-    ResourceAware newInstance(InternalComponentResources resources);
+    ComponentLifecycle newInstance(InternalComponentResources resources);
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformation.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformation.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformation.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformation.java
 Mon Apr 24 17:52:01 2006
@@ -26,6 +26,12 @@
 public interface InternalClassTransformation extends ClassTransformation
 {
     /**
+     * Returns the name of the protected field that is injected with the
+     * [EMAIL PROTECTED] 
org.apache.tapestry.internal.InternalComponentResources}.
+     */
+    String getResourcesFieldName();
+
+    /**
      * Invoked after all [EMAIL PROTECTED] ClassTransformWorker}s have had 
their chance to work over the
      * class. This performs any final operations for the class transformation, 
which includes coming
      * up with the final constructor method for the class.

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/InternalClassTransformationImpl.java
 Mon Apr 24 17:52:01 2006
@@ -34,11 +34,14 @@
 import javassist.expr.ExprEditor;
 import javassist.expr.FieldAccess;
 
-import org.apache.hivemind.service.BodyBuilder;
+import org.apache.tapestry.ComponentResources;
+import org.apache.tapestry.events.ComponentLifecycle;
+import org.apache.tapestry.internal.InternalComponentResources;
 import org.apache.tapestry.internal.annotations.SuppressNullCheck;
 import org.apache.tapestry.transform.MethodSignature;
 import org.apache.tapestry.util.IdAllocator;
 
+import static java.lang.String.format;
 import static org.apache.tapestry.util.CollectionFactory.newList;
 import static org.apache.tapestry.util.CollectionFactory.newMap;
 import static org.apache.tapestry.util.CollectionFactory.newSet;
@@ -53,58 +56,60 @@
  */
 public final class InternalClassTransformationImpl implements 
InternalClassTransformation
 {
+    private boolean _frozen;
+
     private final CtClass _ctClass;
 
     private final ClassPool _classPool;
 
-    private final Set<CtMethod> _addedMethods = newSet();
+    private Set<CtMethod> _addedMethods = newSet();
 
     private final IdAllocator _idAllocator = new IdAllocator();
 
     private final Map<CtField, FieldEncapsulation> _encapsulations = newMap();
 
     /** Map from a field to the annotation objects for that field. */
-    private final Map<String, Object[]> _fieldAnnotations = newMap();
+    private Map<String, Object[]> _fieldAnnotations = newMap();
 
     /** Used to identify fields that have been "claimed" by other annotations. 
*/
-    private final Map<String, Object> _claimedFields = newMap();
-
-    private final Set<String> _addedFieldNames = newSet();
+    private Map<String, Object> _claimedFields = newMap();
 
-    private final Map<String, String> _meta = newMap();
+    private Set<String> _addedFieldNames = newSet();
 
     // Cache of class annotations
 
     private Object[] _classAnnotations;
 
+    /** Contains the assembled Javassist code for the class' constructor. */
+    private StringBuffer _constructor = new StringBuffer();
+
+    // Argument #0 is always "this". We always add argument #1 (i.e., $1) to 
be the
+    // InternalComponentResources. From there it all about injections.
+
+    private int _constructorArgIndex = 0;
+
     private final List<ConstructorArg> _constructorArgs = newList();
 
-    // All names will have this value as a prefix
+    // All field/method names will have this value as a prefix
+
+    private static final String NAME_PREFIX = "_$";
 
-    private final String NAME_PREFIX = "_$";
+    private final String _resourcesFieldName;
 
     private static class ConstructorArg
     {
-        private final String _fieldName;
-
-        private final Class _type;
+        private final CtClass _type;
 
         private final Object _value;
 
         @SuppressNullCheck
-        ConstructorArg(Class type, String fieldName, Object value)
+        ConstructorArg(CtClass type, Object value)
         {
             _type = type;
-            _fieldName = fieldName;
             _value = value;
         }
 
-        String getFieldName()
-        {
-            return _fieldName;
-        }
-
-        Class getType()
+        CtClass getType()
         {
             return _type;
         }
@@ -121,6 +126,24 @@
         _classPool = _ctClass.getClassPool();
 
         preloadMemberNames();
+
+        _constructor.append("{\n");
+
+        addImplementedInterface(ComponentLifecycle.class);
+
+        _resourcesFieldName = 
addInjectedField(InternalComponentResources.class, "resources", null);
+
+        MethodSignature sig = new MethodSignature(Modifier.PUBLIC, 
ComponentResources.class
+                .getName(), "getResources", null, null);
+
+        // Override the default, empty implementation to simply return the 
field.
+
+        extendMethod(sig, "return " + _resourcesFieldName + ";");
+    }
+
+    public String getResourcesFieldName()
+    {
+        return _resourcesFieldName;
     }
 
     /** Loads the names of all declared fields and methods into the 
idAllocator. */
@@ -238,6 +261,8 @@
 
     public String newMemberName(String suggested)
     {
+        checkFrozen();
+
         String memberName = createMemberName(notBlank(suggested, "suggested"));
 
         return _idAllocator.allocateId(memberName);
@@ -246,6 +271,8 @@
     /** Strips leading characters defined by [EMAIL PROTECTED] #NAME_PREFIX}. 
*/
     private String createMemberName(String memberName)
     {
+        checkFrozen();
+
         StringBuilder builder = new StringBuilder(memberName);
 
         // There may be other prefixes we want to strip off, at some point!
@@ -271,6 +298,8 @@
 
     public void addFieldEncapsulation(CtField field, String readMethodName, 
String writeMethodName)
     {
+        checkFrozen();
+
         // TODO: Check if field already encapsulated
 
         FieldEncapsulation fe = new FieldEncapsulation(readMethodName, 
writeMethodName);
@@ -280,6 +309,8 @@
 
     public void applyFieldEncapsulations()
     {
+        checkFrozen();
+
         ExprEditor editor = new ExprEditor()
         {
 
@@ -320,6 +351,8 @@
 
     public void addImplementedInterface(Class interfaceClass)
     {
+        checkFrozen();
+
         String interfaceName = interfaceClass.getName();
 
         try
@@ -354,10 +387,10 @@
     {
         // java.lang.Object is the parent interface of interfaces
 
-        if (ctInterface.getName().equals("java.lang.Object"))
+        if (ctInterface.getName().equals(Object.class.getName()))
             return;
 
-        for (CtMethod method : ctInterface.getMethods())
+        for (CtMethod method : ctInterface.getDeclaredMethods())
         {
             addDefaultImplementation(method);
         }
@@ -418,8 +451,6 @@
                 if (anInterface == ctInterface)
                     return true;
             }
-
-            current = current.getSuperclass();
         }
 
         return false;
@@ -429,6 +460,8 @@
     {
         notBlank(fieldName, "fieldName");
 
+        checkFrozen();
+
         Object existing = _claimedFields.get(fieldName);
 
         if (existing != null)
@@ -449,6 +482,8 @@
 
     public void extendMethod(MethodSignature methodSignature, String 
methodBody)
     {
+        checkFrozen();
+
         CtMethod method = findMethod(methodSignature);
 
         try
@@ -539,6 +574,8 @@
 
     public String[] findUnclaimedFields()
     {
+        checkFrozen();
+
         List<String> names = newList();
 
         for (CtField field : _ctClass.getDeclaredFields())
@@ -586,6 +623,8 @@
 
     public String addField(int modifiers, String type, String suggestedName)
     {
+        checkFrozen();
+
         String fieldName = newMemberName(suggestedName);
 
         try
@@ -616,11 +655,26 @@
     {
         notNull(type, "type");
 
+        checkFrozen();
+
         // TODO: Probably doesn't handle arrays and primitives.
 
+        CtClass ctType;
+
+        try
+        {
+            ctType = _classPool.get(type.getName());
+        }
+        catch (NotFoundException ex)
+        {
+            throw new RuntimeException(ex);
+        }
+
         String fieldName = addField(Modifier.PROTECTED, type.getName(), 
suggestedName);
 
-        _constructorArgs.add(new ConstructorArg(type, fieldName, value));
+        _constructor.append(format("%s = $%d;\n", fieldName, 
++_constructorArgIndex));
+
+        _constructorArgs.add(new ConstructorArg(ctType, value));
 
         return fieldName;
     }
@@ -632,9 +686,7 @@
 
     public void finish()
     {
-        BodyBuilder builder = new BodyBuilder();
-
-        builder.begin();
+        checkFrozen();
 
         int count = _constructorArgs.size();
 
@@ -644,23 +696,18 @@
         {
             ConstructorArg arg = _constructorArgs.get(i);
 
-            builder.addln("{0} = ${1};", arg.getFieldName(), i + 1);
-
-            try
-            {
-                types[i] = _classPool.get(arg.getType().getName());
-            }
-            catch (NotFoundException ex)
-            {
-                throw new RuntimeException(ex);
-            }
+            types[i] = arg.getType();
         }
 
-        builder.end();
+        _constructor.append("}");
 
         try
         {
-            CtConstructor cons = CtNewConstructor.make(types, null, 
builder.toString(), _ctClass);
+            CtConstructor cons = CtNewConstructor.make(
+                    types,
+                    null,
+                    _constructor.toString(),
+                    _ctClass);
             _ctClass.addConstructor(cons);
         }
         catch (CannotCompileException ex)
@@ -668,24 +715,16 @@
             throw new RuntimeException(ex);
         }
 
-    }
-
-    public String readMeta(String key)
-    {
-        return _meta.get(notBlank(key, "key"));
-    }
+        _frozen = true;
 
-    public void storeMeta(String key, String value)
-    {
-        notBlank(key, "key");
+        // Free up stuff we don't need after freezing.
 
-        if (_meta.containsKey(key))
-            throw new IllegalArgumentException(TransformMessages.metaKeyExists(
-                    key,
-                    _meta.get(key),
-                    value));
-
-        _meta.put(key, notBlank(value, "value"));
+        _addedMethods = null;
+        _claimedFields = null;
+        _addedFieldNames = null;
+        _fieldAnnotations = null;
+        _classAnnotations = null;
+        _constructor = null;
     }
 
     public Instantiator createInstantiator(Class componentClass)
@@ -711,4 +750,11 @@
         return new ReflectiveInstantiator(componentClass, parameters);
     }
 
+    private void checkFrozen()
+    {
+        if (_frozen)
+            throw new IllegalStateException("The ClassTransformation instance 
(for "
+                    + _ctClass.getName()
+                    + ") has completed all transformations and may not be 
further modified.");
+    }
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ReflectiveInstantiator.java
 Mon Apr 24 17:52:01 2006
@@ -16,7 +16,7 @@
 
 import java.lang.reflect.Constructor;
 
-import org.apache.tapestry.ResourceAware;
+import org.apache.tapestry.events.ComponentLifecycle;
 import org.apache.tapestry.internal.InternalComponentResources;
 
 /**
@@ -60,7 +60,7 @@
         throw new 
RuntimeException(TransformMessages.noConstructorFound(instanceClass));
     }
 
-    public ResourceAware newInstance(InternalComponentResources resources)
+    public ComponentLifecycle newInstance(InternalComponentResources resources)
     {
         // Hm. Is it faster to clone the parameters, or to synchronize this 
method?
 
@@ -70,7 +70,7 @@
 
         try
         {
-            return (ResourceAware) _constructor.newInstance(parameters);
+            return (ComponentLifecycle) _constructor.newInstance(parameters);
         }
         catch (Exception ex)
         {

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/TransformMessages.java
 Mon Apr 24 17:52:01 2006
@@ -51,11 +51,6 @@
         { fieldName, ctClass.getName(), existingTag, newTag });
     }
 
-    static String metaKeyExists(String key, String existing, String value)
-    {
-        return MESSAGES.format("meta-key-exists", key, existing, value);
-    }
-
     static String noDeclaredMethod(MethodSignature methodSignature, CtClass 
ctClass)
     {
         return MESSAGES.format("no-declared-method", methodSignature, 
ctClass.getName());

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorker.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorker.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorker.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorker.java
 Mon Apr 24 17:52:01 2006
@@ -16,7 +16,6 @@
 
 import java.lang.reflect.Modifier;
 
-import org.apache.tapestry.events.ComponentLifecycle;
 import org.apache.tapestry.model.MutableComponentModel;
 import org.apache.tapestry.transform.ClassTransformWorker;
 import org.apache.tapestry.transform.ClassTransformation;
@@ -49,10 +48,6 @@
 
         String defaultFieldName = transformation.addField(Modifier.PRIVATE, 
type, fieldName
                 + "Default");
-
-        // Add the the interface and an implementation that squirrels away the
-        // initial value of the field.
-        transformation.addImplementedInterface(ComponentLifecycle.class);
 
         transformation.extendMethod(CONTAINING_PAGE_DID_LOAD_SIGNATURE, 
defaultFieldName + " = "
                 + fieldName + ";");

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/ClassTransformation.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/ClassTransformation.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/ClassTransformation.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/ClassTransformation.java
 Mon Apr 24 17:52:01 2006
@@ -177,21 +177,4 @@
      *             Javassist method body can not be compiled
      */
     void extendMethod(MethodSignature methodSignature, String methodBody);
-
-    /**
-     * Stores meta data about the transformation. This is how workers can 
communicate; earlier
-     * workers may record meta data needed by later workers.
-     * 
-     * @throws IllegalArgumentException
-     *             if the provided key has already been stored
-     */
-    void storeMeta(String key, String value);
-
-    /**
-     * Retrieves previously stored meta data.
-     * 
-     * @return value for key, or null if not found.
-     */
-    String readMeta(String key);
-
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/TransformConstants.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/TransformConstants.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/TransformConstants.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/transform/TransformConstants.java
 Mon Apr 24 17:52:01 2006
@@ -24,12 +24,6 @@
 @Utility
 public final class TransformConstants
 {
-    /**
-     * Meta key used to get the name of the field which will contain the
-     * [EMAIL PROTECTED] org.apache.tapestry.ComponentResources} instance for 
the component (which is passed
-     * into the component instance via its constructor).
-     */
-    public static final String RESOURCES_FIELD_NAME_KEY = 
"org.apache.tapestry.resources-field-name-key";
 
     /** Signature for [EMAIL PROTECTED] 
org.apache.tapestry.events.ComponentLifecycle#containingPageDidLoad()}. */
     public static final MethodSignature CONTAINING_PAGE_DID_LOAD_SIGNATURE = 
new MethodSignature(

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/META-INF/org.apache.tapestry.internal.transform.xml
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/META-INF/org.apache.tapestry.internal.transform.xml?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/META-INF/org.apache.tapestry.internal.transform.xml
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/META-INF/org.apache.tapestry.internal.transform.xml
 Mon Apr 24 17:52:01 2006
@@ -19,7 +19,6 @@
     
     <contribution 
configuration-id="org.apache.tapestry.transform.ClassTransformWorkers">
         
-        <command id="ImplementResourceAware" before="*" 
object="instance:worker.ImplementResourceAwareWorker"/>
         <command id="Retain" object="instance:worker.RetainWorker"/>
         <command id="UnclaimedField" 
object="instance:worker.UnclaimedFieldWorker" after="*"/>
         

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/transform/TransformStrings.properties
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/transform/TransformStrings.properties?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/transform/TransformStrings.properties
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/main/resources/org/apache/tapestry/internal/transform/TransformStrings.properties
 Mon Apr 24 17:52:01 2006
@@ -16,7 +16,6 @@
 missing-declared-field=Class {0} does not contain a field named ''{1}''.
 error-adding-method=Error adding method {1} to class {0}: {2} 
 field-already-claimed=Field {0} of class {1} is already claimed by {2} and can 
not be claimed by {3}.
-meta-key-exists=Class transformation meta key ''{0}'' already contains value 
''{1}'' and can not be set to ''{2}''.
 no-declared-method=Class {1} does not declare method ''{0}''.
 incorrect-class-for-instantiator=Unable to create a component instantiator for 
class {0} because class {1} was provided instead.
 class-not-transformed=Class {0} was not transformed for use as a component; 
either it does not have the @ComponentClass annotation, or was not in a package 
subject to component transformation.

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationAspectTest.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationAspectTest.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationAspectTest.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationAspectTest.java
 Mon Apr 24 17:52:01 2006
@@ -26,25 +26,59 @@
     private static final int THREAD_BLOCK_SIZE = 50;
 
     @Test
-    public void incrementCounter() throws Exception
+    public void readLockThenWriteLock() throws Exception
     {
-        List<Thread> threads = newList();
-        List<Thread> running = newList();
+        Runnable operation = new Runnable()
+        {
+            public void run()
+            {
 
-        for (int i = 0; i < THREAD_COUNT; i++)
+                int start = _target.getCounter();
+
+                _target.incrementCounter();
+
+                assertTrue(_target.getCounter() > start);
+            }
+        };
+
+        runOperation(operation);
+    }
+
+    @Test
+    public void readLockInsideWriteLock() throws Exception
+    {
+        Runnable operation = new Runnable()
         {
-            Thread t = new Thread(new Runnable()
+            public void run()
             {
-                public void run()
-                {
 
-                    int start = _target.getCounter();
+                int start = _target.getCounter();
+
+                // Gets a write lock, then a read lock.
 
-                    _target.incrementCounter();
+                _target.incrementCounterHard();
+
+                // If we tried _target.incrementIfNonNegative() we would
+                // hang!
+
+                assertTrue(_target.getCounter() > start);
+            }
+        };
+
+        runOperation(operation);
+    }
+
+    private void runOperation(Runnable operation) throws InterruptedException
+    {
+        List<Thread> threads = newList();
+        List<Thread> running = newList();
+
+        _target.setCounter(0);
+
+        for (int i = 0; i < THREAD_COUNT; i++)
+        {
 
-                    assertTrue(_target.getCounter() > start);
-                }
-            });
+            Thread t = new Thread(operation);
 
             threads.add(t);
 

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationTarget.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationTarget.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationTarget.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/aspects/SynchronizationTarget.java
 Mon Apr 24 17:52:01 2006
@@ -10,57 +10,36 @@
 @Synchronized
 public class SynchronizationTarget
 {
-    // private final ReadWriteLock _lock = new ReentrantReadWriteLock();
-
     private int _counter;
 
     @Synchronized.Read
     public int getCounter()
     {
-        // _lock.readLock().lock();
-
-        try
-        {
-            return _counter;
-        }
-        finally
-        {
-            // _lock.readLock().unlock();
-        }
+        return _counter;
     }
 
     @Synchronized.Write
     public void incrementCounter()
     {
-        // _lock.writeLock().lock();
-
-        try
-        {
-            _counter++;
-        }
-        finally
-        {
-            // _lock.writeLock().unlock();
-        }
+        _counter++;
     }
 
     @Synchronized.Write
-    public void setCounter(int newValue)
+    public void setCounter(int counter)
+    {
+        _counter = counter;
+    }
+
+    @Synchronized.Read
+    public void incrementIfNonNegative()
     {
-        // _lock.writeLock().lock();
-        try
-        {
-            _counter = newValue;
-        }
-        finally
-        {
-            // _lock.writeLock().unlock();
-        }
+        if (_counter >= 0)
+            incrementCounter();
     }
 
     @Synchronized.Write
     public void incrementCounterHard()
     {
-        setCounter(getCounter() + 1);
+        _counter = getCounter() + 1;
     }
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/InternalClassTransformationImplTest.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/InternalClassTransformationImplTest.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/InternalClassTransformationImplTest.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/InternalClassTransformationImplTest.java
 Mon Apr 24 17:52:01 2006
@@ -29,17 +29,16 @@
 import org.apache.tapestry.ResourceAware;
 import org.apache.tapestry.annotations.ComponentClass;
 import org.apache.tapestry.annotations.Retain;
+import org.apache.tapestry.events.ComponentLifecycle;
 import org.apache.tapestry.internal.InternalComponentResources;
 import org.apache.tapestry.internal.transform.pages.AbstractFoo;
 import org.apache.tapestry.internal.transform.pages.BarImpl;
+import org.apache.tapestry.internal.transform.pages.BasicComponent;
 import 
org.apache.tapestry.internal.transform.pages.ChildClassInheritsAnnotation;
 import org.apache.tapestry.internal.transform.pages.ClaimedFields;
 import org.apache.tapestry.internal.transform.pages.ParentClass;
 import org.apache.tapestry.internal.transform.pages.TargetObject;
-import 
org.apache.tapestry.internal.transform.worker.ImplementResourceAwareWorker;
-import org.apache.tapestry.model.MutableComponentModel;
 import org.apache.tapestry.test.BaseTestCase;
-import org.apache.tapestry.transform.ClassTransformWorker;
 import org.apache.tapestry.transform.ClassTransformation;
 import org.testng.annotations.Configuration;
 import org.testng.annotations.Test;
@@ -108,30 +107,6 @@
     }
 
     @Test
-    public void meta() throws Exception
-    {
-        ClassTransformation ct = createClassTransformation(ParentClass.class);
-
-        assertNull(ct.readMeta("foo.bar"));
-
-        ct.storeMeta("foo.bar", "baz");
-
-        assertEquals(ct.readMeta("foo.bar"), "baz");
-
-        try
-        {
-            ct.storeMeta("foo.bar", "Biff");
-            unreachable();
-        }
-        catch (IllegalArgumentException ex)
-        {
-            assertEquals(
-                    ex.getMessage(),
-                    "Class transformation meta key 'foo.bar' already contains 
value 'baz' and can not be set to 'Biff'.");
-        }
-    }
-
-    @Test
     public void findAnnotationOnUnknownField() throws Exception
     {
         ClassTransformation ct = createClassTransformation(ParentClass.class);
@@ -334,7 +309,6 @@
     @Test
     public void injectField() throws Exception
     {
-        MutableComponentModel model = newMutableComponentModel();
         InternalComponentResources resources = newInternalComponentResources();
 
         ClassLoader childLoader = newLoader();
@@ -343,14 +317,6 @@
 
         InternalClassTransformation ct = new 
InternalClassTransformationImpl(targetObjectCtClass);
 
-        replay();
-
-        ClassTransformWorker worker = new ImplementResourceAwareWorker();
-
-        worker.transform(ct, model);
-
-        verify();
-
         ct.finish();
 
         Class transformed = _classPool.toClass(targetObjectCtClass, 
childLoader);
@@ -365,23 +331,13 @@
     @Test
     public void wrongClassPassedToCreateInstantiator() throws Exception
     {
-        MutableComponentModel model = newMutableComponentModel();
-
         ClassLoader childLoader = newLoader();
 
-        CtClass targetObjectCtClass = findCtClass(TargetObject.class);
-
-        InternalClassTransformation ct = new 
InternalClassTransformationImpl(targetObjectCtClass);
+        CtClass ctClass = findCtClass(BasicComponent.class);
 
-        replay();
+        InternalClassTransformation ct = new 
InternalClassTransformationImpl(ctClass);
 
-        ClassTransformWorker worker = new ImplementResourceAwareWorker();
-
-        worker.transform(ct, model);
-
-        ct.finish();
-
-        _classPool.toClass(targetObjectCtClass, childLoader);
+        _classPool.toClass(ctClass, childLoader);
 
         try
         {
@@ -391,11 +347,9 @@
         catch (IllegalArgumentException ex)
         {
             assertEquals(ex.getMessage(), 
TransformMessages.incorrectClassForInstantiator(
-                    TargetObject.class.getName(),
+                    BasicComponent.class.getName(),
                     Boolean.class));
         }
-
-        verify();
     }
 
     private Loader newLoader()
@@ -414,19 +368,14 @@
     @Test
     public void addImplementedInterface() throws Exception
     {
-        MutableComponentModel model = newMutableComponentModel();
         InternalComponentResources resources = newInternalComponentResources();
 
-        replay();
-
         ClassLoader childLoader = newLoader();
 
         CtClass targetObjectCtClass = findCtClass(TargetObject.class);
 
         InternalClassTransformation ct = new 
InternalClassTransformationImpl(targetObjectCtClass);
 
-        new ImplementResourceAwareWorker().transform(ct, model);
-
         ct.addImplementedInterface(FooInterface.class);
         ct.addImplementedInterface(GetterMethodsInterface.class);
 
@@ -443,7 +392,7 @@
         Class[] interfaces = transformed.getInterfaces();
 
         assertEquals(interfaces, new Class[]
-        { ResourceAware.class, FooInterface.class, 
GetterMethodsInterface.class });
+        { ComponentLifecycle.class, FooInterface.class, 
GetterMethodsInterface.class });
 
         Object target = 
ct.createInstantiator(transformed).newInstance(resources);
 
@@ -463,7 +412,5 @@
         assertNull(getters.getString());
         assertNull(getters.getObjectArray());
         assertNull(getters.getIntArray());
-
-        verify();
     }
 }

Modified: 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorkerTest.java
URL: 
http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorkerTest.java?rev=396751&r1=396750&r2=396751&view=diff
==============================================================================
--- 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorkerTest.java
 (original)
+++ 
tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/worker/UnclaimedFieldWorkerTest.java
 Mon Apr 24 17:52:01 2006
@@ -59,8 +59,6 @@
         ct.addField(Modifier.PRIVATE, "foo.Bar", "_fredDefault");
         setReturnValue("_$fredDefault");
 
-        ct.addImplementedInterface(ComponentLifecycle.class);
-
         ct.extendMethod(CONTAINING_PAGE_DID_LOAD_SIGNATURE, "_$fredDefault = 
_fred;");
         ct.extendMethod(CONTAINING_PAGE_DID_DETACH_SIGNATURE, "_fred = 
_$fredDefault;");
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to