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]