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]