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]

Reply via email to