You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Phil Steitz <ph...@gmail.com> on 2013/10/14 17:40:24 UTC

Re: svn commit: r1531846 - in /commons/proper/pool/trunk: ./ src/main/java/org/apache/commons/pool2/proxy/ src/test/java/org/apache/commons/pool2/proxy/

On 10/14/13 3:50 AM, markt@apache.org wrote:
> Author: markt
> Date: Mon Oct 14 10:50:28 2013
> New Revision: 1531846
>
> URL: http://svn.apache.org/r1531846
> Log:
> Add CGLib proxy implementation and test.
>
> Added:
>     commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxyHandler.java   (with props)
>     commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxySource.java   (with props)
>     commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/proxy/TestProxiedObjectPoolWithCglibProxy.java   (with props)
> Modified:
>     commons/proper/pool/trunk/pom.xml
>
> Modified: commons/proper/pool/trunk/pom.xml
> URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/pom.xml?rev=1531846&r1=1531845&r2=1531846&view=diff
> ==============================================================================
> --- commons/proper/pool/trunk/pom.xml (original)
> +++ commons/proper/pool/trunk/pom.xml Mon Oct 14 10:50:28 2013
> @@ -120,6 +120,19 @@
>        <version>4.11</version>
>        <scope>test</scope>
>      </dependency>
> +    <dependency>
> +      <groupId>cglib</groupId>
> +      <artifactId>cglib</artifactId>
> +      <version>3.0</version>
> +      <scope>provided</scope>
> +    </dependency>
> +    <dependency>
> +      <groupId>org.ow2.asm</groupId>
> +      <artifactId>asm-util</artifactId>
> +      <version>4.0</version>
> +      <scope>provided</scope>
> +    </dependency>
> +   

 What exactly is expected to "provide" this?  Does tomcat somehow
provide it?  I guess its obvious from the code what classes depend
on it, right?  Also, this breaks the Ant build, so we either need to
drop the Ant build or fix it.  I am not asking to revert here - just
want to understand the implications.

Phil
>  
>    </dependencies>


