You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2008/05/01 03:24:18 UTC
svn commit: r652417 - in /tapestry/tapestry5/trunk:
tapestry-core/src/main/java/org/apache/tapestry/internal/services/
tapestry-core/src/test/java/org/apache/tapestry/internal/services/
tapestry-core/src/test/java/org/apache/tapestry/internal/transform...
Author: hlship
Date: Wed Apr 30 18:24:18 2008
New Revision: 652417
URL: http://svn.apache.org/viewvc?rev=652417&view=rev
Log:
TAPESTRY-2398: ClassTransformation.addInjectedField() adds fields as protected which can cause exceptions due to visibility
TAPESTRY-2400: Advising a method where the parameter type or return type is the class containing the advised method may throw a java.lang.VerifyError
Added:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSource.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSourceImpl.java (contents, props changed)
- copied, changed from r647587, tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSource.java
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSource.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InvocationBuilder.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/InternalClassTransformationImplTest.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/transform/ApplicationStateWorkerTest.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/transform/ParameterWorkerTest.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/AbstractFab.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ClassFabImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ClassFactoryImpl.java
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry/ioc/internal/services/ClassFabImplTest.java
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentClassTransformerImpl.java Wed Apr 30 18:24:18 2008
@@ -22,6 +22,7 @@
import org.apache.tapestry.internal.model.MutableComponentModelImpl;
import org.apache.tapestry.ioc.LoggerSource;
import org.apache.tapestry.ioc.Resource;
+import org.apache.tapestry.ioc.internal.services.CtClassSource;
import org.apache.tapestry.ioc.internal.util.ClasspathResource;
import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newConcurrentMap;
import org.apache.tapestry.ioc.services.ClassFactory;
@@ -52,6 +53,8 @@
private final ClassFactory _classFactory;
+ private final CtClassSource _classSource;
+
private final ComponentClassCache _componentClassCache;
private final String[] SUBPACKAGES = { "." + InternalConstants.PAGES_SUBPACKAGE + ".",
@@ -61,16 +64,20 @@
/**
* @param workerChain the ordered list of class transform works as a chain of command instance
+ * @param classSource
* @param componentClassCache
*/
- public ComponentClassTransformerImpl(ComponentClassTransformWorker workerChain, LoggerSource loggerSource,
+ public ComponentClassTransformerImpl(ComponentClassTransformWorker workerChain,
+ LoggerSource loggerSource,
@ComponentLayer ClassFactory classFactory,
+ @ComponentLayer CtClassSource classSource,
ComponentClassCache componentClassCache)
{
_workerChain = workerChain;
_loggerSource = loggerSource;
_classFactory = classFactory;
_componentClassCache = componentClassCache;
+ _classSource = classSource;
}
/**
@@ -143,7 +150,7 @@
InternalClassTransformation transformation =
parentTransformation == null
- ? new InternalClassTransformationImpl(_classFactory, _componentClassCache, ctClass, model)
+ ? new InternalClassTransformationImpl(_classFactory, ctClass, _componentClassCache, model, _classSource)
: parentTransformation.createChildTransformation(ctClass, model);
try
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSource.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSource.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSource.java Wed Apr 30 18:24:18 2008
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2008 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.
@@ -15,6 +15,7 @@
package org.apache.tapestry.internal.services;
import org.apache.tapestry.internal.event.InvalidationEventHub;
+import org.apache.tapestry.ioc.internal.services.CtClassSource;
import org.apache.tapestry.ioc.services.ClassFactory;
/**
@@ -63,4 +64,9 @@
*/
ClassFactory getClassFactory();
+ /**
+ * Returns a class source used when creating new classes dynamically.
+ */
+ CtClassSource getClassSource();
+
}
\ No newline at end of file
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImpl.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstantiatorSourceImpl.java Wed Apr 30 18:24:18 2008
@@ -20,6 +20,8 @@
import org.apache.tapestry.internal.util.URLChangeTracker;
import org.apache.tapestry.ioc.internal.services.ClassFactoryClassPool;
import org.apache.tapestry.ioc.internal.services.ClassFactoryImpl;
+import org.apache.tapestry.ioc.internal.services.CtClassSource;
+import org.apache.tapestry.ioc.internal.services.CtClassSourceImpl;
import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newSet;
import org.apache.tapestry.ioc.internal.util.Defense;
@@ -61,6 +63,7 @@
* Map from class name to Instantiator.
*/
private final Map<String, Instantiator> _instantiatorMap = newMap();
+ private CtClassSource _classSource;
private class PackageAwareLoader extends Loader
{
@@ -124,6 +127,8 @@
classPool.appendClassPath(path);
+ _classSource = new CtClassSourceImpl(classPool, _loader);
+
try
{
_loader.addTranslator(classPool, this);
@@ -133,7 +138,7 @@
throw new RuntimeException(ex);
}
- _classFactory = new ClassFactoryImpl(_loader, classPool, _logger);
+ _classFactory = new ClassFactoryImpl(_loader, classPool, _classSource, _logger);
}
// This is called from well within a synchronized block.
@@ -301,4 +306,9 @@
{
return _classFactory;
}
+
+ public CtClassSource getClassSource()
+ {
+ return _classSource;
+ }
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InternalClassTransformationImpl.java Wed Apr 30 18:24:18 2008
@@ -20,6 +20,7 @@
import org.apache.tapestry.ComponentResources;
import org.apache.tapestry.internal.InternalComponentResources;
import org.apache.tapestry.internal.util.MultiKey;
+import org.apache.tapestry.ioc.internal.services.CtClassSource;
import org.apache.tapestry.ioc.internal.util.CollectionFactory;
import static org.apache.tapestry.ioc.internal.util.CollectionFactory.*;
import org.apache.tapestry.ioc.internal.util.Defense;
@@ -119,6 +120,8 @@
private final ComponentClassCache _componentClassCache;
+ private final CtClassSource _classSource;
+
/**
* Signature for newInstance() method of Instantiator.
*/
@@ -130,11 +133,13 @@
/**
* This is a constructor for a base class.
*/
- public InternalClassTransformationImpl(ClassFactory classFactory, ComponentClassCache componentClassCache,
- CtClass ctClass, ComponentModel componentModel)
+ public InternalClassTransformationImpl(ClassFactory classFactory, CtClass ctClass,
+ ComponentClassCache componentClassCache,
+ ComponentModel componentModel, CtClassSource classSource)
{
_ctClass = ctClass;
_componentClassCache = componentClassCache;
+ _classSource = classSource;
_classPool = _ctClass.getClassPool();
_classFactory = classFactory;
_parentTransformation = null;
@@ -166,11 +171,13 @@
* Constructor for a component sub-class.
*/
private InternalClassTransformationImpl(CtClass ctClass, InternalClassTransformation parentTransformation,
- ClassFactory classFactory, ComponentClassCache componentClassCache,
+ ClassFactory classFactory, CtClassSource classSource,
+ ComponentClassCache componentClassCache,
ComponentModel componentModel)
{
_ctClass = ctClass;
_componentClassCache = componentClassCache;
+ _classSource = classSource;
_classPool = _ctClass.getClassPool();
_classFactory = classFactory;
_logger = componentModel.getLogger();
@@ -183,8 +190,6 @@
preloadMemberNames();
- verifyFields();
-
_constructorArgs = parentTransformation.getConstructorArgs();
int count = _constructorArgs.size();
@@ -211,7 +216,9 @@
public InternalClassTransformation createChildTransformation(CtClass childClass, MutableComponentModel childModel)
{
- return new InternalClassTransformationImpl(childClass, this, _classFactory, _componentClassCache, childModel);
+ return new InternalClassTransformationImpl(childClass, this, _classFactory, _classSource, _componentClassCache,
+ childModel
+ );
}
private void freeze()
@@ -1186,6 +1193,8 @@
addInjectToConstructor(fieldName, ctType, value);
+ _addedFieldNames.add(fieldName);
+
return fieldName;
}
@@ -1209,7 +1218,7 @@
if (builder == null)
{
- builder = new InvocationBuilder(this, _classFactory, _componentClassCache, methodSignature);
+ builder = new InvocationBuilder(this, _componentClassCache, methodSignature, _classSource);
_methodToInvocationBuilder.put(methodSignature, builder);
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InternalModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InternalModule.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InternalModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InternalModule.java Wed Apr 30 18:24:18 2008
@@ -24,9 +24,11 @@
import org.apache.tapestry.ioc.annotations.Marker;
import org.apache.tapestry.ioc.annotations.Scope;
import org.apache.tapestry.ioc.annotations.Symbol;
+import org.apache.tapestry.ioc.internal.services.CtClassSource;
import org.apache.tapestry.ioc.services.Builtin;
import org.apache.tapestry.ioc.services.ClassFactory;
import org.apache.tapestry.ioc.services.PerthreadManager;
+import org.apache.tapestry.ioc.services.PropertyShadowBuilder;
import org.apache.tapestry.services.*;
import org.slf4j.Logger;
@@ -229,5 +231,10 @@
return service;
}
+ @Marker(ComponentLayer.class)
+ public CtClassSource buildCtClassSource(PropertyShadowBuilder builder)
+ {
+ return builder.build(_componentInstantiatorSource, "classSource", CtClassSource.class);
+ }
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InvocationBuilder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InvocationBuilder.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InvocationBuilder.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/InvocationBuilder.java Wed Apr 30 18:24:18 2008
@@ -14,11 +14,10 @@
package org.apache.tapestry.internal.services;
+import javassist.*;
import org.apache.tapestry.ComponentResources;
-import org.apache.tapestry.ioc.services.ClassFab;
+import org.apache.tapestry.ioc.internal.services.CtClassSource;
import org.apache.tapestry.ioc.services.ClassFabUtils;
-import org.apache.tapestry.ioc.services.ClassFactory;
-import org.apache.tapestry.ioc.services.MethodSignature;
import org.apache.tapestry.ioc.util.BodyBuilder;
import org.apache.tapestry.services.ComponentMethodAdvice;
import org.apache.tapestry.services.TransformMethodSignature;
@@ -28,48 +27,49 @@
/**
* Used by {@link org.apache.tapestry.internal.services.InternalClassTransformationImpl} to manage adding method
- * invocation advice to arbitrary methods.
+ * invocation advice to arbitrary component methods.
*/
public class InvocationBuilder
{
private static final String FIELD_NAME = "_p";
- private static final MethodSignature OVERRIDE_SIGNATURE =
- new MethodSignature(void.class, "override", new Class[] { int.class, Object.class }, null);
-
- private static final MethodSignature GET_PARAMETER_SIGNATURE =
- new MethodSignature(Object.class, "getParameter", new Class[] { int.class }, null);
+ private static final int PROTECTED_FINAL = Modifier.PROTECTED | Modifier.FINAL;
- private static final MethodSignature INVOKE_ADVISED_METHOD_SIGNATURE =
- new MethodSignature(void.class, "invokeAdvisedMethod", null, null);
+ private static final int PUBLIC_FINAL = Modifier.PUBLIC | Modifier.FINAL;
private final InternalClassTransformation _transformation;
- private final ClassFactory _classFactory;
+ private final CtClassSource _classSource;
- private final TransformMethodSignature _methodSignature;
+ private final TransformMethodSignature _advisedMethod;
private final MethodInvocationInfo _info;
- private static final AtomicLong UID_GENERATOR = new AtomicLong(System.currentTimeMillis());
+ private final CtClass _invocationCtClass;
- private static final int PROTECTED_FINAL = Modifier.PROTECTED | Modifier.FINAL;
+ private final String _invocationClassName;
- private static final int PUBLIC_FINAL = Modifier.PUBLIC | Modifier.FINAL;
+ private static final AtomicLong UID_GENERATOR = new AtomicLong(System.currentTimeMillis());
private static String nextUID()
{
return Long.toHexString(UID_GENERATOR.getAndIncrement());
}
- public InvocationBuilder(InternalClassTransformation transformation, ClassFactory classFactory,
- ComponentClassCache componentClassCache, TransformMethodSignature methodSignature)
+ public InvocationBuilder(InternalClassTransformation transformation,
+ ComponentClassCache componentClassCache, TransformMethodSignature advisedMethod,
+ CtClassSource classSource)
{
_transformation = transformation;
- _classFactory = classFactory;
- _methodSignature = methodSignature;
+ _advisedMethod = advisedMethod;
+ _classSource = classSource;
+
+ _info = new MethodInvocationInfo(advisedMethod, componentClassCache);
+
+ _invocationClassName = _transformation.getClassName() + "$" + _advisedMethod.getMethodName() + "$invocation_" + nextUID();
+
+ _invocationCtClass = _classSource.newClass(_invocationClassName, AbstractComponentMethodInvocation.class);
- _info = new MethodInvocationInfo(methodSignature, componentClassCache);
}
public void addAdvice(ComponentMethodAdvice advice)
@@ -77,52 +77,55 @@
_info.addAdvice(advice);
}
+ /**
+ * Commit the changes, creating the new class for the invocation, and renaming and rewriting the advised method.
+ */
public void commit()
{
// The class name is the component class name plus the method name plus a unique uid. This places
// the invocation in the same package as the component class; the original method will ultimately
// be renamed and modified to be package private.
- String className =
- _transformation.getClassName() + "$" + _methodSignature.getMethodName() + "$invocation_" + nextUID();
-
- ClassFab invocationFab = _classFactory.newClass(className, AbstractComponentMethodInvocation.class);
-
- createConstructor(invocationFab);
-
- implementOverride(invocationFab);
+ try
+ {
+ createConstructor();
- implementGetParameter(invocationFab);
+ implementOverride();
- String renamed = copyAdvisedMethod();
+ implementGetParameter();
- implementInvokeAdviseMethod(invocationFab, renamed);
+ String renamed = copyAdvisedMethod();
- rebuildOriginalMethod(className);
+ implementInvokeAdvisedMethod(renamed);
- // Force the creation of the class now
+ _classSource.createClass(_invocationCtClass);
+ }
+ catch (Exception ex)
+ {
+ throw new RuntimeException(ex);
+ }
- invocationFab.createClass();
+ rebuildOriginalMethod();
}
- private void rebuildOriginalMethod(String invocationClassName)
+ private void rebuildOriginalMethod()
{
String methodInfoField = _transformation.addInjectedField(MethodInvocationInfo.class,
- _methodSignature.getMethodName() + "Info",
+ _advisedMethod.getMethodName() + "Info",
_info);
String componentResourcesField = _transformation.getResourcesFieldName();
BodyBuilder builder = new BodyBuilder().begin();
- builder.addln("%s invocation = new %<s(%s, %s, $$);", invocationClassName, methodInfoField,
+ builder.addln("%s invocation = new %<s(%s, %s, $$);", _invocationClassName, methodInfoField,
componentResourcesField);
// Off into the first MethodAdvice
builder.addln("invocation.proceed();");
- String[] exceptionTypes = _methodSignature.getExceptionTypes();
+ String[] exceptionTypes = _advisedMethod.getExceptionTypes();
int exceptionCount = exceptionTypes.length;
if (exceptionCount > 0)
@@ -138,7 +141,7 @@
}
}
- String returnType = _methodSignature.getReturnType();
+ String returnType = _advisedMethod.getReturnType();
if (!returnType.equals("void"))
{
@@ -150,18 +153,18 @@
builder.end();
/** Replace the original method with the new implementation. */
- _transformation.addMethod(_methodSignature, builder.toString());
+ _transformation.addMethod(_advisedMethod, builder.toString());
}
- private void implementInvokeAdviseMethod(ClassFab classFab, String advisedMethodName)
+ private void implementInvokeAdvisedMethod(String advisedMethodName) throws CannotCompileException
{
BodyBuilder builder = new BodyBuilder().begin();
- boolean isVoid = _methodSignature.getReturnType().equals("void");
+ boolean isVoid = _advisedMethod.getReturnType().equals("void");
builder.addln("%s component = (%<s) getComponentResources().getComponent();", _transformation.getClassName());
- String[] exceptionTypes = _methodSignature.getExceptionTypes();
+ String[] exceptionTypes = _advisedMethod.getExceptionTypes();
int exceptionCount = exceptionTypes.length;
if (exceptionCount > 0)
@@ -171,7 +174,7 @@
builder.add("component.%s(", advisedMethodName);
- for (int i = 0; i < _methodSignature.getParameterTypes().length; i++)
+ for (int i = 0; i < _advisedMethod.getParameterTypes().length; i++)
{
if (i > 0) builder.add(", ");
@@ -196,26 +199,32 @@
builder.end();
- classFab.addMethod(PROTECTED_FINAL, INVOKE_ADVISED_METHOD_SIGNATURE, builder.toString());
+ CtMethod method = new CtMethod(CtClass.voidType, "invokeAdvisedMethod",
+ new CtClass[0], _invocationCtClass);
+
+ method.setModifiers(PROTECTED_FINAL);
+ method.setBody(builder.toString());
+
+ _invocationCtClass.addMethod(method);
}
private String copyAdvisedMethod()
{
- String newName = _transformation.newMemberName("advised$" + _methodSignature.getMethodName());
+ String newName = _transformation.newMemberName("advised$" + _advisedMethod.getMethodName());
- _transformation.copyMethod(_methodSignature, Modifier.FINAL, newName);
+ _transformation.copyMethod(_advisedMethod, Modifier.FINAL, newName);
return newName;
}
- private void createConstructor(ClassFab classFab)
+ private void createConstructor() throws CannotCompileException
{
int parameterCount = _info.getParameterCount();
- Class[] parameterTypes = new Class[parameterCount + 2];
+ CtClass[] parameterTypes = new CtClass[parameterCount + 2];
- parameterTypes[0] = MethodInvocationInfo.class;
- parameterTypes[1] = ComponentResources.class;
+ parameterTypes[0] = toCtClass(MethodInvocationInfo.class);
+ parameterTypes[1] = toCtClass(ComponentResources.class);
BodyBuilder builder = new BodyBuilder().begin().addln("super($1,$2);");
@@ -223,31 +232,44 @@
{
String name = FIELD_NAME + i;
- Class parameterType = _info.getParameterType(i);
+ String parameterTypeName = _advisedMethod.getParameterTypes()[i];
- parameterTypes[2 + i] = parameterType;
+ CtClass parameterType = _classSource.toCtClass(parameterTypeName);
- classFab.addField(name, _info.getParameterType(i));
+ CtField field = new CtField(parameterType, name, _invocationCtClass);
+ field.setModifiers(Modifier.PRIVATE);
+ _invocationCtClass.addField(field);
+
+ parameterTypes[2 + i] = parameterType;
builder.addln("%s = $%d;", name, 3 + i);
}
builder.end();
- classFab.addConstructor(parameterTypes, null, builder.toString());
+ CtConstructor constructor = new CtConstructor(parameterTypes, _invocationCtClass);
+ constructor.setBody(builder.toString());
+
+ _invocationCtClass.addConstructor(constructor);
+
}
- private void implementOverride(ClassFab classFab)
+ private CtClass toCtClass(Class input)
+ {
+ return _classSource.toCtClass(input);
+ }
+
+ private void implementOverride() throws CannotCompileException
{
BodyBuilder builder = new BodyBuilder().begin();
builder.addln("switch ($1)").begin();
- int count = _methodSignature.getParameterTypes().length;
+ int count = _advisedMethod.getParameterTypes().length;
for (int i = 0; i < count; i++)
{
- String type = _methodSignature.getParameterTypes()[i];
+ String type = _advisedMethod.getParameterTypes()[i];
builder.addln("case %d: %s = %s; break;", i, FIELD_NAME + i, ClassFabUtils.castReference("$2", type));
}
@@ -256,16 +278,22 @@
builder.end().end();
- classFab.addMethod(PUBLIC_FINAL, OVERRIDE_SIGNATURE, builder.toString());
+ CtMethod method = new CtMethod(CtClass.voidType, "override",
+ new CtClass[] { CtClass.intType, toCtClass(Object.class) }, _invocationCtClass);
+
+ method.setModifiers(PUBLIC_FINAL);
+ method.setBody(builder.toString());
+
+ _invocationCtClass.addMethod(method);
}
- private void implementGetParameter(ClassFab classFab)
+ private void implementGetParameter() throws CannotCompileException
{
BodyBuilder builder = new BodyBuilder().begin();
builder.addln("switch ($1)").begin();
- int count = _methodSignature.getParameterTypes().length;
+ int count = _advisedMethod.getParameterTypes().length;
for (int i = 0; i < count; i++)
{
@@ -276,7 +304,13 @@
builder.end().end();
- classFab.addMethod(PUBLIC_FINAL, GET_PARAMETER_SIGNATURE, builder.toString());
+ CtMethod method = new CtMethod(toCtClass(Object.class), "getParameter",
+ new CtClass[] { CtClass.intType }, _invocationCtClass);
+
+ method.setModifiers(PUBLIC_FINAL);
+ method.setBody(builder.toString());
+
+ _invocationCtClass.addMethod(method);
}
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/InternalClassTransformationImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/InternalClassTransformationImplTest.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/InternalClassTransformationImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/InternalClassTransformationImplTest.java Wed Apr 30 18:24:18 2008
@@ -173,7 +173,7 @@
MutableComponentModel model = new MutableComponentModelImpl("unknown-class", logger, null, null);
- return new InternalClassTransformationImpl(_classFactory, null, ctClass, model);
+ return new InternalClassTransformationImpl(_classFactory, ctClass, null, model, null);
}
@Test
@@ -483,8 +483,8 @@
replay();
- InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, null, targetObjectCtClass,
- model);
+ InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, targetObjectCtClass, null,
+ model, null);
// Default behavior is to add an injected field for the InternalComponentResources object,
// so we'll just check that.
@@ -516,8 +516,8 @@
replay();
- InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, null, targetObjectCtClass,
- model);
+ InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, targetObjectCtClass, null,
+ model, null);
String parentFieldName = ct.addInjectedField(String.class, "_value", value);
@@ -568,8 +568,8 @@
replay();
- InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, null, targetObjectCtClass,
- model);
+ InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, targetObjectCtClass, null,
+ model, null);
ct.addImplementedInterface(FooInterface.class);
ct.addImplementedInterface(GetterMethodsInterface.class);
@@ -616,8 +616,8 @@
CtClass targetObjectCtClass = findCtClass(ReadOnlyBean.class);
- InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, null, targetObjectCtClass,
- model);
+ InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, targetObjectCtClass, null,
+ model, null);
ct.makeReadOnly("_value");
@@ -651,7 +651,8 @@
CtClass targetObjectCtClass = findCtClass(RemoveFieldBean.class);
- InternalClassTransformation ct = new InternalClassTransformationImpl(null, null, targetObjectCtClass, model);
+ InternalClassTransformation ct = new InternalClassTransformationImpl(null, targetObjectCtClass, null, model,
+ null);
ct.removeField("_barney");
@@ -672,8 +673,8 @@
CtClass targetObjectCtClass = findCtClass(ReadOnlyBean.class);
- InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, null, targetObjectCtClass,
- model);
+ InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, targetObjectCtClass, null,
+ model, null);
ct.extendConstructor("_value = \"from constructor\";");
@@ -698,8 +699,8 @@
CtClass targetObjectCtClass = findCtClass(ReadOnlyBean.class);
- InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, null, targetObjectCtClass,
- model);
+ InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, targetObjectCtClass, null,
+ model, null);
ct.injectField("_value", "Tapestry");
@@ -741,8 +742,8 @@
CtClass targetObjectCtClass = findCtClass(FieldAccessBean.class);
- InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, null, targetObjectCtClass,
- model);
+ InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, targetObjectCtClass, null,
+ model, null);
replaceAccessToField(ct, "foo");
replaceAccessToField(ct, "bar");
@@ -1129,8 +1130,8 @@
CtClass targetObjectCtClass = findCtClass(FieldRemoval.class);
- InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, null, targetObjectCtClass,
- model);
+ InternalClassTransformation ct = new InternalClassTransformationImpl(_classFactory, targetObjectCtClass, null,
+ model, null);
ct.removeField("_fieldToRemove");
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/transform/ApplicationStateWorkerTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/transform/ApplicationStateWorkerTest.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/transform/ApplicationStateWorkerTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/transform/ApplicationStateWorkerTest.java Wed Apr 30 18:24:18 2008
@@ -127,8 +127,8 @@
replay();
- InternalClassTransformation transformation = new InternalClassTransformationImpl(_classFactory, null, ctClass,
- model);
+ InternalClassTransformation transformation = new InternalClassTransformationImpl(_classFactory, ctClass, null,
+ model, null);
new ApplicationStateWorker(manager, cache).transform(transformation, model);
verify();
@@ -194,8 +194,8 @@
replay();
- InternalClassTransformation transformation = new InternalClassTransformationImpl(_classFactory, null, ctClass,
- model);
+ InternalClassTransformation transformation = new InternalClassTransformationImpl(_classFactory, ctClass, null,
+ model, null);
new ApplicationStateWorker(manager, cache).transform(transformation, model);
verify();
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/transform/ParameterWorkerTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/transform/ParameterWorkerTest.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/transform/ParameterWorkerTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/transform/ParameterWorkerTest.java Wed Apr 30 18:24:18 2008
@@ -602,7 +602,8 @@
replay();
- InternalClassTransformation transformation = new InternalClassTransformationImpl(cf, null, ctClass, model);
+ InternalClassTransformation transformation = new InternalClassTransformationImpl(cf, ctClass, null, model,
+ null);
new ParameterWorker(source).transform(transformation, model);
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/AbstractFab.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/AbstractFab.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/AbstractFab.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/AbstractFab.java Wed Apr 30 18:24:18 2008
@@ -1,4 +1,4 @@
-// Copyright 2005, 2006, 2007 The Apache Software Foundation
+// Copyright 2005, 2006, 2007, 2008 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.
@@ -15,16 +15,12 @@
package org.apache.tapestry.ioc.internal.services;
import javassist.CtClass;
-import static org.apache.tapestry.ioc.internal.util.CollectionFactory.newMap;
import org.apache.tapestry.ioc.internal.util.OneShotLock;
import org.slf4j.Logger;
-import java.util.Map;
-
/**
- * Base class for {@link org.apache.tapestry.ioc.internal.services.ClassFabImpl}. This code is a
- * fork from HiveMind; it is kept seperate from ClassFabImpl in case we want to re-introduce the
- * idea of an InterfaceFab.
+ * Base class for {@link org.apache.tapestry.ioc.internal.services.ClassFabImpl}. This code is a fork from HiveMind; it
+ * is kept seperate from ClassFabImpl in case we want to re-introduce the idea of an InterfaceFab.
*/
public class AbstractFab
{
@@ -43,16 +39,11 @@
_logger = logger;
}
- /**
- * Map from Class to CtClass.
- */
- private final Map<Class, CtClass> _ctClassCache = newMap();
-
public void addInterface(Class interfaceClass)
{
_lock.check();
- CtClass ctInterfaceClass = _source.getCtClass(interfaceClass);
+ CtClass ctInterfaceClass = _source.toCtClass(interfaceClass);
try
{
@@ -67,7 +58,7 @@
_ctClass.addInterface(ctInterfaceClass);
}
- protected CtClass[] convertClasses(Class[] inputClasses)
+ protected CtClass[] toCtClasses(Class[] inputClasses)
{
if (inputClasses == null || inputClasses.length == 0) return null;
@@ -76,7 +67,7 @@
for (int i = 0; i < count; i++)
{
- CtClass ctClass = convertClass(inputClasses[i]);
+ CtClass ctClass = toCtClass(inputClasses[i]);
result[i] = ctClass;
}
@@ -84,17 +75,9 @@
return result;
}
- protected CtClass convertClass(Class inputClass)
+ protected CtClass toCtClass(Class inputClass)
{
- CtClass result = _ctClassCache.get(inputClass);
-
- if (result == null)
- {
- result = _source.getCtClass(inputClass);
- _ctClassCache.put(inputClass, result);
- }
-
- return result;
+ return _source.toCtClass(inputClass);
}
public Class createClass()
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ClassFabImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ClassFabImpl.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ClassFabImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ClassFabImpl.java Wed Apr 30 18:24:18 2008
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2008 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.
@@ -32,8 +32,8 @@
import java.util.Set;
/**
- * Implementation of {@link org.apache.tapestry.ioc.services.ClassFab}. Hides, as much as possible,
- * the underlying library (Javassist).
+ * Implementation of {@link org.apache.tapestry.ioc.services.ClassFab}. Hides, as much as possible, the underlying
+ * library (Javassist).
*/
public class ClassFabImpl extends AbstractFab implements ClassFab
{
@@ -48,8 +48,8 @@
}
/**
- * Add fields, methods, and constructors are added, their psuedo-code is appended to this
- * description, which is used by toString().
+ * Add fields, methods, and constructors are added, their psuedo-code is appended to this description, which is used
+ * by toString().
*/
private final StringBuilder _description = new StringBuilder();
@@ -63,8 +63,8 @@
}
/**
- * Returns a representation of the fabricated class, including inheritance, fields,
- * constructors, methods and method bodies.
+ * Returns a representation of the fabricated class, including inheritance, fields, constructors, methods and method
+ * bodies.
*
* @since 1.1
*/
@@ -137,7 +137,7 @@
{
_lock.check();
- CtClass ctType = convertClass(type);
+ CtClass ctType = toCtClass(type);
try
{
@@ -198,10 +198,10 @@
if (_addedSignatures.contains(ms))
throw new RuntimeException(ServiceMessages.duplicateMethodInClass(ms, this));
- CtClass ctReturnType = convertClass(ms.getReturnType());
+ CtClass ctReturnType = toCtClass(ms.getReturnType());
- CtClass[] ctParameters = convertClasses(ms.getParameterTypes());
- CtClass[] ctExceptions = convertClasses(ms.getExceptionTypes());
+ CtClass[] ctParameters = toCtClasses(ms.getParameterTypes());
+ CtClass[] ctExceptions = toCtClasses(ms.getExceptionTypes());
CtMethod method = new CtMethod(ctReturnType, ms.getName(), ctParameters, getCtClass());
@@ -259,8 +259,8 @@
_lock.check();
- CtClass[] ctParameters = convertClasses(parameterTypes);
- CtClass[] ctExceptions = convertClasses(exceptions);
+ CtClass[] ctParameters = toCtClasses(parameterTypes);
+ CtClass[] ctExceptions = toCtClasses(exceptions);
try
{
@@ -289,8 +289,7 @@
}
/**
- * Adds a listing of method (or constructor) parameters and thrown exceptions, and the body, to
- * the description
+ * Adds a listing of method (or constructor) parameters and thrown exceptions, and the body, to the description
*
* @param parameterTypes types of method parameters, or null
* @param exceptions types of throw exceptions, or null
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ClassFactoryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ClassFactoryImpl.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ClassFactoryImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/ClassFactoryImpl.java Wed Apr 30 18:24:18 2008
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2008 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.
@@ -68,15 +68,22 @@
*/
public ClassFactoryImpl(ClassLoader classLoader, ClassFactoryClassPool pool, Logger logger)
{
+ this(classLoader, pool, new CtClassSourceImpl(pool, classLoader), logger);
+ }
+
+ public ClassFactoryImpl(ClassLoader classLoader, ClassFactoryClassPool pool, CtClassSource classSource,
+ Logger logger)
+ {
_loader = classLoader;
_pool = pool;
- _classSource = new CtClassSource(_pool, classLoader);
+ _classSource = classSource;
_logger = logger;
}
+
public ClassFab newClass(Class serviceInterface)
{
String name = ClassFabUtils.generateClassName(serviceInterface);
@@ -131,7 +138,7 @@
Class declaringClass = method.getDeclaringClass();
Class effectiveClass = importClass(declaringClass);
- CtClass ctClass = _classSource.getCtClass(effectiveClass);
+ CtClass ctClass = _classSource.toCtClass(effectiveClass);
StringBuilder builder = new StringBuilder("(");
@@ -172,7 +179,7 @@
builder.append(declaringClass.getName());
builder.append("(");
- CtClass ctClass = _classSource.getCtClass(declaringClass);
+ CtClass ctClass = _classSource.toCtClass(declaringClass);
StringBuilder descripton = new StringBuilder("(");
Added: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSource.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSource.java?rev=652417&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSource.java (added)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSource.java Wed Apr 30 18:24:18 2008
@@ -0,0 +1,50 @@
+// Copyright 2008 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
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry.ioc.internal.services;
+
+import javassist.CtClass;
+
+/**
+ * Used when generating new classes on the fly.
+ *
+ * @see org.apache.tapestry.ioc.services.ClassFactory
+ */
+public interface CtClassSource
+{
+ /**
+ * Returns the number of classes created.
+ */
+ int getCreatedClassCount();
+
+ /**
+ * Converts an existing class to a CtClass instance.
+ */
+ CtClass toCtClass(Class searchClass);
+
+ /**
+ * Converts a class name to a CtClass instance.
+ */
+ CtClass toCtClass(String name);
+
+ /**
+ * Createa a new CtClass instance.
+ */
+ CtClass newClass(String name, Class superClass);
+
+ /**
+ * Used after constructing the CtClass fully, to convert it into a Class ready to be instantiated.
+ */
+ Class createClass(CtClass ctClass);
+}
Copied: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSourceImpl.java (from r647587, tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSource.java)
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSourceImpl.java?p2=tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSourceImpl.java&p1=tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSource.java&r1=647587&r2=652417&rev=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSource.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSourceImpl.java Wed Apr 30 18:24:18 2008
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2008 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.
@@ -21,10 +21,10 @@
import java.security.ProtectionDomain;
/**
- * Wrapper around Javassist's {@link javassist.ClassPool} that manages the creation of new instances
- * of {@link javassist.CtClass} and converts finished CtClass's into instantiable Classes.
+ * Wrapper around Javassist's {@link javassist.ClassPool} that manages the creation of new instances of {@link
+ * javassist.CtClass} and converts finished CtClass's into instantiable Classes.
*/
-class CtClassSource
+public class CtClassSourceImpl implements CtClassSource
{
private final ClassFactoryClassPool _pool;
@@ -42,13 +42,13 @@
return _createdClassCount;
}
- public CtClassSource(ClassFactoryClassPool pool, ClassLoader loader)
+ public CtClassSourceImpl(ClassFactoryClassPool pool, ClassLoader loader)
{
_pool = pool;
_loader = loader;
}
- public CtClass getCtClass(Class searchClass)
+ public CtClass toCtClass(Class searchClass)
{
ClassLoader loader = searchClass.getClassLoader();
@@ -59,6 +59,11 @@
String name = ClassFabUtils.toJavaClassName(searchClass);
+ return toCtClass(name);
+ }
+
+ public CtClass toCtClass(String name)
+ {
try
{
return _pool.get(name);
@@ -71,7 +76,7 @@
public synchronized CtClass newClass(String name, Class superClass)
{
- CtClass ctSuperClass = getCtClass(superClass);
+ CtClass ctSuperClass = toCtClass(superClass);
return _pool.makeClass(name, ctSuperClass);
}
Propchange: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSourceImpl.java
------------------------------------------------------------------------------
cvs2svn:cvs-rev = 1.8
Propchange: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSourceImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry/ioc/internal/services/CtClassSourceImpl.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry/ioc/internal/services/ClassFabImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry/ioc/internal/services/ClassFabImplTest.java?rev=652417&r1=652416&r2=652417&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry/ioc/internal/services/ClassFabImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry/ioc/internal/services/ClassFabImplTest.java Wed Apr 30 18:24:18 2008
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007 The Apache Software Foundation
+// Copyright 2006, 2007, 2008 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.
@@ -59,7 +59,7 @@
pool.addClassLoaderIfNeeded(threadLoader);
- _source = new CtClassSource(pool, threadLoader);
+ _source = new CtClassSourceImpl(pool, threadLoader);
}
private ClassFab newClassFab(String className, Class superClass)
@@ -76,7 +76,7 @@
cf.addField("_stringValue", String.class);
- MethodSignature setStringValue = new MethodSignature(void.class, "setStringValue", new Class[]{String.class},
+ MethodSignature setStringValue = new MethodSignature(void.class, "setStringValue", new Class[] { String.class },
null);
cf.addMethod(Modifier.PUBLIC, setStringValue, "_stringValue = $1;");
@@ -118,7 +118,7 @@
ClassFab cf = newClassFab("Delegator", Object.class);
cf.addField("_delegate", SampleService.class);
- cf.addConstructor(new Class[]{SampleService.class}, null, "_delegate = $1;");
+ cf.addConstructor(new Class[] { SampleService.class }, null, "_delegate = $1;");
cf.proxyMethodsToDelegate(SampleService.class, "_delegate", "<Delegator>");
@@ -152,7 +152,7 @@
ClassFab cf = newClassFab("ToStringDelegator", Object.class);
cf.addField("_delegate", ToStringService.class);
- cf.addConstructor(new Class[]{ToStringService.class}, null, "_delegate = $1;");
+ cf.addConstructor(new Class[] { ToStringService.class }, null, "_delegate = $1;");
cf.proxyMethodsToDelegate(ToStringService.class, "_delegate", "<ToStringDelegator>");
@@ -178,7 +178,7 @@
ClassFab cf = newClassFab("ConstructableBean", Object.class);
cf.addField("_stringValue", String.class);
- cf.addConstructor(new Class[]{String.class}, null, "{ _stringValue = $1; }");
+ cf.addConstructor(new Class[] { String.class }, null, "{ _stringValue = $1; }");
MethodSignature getStringValue = new MethodSignature(String.class, "getStringValue", null, null);
@@ -197,7 +197,7 @@
Constructor c = targetClass.getConstructors()[0];
- Object targetBean = c.newInstance(new Object[]{"Buffy"});
+ Object targetBean = c.newInstance(new Object[] { "Buffy" });
String actual = (String) _access.get(targetBean, "stringValue");
@@ -210,14 +210,14 @@
ClassFab cf = newClassFab("MyIntHolder", AbstractIntWrapper.class);
cf.addField("_intValue", int.class);
- cf.addConstructor(new Class[]{int.class}, null, "{ _intValue = $1; }");
+ cf.addConstructor(new Class[] { int.class }, null, "{ _intValue = $1; }");
cf.addMethod(Modifier.PUBLIC, new MethodSignature(int.class, "getIntValue", null, null), "return _intValue;");
Class targetClass = cf.createClass();
Constructor c = targetClass.getConstructors()[0];
- AbstractIntWrapper targetBean = (AbstractIntWrapper) c.newInstance(new Object[]{new Integer(137)});
+ AbstractIntWrapper targetBean = (AbstractIntWrapper) c.newInstance(new Object[] { new Integer(137) });
assertEquals(targetBean.getIntValue(), 137);
}
@@ -250,7 +250,7 @@
cf.addInterface(SimpleService.class);
- cf.addMethod(Modifier.PUBLIC, new MethodSignature(int.class, "add", new Class[]{int.class, int.class}, null),
+ cf.addMethod(Modifier.PUBLIC, new MethodSignature(int.class, "add", new Class[] { int.class, int.class }, null),
"return $1 + $2;");
Class targetClass = cf.createClass();
@@ -381,12 +381,12 @@
cf.addField("_map", Map.class);
- cf.addConstructor(new Class[]{Map.class, Runnable.class},
- new Class[]{IllegalArgumentException.class, DataFormatException.class}, "{ _map = $1; }");
+ cf.addConstructor(new Class[] { Map.class, Runnable.class },
+ new Class[] { IllegalArgumentException.class, DataFormatException.class }, "{ _map = $1; }");
- MethodSignature sig = new MethodSignature(Map.class, "doTheNasty", new Class[]{int.class, String.class},
- new Class[]{InstantiationException.class,
- IllegalAccessException.class});
+ MethodSignature sig = new MethodSignature(Map.class, "doTheNasty", new Class[] { int.class, String.class },
+ new Class[] { InstantiationException.class,
+ IllegalAccessException.class });
cf.addMethod(Modifier.PUBLIC + Modifier.FINAL + Modifier.SYNCHRONIZED, sig, "{ return _map; }");