Return-Path: Delivered-To: apmail-cocoon-cvs-archive@www.apache.org Received: (qmail 80495 invoked from network); 9 Sep 2004 02:28:55 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 9 Sep 2004 02:28:55 -0000 Received: (qmail 90674 invoked by uid 500); 9 Sep 2004 02:28:54 -0000 Delivered-To: apmail-cocoon-cvs-archive@cocoon.apache.org Received: (qmail 90584 invoked by uid 500); 9 Sep 2004 02:28:53 -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 90572 invoked by uid 99); 9 Sep 2004 02:28:52 -0000 X-ASF-Spam-Status: No, hits=-2.8 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; Wed, 08 Sep 2004 19:28:50 -0700 Received: (qmail 80417 invoked by uid 65534); 9 Sep 2004 02:28:48 -0000 Date: 9 Sep 2004 02:28:48 -0000 Message-ID: <20040909022848.80414.qmail@minotaur.apache.org> From: vgritsenko@apache.org To: cvs@cocoon.apache.org Subject: svn commit: rev 43561 - in cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components: . flow flow/util pipeline/impl source/impl X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N Author: vgritsenko Date: Wed Sep 8 19:28:46 2004 New Revision: 43561 Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/CocoonComponentManager.java cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/AbstractInterpreter.java cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/util/PipelineUtil.java cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/source/impl/SitemapSource.java Log: pipelineutil: close input stream Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/CocoonComponentManager.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/CocoonComponentManager.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/CocoonComponentManager.java Wed Sep 8 19:28:46 2004 @@ -199,7 +199,7 @@ * @return A unique key within this thread. */ public static Object startProcessing(Environment env) { - if ( null == env) { + if (null == env) { throw new RuntimeException("CocoonComponentManager.startProcessing: environment must be set."); } final EnvironmentDescription desc = new EnvironmentDescription(env); Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/AbstractInterpreter.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/AbstractInterpreter.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/AbstractInterpreter.java Wed Sep 8 19:28:46 2004 @@ -1,12 +1,12 @@ /* * Copyright 1999-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. @@ -59,12 +59,12 @@ implements Component, Serviceable, Contextualizable, Interpreter, SingleThreaded, Configurable, Disposable { - // The instance counters, used to produce unique IDs + // The instance counters, used to produce unique IDs private static int instanceCounter = 0; - + // The instance ID of this interpreter, used to identify user scopes private String instanceID; - + protected org.apache.avalon.framework.context.Context avalonContext; /** @@ -75,7 +75,7 @@ protected org.apache.cocoon.environment.Context context; protected ServiceManager manager; protected ContinuationsManager continuationsMgr; - + /** * Whether reloading of scripts should be done. Specified through * the "reload-scripts" attribute in flow.xmap. @@ -94,11 +94,11 @@ this.instanceID = String.valueOf(instanceCounter); } } - + /** * Get the unique ID for this interpreter, which can be used to distinguish user value scopes * attached to the session. - * + * * @return a unique ID for this interpreter */ protected String getInterpreterID() { @@ -179,8 +179,7 @@ * @exception Exception If an error occurs. */ public void process(String uri, Object biz, OutputStream out) - throws Exception - { + throws Exception { // FIXME (SW): should we deprecate this method in favor of PipelineUtil? PipelineUtil pipeUtil = new PipelineUtil(); try { @@ -195,8 +194,7 @@ public void forwardTo(String uri, Object bizData, WebContinuation continuation, Redirector redirector) - throws Exception - { + throws Exception { if (SourceUtil.indexOfSchemeColon(uri) == -1) { uri = "cocoon:/" + uri; Map objectModel = ContextHelper.getObjectModel(this.avalonContext); Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/util/PipelineUtil.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/util/PipelineUtil.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/flow/util/PipelineUtil.java Wed Sep 8 19:28:46 2004 @@ -1,12 +1,12 @@ /* * Copyright 1999-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. @@ -42,12 +42,12 @@ * Utility class to process a pipeline to various destinations. * This class must be setup from the flowscript before being used. This means that instances must * be created with cocoon.createObject(Packages.org.apache.cocoon.components.flow.util.PipelineUtil); - * + * * @author Sylvain Wallez - * @version CVS $Id: PipelineUtil.java,v 1.3 2004/05/04 11:54:35 cziegeler Exp $ + * @version CVS $Id$ */ public class PipelineUtil implements Contextualizable, Serviceable, Disposable { - + private Context context; private ServiceManager manager; private SourceResolver resolver; @@ -56,23 +56,23 @@ * @see org.apache.avalon.framework.activity.Disposable#dispose() */ public void dispose() { - if ( this.manager != null ) { - this.manager.release( this.resolver ); + if (this.manager != null) { + this.manager.release(this.resolver); this.manager = null; this.resolver = null; } } - + public void contextualize(Context context) throws ContextException { this.context = context; - + } public void service(ServiceManager manager) throws ServiceException { this.manager = manager; this.resolver = (SourceResolver)manager.lookup(SourceResolver.ROLE); } - + /** * Check that this object has been correctly set up. * @@ -80,36 +80,42 @@ */ private void checkSetup() { if (this.manager == null) { - throw new IllegalStateException("Instances of " + this.getClass().getName() + - " must be setup using either cocoon.createObject() or cocoon.setupObject()."); + throw new IllegalStateException("Instances of " + getClass().getName() + + " must be setup using either cocoon.createObject() or cocoon.setupObject()."); } } - + /** * Process a pipeline to a stream. - * + * * @param uri the pipeline URI * @param viewData the view data object * @param output the stream where pipeline result is output. Note: this stream is not closed. * @throws IOException */ - public void processToStream(String uri, Object viewData, OutputStream output) throws IOException { + public void processToStream(String uri, Object viewData, OutputStream output) + throws IOException { checkSetup(); - + Map objectModel = ContextHelper.getObjectModel(this.context); // Keep the previous view data, if any (is it really necessary?), and set the new one Object oldViewData = FlowHelper.getContextObject(objectModel); FlowHelper.setContextObject(objectModel, FlowHelper.unwrap(viewData)); - + Source src = null; - + InputStream input = null; try { src = this.resolver.resolveURI("cocoon:/" + uri); - InputStream input = src.getInputStream(); - + input = src.getInputStream(); IOUtil.copy(input, output); } finally { + if (input != null) { + try { + input.close(); + } catch (IOException ignored) {} + } + // Restore the previous view data FlowHelper.setContextObject(objectModel, oldViewData); @@ -118,23 +124,23 @@ } } } - + /** * Process a pipeline to a SAX ContentHandler - * + * * @param uri the pipeline URI * @param viewData the view data object * @param handler where the pipeline should be streamed to. */ - public void processToSAX(String uri, Object viewData, ContentHandler handler) throws SAXException, IOException, ProcessingException { + public void processToSAX(String uri, Object viewData, ContentHandler handler) + throws SAXException, IOException, ProcessingException { checkSetup(); - + Map objectModel = ContextHelper.getObjectModel(this.context); Object oldViewData = FlowHelper.getContextObject(objectModel); FlowHelper.setContextObject(objectModel, FlowHelper.unwrap(viewData)); - + Source src = null; - try { src = this.resolver.resolveURI("cocoon:/" + uri); SourceUtil.toSAX(src, handler); @@ -145,23 +151,23 @@ } } } - + /** * Process a pipeline and gets is result as a DOM Document - * + * * @param uri the pipeline URI * @param viewData the view data object * @return the document */ public Document processToDOM(String uri, Object viewData) throws ProcessingException, SAXException, IOException { checkSetup(); - + Map objectModel = ContextHelper.getObjectModel(this.context); Object oldViewData = FlowHelper.getContextObject(objectModel); FlowHelper.setContextObject(objectModel, FlowHelper.unwrap(viewData)); - + Source src = null; - + try { src = this.resolver.resolveURI("cocoon:/" + uri); return SourceUtil.toDOM(src); Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/pipeline/impl/AbstractCachingProcessingPipeline.java Wed Sep 8 19:28:46 2004 @@ -1,12 +1,12 @@ /* * Copyright 1999-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. @@ -82,7 +82,7 @@ protected PipelineCacheKey toCacheKey; /** The source validities used for caching */ protected SourceValidity[] toCacheSourceValidities; - + /** The index indicating to the first transformer which is not cacheable */ protected int firstNotCacheableTransformerIndex; /** Cache complete response */ @@ -96,7 +96,7 @@ protected boolean doSmartCaching; /** Default setting for smart caching */ protected boolean configuredDoSmartCaching; - + /** * Abstract methods defined in subclasses */ @@ -116,7 +116,7 @@ this.configuredDoSmartCaching = params.getParameterAsBoolean("smart-caching", true); } - + /** * Setup this component */ @@ -211,7 +211,7 @@ } try { OutputStream os = null; - + if (this.cacheCompleteResponse && this.toCacheKey != null) { os = new CachingOutputStream(environment.getOutputStream( this.outputBufferSize)); @@ -235,7 +235,7 @@ ByteArrayOutputStream baos = new ByteArrayOutputStream(); this.serializer.setOutputStream(baos); - + // execute the pipeline: if ( this.xmlDeserializer != null ) { this.xmlDeserializer.deserialize( @@ -332,7 +332,7 @@ while (this.firstNotCacheableTransformerIndex < transformerSize && continueTest) { - final Transformer trans = + final Transformer trans = (Transformer)super.transformers.get( this.firstNotCacheableTransformerIndex); key = null; @@ -355,7 +355,7 @@ continueTest = false; } } - // all transformers are cacheable => pipeline is cacheable + // all transformers are cacheable => pipeline is cacheable // test serializer if this is not an internal request if (this.firstNotCacheableTransformerIndex == transformerSize && super.serializer == this.lastConsumer) { @@ -388,10 +388,10 @@ // only update validity objects if we cannot use // a cached response or when the cached response does // cache less than now is cacheable - if (this.fromCacheKey == null + if (this.fromCacheKey == null || this.fromCacheKey.size() < this.toCacheKey.size()) { - this.toCacheSourceValidities = + this.toCacheSourceValidities = new SourceValidity[this.toCacheKey.size()]; int len = this.toCacheSourceValidities.length; int i = 0; @@ -400,7 +400,7 @@ this.getValidityForInternalPipeline(i); if (validity == null) { - if (i > 0 + if (i > 0 && (this.fromCacheKey == null || i > this.fromCacheKey.size())) { // shorten key @@ -437,21 +437,21 @@ } /** - * Calculate the key that can be used to get something from the cache, and + * Calculate the key that can be used to get something from the cache, and * handle expires properly. - * + * */ protected void validatePipeline(Environment environment) throws ProcessingException { this.completeResponseIsCached = this.cacheCompleteResponse; - this.fromCacheKey = this.toCacheKey.copy(); + this.fromCacheKey = this.toCacheKey.copy(); this.firstProcessedTransformerIndex = this.firstNotCacheableTransformerIndex; this.cachedLastModified = 0L; boolean finished = false; - + while (this.fromCacheKey != null && !finished) { - + finished = true; final CachedResponse response = this.cache.get( this.fromCacheKey ); @@ -459,7 +459,7 @@ if (response != null) { if (this.getLogger().isDebugEnabled()) { this.getLogger().debug( - "Found cached response for '" + environment.getURI() + + "Found cached response for '" + environment.getURI() + "' using key: " + this.fromCacheKey ); } @@ -495,27 +495,27 @@ environment.getURI() + " regenerating content."); } - + // If an expires parameter was provided, use it. If this parameter is not available // it means that the sitemap was modified, and the old expires value is not valid // anymore. if (expires != 0) { if (this.getLogger().isDebugEnabled()) this.getLogger().debug("Refreshing expires informations"); - response.setExpires(new Long(expires + System.currentTimeMillis())); + response.setExpires(new Long(expires + System.currentTimeMillis())); } else { if (this.getLogger().isDebugEnabled()) this.getLogger().debug("No expires defined anymore for this object, setting it to no expires"); response.setExpires(null); - } + } } } else { // The response had no expires informations. See if it needs to be set (i.e. because the configuration has changed) if (expires != 0) { if (this.getLogger().isDebugEnabled()) this.getLogger().debug("Setting a new expires object for this resource"); - response.setExpires(new Long(expires + System.currentTimeMillis())); - } + response.setExpires(new Long(expires + System.currentTimeMillis())); + } } SourceValidity[] fromCacheValidityObjects = response.getValidityObjects(); @@ -528,7 +528,7 @@ SourceValidity validity = fromCacheValidityObjects[i]; int valid = validity != null ? validity.isValid() : -1; if ( valid == 0) { // don't know if valid, make second test - + validity = this.getValidityForInternalPipeline(i); if (validity != null) { @@ -607,15 +607,15 @@ this.completeResponseIsCached = false; } } else { - + // no cached response found if (this.getLogger().isDebugEnabled()) { this.getLogger().debug( - "Cached response not found for '" + environment.getURI() + + "Cached response not found for '" + environment.getURI() + "' using key: " + this.fromCacheKey ); } - + if (!this.doSmartCaching) { // try a shorter key if (this.fromCacheKey.size() > 1) { @@ -653,7 +653,7 @@ if (this.toCacheKey != null) { this.validatePipeline(environment); } - this.setupValidities(); + this.setupValidities(); } /** @@ -854,9 +854,9 @@ } else { int vals = 0; - + if ( null != this.toCacheKey - && !this.cacheCompleteResponse + && !this.cacheCompleteResponse && this.firstNotCacheableTransformerIndex == super.transformers.size()) { vals = this.toCacheKey.size(); } else if ( null != this.fromCacheKey @@ -880,19 +880,19 @@ * @see org.apache.cocoon.components.pipeline.ProcessingPipeline#getKeyForEventPipeline() */ public String getKeyForEventPipeline() { - if ( null != this.toCacheKey + if ( null != this.toCacheKey && !this.cacheCompleteResponse && this.firstNotCacheableTransformerIndex == super.transformers.size()) { return String.valueOf(HashUtil.hash(this.toCacheKey.toString())); } - if ( null != this.fromCacheKey + if ( null != this.fromCacheKey && !this.completeResponseIsCached && this.firstProcessedTransformerIndex == super.transformers.size()) { return String.valueOf(HashUtil.hash(this.fromCacheKey.toString())); } return null; } - + SourceValidity getValidityForInternalPipeline(int index) { final SourceValidity validity; @@ -937,12 +937,11 @@ } return validity; } - + /** * Recyclable Interface */ public void recycle() { - this.generatorRole = null; this.transformerRoles.clear(); this.serializerRole = null; @@ -950,7 +949,7 @@ this.fromCacheKey = null; this.cachedResponse = null; - + this.transformerIsCacheableProcessingComponent = null; this.toCacheKey = null; this.toCacheSourceValidities = null; @@ -964,12 +963,12 @@ private final AbstractCachingProcessingPipeline pipeline; private final int index; - + public DeferredPipelineValidity(AbstractCachingProcessingPipeline pipeline, int index) { this.pipeline = pipeline; this.index = index; } - + /** * @see org.apache.excalibur.source.impl.validity.DeferredValidity#getValidity() */ Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/source/impl/SitemapSource.java ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/source/impl/SitemapSource.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/components/source/impl/SitemapSource.java Wed Sep 8 19:28:46 2004 @@ -1,12 +1,12 @@ /* * Copyright 1999-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. @@ -67,7 +67,7 @@ /** The system id used for caching */ private String systemIdForCaching; - + /** The current ComponentManager */ private final ComponentManager manager; @@ -97,15 +97,15 @@ /** The unique key for this processing */ private Object processKey; - + /** The used protocol */ private final String protocol; /** SourceResolver (for the redirect source) */ private SourceResolver sourceResolver; - + private String mimeType; - + /** * Construct a new object */ @@ -161,16 +161,16 @@ } else if (position > 0) { uri = uri.substring(position); } - + // determine if the queryString specifies a cocoon-view String view = null; if (queryString != null) { int index = queryString.indexOf(Constants.VIEW_PARAM); - if (index != -1 + if (index != -1 && (index == 0 || queryString.charAt(index-1) == '&') - && queryString.length() > index + Constants.VIEW_PARAM.length() + && queryString.length() > index + Constants.VIEW_PARAM.length() && queryString.charAt(index+Constants.VIEW_PARAM.length()) == '=') { - + String tmp = queryString.substring(index+Constants.VIEW_PARAM.length()+1); index = tmp.indexOf('&'); if (index != -1) { @@ -194,10 +194,10 @@ this.protocol + "://" + requestURI + "?" + queryString; // create environment... - EnvironmentWrapper wrapper = new EnvironmentWrapper(env, requestURI, + EnvironmentWrapper wrapper = new EnvironmentWrapper(env, requestURI, queryString, logger, manager, rawMode, view); wrapper.setURI(prefix, uri); - + // The environment is a facade whose delegate can be changed in case of internal redirects this.environment = new MutableEnvironmentFacade(wrapper); @@ -207,7 +207,7 @@ } else { this.environment.getObjectModel().remove(ObjectModelHelper.PARENT_CONTEXT); } - + // initialize this.init(); } @@ -286,13 +286,13 @@ } /** - * + * * @see org.apache.excalibur.source.Source#exists() */ public boolean exists() { return true; } - + /** * Get the Validity object. This can either wrap the last modification * date or the expires information or... @@ -332,7 +332,7 @@ try { this.processKey = CocoonComponentManager.startProcessing(this.environment); this.processingPipeline = this.processor.buildPipeline(this.environment); - this.pipelineProcessor = CocoonComponentManager.getLastProcessor(this.environment); + this.pipelineProcessor = CocoonComponentManager.getLastProcessor(this.environment); this.environment.changeToLastContext(); String redirectURL = this.environment.getRedirectURL(); @@ -345,7 +345,7 @@ this.processingPipeline.prepareInternal(this.environment); this.sourceValidity = this.processingPipeline.getValidityForEventPipeline(); this.mimeType = this.environment.getContentType(); - + final String eventPipelineKey = this.processingPipeline.getKeyForEventPipeline(); if (eventPipelineKey != null) { StringBuffer buffer = new StringBuffer(this.systemId); @@ -358,7 +358,7 @@ buffer.append(eventPipelineKey); this.systemIdForCaching = buffer.toString(); } else { - this.systemIdForCaching = this.systemId; + this.systemIdForCaching = this.systemId; } } finally { CocoonComponentManager.leaveEnvironment(); @@ -415,7 +415,7 @@ this.pipelineProcessor); try { this.processingPipeline.process(this.environment, - CocoonComponentManager.createEnvironmentAwareConsumer(consumer)); + CocoonComponentManager.createEnvironmentAwareConsumer(consumer)); } finally { CocoonComponentManager.leaveEnvironment(); } @@ -437,19 +437,23 @@ private void reset() { if (this.processingPipeline != null) { this.processingPipeline.release(); + this.processingPipeline = null; } + if (this.processKey != null) { CocoonComponentManager.endProcessing(this.environment, this.processKey); this.processKey = null; } - this.processingPipeline = null; - this.sourceValidity = null; + if (this.redirectSource != null) { this.sourceResolver.release(this.redirectSource); + this.redirectSource = null; } - this.environment.reset(); - this.redirectSource = null; + + this.sourceValidity = null; this.redirectValidity = null; + + this.environment.reset(); this.exception = null; this.needsRefresh = true; this.pipelineProcessor = null;