>  
>    <distributionManagement>
>
> Added: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxyHandler.java
> URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxyHandler.java?rev=1531846&view=auto
> ==============================================================================
> --- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxyHandler.java (added)
> +++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxyHandler.java Mon Oct 14 10:50:28 2013
> @@ -0,0 +1,32 @@
> +package org.apache.commons.pool2.proxy;
> +
> +import java.lang.reflect.Method;
> +
> +import org.apache.commons.pool2.UsageTracking;
> +
> +import net.sf.cglib.proxy.MethodInterceptor;
> +import net.sf.cglib.proxy.MethodProxy;
> +
> +
> +public class CglibProxyHandler<T> extends BaseProxyHandler<T>
> +        implements MethodInterceptor {
> +
> +    private final UsageTracking<T> usageTracking;
> +
> +    CglibProxyHandler(T pooledObject, UsageTracking<T> usageTracking) {
> +        super(pooledObject);
> +        this.usageTracking = usageTracking;
> +    }
> +
> +    @Override
> +    public Object intercept(Object object, Method method, Object[] args,
> +            MethodProxy methodProxy) throws Throwable {
> +        validateProxiedObject();
> +        T pooledObject = getPooledObject();
> +        if (usageTracking != null) {
> +            usageTracking.use(pooledObject);
> +        }
> +
> +        return method.invoke(pooledObject, args);
> +    }
> +}
>
> Propchange: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxyHandler.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxySource.java
> URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxySource.java?rev=1531846&view=auto
> ==============================================================================
> --- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxySource.java (added)
> +++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxySource.java Mon Oct 14 10:50:28 2013
> @@ -0,0 +1,57 @@
> +/*
> + * 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.pool2.proxy;
> +
> +import net.sf.cglib.proxy.Enhancer;
> +import net.sf.cglib.proxy.Factory;
> +
> +import org.apache.commons.pool2.UsageTracking;
> +
> +public class CglibProxySource<T> implements ProxySource<T> {
> +
> +    private final Class<? extends T> superclass;
> +
> +    public CglibProxySource(Class<? extends T> superclass) {
> +        this.superclass = superclass;
> +    }
> +
> +
> +    @Override
> +    public T createProxy(T pooledObject, UsageTracking<T> usageTracking) {
> +        Enhancer enhancer = new Enhancer();
> +        enhancer.setSuperclass(superclass);
> +
> +        CglibProxyHandler<T> proxyInterceptor =
> +                new CglibProxyHandler<T>(pooledObject, usageTracking);
> +        enhancer.setCallback(proxyInterceptor);
> +
> +        @SuppressWarnings("unchecked")
> +        T proxy = (T) enhancer.create();
> +
> +        return proxy;
> +    }
> +
> +
> +    @Override
> +    public T resolveProxy(T proxy) {
> +        @SuppressWarnings("unchecked")
> +        BaseProxyHandler<T> proxyInterceptor =
> +                (BaseProxyHandler<T>) ((Factory) proxy).getCallback(0);
> +        T pooledObject = proxyInterceptor.disableProxy();
> +        return pooledObject;
> +    }
> +}
>
> Propchange: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/proxy/CglibProxySource.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added: commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/proxy/TestProxiedObjectPoolWithCglibProxy.java
> URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/proxy/TestProxiedObjectPoolWithCglibProxy.java?rev=1531846&view=auto
> ==============================================================================
> --- commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/proxy/TestProxiedObjectPoolWithCglibProxy.java (added)
> +++ commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/proxy/TestProxiedObjectPoolWithCglibProxy.java Mon Oct 14 10:50:28 2013
> @@ -0,0 +1,150 @@
> +/*
> + * 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.pool2.proxy;
> +
> +import static org.junit.Assert.assertEquals;
> +import static org.junit.Assert.assertNotNull;
> +import static org.junit.Assert.assertTrue;
> +
> +import java.io.PrintWriter;
> +import java.io.StringWriter;
> +
> +import org.apache.commons.pool2.BasePooledObjectFactory;
> +import org.apache.commons.pool2.ObjectPool;
> +import org.apache.commons.pool2.PooledObjectFactory;
> +import org.apache.commons.pool2.impl.AbandonedConfig;
> +import org.apache.commons.pool2.impl.GenericObjectPool;
> +import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
> +
> +import org.junit.Before;
> +import org.junit.Test;
> +
> +public class TestProxiedObjectPoolWithCglibProxy {
> +
> +    private static final String DATA1 = "data1";
> +    private static final int ABANDONED_TIMEOUT_SECS = 3;
> +
> +    private ObjectPool<TestObject> pool;
> +    private StringWriter log;
> +
> +    @Before
> +    public void setup() {
> +        log = new StringWriter();
> +
> +        PrintWriter pw = new PrintWriter(log);
> +        AbandonedConfig abandonedConfig = new AbandonedConfig();
> +        abandonedConfig.setLogAbandoned(true);
> +        abandonedConfig.setRemoveAbandonedOnBorrow(true);
> +        abandonedConfig.setUseUsageTracking(true);
> +        abandonedConfig.setRemoveAbandonedTimeout(ABANDONED_TIMEOUT_SECS);
> +        abandonedConfig.setLogWriter(pw);
> +
> +        GenericObjectPoolConfig config = new GenericObjectPoolConfig();
> +        config.setMaxTotal(3);
> +
> +        PooledObjectFactory<TestObject> factory = new TestObjectFactory();
> +
> +        ObjectPool<TestObject> innerPool =
> +                new GenericObjectPool<TestObject>(factory, config, abandonedConfig);
> +
> +        ProxySource<TestObject> proxySource =
> +                new CglibProxySource<TestObject>(TestObject.class);
> +        pool = new ProxiedObjectPool<TestObject>(innerPool, proxySource);
> +    }
> +
> +
> +    @Test
> +    public void testBorrowObject() throws Exception {
> +        TestObject obj = pool.borrowObject();
> +        assertNotNull(obj);
> +
> +        // Make sure proxied methods are working
> +        obj.setData(DATA1);
> +        assertEquals(DATA1, obj.getData());
> +
> +        pool.returnObject(obj);
> +    }
> +
> +
> +    @Test(expected=IllegalStateException.class)
> +    public void testAccessAfterReturn() throws Exception {
> +        TestObject obj = pool.borrowObject();
> +        assertNotNull(obj);
> +
> +        // Make sure proxied methods are working
> +        obj.setData(DATA1);
> +        assertEquals(DATA1, obj.getData());
> +
> +        pool.returnObject(obj);
> +
> +        assertNotNull(obj);
> +
> +        obj.getData();
> +    }
> +
> +
> +    @Test
> +    public void testUsageTracking() throws Exception {
> +        TestObject obj = pool.borrowObject();
> +        assertNotNull(obj);
> +
> +        // Use the object to trigger collection of last used stack trace
> +        obj.setData(DATA1);
> +
> +        // Sleep long enough for the object to be considered abandoned
> +        Thread.sleep((ABANDONED_TIMEOUT_SECS + 2) * 1000);
> +
> +        // Borrow another object to trigger the abandoned object processing
> +        pool.borrowObject();
> +
> +        String logOutput = log.getBuffer().toString();
> +
> +        assertTrue(logOutput.contains("Pooled object created"));
> +        assertTrue(logOutput.contains("The last code to use this object was"));
> +    }
> +
> +    private static class TestObjectFactory extends
> +            BasePooledObjectFactory<TestObject> {
> +
> +        @Override
> +        public TestObject create() throws Exception {
> +            return new TestObjectImpl();
> +        }
> +    }
> +
> +
> +    private static interface TestObject {
> +        String getData();
> +        void setData(String data);
> +    }
> +
> +
> +    private static class TestObjectImpl implements TestObject {
> +
> +        private String data;
> +
> +        @Override
> +        public String getData() {
> +            return data;
> +        }
> +
> +        @Override
> +        public void setData(String data) {
> +            this.data = data;
> +        }
> +    }
> +}
>
> Propchange: commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/proxy/TestProxiedObjectPoolWithCglibProxy.java
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
>
>


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org