Author: cziegeler Date: Tue Jan 25 11:49:12 2005 New Revision: 126414 URL: http://svn.apache.org/viewcvs?view=rev&rev=126414 Log: New poolable handler using proxies Added: cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java (contents, props changed) Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/handler/NewPoolableComponentHandler.java cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java
Added: cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java?view=auto&rev=126414 ============================================================================== --- (empty file) +++ cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java Tue Jan 25 11:49:12 2005 @@ -0,0 +1,56 @@ +/* + * Copyright 2005 The Apache Software Foundation + * Licensed 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.cocoon.core; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * The Core + * + * @version SVN $Id:$ + */ +public class Core { + + private static final ThreadLocal cleanup = new InheritableThreadLocal(); + + public static void addCleanupTask(CleanupTask task) { + List l = (List)cleanup.get(); + if ( l == null ) { + l = new ArrayList(); + cleanup.set(l); + } + l.add(task); + } + + public static void cleanup() { + List l = (List)cleanup.get(); + if ( l != null ) { + final Iterator i = l.iterator(); + while ( i.hasNext() ) { + final CleanupTask t = (CleanupTask)i.next(); + t.invoke(); + } + l.clear(); + } + } + public static interface CleanupTask { + + void invoke(); + } +} Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/handler/NewPoolableComponentHandler.java Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/container/handler/NewPoolableComponentHandler.java?view=diff&rev=126414&p1=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/handler/NewPoolableComponentHandler.java&r1=126413&p2=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/handler/NewPoolableComponentHandler.java&r2=126414 ============================================================================== --- cocoon/trunk/src/core/java/org/apache/cocoon/core/container/handler/NewPoolableComponentHandler.java (original) +++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/handler/NewPoolableComponentHandler.java Tue Jan 25 11:49:12 2005 @@ -28,6 +28,7 @@ import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.logger.Logger; import org.apache.cocoon.components.ComponentInfo; +import org.apache.cocoon.core.Core; import org.apache.cocoon.core.container.ComponentFactory; /** @@ -156,7 +157,7 @@ * @throws Exception An exception may be thrown as described above or if there is an exception * thrown by the ObjectFactory's newInstance() method. */ - protected Object doGet() throws Exception { + protected Object getFromPool() throws Exception { Object poolable; synchronized( this.semaphore ) { // Look for a Poolable at the end of the m_ready list @@ -183,7 +184,22 @@ this.logger.debug( "Got a " + poolable.getClass().getName() + " from the pool." ); } - return createProxy(poolable); + return poolable; + } + + + /* (non-Javadoc) + * @see org.apache.cocoon.core.container.handler.AbstractComponentHandler#doGet() + */ + protected Object doGet() throws Exception { + return this.createProxy(); + } + + /* (non-Javadoc) + * @see org.apache.cocoon.core.container.handler.AbstractComponentHandler#doPut(java.lang.Object) + */ + protected void doPut(Object component) throws Exception { + // nothing to do } /** @@ -191,7 +207,7 @@ * * @param poolable Poolable to return to the pool. */ - protected void doPut( final Object poolable ) { + protected void putIntoPool( final Object poolable ) { try { this.factory.enteringPool(poolable); } catch (Exception ignore) { @@ -235,11 +251,10 @@ // nothing to do here } - protected Object createProxy(Object component) { - Proxy.newProxyInstance(component.getClass().getClassLoader(), - this.guessWorkInterfaces(component.getClass()), - new ProxyHandler(component)); - return component; + protected Object createProxy() { + return Proxy.newProxyInstance(this.factory.getCreatedClass().getClassLoader(), + this.guessWorkInterfaces(this.factory.getCreatedClass()), + new ProxyHandler(this)); } /** @@ -290,12 +305,13 @@ } } - protected static final class ProxyHandler implements InvocationHandler { + protected static final class ProxyHandler implements InvocationHandler, Core.CleanupTask { - private final Object component; + private ThreadLocal componentHolder = new InheritableThreadLocal(); + private final NewPoolableComponentHandler handler; - public ProxyHandler(Object component) { - this.component = component; + public ProxyHandler(NewPoolableComponentHandler handler) { + this.handler = handler; } /* (non-Javadoc) @@ -303,11 +319,33 @@ */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if ( method.getName().equals("hashCode") && args == null ) { + return new Integer(this.hashCode()); + } + if ( this.componentHolder.get() == null ) { + this.componentHolder.set(this.handler.getFromPool()); + Core.addCleanupTask(this); + } try { - return method.invoke(component, args); + return method.invoke(this.componentHolder.get(), args); } catch (InvocationTargetException ite) { throw ite.getTargetException(); } } + + + /* (non-Javadoc) + * @see org.apache.cocoon.core.Core.CleanupTask#invoke() + */ + public void invoke() { + try { + this.handler.putIntoPool(this.componentHolder.get()); + } catch (Exception ignore) { + // we ignore this + } + this.componentHolder.set(null); + } } + + } Modified: cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java?view=diff&rev=126414&p1=cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java&r1=126413&p2=cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java&r2=126414 ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java (original) +++ cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java Tue Jan 25 11:49:12 2005 @@ -16,7 +16,6 @@ package org.apache.cocoon; import java.io.BufferedInputStream; -import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Enumeration; @@ -84,12 +83,6 @@ /** The logger manager */ private LoggerManager loggerManager; - /** The classpath (null if not available) */ - private String classpath; - - /** The working directory (null if not available) */ - private File workDir; - /** The parent service manager. */ private ServiceManager parentServiceManager; @@ -150,8 +143,6 @@ this.context = new ComponentContext(context); ((DefaultContext)this.context).makeReadOnly(); - this.classpath = (String)context.get(Constants.CONTEXT_CLASSPATH); - this.workDir = (File)context.get(Constants.CONTEXT_WORK_DIR); try { // FIXME : add a configuration option for the refresh delay. // for now, hard-coded to 1 second. @@ -547,6 +538,7 @@ if (getLogger().isDebugEnabled()) { --activeRequestCount; } + //Core.cleanup(); EnvironmentHelper.checkEnvironment(environmentDepth, getLogger()); }
