Author: hlship Date: Sun Apr 23 09:55:49 2006 New Revision: 396291 URL: http://svn.apache.org/viewcvs?rev=396291&view=rev Log: Sort out class loading conflicts, add dependencies to the classpath
Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/pages/BasicComponent.java Modified: tapestry/tapestry5/tapestry-core/trunk/.classpath tapestry/tapestry5/tapestry-core/trunk/pom.xml tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSource.java tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.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/TransformMessages.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/META-INF/org.apache.tapestry.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/transform/ComponentInstantiatorSourceImplTest.java tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties Modified: tapestry/tapestry5/tapestry-core/trunk/.classpath URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/.classpath?rev=396291&r1=396290&r2=396291&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/.classpath (original) +++ tapestry/tapestry5/tapestry-core/trunk/.classpath Sun Apr 23 09:55:49 2006 @@ -15,5 +15,8 @@ <classpathentry kind="var" path="M2_REPO/bsh/bsh/2.0b1/bsh-2.0b1.jar"/> <classpathentry kind="var" path="M2_REPO/hivemind/hivemind/1.1.1/hivemind-1.1.1.jar"/> <classpathentry kind="var" path="ASPECTJRT_LIB"/> + <classpathentry sourcepath="/M2_REPO/oro/oro/2.0.8/oro-2.0.8-sources.jar" kind="var" path="M2_REPO/oro/oro/2.0.8/oro-2.0.8.jar"/> + <classpathentry kind="var" path="M2_REPO/hivemind/hivemind-lib/1.1.1/hivemind-lib-1.1.1.jar"/> + <classpathentry sourcepath="/M2_REPO/log4j/log4j/1.2.8/log4j-1.2.8-sources.jar" kind="var" path="M2_REPO/log4j/log4j/1.2.13/log4j-1.2.13.jar"/> <classpathentry kind="output" path="bin"/> </classpath> Modified: tapestry/tapestry5/tapestry-core/trunk/pom.xml URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/pom.xml?rev=396291&r1=396290&r2=396291&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/pom.xml (original) +++ tapestry/tapestry5/tapestry-core/trunk/pom.xml Sun Apr 23 09:55:49 2006 @@ -26,6 +26,19 @@ <version>1.1.1</version> <scope>compile</scope> </dependency> + <dependency> + <groupId>hivemind</groupId> + <artifactId>hivemind-lib</artifactId> + <version>1.1.1</version> + <scope>compile</scope> + </dependency> + <!-- Really, a transitive dependency of hivemind. --> + <dependency> + <groupId>oro</groupId> + <artifactId>oro</artifactId> + <version>2.0.8</version> + <scope>runtime</scope> + </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java?rev=396291&r1=396290&r2=396291&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ClassTransformerImpl.java Sun Apr 23 09:55:49 2006 @@ -67,7 +67,8 @@ InternalClassTransformation ct = _nameToClassTransformation.get(className); - // TODO: if null ... + if (ct == null) + throw new RuntimeException(TransformMessages.classNotTransformed(className)); return ct.createInstantiator(componentClass); } Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSource.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSource.java?rev=396291&r1=396290&r2=396291&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSource.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSource.java Sun Apr 23 09:55:49 2006 @@ -31,4 +31,13 @@ * @return an object which can instantiate an instance of the component */ Instantiator createInstantiator(String classname); + + /** + * Adds a controlled package. Only classes within controlled packages are subject to + * transformation. + * + * @param packageName + * the package name to add (must not be blank) + */ + void addPackage(String packageName); } Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java?rev=396291&r1=396290&r2=396291&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImpl.java Sun Apr 23 09:55:49 2006 @@ -42,7 +42,7 @@ public final class ComponentInstantiatorSourceImpl implements Translator, ComponentInstantiatorSource { - private final Set<String> _packages = newSet(); + private final Set<String> _controlledPackageNames = newSet(); private ClassLoader _parent; @@ -73,6 +73,27 @@ _parent = parent; } + private class PackageAwareLoader extends Loader + { + + public PackageAwareLoader(ClassPool classPool) + { + super(classPool); + } + + @Override + protected Class findClass(String className) throws ClassNotFoundException + { + if (inControlledPackage(className)) + return super.findClass(className); + + // Returning null forces delegation to the parent class loader. + + return null; + } + + } + public void initializeService() { _classPool = new ClassPool(); @@ -81,7 +102,7 @@ _classPool.appendClassPath(path); - _loader = new Loader(_classPool); + _loader = new PackageAwareLoader(_classPool); try { @@ -100,23 +121,30 @@ // This is our chance to make changes to the CtClass before it is loaded into memory. - CtClass ctClass = pool.get(classname); + String diag = "FAIL"; try { + CtClass ctClass = pool.get(classname); + // Force the creation of the super-class before the target class. forceSuperclassTransform(ctClass); // Do the transformations here + _transformer.transformClass(ctClass); + + diag = "END"; } catch (ClassNotFoundException ex) { throw new CannotCompileException(ex); } - - _log.debug(" END onLoad " + classname); + finally + { + _log.debug(String.format("%5s onLoad %s", diag, classname)); + } } private void forceSuperclassTransform(CtClass ctClass) throws NotFoundException, @@ -174,7 +202,7 @@ while (packageName != null) { - if (_packages.contains(packageName)) + if (_controlledPackageNames.contains(packageName)) return true; packageName = stripTail(packageName); @@ -193,18 +221,13 @@ return input.substring(0, lastdot); } - /** - * Adds a controlled package. Only classes within controlled packages are subject to - * enhancement. - * - * @param packageName - * the package name to add (must not be blank) - */ public void addPackage(String packageName) { + Defense.notBlank(packageName, "packageName"); + // TODO: Should we check that pacakages are not nested? - _packages.add(Defense.notBlank(packageName, "packageName")); + _controlledPackageNames.add(packageName); } /** For injection. */ 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=396291&r1=396290&r2=396291&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 Sun Apr 23 09:55:49 2006 @@ -570,8 +570,18 @@ public String getFieldType(String fieldName) { - // TODO Auto-generated method stub - return null; + try + { + CtField field = _ctClass.getDeclaredField(fieldName); + + CtClass type = field.getType(); + + return type.getName(); + } + catch (NotFoundException ex) + { + throw new RuntimeException(ex); + } } public String addField(int modifiers, String type, String suggestedName) 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=396291&r1=396290&r2=396291&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 Sun Apr 23 09:55:49 2006 @@ -28,7 +28,7 @@ final class TransformMessages { private static final Messages MESSAGES = new MessageFormatter(TransformMessages.class); - + static String noConstructorFound(Class instanceClass) { return MESSAGES.format("no-constructor-found", instanceClass.getName()); @@ -65,5 +65,10 @@ { return MESSAGES.format("incorrect-class-for-instantiator", className, componentClass .getName()); + } + + static String classNotTransformed(String className) + { + return MESSAGES.format("class-not-transformed", className); } } 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=396291&r1=396290&r2=396291&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 Sun Apr 23 09:55:49 2006 @@ -17,7 +17,7 @@ <module id="org.apache.tapestry.internal.transform" version="5.0.0"> - <contribution configuration-id="org.apache.tapestry.transform.TransformWorkers"> + <contribution configuration-id="org.apache.tapestry.transform.ClassTransformWorkers"> <command id="ImplementResourceAware" before="*" object="instance:worker.ImplementResourceAwareWorker"/> <command id="Retain" object="instance:worker.RetainWorker"/> @@ -25,11 +25,11 @@ </contribution> - <service-point id="TransformWorkersChain" - interface="org.apache.tapestry.transform.TransformWorker" - visibility="private""> + <service-point id="ClassTransformWorkersChain" + interface="org.apache.tapestry.transform.ClassTransformWorker" + visibility="private"> <invoke-factory service-id="hivemind.lib.ChainFactory"> - <construct configuration-id="org.apache.tapestry.transform.TransformWorkers"/> + <construct configuration-id="org.apache.tapestry.transform.ClassTransformWorkers"/> </invoke-factory> </service-point> @@ -40,7 +40,7 @@ <invoke-factory> <construct class="ClassTransformerImpl"> - <set-object class="workers" value="service:TransformWorkersChain"/> + <set-object property="workers" value="service:ClassTransformWorkersChain"/> </construct> </invoke-factory> <interceptor service-id="hivemind.LoggingInterceptor"/> @@ -55,7 +55,7 @@ <invoke-factory> <construct class="ComponentInstantiatorSourceImpl"> <class-resolver/> - <object>service:ClassTransformer</object> + <set-object property="transformer" value="service:ClassTransformer"/> </construct> </invoke-factory> <interceptor service-id="hivemind.LoggingInterceptor"/> Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/resources/META-INF/org.apache.tapestry.transform.xml URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/main/resources/META-INF/org.apache.tapestry.transform.xml?rev=396291&r1=396290&r2=396291&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/main/resources/META-INF/org.apache.tapestry.transform.xml (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/main/resources/META-INF/org.apache.tapestry.transform.xml Sun Apr 23 09:55:49 2006 @@ -1,4 +1,3 @@ -<module id="org.apache.tapestry.transform" version="5.0.0"> <!-- Copyright 2006 The Apache Software Foundation @@ -14,8 +13,9 @@ See the License for the specific language governing permissions and limitations under the License. --> - - <configuration-point id="TransformWorkers" schema-id="hivemind.lib.ChainContribution"> +<module id="org.apache.tapestry.transform" version="5.0.0"> + + <configuration-point id="ClassTransformWorkers" schema-id="hivemind.lib.ChainContribution"> Defines a command chain of workers objects (implementing the ClassTransformWorker interface). 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=396291&r1=396290&r2=396291&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 Sun Apr 23 09:55:49 2006 @@ -18,4 +18,5 @@ 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. \ No newline at end of file +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. \ No newline at end of file Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java?rev=396291&r1=396290&r2=396291&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/ComponentInstantiatorSourceImplTest.java Sun Apr 23 09:55:49 2006 @@ -14,10 +14,18 @@ package org.apache.tapestry.internal.transform; +import org.apache.hivemind.Registry; +import org.apache.hivemind.impl.RegistryBuilder; +import org.apache.hivemind.util.PropertyUtils; +import org.apache.tapestry.events.ComponentLifecycle; +import org.apache.tapestry.internal.InternalComponentResources; +import org.apache.tapestry.internal.transform.pages.BasicComponent; import org.apache.tapestry.test.BaseTestCase; +import org.testng.Assert; import org.testng.annotations.Test; import static java.lang.Thread.currentThread; +import static org.apache.hivemind.util.PropertyUtils.read; import static org.testng.Assert.assertEquals; /** @@ -54,5 +62,55 @@ // Parents of controlled packages are not controlled assertEquals(e.inControlledPackage("foo.Gloop"), false); + } + + /** More of an integration test. */ + @Test + public void loadComponentViaService() throws Exception + { + InternalComponentResources resources = newInternalComponentResources(); + + replay(); + + Registry registry = RegistryBuilder.constructDefaultRegistry(); + + // Can't wait for the HiveMind code base to start using some generics for this kind of + // thing. + + ComponentInstantiatorSource source = (ComponentInstantiatorSource) registry + .getService(ComponentInstantiatorSource.class); + + source.addPackage("org.apache.tapestry.internal.transform.pages"); + + Instantiator inst = source.createInstantiator(BasicComponent.class.getName()); + + Object target = inst.newInstance(resources); + + verify(); + + // Should not be an instance, since it is loaded by a different class loader. + Assert.assertFalse(BasicComponent.class.isInstance(target)); + + PropertyUtils.write(target, "value", "some default value"); + assertEquals(read(target, "value"), "some default value"); + + PropertyUtils.write(target, "retainedValue", "some retained value"); + assertEquals(read(target, "retainedValue"), "some retained value"); + + ComponentLifecycle lifecycle = (ComponentLifecycle) target; + + // Setting a property value before pageDidLoad will cause that value + // to be the default when the page detaches. + + lifecycle.containingPageDidLoad(); + + PropertyUtils.write(target, "value", "some transient value"); + assertEquals(read(target, "value"), "some transient value"); + + lifecycle.containingPageDidDetach(); + + assertEquals(read(target, "value"), "some default value"); + assertEquals(read(target, "retainedValue"), "some retained value"); + } } Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/pages/BasicComponent.java URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/pages/BasicComponent.java?rev=396291&view=auto ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/pages/BasicComponent.java (added) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/transform/pages/BasicComponent.java Sun Apr 23 09:55:49 2006 @@ -0,0 +1,38 @@ +package org.apache.tapestry.internal.transform.pages; + +import org.apache.tapestry.annotations.ComponentClass; +import org.apache.tapestry.annotations.Retain; + +/** + * Used to test retained vs. discard properties. + * + * @author Howard M. Lewis Ship + */ [EMAIL PROTECTED] +public class BasicComponent +{ + private String _value; + + @Retain + private String _retainedValue; + + public final String getRetainedValue() + { + return _retainedValue; + } + + public final void setRetainedValue(String retainedValue) + { + _retainedValue = retainedValue; + } + + public final String getValue() + { + return _value; + } + + public final void setValue(String value) + { + _value = value; + } +} Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties URL: http://svn.apache.org/viewcvs/tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties?rev=396291&r1=396290&r2=396291&view=diff ============================================================================== --- tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties (original) +++ tapestry/tapestry5/tapestry-core/trunk/src/test/resources/log4j.properties Sun Apr 23 09:55:49 2006 @@ -22,3 +22,4 @@ log4j.appender.A1.layout.ConversionPattern=%c{1} [%p] %m%n log4j.category.org.apache.tapestry=debug + --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]