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);