You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by ch...@apache.org on 2003/08/25 05:14:47 UTC

cvs commit: incubator-geronimo/modules/core/src/test-data/mock-app/org/apache/geronimo/remoting IPerson.java Person.java TransientValue.java

chirino     2003/08/24 20:14:47

  Modified:    modules/core maven.xml
               modules/core/src/java/org/apache/geronimo/proxy
                        ProxyContainer.java
               modules/core/src/test/org/apache/geronimo/remoting
                        MarshalingInterceptorsTest.java
                        RemotingInterceptorsTest.java
  Added:       modules/core/src/test-data/mock-app/org/apache/geronimo/remoting
                        IPerson.java Person.java TransientValue.java
  Removed:     modules/core/src/test/org/apache/geronimo/remoting
                        IPerson.java Person.java TransientValue.java
  Log:
  Figured out how to get maven to compile a few sources files to an isolated directory.  I have now enabled the testcases for the Marshaling and Remoting Interceptors.
  
  Revision  Changes    Path
  1.14      +21 -1     incubator-geronimo/modules/core/maven.xml
  
  Index: maven.xml
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/core/maven.xml,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- maven.xml	24 Aug 2003 21:44:02 -0000	1.13
  +++ maven.xml	25 Aug 2003 03:14:46 -0000	1.14
  @@ -61,4 +61,24 @@
       -->
     </preGoal>
   
  +
  +  <!-- Set up the test files -->
  +  <postGoal name="test:test-resources">
  +
  +    <!-- Compile the code for the Marshalling/Remoting tests -->
  +    <ant:mkdir dir="${maven.build.dir}/mock-app"/>
  +    <javac
  +      destdir="${maven.build.dir}/mock-app"
  +      debug="${maven.compile.debug}"
  +      deprecation="${maven.compile.deprecation}"
  +      optimize="${maven.compile.optimize}">
  +      <src>
  +        <path>
  +          <pathelement location="${maven.src.dir}/test-data/mock-app"/>
  +        </path>
  +      </src>
  +    </javac>
  +
  +  </postGoal>  
  +
   </project>
  
  
  
  1.2       +2 -8      incubator-geronimo/modules/core/src/java/org/apache/geronimo/proxy/ProxyContainer.java
  
  Index: ProxyContainer.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/core/src/java/org/apache/geronimo/proxy/ProxyContainer.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ProxyContainer.java	22 Aug 2003 02:23:25 -0000	1.1
  +++ ProxyContainer.java	25 Aug 2003 03:14:46 -0000	1.2
  @@ -67,7 +67,7 @@
    */
   public class ProxyContainer extends SimpleRPCContainer implements InvocationHandler {
   
  -    /* (non-Javadoc)
  +    /**
        * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
        */
       public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  @@ -76,12 +76,6 @@
           ProxyInvocation.putArguments(invocation, args);
           InvocationResult result = this.invoke(invocation);
           return result.getResult();
  -    }
  -
  -    static public Object createProxy(Object target) throws Exception {
  -        ProxyContainer container = new ProxyContainer();
  -        container.addInterceptor(new ReflexiveInterceptor(target));
  -        return container.createProxy(target.getClass());
       }
   
       public Object createProxy(Class likeClass) {
  
  
  
  1.2       +259 -263  incubator-geronimo/modules/core/src/test/org/apache/geronimo/remoting/MarshalingInterceptorsTest.java
  
  Index: MarshalingInterceptorsTest.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/core/src/test/org/apache/geronimo/remoting/MarshalingInterceptorsTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MarshalingInterceptorsTest.java	22 Aug 2003 02:23:36 -0000	1.1
  +++ MarshalingInterceptorsTest.java	25 Aug 2003 03:14:46 -0000	1.2
  @@ -56,6 +56,7 @@
   
   package org.apache.geronimo.remoting;
   
  +import java.io.File;
   import java.io.IOException;
   import java.lang.reflect.InvocationTargetException;
   import java.lang.reflect.Method;
  @@ -87,267 +88,262 @@
       ArrayList severContainers = new ArrayList();
       URLClassLoader cl1, cl2;
   
  -//    /**
  -//     * creates the two classloaders that will be used during the tests.
  -//     */
  -//    public void setUp() throws MalformedURLException, IOException {
  -//        URL url = new URL(System.getProperty("test-app.url"));
  -//        System.out.println("Setting up the CP to: " + url);
  -//
  -//        cl1 = new URLClassLoader(new URL[] { url });
  -//        cl2 = new URLClassLoader(new URL[] { url });
  -//    }
  -    
  -    //
  -    // This is here until we can enable the tests.
  -    public void testNull() {        
  -    }
  -
  -//    /**
  -//     * Verify that the classpath/classloader structure is
  -//     * as expected.  If the application classes are in
  -//     * the current classloader then that will throw all the 
  -//     * tests off.
  -//     * 
  -//     * @throws Exception
  -//     */
  -//    public void testCheckClassLoaders() throws Exception {
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Class class2 = cl2.loadClass(PERSON_CLASS);
  -//        assertFalse("Classpath for this test was incorrect.  The '"+PERSON_CLASS+"' cannot be in the test's classpath.", class1.equals(class2));
  -//    }
  -//
  -//    /**
  -//     * Verify that the helper methods used by this test work
  -//     * as expected.  Everything should be ok when working in the
  -//     * same classloader.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetSpouseSameCL() throws Throwable {
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Class class2 = cl1.loadClass(PERSON_CLASS);
  -//
  -//        Object object1 = class1.newInstance();
  -//        Object object2 = class2.newInstance();
  -//
  -//        call(object1, "setSpouse", new Object[] { object2 });
  -//    }
  -//
  -//    /**
  -//     * Verify that the helper methods used by this test work
  -//     * as expected.  We should see problems when you start mixing
  -//     * Objects from different classloaders.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetSpouseOtherCL() throws Throwable {
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Class class2 = cl2.loadClass(PERSON_CLASS);
  -//
  -//        Object object1 = class1.newInstance();
  -//        Object object2 = class2.newInstance();
  -//
  -//        try {
  -//            call(object1, "setSpouse", new Object[] { object2 });
  -//            fail("Call should fail due to argument type mismatch.");
  -//        } catch (IllegalArgumentException e) {
  -//        }
  -//    }
  -//
  -//    /**
  -//     * Verify that a proxy using working in a single app context works ok.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetSpouseWithProxy() throws Throwable {
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Object object1 = class1.newInstance();
  -//
  -//        // Simulate App1 creating a proxy.
  -//        Thread.currentThread().setContextClassLoader(cl1);
  -//        Object proxy1 = createProxy(object1);
  -//        call(proxy1, "setSpouse", new Object[] { object1 });
  -//    }
  -//
  -//    /**
  -//     * App2 creates a proxy and serializes.  App1 context deserializes
  -//     * the proxy and trys to use it.  Method calls should be getting
  -//     * marshalled/demarshaled by the proxy to avoid getting an 
  -//     * IllegalArgumentException.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetSpouseOtherCLWithSerializedProxy() throws Throwable {
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Class class2 = cl2.loadClass(PERSON_CLASS);
  -//
  -//        Object object1 = class1.newInstance();
  -//        Object object2 = class2.newInstance();
  -//
  -//        // Simulate App2 creating a proxy.
  -//        Thread.currentThread().setContextClassLoader(cl2);
  -//        Object proxy2 = createProxy(object2);
  -//        MarshalledObject mo = new BytesMarshalledObject(proxy2);
  -//
  -//        // Simulate App1 using the serialized proxy.    
  -//        Thread.currentThread().setContextClassLoader(cl1);
  -//        Object proxy1 = mo.get();
  -//        call(proxy1, "setSpouse", new Object[] { object1 });
  -//    }
  -//
  -//    /**
  -//     * App1 creates a proxy.  It then creates a Transient calls that holds
  -//     * a "value" property that is transient when serialized.  This allows to 
  -//     * to see if the Transient object was serialized by getting the value back
  -//     * and seeing if the "value" is null.  All this work is done in one classloader
  -//     * so no serialization should occur.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetTransientWithOptimizedProxy() throws Throwable {
  -//        Thread.currentThread().setContextClassLoader(cl1);
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Object object1 = class1.newInstance();
  -//
  -//        Class class2 = cl1.loadClass(TRANSIENT_CLASS);
  -//        Object object2 = class2.newInstance();
  -//        call(object2, "setValue", new Object[] { "foo" });
  -//
  -//        Object proxy1 = createProxy(object1);
  -//        call(proxy1, "setValue", new Object[] { object2 });
  -//        Object rc = call(proxy1, "getValue", new Object[] {
  -//        });
  -//        rc = call(rc, "getValue", new Object[] {
  -//        });
  -//
  -//        assertSame(rc, "foo");
  -//    }
  -//
  -//    /**
  -//     * Same as testSetTransientWithOptimizedProxy() but, the proxy is serialized before it is used.
  -//     * It should still result in the method call not being serialized.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetTransientWithSerializedOptimizedProxy() throws Throwable {
  -//        Thread.currentThread().setContextClassLoader(cl1);
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Object object1 = class1.newInstance();
  -//
  -//        Class class2 = cl1.loadClass(TRANSIENT_CLASS);
  -//        Object object2 = class2.newInstance();
  -//        call(object2, "setValue", new Object[] { "foo" });
  -//
  -//        Object proxy1 = createProxy(object1);
  -//        proxy1 = new BytesMarshalledObject(proxy1).get();
  -//        call(proxy1, "setValue", new Object[] { object2 });
  -//        Object rc = call(proxy1, "getValue", new Object[] {
  -//        });
  -//        rc = call(rc, "getValue", new Object[] {
  -//        });
  -//
  -//        assertSame(rc, "foo");
  -//    }
  -//
  -//    /**
  -//     * Same as testSetTransientWithOptimizedProxy() but, the proxy is serialized before it is
  -//     * by App2.  Since a different classloader is using the proxy, the metod call should
  -//     * be serialized and we should see that the set "value" is null.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetTransientWithSerializedNonOptimizedProxy() throws Throwable {
  -//        Thread.currentThread().setContextClassLoader(cl1);
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Object object1 = class1.newInstance();
  -//
  -//        Object proxy1 = createProxy(object1);
  -//        Thread.currentThread().setContextClassLoader(cl2);
  -//        proxy1 = new BytesMarshalledObject(proxy1).get();
  -//
  -//        Class class2 = cl2.loadClass(TRANSIENT_CLASS);
  -//        Object object2 = class2.newInstance();
  -//        call(object2, "setValue", new Object[] { "foo" });
  -//
  -//        call(proxy1, "setValue", new Object[] { object2 });
  -//        Object rc = call(proxy1, "getValue", new Object[] {
  -//        });
  -//        rc = call(rc, "getValue", new Object[] {
  -//        });
  -//
  -//        assertSame(rc, null);
  -//    }
  -//
  -//    /**
  -//     * Does a reflexive call on object1 my calling method with the provided args.
  -//     * 
  -//     * @param object1
  -//     * @param string
  -//     * @param objects
  -//     */
  -//    private Object call(Object object1, String method, Object[] args) throws Throwable {
  -//        try {
  -//            Class argTypes[] = getArgTypes(object1.getClass().getClassLoader(), args);
  -//            Method m = findMethod(object1.getClass(), method);
  -//            return m.invoke(object1, args);
  -//        } catch (InvocationTargetException e) {
  -//            throw e.getTargetException();
  -//        }
  -//    }
  -//
  -//    /**
  -//     * Gets the Class[] for a given Object[] using the provided loader.
  -//     * 
  -//     * @param object1
  -//     * @param args
  -//     * @return
  -//     */
  -//    private Class[] getArgTypes(ClassLoader loader, Object[] args) throws Exception {
  -//        Class rc[] = new Class[args.length];
  -//        for (int i = 0; i < rc.length; i++) {
  -//            rc[i] = loader.loadClass(args[i].getClass().getName());
  -//        }
  -//        return rc;
  -//    }
  -//
  -//    /**
  -//     * Finds the first method in class c whose name is name.
  -//     * @param c
  -//     * @param name
  -//     * @return
  -//     */
  -//    private Method findMethod(Class c, String name) {
  -//        Method[] methods = c.getMethods();
  -//        for (int i = 0; i < methods.length; i++) {
  -//            if (methods[i].getName().equals(name))
  -//                return methods[i];
  -//        }
  -//        return null;
  -//    }
  -//
  -//    /**
  -//      * @param object1
  -//      * @return
  -//      */
  -//    private Object createProxy(Object object1) throws Exception {
  -//        
  -//        ProxyContainer serverContainer = new ProxyContainer();        
  -//
  -//        DeMarshalingInterceptor dmi = new DeMarshalingInterceptor();
  -//        dmi.setClassloader(object1.getClass().getClassLoader());
  -//        Long dmiid = InterceptorRegistry.instance.register(dmi);
  -//        serverContainer.addInterceptor(dmi);      
  -//        Interceptor reflexive = new ReflexiveInterceptor(object1);
  -//        serverContainer.addInterceptor(reflexive);
  -//        severContainers.add(serverContainer);
  -//        
  -//        ProxyContainer clientContainer = new ProxyContainer();        
  -//        IntraVMRoutingInterceptor ivmri = new IntraVMRoutingInterceptor();
  -//        ivmri.setDeMarshalingInterceptorID(dmiid);
  -//        clientContainer.addInterceptor(ivmri);
  -//
  -//        return clientContainer.createProxy(object1.getClass());
  -//    }
  +    /**
  +     * creates the two classloaders that will be used during the tests.
  +     */
  +    public void setUp() throws MalformedURLException, IOException {
  +        URL url = new File("./target/mock-app").toURL();
  +        System.out.println("Setting up the CP to: " + url);
  +
  +        cl1 = new URLClassLoader(new URL[] { url });
  +        cl2 = new URLClassLoader(new URL[] { url });
  +    }    
  +
  +    /**
  +     * Verify that the classpath/classloader structure is
  +     * as expected.  If the application classes are in
  +     * the current classloader then that will throw all the 
  +     * tests off.
  +     * 
  +     * @throws Exception
  +     */
  +    public void testCheckClassLoaders() throws Exception {
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Class class2 = cl2.loadClass(PERSON_CLASS);
  +        assertFalse("Classpath for this test was incorrect.  The '"+PERSON_CLASS+"' cannot be in the test's classpath.", class1.equals(class2));
  +    }
  +
  +    /**
  +     * Verify that the helper methods used by this test work
  +     * as expected.  Everything should be ok when working in the
  +     * same classloader.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetSpouseSameCL() throws Throwable {
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Class class2 = cl1.loadClass(PERSON_CLASS);
  +
  +        Object object1 = class1.newInstance();
  +        Object object2 = class2.newInstance();
  +
  +        call(object1, "setSpouse", new Object[] { object2 });
  +    }
  +
  +    /**
  +     * Verify that the helper methods used by this test work
  +     * as expected.  We should see problems when you start mixing
  +     * Objects from different classloaders.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetSpouseOtherCL() throws Throwable {
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Class class2 = cl2.loadClass(PERSON_CLASS);
  +
  +        Object object1 = class1.newInstance();
  +        Object object2 = class2.newInstance();
  +
  +        try {
  +            call(object1, "setSpouse", new Object[] { object2 });
  +            fail("Call should fail due to argument type mismatch.");
  +        } catch (IllegalArgumentException e) {
  +        }
  +    }
  +
  +    /**
  +     * Verify that a proxy using working in a single app context works ok.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetSpouseWithProxy() throws Throwable {
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Object object1 = class1.newInstance();
  +
  +        // Simulate App1 creating a proxy.
  +        Thread.currentThread().setContextClassLoader(cl1);
  +        Object proxy1 = createProxy(object1);
  +        call(proxy1, "setSpouse", new Object[] { object1 });
  +    }
  +
  +    /**
  +     * App2 creates a proxy and serializes.  App1 context deserializes
  +     * the proxy and trys to use it.  Method calls should be getting
  +     * marshalled/demarshaled by the proxy to avoid getting an 
  +     * IllegalArgumentException.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetSpouseOtherCLWithSerializedProxy() throws Throwable {
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Class class2 = cl2.loadClass(PERSON_CLASS);
  +
  +        Object object1 = class1.newInstance();
  +        Object object2 = class2.newInstance();
  +
  +        // Simulate App2 creating a proxy.
  +        Thread.currentThread().setContextClassLoader(cl2);
  +        Object proxy2 = createProxy(object2);
  +        MarshalledObject mo = new BytesMarshalledObject(proxy2);
  +
  +        // Simulate App1 using the serialized proxy.    
  +        Thread.currentThread().setContextClassLoader(cl1);
  +        Object proxy1 = mo.get();
  +        call(proxy1, "setSpouse", new Object[] { object1 });
  +    }
  +
  +    /**
  +     * App1 creates a proxy.  It then creates a Transient calls that holds
  +     * a "value" property that is transient when serialized.  This allows to 
  +     * to see if the Transient object was serialized by getting the value back
  +     * and seeing if the "value" is null.  All this work is done in one classloader
  +     * so no serialization should occur.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetTransientWithOptimizedProxy() throws Throwable {
  +        Thread.currentThread().setContextClassLoader(cl1);
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Object object1 = class1.newInstance();
  +
  +        Class class2 = cl1.loadClass(TRANSIENT_CLASS);
  +        Object object2 = class2.newInstance();
  +        call(object2, "setValue", new Object[] { "foo" });
  +
  +        Object proxy1 = createProxy(object1);
  +        call(proxy1, "setValue", new Object[] { object2 });
  +        Object rc = call(proxy1, "getValue", new Object[] {
  +        });
  +        rc = call(rc, "getValue", new Object[] {
  +        });
  +
  +        assertSame(rc, "foo");
  +    }
  +
  +    /**
  +     * Same as testSetTransientWithOptimizedProxy() but, the proxy is serialized before it is used.
  +     * It should still result in the method call not being serialized.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetTransientWithSerializedOptimizedProxy() throws Throwable {
  +        Thread.currentThread().setContextClassLoader(cl1);
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Object object1 = class1.newInstance();
  +
  +        Class class2 = cl1.loadClass(TRANSIENT_CLASS);
  +        Object object2 = class2.newInstance();
  +        call(object2, "setValue", new Object[] { "foo" });
  +
  +        Object proxy1 = createProxy(object1);
  +        proxy1 = new BytesMarshalledObject(proxy1).get();
  +        call(proxy1, "setValue", new Object[] { object2 });
  +        Object rc = call(proxy1, "getValue", new Object[] {
  +        });
  +        rc = call(rc, "getValue", new Object[] {
  +        });
  +
  +        assertSame(rc, "foo");
  +    }
  +
  +    /**
  +     * Same as testSetTransientWithOptimizedProxy() but, the proxy is serialized before it is
  +     * by App2.  Since a different classloader is using the proxy, the metod call should
  +     * be serialized and we should see that the set "value" is null.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetTransientWithSerializedNonOptimizedProxy() throws Throwable {
  +        Thread.currentThread().setContextClassLoader(cl1);
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Object object1 = class1.newInstance();
  +
  +        Object proxy1 = createProxy(object1);
  +        Thread.currentThread().setContextClassLoader(cl2);
  +        proxy1 = new BytesMarshalledObject(proxy1).get();
  +
  +        Class class2 = cl2.loadClass(TRANSIENT_CLASS);
  +        Object object2 = class2.newInstance();
  +        call(object2, "setValue", new Object[] { "foo" });
  +
  +        call(proxy1, "setValue", new Object[] { object2 });
  +        Object rc = call(proxy1, "getValue", new Object[] {
  +        });
  +        rc = call(rc, "getValue", new Object[] {
  +        });
  +
  +        assertSame(rc, null);
  +    }
  +
  +    /**
  +     * Does a reflexive call on object1 my calling method with the provided args.
  +     * 
  +     * @param object1
  +     * @param string
  +     * @param objects
  +     */
  +    private Object call(Object object1, String method, Object[] args) throws Throwable {
  +        try {
  +            Class argTypes[] = getArgTypes(object1.getClass().getClassLoader(), args);
  +            Method m = findMethod(object1.getClass(), method);
  +            return m.invoke(object1, args);
  +        } catch (InvocationTargetException e) {
  +            throw e.getTargetException();
  +        }
  +    }
  +
  +    /**
  +     * Gets the Class[] for a given Object[] using the provided loader.
  +     * 
  +     * @param object1
  +     * @param args
  +     * @return
  +     */
  +    private Class[] getArgTypes(ClassLoader loader, Object[] args) throws Exception {
  +        Class rc[] = new Class[args.length];
  +        for (int i = 0; i < rc.length; i++) {
  +            rc[i] = loader.loadClass(args[i].getClass().getName());
  +        }
  +        return rc;
  +    }
  +
  +    /**
  +     * Finds the first method in class c whose name is name.
  +     * @param c
  +     * @param name
  +     * @return
  +     */
  +    private Method findMethod(Class c, String name) {
  +        Method[] methods = c.getMethods();
  +        for (int i = 0; i < methods.length; i++) {
  +            if (methods[i].getName().equals(name))
  +                return methods[i];
  +        }
  +        return null;
  +    }
  +
  +    /**
  +      * @param object1
  +      * @return
  +      */
  +    private Object createProxy(Object object1) throws Exception {
  +        
  +        ProxyContainer serverContainer = new ProxyContainer();        
  +
  +        DeMarshalingInterceptor dmi = new DeMarshalingInterceptor();
  +        dmi.setClassloader(object1.getClass().getClassLoader());
  +        Long dmiid = InterceptorRegistry.instance.register(dmi);
  +        serverContainer.addInterceptor(dmi);      
  +        Interceptor reflexive = new ReflexiveInterceptor(object1);
  +        serverContainer.addInterceptor(reflexive);
  +        severContainers.add(serverContainer);
  +        
  +        ProxyContainer clientContainer = new ProxyContainer();        
  +        IntraVMRoutingInterceptor ivmri = new IntraVMRoutingInterceptor();
  +        ivmri.setDeMarshalingInterceptorID(dmiid);
  +        clientContainer.addInterceptor(ivmri);
  +
  +        return clientContainer.createProxy(object1.getClass());
  +    }
   
   }
  
  
  
  1.2       +283 -286  incubator-geronimo/modules/core/src/test/org/apache/geronimo/remoting/RemotingInterceptorsTest.java
  
  Index: RemotingInterceptorsTest.java
  ===================================================================
  RCS file: /home/cvs/incubator-geronimo/modules/core/src/test/org/apache/geronimo/remoting/RemotingInterceptorsTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- RemotingInterceptorsTest.java	22 Aug 2003 02:23:36 -0000	1.1
  +++ RemotingInterceptorsTest.java	25 Aug 2003 03:14:46 -0000	1.2
  @@ -19,7 +19,7 @@
    * 3. The end-user documentation included with the redistribution,
    *    if any, must include the following acknowledgment:
    *       "This product includes software developed by the
  - *        Apache Software Foundation (http://www.apache.org/)."
  + *        Apache Software Foundation (http:www.apache.org/)."
    *    Alternately, this acknowledgment may appear in the software itself,
    *    if and wherever such third-party acknowledgments normally appear.
    *
  @@ -49,13 +49,14 @@
    * This software consists of voluntary contributions made by many
    * individuals on behalf of the Apache Software Foundation.  For more
    * information on the Apache Software Foundation, please see
  - * <http://www.apache.org/>.
  + * <http:www.apache.org/>.
    *
    * ====================================================================
    */
   
   package org.apache.geronimo.remoting;
   
  +import java.io.File;
   import java.lang.reflect.InvocationTargetException;
   import java.lang.reflect.Method;
   import java.net.URI;
  @@ -94,288 +95,284 @@
       TransportServer server;
       URI connectURI;    
   
  -//    /**
  -//     * creates the two classloaders that will be used during the tests.
  -//     */
  -//    public void setUp() throws Exception {
  -//        URL url = new URL(System.getProperty("test-app.url"));
  -//        System.out.println("Setting up the CP to: " + url);
  -//
  -//        cl1 = new URLClassLoader(new URL[] { url });
  -//        cl2 = new URLClassLoader(new URL[] { url });
  -//
  -//        System.out.println("================================================");
  -//        URI bindURI = new URI("async://0.0.0.0:0");
  -//        TransportFactory tf = TransportFactory.getTransportFactory(bindURI);
  -//        server = tf.createSever();
  -//        server.bind(bindURI,new FragmentBasedInterceptorRouter());
  -//        connectURI = server.getClientConnectURI();
  -//        server.start();
  -//
  -//    }
  -//    
  -//    /**
  -//     * @see junit.framework.TestCase#tearDown()
  -//     */
  -//    protected void tearDown() throws Exception {
  -//        server.dispose();
  -//    }    
  -
  -    // This is here until we can enable the tests.
  -    public void testNull() {        
  -    }
  -
  -//    /**
  -//     * Verify that the classpath/classloader structure is
  -//     * as expected.  If the application classes are in
  -//     * the current classloader then that will throw all the 
  -//     * tests off.
  -//     * 
  -//     * @throws Exception
  -//     */
  -//    public void testCheckClassLoaders() throws Exception {
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Class class2 = cl2.loadClass(PERSON_CLASS);
  -//        assertFalse("Classpath for this test was incorrect.  The '"+PERSON_CLASS+"' cannot be in the test's classpath.", class1.equals(class2));
  -//    }
  -//
  -//    /**
  -//     * Verify that the helper methods used by this test work
  -//     * as expected.  Everything should be ok when working in the
  -//     * same classloader.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetSpouseSameCL() throws Throwable {
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Class class2 = cl1.loadClass(PERSON_CLASS);
  -//
  -//        Object object1 = class1.newInstance();
  -//        Object object2 = class2.newInstance();
  -//
  -//        call(object1, "setSpouse", new Object[] { object2 });
  -//    }
  -//
  -//    /**
  -//     * Verify that the helper methods used by this test work
  -//     * as expected.  We should see problems when you start mixing
  -//     * Objects from different classloaders.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetSpouseOtherCL() throws Throwable {
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Class class2 = cl2.loadClass(PERSON_CLASS);
  -//
  -//        Object object1 = class1.newInstance();
  -//        Object object2 = class2.newInstance();
  -//
  -//        try {
  -//            call(object1, "setSpouse", new Object[] { object2 });
  -//            fail("Call should fail due to argument type mismatch.");
  -//        } catch (IllegalArgumentException e) {
  -//        }
  -//    }
  -//
  -//    /**
  -//     * Verify that a proxy using working in a single app context works ok.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetSpouseWithProxy() throws Throwable {
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Object object1 = class1.newInstance();
  -//
  -//        // Simulate App1 creating a proxy.
  -//        Thread.currentThread().setContextClassLoader(cl1);
  -//        Object proxy1 = createProxy(object1);
  -//        call(proxy1, "setSpouse", new Object[] { object1 });
  -//    }
  -//
  -//    /**
  -//     * App2 creates a proxy and serializes.  App1 context deserializes
  -//     * the proxy and trys to use it.  Method calls should be getting
  -//     * marshalled/demarshaled by the proxy to avoid getting an 
  -//     * IllegalArgumentException.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetSpouseOtherCLWithSerializedProxy() throws Throwable {
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Class class2 = cl2.loadClass(PERSON_CLASS);
  -//
  -//        Object object1 = class1.newInstance();
  -//        Object object2 = class2.newInstance();
  -//
  -//        // Simulate App2 creating a proxy.
  -//        Thread.currentThread().setContextClassLoader(cl2);
  -//        Object proxy2 = createProxy(object2);
  -//        MarshalledObject mo = new BytesMarshalledObject(proxy2);
  -//
  -//        // Simulate App1 using the serialized proxy.    
  -//        Thread.currentThread().setContextClassLoader(cl1);
  -//        Object proxy1 = mo.get();
  -//        call(proxy1, "setSpouse", new Object[] { object1 });
  -//    }
  -//
  -//    /**
  -//     * App1 creates a proxy.  It then creates a Transient calls that holds
  -//     * a "value" property that is transient when serialized.  This allows to 
  -//     * to see if the Transient object was serialized by getting the value back
  -//     * and seeing if the "value" is null.  All this work is done in one classloader
  -//     * so no serialization should occur.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    /* Disable until proxy knows how to do a local optimize.
  -//    public void testSetTransientWithOptimizedProxy() throws Throwable {
  -//        Thread.currentThread().setContextClassLoader(cl1);
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Object object1 = class1.newInstance();
  -//
  -//        Class class2 = cl1.loadClass(TRANSIENT_CLASS);
  -//        Object object2 = class2.newInstance();
  -//        call(object2, "setValue", new Object[] { "foo" });
  -//
  -//        Object proxy1 = createProxy(object1);
  -//        call(proxy1, "setValue", new Object[] { object2 });
  -//        Object rc = call(proxy1, "getValue", new Object[] {
  -//        });
  -//        rc = call(rc, "getValue", new Object[] {
  -//        });
  -//
  -//        assertSame(rc, "foo");
  -//    }
  -//    */
  -//    
  -//    /**
  -//     * Same as testSetTransientWithOptimizedProxy() but, the proxy is serialized before it is used.
  -//     * It should still result in the method call not being serialized.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    /* Disable until proxy knows how to do a local optimize.
  -//    public void testSetTransientWithSerializedOptimizedProxy() throws Throwable {
  -//        Thread.currentThread().setContextClassLoader(cl1);
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Object object1 = class1.newInstance();
  -//
  -//        Class class2 = cl1.loadClass(TRANSIENT_CLASS);
  -//        Object object2 = class2.newInstance();
  -//        call(object2, "setValue", new Object[] { "foo" });
  -//
  -//        Object proxy1 = createProxy(object1);
  -//        proxy1 = new BytesMarshalledObject(proxy1).get();
  -//        call(proxy1, "setValue", new Object[] { object2 });
  -//        Object rc = call(proxy1, "getValue", new Object[] {
  -//        });
  -//        rc = call(rc, "getValue", new Object[] {
  -//        });
  -//
  -//        assertSame(rc, "foo");
  -//    }
  -//    */
  -//    
  -//    /**
  -//     * Same as testSetTransientWithOptimizedProxy() but, the proxy is serialized before it is
  -//     * by App2.  Since a different classloader is using the proxy, the metod call should
  -//     * be serialized and we should see that the set "value" is null.
  -//     * 
  -//     * @throws Throwable
  -//     */
  -//    public void testSetTransientWithSerializedNonOptimizedProxy() throws Throwable {
  -//        Thread.currentThread().setContextClassLoader(cl1);
  -//        Class class1 = cl1.loadClass(PERSON_CLASS);
  -//        Object object1 = class1.newInstance();
  -//
  -//        Object proxy1 = createProxy(object1);
  -//        Thread.currentThread().setContextClassLoader(cl2);
  -//        proxy1 = new BytesMarshalledObject(proxy1).get();
  -//
  -//        Class class2 = cl2.loadClass(TRANSIENT_CLASS);
  -//        Object object2 = class2.newInstance();
  -//        call(object2, "setValue", new Object[] { "foo" });
  -//
  -//        call(proxy1, "setValue", new Object[] { object2 });
  -//        Object rc = call(proxy1, "getValue", new Object[] {
  -//        });
  -//        rc = call(rc, "getValue", new Object[] {
  -//        });
  -//
  -//        assertSame(rc, null);
  -//    }
  -//
  -//    /**
  -//     * Does a reflexive call on object1 my calling method with the provided args.
  -//     * 
  -//     * @param object1
  -//     * @param string
  -//     * @param objects
  -//     */
  -//    private Object call(Object object1, String method, Object[] args) throws Throwable {
  -//        try {
  -//            Class argTypes[] = getArgTypes(object1.getClass().getClassLoader(), args);
  -//            Method m = findMethod(object1.getClass(), method);
  -//            return m.invoke(object1, args);
  -//        } catch (InvocationTargetException e) {
  -//            throw e.getTargetException();
  -//        }
  -//    }
  -//
  -//    /**
  -//     * Gets the Class[] for a given Object[] using the provided loader.
  -//     * 
  -//     * @param object1
  -//     * @param args
  -//     * @return
  -//     */
  -//    private Class[] getArgTypes(ClassLoader loader, Object[] args) throws Exception {
  -//        Class rc[] = new Class[args.length];
  -//        for (int i = 0; i < rc.length; i++) {
  -//            rc[i] = loader.loadClass(args[i].getClass().getName());
  -//        }
  -//        return rc;
  -//    }
  -//
  -//    /**
  -//     * Finds the first method in class c whose name is name.
  -//     * @param c
  -//     * @param name
  -//     * @return
  -//     */
  -//    private Method findMethod(Class c, String name) {
  -//        Method[] methods = c.getMethods();
  -//        for (int i = 0; i < methods.length; i++) {
  -//            if (methods[i].getName().equals(name))
  -//                return methods[i];
  -//        }
  -//        return null;
  -//    }
  -//
  -//    /**
  -//      * @param object1
  -//      * @return
  -//      */
  -//    private Object createProxy(Object object1) throws Exception {
  -//        
  -//        ProxyContainer serverContainer = new ProxyContainer();        
  -//
  -//        DeMarshalingInterceptor dmi = new DeMarshalingInterceptor();
  -//        dmi.setClassloader(object1.getClass().getClassLoader());
  -//        Long dmiid = InterceptorRegistry.instance.register(dmi);
  -//        serverContainer.addInterceptor(dmi);      
  -//        Interceptor reflexive = new ReflexiveInterceptor(object1);
  -//        serverContainer.addInterceptor(reflexive);
  -//        severContainers.add(serverContainer);
  -//        
  -//        ProxyContainer clientContainer = new ProxyContainer();
  -//        clientContainer.addInterceptor(new MarshalingInterceptor());
  -//        RemoteTransportInterceptor rti = new RemoteTransportInterceptor();
  -//        URI u = URISupport.setFragment(connectURI, ""+dmiid);        
  -//        rti.setRemoteURI(u);
  -//        clientContainer.addInterceptor(rti);
  -//        
  -//        return clientContainer.createProxy(object1.getClass());
  -//    }
  +    /**
  +     * creates the two classloaders that will be used during the tests.
  +     */
  +    public void setUp() throws Exception {
  +        URL url = new File("./target/mock-app").toURL();
  +        System.out.println("Setting up the CP to: " + url);
  +
  +        cl1 = new URLClassLoader(new URL[] { url });
  +        cl2 = new URLClassLoader(new URL[] { url });
  +
  +        System.out.println("================================================");
  +        URI bindURI = new URI("async://0.0.0.0:0");
  +        TransportFactory tf = TransportFactory.getTransportFactory(bindURI);
  +        server = tf.createSever();
  +        server.bind(bindURI,new FragmentBasedInterceptorRouter());
  +        connectURI = server.getClientConnectURI();
  +        server.start();
  +
  +    }
  +    
  +    /**
  +     * @see junit.framework.TestCase#tearDown()
  +     */
  +    protected void tearDown() throws Exception {
  +        server.dispose();
  +    }    
  +
  +    /**
  +     * Verify that the classpath/classloader structure is
  +     * as expected.  If the application classes are in
  +     * the current classloader then that will throw all the 
  +     * tests off.
  +     * 
  +     * @throws Exception
  +     */
  +    public void testCheckClassLoaders() throws Exception {
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Class class2 = cl2.loadClass(PERSON_CLASS);
  +        assertFalse("Classpath for this test was incorrect.  The '"+PERSON_CLASS+"' cannot be in the test's classpath.", class1.equals(class2));
  +    }
  +
  +    /**
  +     * Verify that the helper methods used by this test work
  +     * as expected.  Everything should be ok when working in the
  +     * same classloader.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetSpouseSameCL() throws Throwable {
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Class class2 = cl1.loadClass(PERSON_CLASS);
  +
  +        Object object1 = class1.newInstance();
  +        Object object2 = class2.newInstance();
  +
  +        call(object1, "setSpouse", new Object[] { object2 });
  +    }
  +
  +    /**
  +     * Verify that the helper methods used by this test work
  +     * as expected.  We should see problems when you start mixing
  +     * Objects from different classloaders.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetSpouseOtherCL() throws Throwable {
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Class class2 = cl2.loadClass(PERSON_CLASS);
  +
  +        Object object1 = class1.newInstance();
  +        Object object2 = class2.newInstance();
  +
  +        try {
  +            call(object1, "setSpouse", new Object[] { object2 });
  +            fail("Call should fail due to argument type mismatch.");
  +        } catch (IllegalArgumentException e) {
  +        }
  +    }
  +
  +    /**
  +     * Verify that a proxy using working in a single app context works ok.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetSpouseWithProxy() throws Throwable {
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Object object1 = class1.newInstance();
  +
  +        // Simulate App1 creating a proxy.
  +        Thread.currentThread().setContextClassLoader(cl1);
  +        Object proxy1 = createProxy(object1);
  +        call(proxy1, "setSpouse", new Object[] { object1 });
  +    }
  +
  +    /**
  +     * App2 creates a proxy and serializes.  App1 context deserializes
  +     * the proxy and trys to use it.  Method calls should be getting
  +     * marshalled/demarshaled by the proxy to avoid getting an 
  +     * IllegalArgumentException.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetSpouseOtherCLWithSerializedProxy() throws Throwable {
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Class class2 = cl2.loadClass(PERSON_CLASS);
  +
  +        Object object1 = class1.newInstance();
  +        Object object2 = class2.newInstance();
  +
  +        // Simulate App2 creating a proxy.
  +        Thread.currentThread().setContextClassLoader(cl2);
  +        Object proxy2 = createProxy(object2);
  +        MarshalledObject mo = new BytesMarshalledObject(proxy2);
  +
  +        // Simulate App1 using the serialized proxy.    
  +        Thread.currentThread().setContextClassLoader(cl1);
  +        Object proxy1 = mo.get();
  +        call(proxy1, "setSpouse", new Object[] { object1 });
  +    }
  +
  +    /**
  +     * App1 creates a proxy.  It then creates a Transient calls that holds
  +     * a "value" property that is transient when serialized.  This allows to 
  +     * to see if the Transient object was serialized by getting the value back
  +     * and seeing if the "value" is null.  All this work is done in one classloader
  +     * so no serialization should occur.
  +     * 
  +     * @throws Throwable
  +     */
  +    /* Disable until proxy knows how to do a local optimize.
  +    public void testSetTransientWithOptimizedProxy() throws Throwable {
  +        Thread.currentThread().setContextClassLoader(cl1);
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Object object1 = class1.newInstance();
  +
  +        Class class2 = cl1.loadClass(TRANSIENT_CLASS);
  +        Object object2 = class2.newInstance();
  +        call(object2, "setValue", new Object[] { "foo" });
  +
  +        Object proxy1 = createProxy(object1);
  +        call(proxy1, "setValue", new Object[] { object2 });
  +        Object rc = call(proxy1, "getValue", new Object[] {
  +        });
  +        rc = call(rc, "getValue", new Object[] {
  +        });
  +
  +        assertSame(rc, "foo");
  +    }
  +    */
  +    
  +    /**
  +     * Same as testSetTransientWithOptimizedProxy() but, the proxy is serialized before it is used.
  +     * It should still result in the method call not being serialized.
  +     * 
  +     * @throws Throwable
  +     */
  +    /* Disable until proxy knows how to do a local optimize.
  +    public void testSetTransientWithSerializedOptimizedProxy() throws Throwable {
  +        Thread.currentThread().setContextClassLoader(cl1);
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Object object1 = class1.newInstance();
  +
  +        Class class2 = cl1.loadClass(TRANSIENT_CLASS);
  +        Object object2 = class2.newInstance();
  +        call(object2, "setValue", new Object[] { "foo" });
  +
  +        Object proxy1 = createProxy(object1);
  +        proxy1 = new BytesMarshalledObject(proxy1).get();
  +        call(proxy1, "setValue", new Object[] { object2 });
  +        Object rc = call(proxy1, "getValue", new Object[] {
  +        });
  +        rc = call(rc, "getValue", new Object[] {
  +        });
  +
  +        assertSame(rc, "foo");
  +    }
  +    */
  +    
  +    /**
  +     * Same as testSetTransientWithOptimizedProxy() but, the proxy is serialized before it is
  +     * by App2.  Since a different classloader is using the proxy, the metod call should
  +     * be serialized and we should see that the set "value" is null.
  +     * 
  +     * @throws Throwable
  +     */
  +    public void testSetTransientWithSerializedNonOptimizedProxy() throws Throwable {
  +        Thread.currentThread().setContextClassLoader(cl1);
  +        Class class1 = cl1.loadClass(PERSON_CLASS);
  +        Object object1 = class1.newInstance();
  +
  +        Object proxy1 = createProxy(object1);
  +        Thread.currentThread().setContextClassLoader(cl2);
  +        proxy1 = new BytesMarshalledObject(proxy1).get();
  +
  +        Class class2 = cl2.loadClass(TRANSIENT_CLASS);
  +        Object object2 = class2.newInstance();
  +        call(object2, "setValue", new Object[] { "foo" });
  +
  +        call(proxy1, "setValue", new Object[] { object2 });
  +        Object rc = call(proxy1, "getValue", new Object[] {
  +        });
  +        rc = call(rc, "getValue", new Object[] {
  +        });
  +
  +        assertSame(rc, null);
  +    }
  +
  +    /**
  +     * Does a reflexive call on object1 my calling method with the provided args.
  +     * 
  +     * @param object1
  +     * @param string
  +     * @param objects
  +     */
  +    private Object call(Object object1, String method, Object[] args) throws Throwable {
  +        try {
  +            Class argTypes[] = getArgTypes(object1.getClass().getClassLoader(), args);
  +            Method m = findMethod(object1.getClass(), method);
  +            return m.invoke(object1, args);
  +        } catch (InvocationTargetException e) {
  +            throw e.getTargetException();
  +        }
  +    }
  +
  +    /**
  +     * Gets the Class[] for a given Object[] using the provided loader.
  +     * 
  +     * @param object1
  +     * @param args
  +     * @return
  +     */
  +    private Class[] getArgTypes(ClassLoader loader, Object[] args) throws Exception {
  +        Class rc[] = new Class[args.length];
  +        for (int i = 0; i < rc.length; i++) {
  +            rc[i] = loader.loadClass(args[i].getClass().getName());
  +        }
  +        return rc;
  +    }
  +
  +    /**
  +     * Finds the first method in class c whose name is name.
  +     * @param c
  +     * @param name
  +     * @return
  +     */
  +    private Method findMethod(Class c, String name) {
  +        Method[] methods = c.getMethods();
  +        for (int i = 0; i < methods.length; i++) {
  +            if (methods[i].getName().equals(name))
  +                return methods[i];
  +        }
  +        return null;
  +    }
  +
  +    /**
  +      * @param object1
  +      * @return
  +      */
  +    private Object createProxy(Object object1) throws Exception {
  +        
  +        ProxyContainer serverContainer = new ProxyContainer();        
  +
  +        DeMarshalingInterceptor dmi = new DeMarshalingInterceptor();
  +        dmi.setClassloader(object1.getClass().getClassLoader());
  +        Long dmiid = InterceptorRegistry.instance.register(dmi);
  +        serverContainer.addInterceptor(dmi);      
  +        Interceptor reflexive = new ReflexiveInterceptor(object1);
  +        serverContainer.addInterceptor(reflexive);
  +        severContainers.add(serverContainer);
  +        
  +        ProxyContainer clientContainer = new ProxyContainer();
  +        clientContainer.addInterceptor(new MarshalingInterceptor());
  +        RemoteTransportInterceptor rti = new RemoteTransportInterceptor();
  +        URI u = URISupport.setFragment(connectURI, ""+dmiid);        
  +        rti.setRemoteURI(u);
  +        clientContainer.addInterceptor(rti);
  +        
  +        return clientContainer.createProxy(object1.getClass());
  +    }
   
   }
  
  
  
  1.1                  incubator-geronimo/modules/core/src/test-data/mock-app/org/apache/geronimo/remoting/IPerson.java
  
  Index: IPerson.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.remoting;
  
  /**
   * @version $Revision: 1.1 $ $Date: 2003/08/25 03:14:47 $
   */
  public interface IPerson {
      public TransientValue getValue();
      public void setValue(TransientValue value);
     /**
      * @return
      */
     public abstract IPerson getSpouse();
     /**
      * @param spouse
      */
     public abstract void setSpouse(IPerson spouse);
     /**
      * @return
      */
     public abstract String getFirstName();
     /**
      * @param firstName
      */
     public abstract void setFirstName(String firstName);
     /**
      * @return
      */
     public abstract String getLastName();
     /**
      * @param lastName
      */
     public abstract void setLastName(String lastName);
  }
  
  
  
  1.1                  incubator-geronimo/modules/core/src/test-data/mock-app/org/apache/geronimo/remoting/Person.java
  
  Index: Person.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.remoting;
  
  import java.io.Serializable;
  
  /**
   * @version $Revision: 1.1 $ $Date: 2003/08/25 03:14:47 $
   */
  public class Person implements Serializable, IPerson {
      
      private String firstName;
      private String lastName;
      private IPerson spouse;
      private TransientValue value;
      
     /**
      * @return
      */
     public TransientValue getValue() {
        return value;
     }
  
     /**
      * @param value
      */
     public void setValue(TransientValue value) {
        this.value = value;
     }
  
     /**
      * @return
      */
     public IPerson getSpouse() {
        return spouse;
     }
  
     /**
      * @param spouse
      */
     public void setSpouse(IPerson spouse) {
        this.spouse = spouse;
     }
  
     /**
      * @return
      */
     public String getFirstName() {
        return firstName;
     }
  
     /**
      * @param firstName
      */
     public void setFirstName(String firstName) {
        this.firstName = firstName;
     }
  
     /**
      * @return
      */
     public String getLastName() {
        return lastName;
     }
  
     /**
      * @param lastName
      */
     public void setLastName(String lastName) {
        this.lastName = lastName;
     }
  
      public static void main(String[] args) {
        Person p = new Person();
        p.setSpouse(p);
     }
  }
  
  
  
  1.1                  incubator-geronimo/modules/core/src/test-data/mock-app/org/apache/geronimo/remoting/TransientValue.java
  
  Index: TransientValue.java
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" and
   *    "Apache Geronimo" must not be used to endorse or promote products
   *    derived from this software without prior written permission. For
   *    written permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    "Apache Geronimo", nor may "Apache" appear in their name, without
   *    prior written permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * ====================================================================
   */
  package org.apache.geronimo.remoting;
  
  import java.io.Serializable;
  
  /**
   * @version $Revision: 1.1 $ $Date: 2003/08/25 03:14:47 $
   */
  public class TransientValue implements Serializable {
      transient public Object value;
      
     /**
      * @return
      */
     public Object getValue() {
        return value;
     }
  
     /**
      * @param value
      */
     public void setValue(Object value) {
        this.value = value;
     }
  
  }