Work in progress, still.

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/proxy/branches/version-2.0-work@964999 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/cglib/pom.xml b/cglib/pom.xml
index b51c726..9f7c61b 100644
--- a/cglib/pom.xml
+++ b/cglib/pom.xml
@@ -20,7 +20,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

     <parent>

-        <artifactId>commons-proxy</artifactId>

+        <artifactId>commons-proxy-parent</artifactId>

         <groupId>org.apache.commons</groupId>

         <version>2.0-SNAPSHOT</version>

     </parent>

@@ -31,7 +31,7 @@
     <dependencies>

         <dependency>

             <groupId>${project.groupId}</groupId>

-            <artifactId>commons-proxy-core</artifactId>

+            <artifactId>commons-proxy</artifactId>

             <version>${project.version}</version>

         </dependency>

         <dependency>

@@ -42,7 +42,7 @@
         </dependency>

         <dependency>

             <groupId>${project.groupId}</groupId>

-            <artifactId>commons-proxy-core</artifactId>

+            <artifactId>commons-proxy</artifactId>

             <version>${project.version}</version>

             <type>test-jar</type>

             <scope>test</scope>

diff --git a/cglib/src/main/resources/META-INF/services/org.apache.commons.proxy.ProxyFactory b/cglib/src/main/resources/META-INF/services/org.apache.commons.proxy.ProxyFactory
new file mode 100644
index 0000000..12ec239
--- /dev/null
+++ b/cglib/src/main/resources/META-INF/services/org.apache.commons.proxy.ProxyFactory
@@ -0,0 +1 @@
+org.apache.commons.proxy.cglib.CglibProxyFactory
\ No newline at end of file
diff --git a/cglib/src/test/java/org/apache/commons/proxy/cglib/TestCglibProxyFactory.java b/cglib/src/test/java/org/apache/commons/proxy/cglib/TestCglibProxyFactory.java
index e2985ef..0539e1b 100644
--- a/cglib/src/test/java/org/apache/commons/proxy/cglib/TestCglibProxyFactory.java
+++ b/cglib/src/test/java/org/apache/commons/proxy/cglib/TestCglibProxyFactory.java
@@ -27,6 +27,5 @@
 

     public TestCglibProxyFactory()

     {

-        super(new CglibProxyFactory());

     }

 }

diff --git a/core/pom.xml b/core/pom.xml
index c72654a..194f557 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -3,13 +3,13 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

     <parent>

-        <artifactId>commons-proxy</artifactId>

+        <artifactId>commons-proxy-parent</artifactId>

         <groupId>org.apache.commons</groupId>

         <version>2.0-SNAPSHOT</version>

     </parent>

     <modelVersion>4.0.0</modelVersion>

 

-    <artifactId>commons-proxy-core</artifactId>

+    <artifactId>commons-proxy</artifactId>

 

     <dependencies>

         <dependency>

@@ -49,6 +49,12 @@
             <optional>true</optional>

         </dependency>

         <dependency>

+            <groupId>concurrent</groupId>

+            <artifactId>concurrent</artifactId>

+            <version>1.3.4</version>

+            <optional>true</optional>

+        </dependency>

+        <dependency>

             <groupId>org.slf4j</groupId>

             <artifactId>slf4j-api</artifactId>

             <version>1.4.0</version>

