Return-Path: Delivered-To: apmail-cocoon-cvs-archive@www.apache.org Received: (qmail 23031 invoked from network); 1 Nov 2004 18:59:18 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 1 Nov 2004 18:59:18 -0000 Received: (qmail 79576 invoked by uid 500); 1 Nov 2004 18:59:12 -0000 Delivered-To: apmail-cocoon-cvs-archive@cocoon.apache.org Received: (qmail 79509 invoked by uid 500); 1 Nov 2004 18:59:11 -0000 Mailing-List: contact cvs-help@cocoon.apache.org; run by ezmlm Precedence: bulk Reply-To: dev@cocoon.apache.org list-help: list-unsubscribe: list-post: Delivered-To: mailing list cvs@cocoon.apache.org Received: (qmail 79459 invoked by uid 99); 1 Nov 2004 18:59:09 -0000 X-ASF-Spam-Status: No, hits=-10.0 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Mon, 01 Nov 2004 10:59:08 -0800 Received: (qmail 22683 invoked by uid 65534); 1 Nov 2004 18:59:06 -0000 Date: 1 Nov 2004 18:59:06 -0000 Message-ID: <20041101185906.22677.qmail@minotaur.apache.org> From: cziegeler@apache.org To: cvs@cocoon.apache.org Subject: svn commit: rev 56271 - in cocoon/trunk/src: core/java/org/apache/cocoon/core/container java/org/apache/cocoon/components/pipeline X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N Author: cziegeler Date: Mon Nov 1 10:59:06 2004 New Revision: 56271 Added: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/SelectorBasedComponentHandler.java Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CocoonServiceManager.java cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CocoonServiceSelector.java cocoon/trunk/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java Log: Improved lookup mechanism to avoid selectors Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CocoonServiceManager.java ============================================================================== --- cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CocoonServiceManager.java (original) +++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CocoonServiceManager.java Mon Nov 1 10:59:06 2004 @@ -432,5 +432,18 @@ throw new ServiceException( role, "Could not set up component handler.", e ); } } + + void addComponentFromSelector(CocoonServiceSelector selector, + String roleName, + String key) + throws Exception { + if ( this.disposed ) { + throw new ServiceException( this.toString(), + "Cannot add components to a disposed CocoonServiceManager." ); + } + final String role = roleName + '/' + key; + final ComponentHandler handler = new SelectorBasedComponentHandler(selector, key); + this.componentHandlers.put( role, handler ); + } } Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CocoonServiceSelector.java ============================================================================== --- cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CocoonServiceSelector.java (original) +++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CocoonServiceSelector.java Mon Nov 1 10:59:06 2004 @@ -351,6 +351,10 @@ handler.initialize(); this.componentHandlers.put( key, handler ); + if ( this.roleName != null && this.roleName.endsWith("Selector") ) { + final String role = this.roleName.substring(0, this.roleName.length()-8); + ((CocoonServiceManager)this.serviceManager).addComponentFromSelector(this, role, key); + } if( this.getLogger().isDebugEnabled() ) { this.getLogger().debug( "Adding " + component.getName() + " for key [" + key + "]" ); Added: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/SelectorBasedComponentHandler.java ============================================================================== --- (empty file) +++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/SelectorBasedComponentHandler.java Mon Nov 1 10:59:06 2004 @@ -0,0 +1,78 @@ +/* + * Copyright 2002-2004 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.container; + +/** + * @version CVS $Id: SelectorBasedComponentHandler.java 55144 2004-10-20 12:26:09Z ugo $ + */ +public class SelectorBasedComponentHandler +implements ComponentHandler { + + private final Object referenceSemaphore = new Object(); + private int references = 0; + + protected final CocoonServiceSelector selector; + protected final String key; + + public SelectorBasedComponentHandler(CocoonServiceSelector selector, + String key) { + this.selector = selector; + this.key = key; + } + + /* (non-Javadoc) + * @see org.apache.cocoon.core.container.ComponentHandler#canBeDisposed() + */ + public boolean canBeDisposed() { + return ( this.references == 0 ); + } + + /* (non-Javadoc) + * @see org.apache.cocoon.core.container.ComponentHandler#dispose() + */ + public void dispose() { + // nothing to do here + } + + /* (non-Javadoc) + * @see org.apache.cocoon.core.container.ComponentHandler#get() + */ + public Object get() throws Exception { + Object c = this.selector.select(key); + synchronized( this.referenceSemaphore ) { + this.references++; + } + return c; + } + + /* (non-Javadoc) + * @see org.apache.cocoon.core.container.ComponentHandler#initialize() + */ + public void initialize() throws Exception { + // nothing to do here + } + + /* (non-Javadoc) + * @see org.apache.cocoon.core.container.ComponentHandler#put(java.lang.Object) + */ + public void put(Object component) throws Exception { + synchronized( this.referenceSemaphore ) { + this.references--; + } + this.selector.release(component); + } +} Modified: cocoon/trunk/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java ============================================================================== --- cocoon/trunk/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java (original) +++ cocoon/trunk/src/java/org/apache/cocoon/components/pipeline/AbstractProcessingPipeline.java Mon Nov 1 10:59:06 2004 @@ -22,7 +22,6 @@ import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceManager; -import org.apache.avalon.framework.service.ServiceSelector; import org.apache.avalon.framework.service.Serviceable; import org.apache.cocoon.ConnectionResetException; @@ -69,27 +68,23 @@ protected Generator generator; protected Parameters generatorParam; protected String generatorSource; - protected ServiceSelector generatorSelector; // Transformer stuff protected ArrayList transformers = new ArrayList(); protected ArrayList transformerParams = new ArrayList(); protected ArrayList transformerSources = new ArrayList(); - protected ArrayList transformerSelectors = new ArrayList(); // Serializer stuff protected Serializer serializer; protected Parameters serializerParam; protected String serializerSource; protected String serializerMimeType; - protected ServiceSelector serializerSelector; // Reader stuff protected Reader reader; protected Parameters readerParam; protected String readerSource; protected String readerMimeType; - protected ServiceSelector readerSelector; /** * True when pipeline has been prepared. @@ -210,12 +205,7 @@ "' at " + getLocation(param)); } try { - this.generatorSelector = (ServiceSelector) this.newManager.lookup(Generator.ROLE + "Selector"); - } catch (ServiceException ce) { - throw new ProcessingException("Lookup of generator selector failed at " +getLocation(param), ce); - } - try { - this.generator = (Generator) this.generatorSelector.select(role); + this.generator = (Generator) this.newManager.lookup(Generator.ROLE + '/' + role); } catch (ServiceException ce) { throw new ProcessingException("Lookup of generator '" + role + "' failed at " + getLocation(param), ce); } @@ -245,15 +235,8 @@ throw new ProcessingException ("Must set a generator before adding transformer '" + role + "' at " + getLocation(param)); } - ServiceSelector selector = null; - try { - selector = (ServiceSelector) this.newManager.lookup(Transformer.ROLE + "Selector"); - } catch (ServiceException ce) { - throw new ProcessingException("Lookup of transformer selector failed at " + getLocation(param), ce); - } try { - this.transformers.add(selector.select(role)); - this.transformerSelectors.add(selector); + this.transformers.add(this.newManager.lookup(Transformer.ROLE + '/' + role)); } catch (ServiceException ce) { throw new ProcessingException("Lookup of transformer '"+role+"' failed at " + getLocation(param), ce); } @@ -283,12 +266,7 @@ } try { - this.serializerSelector = (ServiceSelector) this.newManager.lookup(Serializer.ROLE + "Selector"); - } catch (ServiceException ce) { - throw new ProcessingException("Lookup of serializer selector failed at " + getLocation(param), ce); - } - try { - this.serializer = (Serializer)serializerSelector.select(role); + this.serializer = (Serializer)this.newManager.lookup(Serializer.ROLE + '/' + role); } catch (ServiceException ce) { throw new ProcessingException("Lookup of serializer '" + role + "' failed at " + getLocation(param), ce); } @@ -316,12 +294,7 @@ } try { - this.readerSelector = (ServiceSelector) this.newManager.lookup(Reader.ROLE + "Selector"); - } catch (ServiceException ce) { - throw new ProcessingException("Lookup of reader selector failed at " + getLocation(param), ce); - } - try { - this.reader = (Reader)readerSelector.select(role); + this.reader = (Reader)this.newManager.lookup(Reader.ROLE + '/' + role); } catch (ServiceException ce) { throw new ProcessingException("Lookup of reader '"+role+"' failed at " + getLocation(param), ce); } @@ -644,41 +617,31 @@ this.prepared = false; // Release reader. - if (this.readerSelector != null) { - this.readerSelector.release(this.reader); - this.newManager.release(this.readerSelector); - this.readerSelector = null; + if (this.reader != null) { + this.newManager.release(this.reader); this.reader = null; this.readerParam = null; } - // Release generator. - if (this.generatorSelector != null) { - this.generatorSelector.release(this.generator); - this.newManager.release(this.generatorSelector); - this.generatorSelector = null; + if (this.generator != null) { + // Release generator. + this.newManager.release(this.generator); this.generator = null; this.generatorParam = null; } // Release transformers - int size = this.transformerSelectors.size(); + int size = this.transformers.size(); for (int i = 0; i < size; i++) { - final ServiceSelector selector = - (ServiceSelector) this.transformerSelectors.get(i); - selector.release(this.transformers.get(i)); - this.newManager.release(selector); + this.newManager.release(this.transformers.get(i)); } - this.transformerSelectors.clear(); this.transformers.clear(); this.transformerParams.clear(); this.transformerSources.clear(); // Release serializer - if (this.serializerSelector != null) { - this.serializerSelector.release(this.serializer); - this.newManager.release(this.serializerSelector); - this.serializerSelector = null; + if (this.serializer != null) { + this.newManager.release(this.serializer); this.serializerParam = null; } this.serializer = null;