Author: hlship
Date: Fri Jan 22 16:30:12 2010
New Revision: 902149

URL: http://svn.apache.org/viewvc?rev=902149&view=rev
Log:
Convert MixinWorker to use a ComponentValueProvider to inject a component mixin 
into a container component.

Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MixinWorker.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/MixinWorkerTest.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MixinWorker.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MixinWorker.java?rev=902149&r1=902148&r2=902149&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MixinWorker.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/MixinWorker.java
 Fri Jan 22 16:30:12 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2008, 2009 The Apache Software Foundation
+// Copyright 2006, 2008, 2009, 2010 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.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,19 +14,24 @@
 
 package org.apache.tapestry5.internal.transform;
 
+import org.apache.tapestry5.ComponentResources;
 import org.apache.tapestry5.annotations.Mixin;
+import org.apache.tapestry5.internal.InternalComponentResources;
 import org.apache.tapestry5.ioc.internal.util.InternalUtils;
 import org.apache.tapestry5.model.MutableComponentModel;
 import org.apache.tapestry5.services.ClassTransformation;
 import org.apache.tapestry5.services.ComponentClassResolver;
 import org.apache.tapestry5.services.ComponentClassTransformWorker;
+import org.apache.tapestry5.services.ComponentValueProvider;
 import org.apache.tapestry5.services.TransformConstants;
 
 import java.util.List;
 
 /**
- * Supports the {...@link org.apache.tapestry5.annotations.Mixin} annotation, 
which allows a mixin to be part of the
- * implementation of a component. The annotation is applied to a field, which 
will become read-only, and contain a
+ * Supports the {...@link org.apache.tapestry5.annotations.Mixin} annotation, 
which allows a mixin to
+ * be part of the
+ * implementation of a component. The annotation is applied to a field, which 
will become read-only,
+ * and contain a
  * reference to the mixin instance.
  */
 public class MixinWorker implements ComponentClassTransformWorker
@@ -47,25 +52,32 @@
             Mixin annotation = transformation.getFieldAnnotation(fieldName, 
Mixin.class);
 
             transformation.claimField(fieldName, annotation);
-            
+
             String mixinType = annotation.value();
 
             String[] order = annotation.order();
 
             String fieldType = transformation.getFieldType(fieldName);
 
-            String mixinClassName = InternalUtils.isBlank(mixinType) ? 
fieldType : resolver
+            final String mixinClassName = InternalUtils.isBlank(mixinType) ? 
fieldType : resolver
                     .resolveMixinTypeToClassName(mixinType);
 
-            model.addMixinClassName(mixinClassName,order);
+            model.addMixinClassName(mixinClassName, order);
 
-            transformation.makeReadOnly(fieldName);
+            ComponentValueProvider<Object> provider = new 
ComponentValueProvider<Object>()
+            {
 
-            String body = String.format("%s = (%s) 
%s.getMixinByClassName(\"%s\");", fieldName, fieldType,
-                                        
transformation.getResourcesFieldName(), mixinClassName);
+                @Override
+                public Object get(ComponentResources resources)
+                {
+                    InternalComponentResources icr = 
(InternalComponentResources) resources;
+
+                    return icr.getMixinByClassName(mixinClassName);
+                }
+            };
 
-            transformation
-                    
.extendMethod(TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE, body);
+            transformation.assignFieldIndirect(fieldName,
+                    TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE, 
provider);
         }
     }
 }

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/MixinWorkerTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/MixinWorkerTest.java?rev=902149&r1=902148&r2=902149&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/MixinWorkerTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/transform/MixinWorkerTest.java
 Fri Jan 22 16:30:12 2010
@@ -1,10 +1,10 @@
-// Copyright 2006, 2007, 2008, 2009 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009, 2010 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.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -19,6 +19,7 @@
 import org.apache.tapestry5.model.MutableComponentModel;
 import org.apache.tapestry5.services.ClassTransformation;
 import org.apache.tapestry5.services.ComponentClassResolver;
+import org.apache.tapestry5.services.ComponentValueProvider;
 import org.apache.tapestry5.services.TransformConstants;
 import org.testng.annotations.Test;
 import org.easymock.EasyMock;
@@ -41,14 +42,16 @@
         verify();
     }
 
+    @SuppressWarnings("unchecked")
     @Test
     public void field_with_explicit_type_and_order()
     {
         ComponentClassResolver resolver = mockComponentClassResolver();
         ClassTransformation transformation = mockClassTransformation();
         MutableComponentModel model = mockMutableComponentModel();
-        String[] order = {"before:*"};
-        Mixin annotation = newMixin("Bar",order);
+        String[] order =
+        { "before:*" };
+        Mixin annotation = newMixin("Bar", order);
 
         train_findFieldsWithAnnotation(transformation, Mixin.class, "fred");
         train_getFieldAnnotation(transformation, "fred", Mixin.class, 
annotation);
@@ -56,16 +59,11 @@
 
         train_resolveMixinTypeToClassName(resolver, "Bar", "foo.bar.BazMixin");
 
-        model.addMixinClassName("foo.bar.BazMixin",order);
+        model.addMixinClassName("foo.bar.BazMixin", order);
 
-        transformation.makeReadOnly("fred");
-
-        train_getResourcesFieldName(transformation, "rez");
-
-        train_extendMethod(
-                transformation,
-                TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE,
-                "fred = (foo.bar.Baz) 
rez.getMixinByClassName(\"foo.bar.BazMixin\");");
+        transformation.assignFieldIndirect(EasyMock.eq("fred"), EasyMock
+                .eq(TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE), 
EasyMock
+                .isA(ComponentValueProvider.class));
 
         transformation.claimField("fred", annotation);
 
@@ -76,6 +74,7 @@
         verify();
     }
 
+    @SuppressWarnings("unchecked")
     @Test
     public void field_with_no_specific_mixin_type_or_order()
     {
@@ -83,22 +82,17 @@
         ClassTransformation transformation = mockClassTransformation();
         MutableComponentModel model = mockMutableComponentModel();
         String[] order = new String[0];
-        Mixin annotation = newMixin("",order);
+        Mixin annotation = newMixin("", order);
 
         train_findFieldsWithAnnotation(transformation, Mixin.class, "fred");
         train_getFieldAnnotation(transformation, "fred", Mixin.class, 
annotation);
         train_getFieldType(transformation, "fred", "foo.bar.Baz");
 
-        model.addMixinClassName("foo.bar.Baz",order);
-
-        transformation.makeReadOnly("fred");
-
-        train_getResourcesFieldName(transformation, "rez");
+        model.addMixinClassName("foo.bar.Baz", order);
 
-        train_extendMethod(
-                transformation,
-                TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE,
-                "fred = (foo.bar.Baz) 
rez.getMixinByClassName(\"foo.bar.Baz\");");
+        transformation.assignFieldIndirect(EasyMock.eq("fred"), EasyMock
+                .eq(TransformConstants.CONTAINING_PAGE_DID_LOAD_SIGNATURE), 
EasyMock
+                .isA(ComponentValueProvider.class));
 
         transformation.claimField("fred", annotation);
 
@@ -111,12 +105,12 @@
     }
 
     protected final void 
train_resolveMixinTypeToClassName(ComponentClassResolver resolver,
-                                                           String mixinType, 
String mixinClassName)
+            String mixinType, String mixinClassName)
     {
         
expect(resolver.resolveMixinTypeToClassName(mixinType)).andReturn(mixinClassName);
     }
 
-    private Mixin newMixin(String value,String...order)
+    private Mixin newMixin(String value, String... order)
     {
         Mixin annotation = newMock(Mixin.class);
 


Reply via email to