diff --git a/core/src/test/java/org/apache/commons/proxy/TestProxyUtils.java b/core/src/test/java/org/apache/commons/proxy/TestProxyUtils.java
new file mode 100644
index 0000000..e3a1156
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/TestProxyUtils.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy;
+
+import junit.framework.TestCase;
+import org.apache.commons.proxy.util.DuplicateEcho;
+import org.apache.commons.proxy.util.Echo;
+import org.apache.commons.proxy.util.EchoImpl;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Properties;
+
+public class TestProxyUtils extends TestCase
+{
+//**********************************************************************************************************************
+// Fields
+//**********************************************************************************************************************
+
+    private Properties prevProperties;
+
+//**********************************************************************************************************************
+// Other Methods
+//**********************************************************************************************************************
+
+    protected void setUp() throws Exception
+    {
+        prevProperties = System.getProperties();
+        System.setProperties(new Properties());
+    }
+
+    protected void tearDown() throws Exception
+    {
+        System.setProperties(prevProperties);
+    }
+
+    public void testNullValue()
+    {
+        assertNullValue(null, String.class);
+        assertNullValue(( char ) 0, Character.TYPE);
+        assertNullValue(0, Integer.TYPE);
+        assertNullValue(( long ) 0, Long.TYPE);
+        assertNullValue(( short ) 0, Short.TYPE);
+        assertNullValue(( double ) 0, Double.TYPE);
+        assertNullValue(( float ) 0, Float.TYPE);
+        assertNullValue(false, Boolean.TYPE);
+        assertNullValue(( byte ) 0, Byte.TYPE);
+    }
+
+    private void assertNullValue( Object expected, Class type )
+    {
+        assertEquals(expected, ProxyUtils.nullValue(type));
+    }
+
+    public void testCreateNullObject() throws Exception
+    {
+        final Echo nullEcho = ( Echo ) ProxyUtils
+                .createNullObject(new JavassistProxyFactory(), new Class[] {Echo.class});
+        assertNull(nullEcho.echoBack("hello"));
+        assertNull(nullEcho.echoBack("hello", "world"));
+        assertEquals(( int ) 0, nullEcho.echoBack(12345));
+    }
+
+    public void testCreateNullObjectWithClassLoader() throws Exception
+    {
+        final Echo nullEcho = ( Echo ) ProxyUtils.createNullObject(new JavassistProxyFactory(),
+                                                                   Echo.class.getClassLoader(),
+                                                                   new Class[] {Echo.class});
+        assertNull(nullEcho.echoBack("hello"));
+        assertNull(nullEcho.echoBack("hello", "world"));
+        assertEquals(( int ) 0, nullEcho.echoBack(12345));
+    }
+
+    public void testGetAllInterfaces()
+    {
+        assertNull(ProxyUtils.getAllInterfaces(null));
+        assertEquals(Arrays.asList(new Class[] {DuplicateEcho.class, Serializable.class, Echo.class}),
+                     Arrays.asList(ProxyUtils.getAllInterfaces(EchoImpl.class)));
+    }
+
+    public void testGetJavaClassName() throws Exception
+    {
+        assertEquals("java.lang.Object[]", ProxyUtils.getJavaClassName(Object[].class));
+        assertEquals("java.lang.Object[][]", ProxyUtils.getJavaClassName(Object[][].class));
+        assertEquals("java.lang.String[][][]", ProxyUtils.getJavaClassName(String[][][].class));
+        assertEquals("int", ProxyUtils.getJavaClassName(Integer.TYPE));
+        assertEquals("float", ProxyUtils.getJavaClassName(Float.TYPE));
+        assertEquals("long", ProxyUtils.getJavaClassName(Long.TYPE));
+        assertEquals("double", ProxyUtils.getJavaClassName(Double.TYPE));
+        assertEquals("short", ProxyUtils.getJavaClassName(Short.TYPE));
+        assertEquals("byte", ProxyUtils.getJavaClassName(Byte.TYPE));
+        assertEquals("char", ProxyUtils.getJavaClassName(Character.TYPE));
+        assertEquals("boolean", ProxyUtils.getJavaClassName(Boolean.TYPE));
+    }
+}
\ No newline at end of file
diff --git a/core/src/test/java/org/apache/commons/proxy/exception/AbstractExceptionClassTestCase.java b/core/src/test/java/org/apache/commons/proxy/exception/AbstractExceptionClassTestCase.java
new file mode 100644
index 0000000..343ddd6
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/exception/AbstractExceptionClassTestCase.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.exception;
+
+import junit.framework.TestCase;
+
+/**
+ * @author James Carman
+ * @since 1.0
+ */
+public abstract class AbstractExceptionClassTestCase extends TestCase
+{
+//**********************************************************************************************************************
+// Fields
+//**********************************************************************************************************************
+
+    private final Class exceptionClass;
+
+//**********************************************************************************************************************
+// Constructors
+//**********************************************************************************************************************
+
+    public AbstractExceptionClassTestCase( Class exceptionClass )
+    {
+        this.exceptionClass = exceptionClass;
+    }
+
+//**********************************************************************************************************************
+// Other Methods
+//**********************************************************************************************************************
+
+    public void testCauseOnlyConstructor() throws Exception
+    {
+        final Exception cause = new Exception();
+        Exception e = ( Exception ) exceptionClass.getConstructor(new Class[] {Throwable.class}).newInstance(new Object[] {cause});
+        assertEquals(cause.toString(), e.getMessage());
+        assertEquals(cause, e.getCause());
+    }
+
+    public void testMessageAndCauseConstructor() throws Exception
+    {
+        final Exception cause = new Exception();
+        final String message = "message";
+        Exception e = ( Exception ) exceptionClass.getConstructor(new Class[] {String.class, Throwable.class}).newInstance(new Object[] {message, cause});
+        assertEquals(message, e.getMessage());
+        assertEquals(cause, e.getCause());
+    }
+
+    public void testMessageOnlyConstructor() throws Exception
+    {
+        final String message = "message";
+        Exception e = ( Exception ) exceptionClass.getConstructor(new Class[] {String.class}).newInstance(new Object[] {message});
+        assertEquals(message, e.getMessage());
+        assertNull(e.getCause());
+    }
+
+    public void testNoArgConstructor() throws Exception
+    {
+        Exception e = ( Exception ) exceptionClass.getConstructor(new Class[] {}).newInstance(new Object[] {});
+        assertNull(e.getMessage());
+        assertNull(e.getCause());
+    }
+}
diff --git a/core/src/test/java/org/apache/commons/proxy/exception/TestDelegateProviderException.java b/core/src/test/java/org/apache/commons/proxy/exception/TestDelegateProviderException.java
new file mode 100644
index 0000000..45af58c
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/exception/TestDelegateProviderException.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.exception;
+
+public class TestDelegateProviderException extends AbstractExceptionClassTestCase
+{
+//**********************************************************************************************************************
+// Constructors
+//**********************************************************************************************************************
+
+    public TestDelegateProviderException()
+    {
+        super(ObjectProviderException.class);
+    }
+}
\ No newline at end of file
diff --git a/core/src/test/java/org/apache/commons/proxy/exception/TestInvocationHandlerException.java b/core/src/test/java/org/apache/commons/proxy/exception/TestInvocationHandlerException.java
new file mode 100644
index 0000000..13ed169
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/exception/TestInvocationHandlerException.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.exception;
+
+public class TestInvocationHandlerException extends AbstractExceptionClassTestCase
+{
+//**********************************************************************************************************************
+// Constructors
+//**********************************************************************************************************************
+
+    public TestInvocationHandlerException()
+    {
+        super(InvokerException.class);
+    }
+}
\ No newline at end of file
diff --git a/core/src/test/java/org/apache/commons/proxy/exception/TestProxyFactoryException.java b/core/src/test/java/org/apache/commons/proxy/exception/TestProxyFactoryException.java
new file mode 100644
index 0000000..4498a29
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/exception/TestProxyFactoryException.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.exception;
+
+/**
+ * @author James Carman
+ * @since 1.0
+ */
+public class TestProxyFactoryException extends AbstractExceptionClassTestCase
+{
+//**********************************************************************************************************************
+// Constructors
+//**********************************************************************************************************************
+
+    public TestProxyFactoryException()
+    {
+        super(ProxyFactoryException.class);
+    }
+}
diff --git a/core/src/test/java/org/apache/commons/proxy/impl/TestMethodSignature.java b/core/src/test/java/org/apache/commons/proxy/impl/TestMethodSignature.java
new file mode 100644
index 0000000..4388dd4
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/impl/TestMethodSignature.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.impl;
+
+import junit.framework.TestCase;
+
+public class TestMethodSignature extends TestCase
+{
+//**********************************************************************************************************************
+// Other Methods
+//**********************************************************************************************************************
+
+    public void testEquals() throws Exception
+    {
+        final MethodSignature sig = new MethodSignature(Echo.class.getMethod("echoBack", new Class[] {String.class}));
+        assertTrue(sig.equals(sig));
+        assertFalse(sig.equals("echoBack"));
+        assertEquals(sig, new MethodSignature(Echo.class.getMethod("echoBack", new Class[] {String.class})));
+        assertEquals(sig, new MethodSignature(DuplicateEcho.class.getMethod("echoBack", new Class[] {String.class})));
+        assertFalse(sig.equals(new MethodSignature(Echo.class.getMethod("echoBack", new Class[] {String.class, String.class}))));
+        assertFalse(sig.equals(new MethodSignature(Echo.class.getMethod("echo", new Class[] {}))));
+    }
+}
\ No newline at end of file
diff --git a/core/src/test/java/org/apache/commons/proxy/provider/CountingProvider.java b/core/src/test/java/org/apache/commons/proxy/provider/CountingProvider.java
new file mode 100644
index 0000000..ae4d3e6
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/provider/CountingProvider.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.provider;
+
+import org.apache.commons.proxy.ObjectProvider;
+
+/**
+ * @author James Carman
+ * @since 1.0
+ */
+public class CountingProvider extends ProviderDecorator
+{
+//**********************************************************************************************************************
+// Fields
+//**********************************************************************************************************************
+
+    private int count = 0;
+
+//**********************************************************************************************************************
+// Constructors
+//**********************************************************************************************************************
+
+    public CountingProvider( ObjectProvider inner )
+    {
+        super(inner);
+    }
+
+//**********************************************************************************************************************
+// ObjectProvider Implementation
+//**********************************************************************************************************************
+
+
+    public synchronized Object getObject()
+    {
+        count++;
+        return super.getObject();
+    }
+
+//**********************************************************************************************************************
+// Getter/Setter Methods
+//**********************************************************************************************************************
+
+    public synchronized int getCount()
+    {
+        return count;
+    }
+}
diff --git a/core/src/test/java/org/apache/commons/proxy/provider/TestBeanProvider.java b/core/src/test/java/org/apache/commons/proxy/provider/TestBeanProvider.java
new file mode 100644
index 0000000..8973bfa
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/provider/TestBeanProvider.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.provider;
+
+import org.apache.commons.proxy.exception.ObjectProviderException;
+import org.apache.commons.proxy.util.AbstractTestCase;
+
+public class TestBeanProvider extends AbstractTestCase
+{
+//**********************************************************************************************************************
+// Other Methods
+//**********************************************************************************************************************
+
+    public void testAbstractBeanClass()
+    {
+        try
+        {
+            final BeanProvider p = new BeanProvider();
+            p.setBeanClass(Number.class);
+            p.getObject();
+            fail();
+        }
+        catch( ObjectProviderException e )
+        {
+        }
+    }
+
+    public void testNonAccessibleConstructor()
+    {
+        try
+        {
+            new BeanProvider(MyBean.class).getObject();
+            fail();
+        }
+        catch( ObjectProviderException e )
+        {
+        }
+    }
+
+    public void testSerialization()
+    {
+        assertSerializable(new BeanProvider(MyBean.class));
+    }
+
+    public void testWithNullBeanClass()
+    {
+        try
+        {
+            final BeanProvider p = new BeanProvider();
+            p.getObject();
+            fail();
+        }
+        catch( ObjectProviderException e )
+        {
+        }
+    }
+
+//**********************************************************************************************************************
+// Inner Classes
+//**********************************************************************************************************************
+
+    public static class MyBean
+    {
+        private MyBean()
+        {
+
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/src/test/java/org/apache/commons/proxy/provider/TestCloningProvider.java b/core/src/test/java/org/apache/commons/proxy/provider/TestCloningProvider.java
new file mode 100644
index 0000000..adac321
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/provider/TestCloningProvider.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.provider;
+
+import org.apache.commons.proxy.exception.ObjectProviderException;
+import org.apache.commons.proxy.util.AbstractTestCase;
+
+import java.util.Date;
+
+public class TestCloningProvider extends AbstractTestCase
+{
+//**********************************************************************************************************************
+// Other Methods
+//**********************************************************************************************************************
+
+    public void testSerialization()
+    {
+        assertSerializable(new CloningProvider(new Date()));
+    }
+
+    public void testValidCloneable()
+    {
+        final Date now = new Date();
+        final CloningProvider provider = new CloningProvider(now);
+        final Date clone1 = ( Date ) provider.getObject();
+        assertEquals(now, clone1);
+        assertNotSame(now, clone1);
+        final Date clone2 = ( Date ) provider.getObject();
+        assertEquals(now, clone2);
+        assertNotSame(now, clone2);
+        assertNotSame(clone2, clone1);
+    }
+
+    public void testWithExceptionThrown()
+    {
+        final CloningProvider provider = new CloningProvider(new ExceptionCloneable());
+        try
+        {
+            provider.getObject();
+            fail();
+        }
+        catch( ObjectProviderException e )
+        {
+        }
+    }
+
+    public void testWithInvalidCloneable()
+    {
+        final CloningProvider provider = new CloningProvider(new InvalidCloneable());
+        try
+        {
+            provider.getObject();
+            fail();
+        }
+        catch( ObjectProviderException e )
+        {
+        }
+    }
+
+    public void testWithPrivateCloneMethod()
+    {
+        final CloningProvider provider = new CloningProvider(new PrivateCloneable());
+        try
+        {
+            provider.getObject();
+            fail();
+        }
+        catch( ObjectProviderException e )
+        {
+        }
+    }
+
+//**********************************************************************************************************************
+// Inner Classes
+//**********************************************************************************************************************
+
+    public static class ExceptionCloneable implements Cloneable
+    {
+        public Object clone()
+        {
+            throw new RuntimeException("No clone for you!");
+        }
+    }
+
+    public static class InvalidCloneable implements Cloneable
+    {
+    }
+
+    public static class PrivateCloneable implements Cloneable
+    {
+        protected Object clone()
+        {
+            return this;
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/src/test/java/org/apache/commons/proxy/provider/TestConstantProvider.java b/core/src/test/java/org/apache/commons/proxy/provider/TestConstantProvider.java
new file mode 100644
index 0000000..8c4eee3
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/provider/TestConstantProvider.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.provider;
+
+import org.apache.commons.proxy.util.AbstractTestCase;
+
+/**
+ * @since 1.0
+ */
+public class TestConstantProvider extends AbstractTestCase
+{
+//**********************************************************************************************************************
+// Other Methods
+//**********************************************************************************************************************
+
+    public void testGetObject() throws Exception
+    {
+        final String s = "Hello, World!";
+        final ConstantProvider provider = new ConstantProvider(s);
+        assertSame(s, provider.getObject());
+    }
+
+    public void testSerialization()
+    {
+        assertSerializable(new ConstantProvider("Hello, World!"));
+    }
+}
diff --git a/core/src/test/java/org/apache/commons/proxy/provider/TestNullProvider.java b/core/src/test/java/org/apache/commons/proxy/provider/TestNullProvider.java
new file mode 100644
index 0000000..12f59f5
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/provider/TestNullProvider.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.provider;
+
+import org.apache.commons.proxy.util.AbstractTestCase;
+
+/**
+ * @author James Carman
+ * @since 1.0
+ */
+public class TestNullProvider extends AbstractTestCase
+{
+//**********************************************************************************************************************
+// Other Methods
+//**********************************************************************************************************************
+
+    public void testGetObject()
+    {
+        final NullProvider provider = new NullProvider();
+        assertNull(provider.getObject());
+    }
+
+    public void testSerialization()
+    {
+        assertSerializable(new NullProvider());
+    }
+}
diff --git a/core/src/test/java/org/apache/commons/proxy/provider/remoting/TestBurlapProvider.java b/core/src/test/java/org/apache/commons/proxy/provider/remoting/TestBurlapProvider.java
new file mode 100644
index 0000000..f3dcc3a
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/provider/remoting/TestBurlapProvider.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.provider.remoting;
+
+import org.apache.commons.proxy.exception.ObjectProviderException;
+import org.apache.commons.proxy.util.AbstractTestCase;
+import org.apache.commons.proxy.util.Echo;
+
+public class TestBurlapProvider extends AbstractTestCase
+{
+//**********************************************************************************************************************
+// Other Methods
+//**********************************************************************************************************************
+
+    public void testSerialization()
+    {
+        final BurlapProvider p = new BurlapProvider();
+        p.setServiceInterface(Echo.class);
+        p.setUrl("a malformed URL");
+        assertSerializable(p);
+    }
+
+    public void testWithMalformedUrl()
+    {
+        try
+        {
+            final BurlapProvider p = new BurlapProvider(Echo.class, "a malformed URL");
+            p.getObject();
+            fail();
+        }
+        catch( ObjectProviderException e )
+        {
+        }
+    }
+
+    public void testWithMalformedUrlBean()
+    {
+        try
+        {
+            final BurlapProvider p = new BurlapProvider();
+            p.setServiceInterface(Echo.class);
+            p.setUrl("a malformed URL");
+            p.getObject();
+            fail();
+        }
+        catch( ObjectProviderException e )
+        {
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/src/test/java/org/apache/commons/proxy/provider/remoting/TestHessianProvider.java b/core/src/test/java/org/apache/commons/proxy/provider/remoting/TestHessianProvider.java
new file mode 100644
index 0000000..e002b90
--- /dev/null
+++ b/core/src/test/java/org/apache/commons/proxy/provider/remoting/TestHessianProvider.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.proxy.provider.remoting;
+
+import org.apache.commons.proxy.exception.ObjectProviderException;
+import org.apache.commons.proxy.util.AbstractTestCase;
+import org.apache.commons.proxy.util.Echo;
+
+public class TestHessianProvider extends AbstractTestCase
+{
+//**********************************************************************************************************************
+// Other Methods
+//**********************************************************************************************************************
+
+    public void testSerialization()
+    {
+        final HessianProvider p = new HessianProvider();
+        p.setServiceInterface(Echo.class);
+        p.setUrl("a malformed URL");
+        assertSerializable(p);
+    }
+
+    public void testWithMalformedUrl()
+    {
+        try
+        {
+            final HessianProvider p = new HessianProvider(Echo.class, "a malformed URL");
+            p.getObject();
+            fail();
+        }
+        catch( ObjectProviderException e )
+        {
+        }
+    }
+
+    public void testWithMalformedUrlBean()
+    {
+        try
+        {
+            final HessianProvider p = new HessianProvider();
+            p.setServiceInterface(Echo.class);
+            p.setUrl("a malformed URL");
+            p.getObject();
+            fail();
+        }
+        catch( ObjectProviderException e )
+        {
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/test/resources/log4j.properties b/core/src/test/resources/log4j.properties
similarity index 100%
rename from src/test/resources/log4j.properties
rename to core/src/test/resources/log4j.properties
diff --git a/javassist/pom.xml b/javassist/pom.xml
index 743c2d4..efe8297 100644
--- a/javassist/pom.xml
+++ b/javassist/pom.xml
@@ -3,7 +3,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

     <parent>

-        <artifactId>commons-proxy</artifactId>

+        <artifactId>commons-proxy-parent</artifactId>

         <groupId>org.apache.commons</groupId>

         <version>2.0-SNAPSHOT</version>

     </parent>

@@ -14,7 +14,7 @@
     <dependencies>

         <dependency>

             <groupId>${project.groupId}</groupId>

-            <artifactId>commons-proxy-core</artifactId>

+            <artifactId>commons-proxy</artifactId>

             <version>${project.version}</version>

         </dependency>

         <dependency>

@@ -24,7 +24,7 @@
         </dependency>

         <dependency>

             <groupId>${project.groupId}</groupId>

-            <artifactId>commons-proxy-core</artifactId>

+            <artifactId>commons-proxy</artifactId>

             <version>${project.version}</version>

             <type>test-jar</type>

             <scope>test</scope>

diff --git a/jdk/pom.xml b/jdk/pom.xml
index 9893f00..3e5c4fb 100644
--- a/jdk/pom.xml
+++ b/jdk/pom.xml
@@ -3,7 +3,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

     <parent>

-        <artifactId>commons-proxy</artifactId>

+        <artifactId>commons-proxy-parent</artifactId>

         <groupId>org.apache.commons</groupId>

         <version>2.0-SNAPSHOT</version>

     </parent>

@@ -14,12 +14,12 @@
     <dependencies>

         <dependency>

             <groupId>${project.groupId}</groupId>

-            <artifactId>commons-proxy-core</artifactId>

+            <artifactId>commons-proxy</artifactId>

             <version>${project.version}</version>

         </dependency>

         <dependency>

             <groupId>${project.groupId}</groupId>

-            <artifactId>commons-proxy-core</artifactId>

+            <artifactId>commons-proxy</artifactId>

             <version>${project.version}</version>

             <type>test-jar</type>

             <scope>test</scope>

diff --git a/pom.xml b/pom.xml
index 886a58c..40edaa9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,9 +28,9 @@
     <parent>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-parent</artifactId>
-        <version>16</version>
+        <version>17</version>
     </parent>
-    <artifactId>commons-proxy</artifactId>
+    <artifactId>commons-proxy-parent</artifactId>
     <version>2.0-SNAPSHOT</version>
     <name>Commons Proxy</name>
     <description>Java library for dynamic proxying</description>