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());
         }