You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2005/01/25 20:49:14 UTC
svn commit: r126414 - /cocoon/trunk/src/core/java/org/apache/cocoon/core/Core.java /cocoon/trunk/src/core/java/org/apache/cocoon/core/container/handler/NewPoolableComponentHandler.java /cocoon/trunk/src/java/org/apache/cocoon/Cocoon.java
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());
}