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/18 16:15:08 UTC
svn commit: r125512 - in cocoon/trunk/src: core/java/org/apache/cocoon/core/container java/org/apache/cocoon/components/source/impl
Author: cziegeler
Date: Tue Jan 18 07:15:05 2005
New Revision: 125512
URL: http://svn.apache.org/viewcvs?view=rev&rev=125512
Log:
Add first hacky implementation for traversable context source - NOT TESTED
Added:
cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/TraversableContextSource.java (contents, props changed)
Modified:
cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java
cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/ContextSourceFactory.java
Modified: cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java?view=diff&rev=125512&p1=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java&r1=125511&p2=cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java&r2=125512
==============================================================================
--- cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java (original)
+++ cocoon/trunk/src/core/java/org/apache/cocoon/core/container/CoreServiceManager.java Tue Jan 18 07:15:05 2005
@@ -69,6 +69,9 @@
*/
public static final Configuration EMPTY_CONFIGURATION = new DefaultConfiguration("-", "unknown location");
+ /** Parameter map for the context protocol */
+ protected static final Map CONTEXT_PARAMETERS = Collections.singletonMap("force-traversable", Boolean.TRUE);
+
/** The application context for components */
protected Context context;
@@ -674,7 +677,7 @@
final String ending = includeStatement.getAttribute("postfix", null);
Source directory = null;
try {
- directory = this.cachedSourceResolver.resolveURI(directoryURI, contextURI, null);
+ directory = this.cachedSourceResolver.resolveURI(directoryURI, contextURI, CONTEXT_PARAMETERS);
if ( directory instanceof TraversableSource ) {
final Iterator children = ((TraversableSource)directory).getChildren().iterator();
while ( children.hasNext() ) {
Modified: cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/ContextSourceFactory.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/ContextSourceFactory.java?view=diff&rev=125512&p1=cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/ContextSourceFactory.java&r1=125511&p2=cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/ContextSourceFactory.java&r2=125512
==============================================================================
--- cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/ContextSourceFactory.java (original)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/ContextSourceFactory.java Tue Jan 18 07:15:05 2005
@@ -20,6 +20,10 @@
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
@@ -30,11 +34,14 @@
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.cocoon.Constants;
import org.apache.cocoon.environment.Context;
+import org.apache.cocoon.servlet.CocoonServlet;
+import org.apache.commons.lang.BooleanUtils;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
import org.apache.excalibur.source.SourceFactory;
import org.apache.excalibur.source.SourceResolver;
import org.apache.excalibur.source.SourceUtil;
+import org.apache.excalibur.source.TraversableSource;
import org.apache.excalibur.source.URIAbsolutizer;
/**
@@ -45,7 +52,7 @@
*
* @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
* @author <a href="http://www.apache.org/~sylvain">Sylvain Wallez</a>
- * @version CVS $Id: ContextSourceFactory.java,v 1.8 2004/06/16 14:29:31 vgritsenko Exp $
+ * @version CVS $Id$
*/
public class ContextSourceFactory
extends AbstractLogEnabled
@@ -61,6 +68,9 @@
/** The ServiceManager */
protected ServiceManager manager;
+ /** Http servlet context - if available */
+ protected ServletContext servletContext;
+
/* (non-Javadoc)
* @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
*/
@@ -74,6 +84,11 @@
public void contextualize(org.apache.avalon.framework.context.Context context)
throws ContextException {
this.envContext = (Context)context.get(Constants.CONTEXT_ENVIRONMENT_CONTEXT);
+ try {
+ this.servletContext = ((ServletConfig) context.get(CocoonServlet.CONTEXT_SERVLET_CONFIG)).getServletContext();
+ } catch (ContextException ignore) {
+ // in other environments (CLI etc.), we don't have a servlet context
+ }
}
/* (non-Javadoc)
@@ -110,13 +125,21 @@
}
if (u != null) {
- return resolver.resolveURI(u.toExternalForm());
-
- } else {
- String message = location + " could not be found. (possible context problem)";
- getLogger().info(message);
- throw new MalformedURLException(message);
- }
+ Source source = resolver.resolveURI(u.toExternalForm());
+ if ( parameters != null
+ && BooleanUtils.toBoolean("force-traversable")
+ && this.servletContext != null
+ && !(source instanceof TraversableSource) ) {
+ final Set children = this.servletContext.getResourcePaths(path + '/');
+ if ( children != null ) {
+ source = new TraversableContextSource(source, children, this, path);
+ }
+ }
+ return source;
+ }
+ final String message = location + " could not be found. (possible context problem)";
+ this.getLogger().info(message);
+ throw new MalformedURLException(message);
} catch (ServiceException se) {
throw new SourceException("Unable to lookup source resolver.", se);
} finally {
@@ -139,8 +162,13 @@
SourceResolver resolver = null;
try {
resolver = (SourceResolver)this.manager.lookup( SourceResolver.ROLE );
- resolver.release( source );
+ if ( source instanceof TraversableContextSource ) {
+ resolver.release(((TraversableContextSource)source).wrappedSource);
+ } else {
+ resolver.release( source );
+ }
} catch (ServiceException ingore) {
+ // we ignore this
} finally {
this.manager.release( resolver );
}
Added: cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/TraversableContextSource.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/TraversableContextSource.java?view=auto&rev=125512
==============================================================================
--- (empty file)
+++ cocoon/trunk/src/java/org/apache/cocoon/components/source/impl/TraversableContextSource.java Tue Jan 18 07:15:05 2005
@@ -0,0 +1,196 @@
+/*
+ * Copyright 1999-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.components.source.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.excalibur.source.Source;
+import org.apache.excalibur.source.SourceException;
+import org.apache.excalibur.source.SourceNotFoundException;
+import org.apache.excalibur.source.SourceValidity;
+import org.apache.excalibur.source.TraversableSource;
+
+/**
+ * @version SVN $Id: ContextSourceFactory.java 30941 2004-07-29 19:56:58Z vgritsenko $
+ */
+public class TraversableContextSource
+implements Source, TraversableSource {
+
+ final protected Source wrappedSource;
+ final protected Set children;
+ final protected ContextSourceFactory factory;
+ final protected String path;
+
+ public TraversableContextSource(Source source,
+ Set children,
+ ContextSourceFactory factory,
+ String path) {
+ this.wrappedSource = source;
+ this.children = children;
+ this.factory = factory;
+ this.path = path;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.Source#exists()
+ */
+ public boolean exists() {
+ return this.wrappedSource.exists();
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.Source#getContentLength()
+ */
+ public long getContentLength() {
+ return this.wrappedSource.getContentLength();
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.Source#getInputStream()
+ */
+ public InputStream getInputStream()
+ throws IOException, SourceNotFoundException {
+ return this.wrappedSource.getInputStream();
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.Source#getLastModified()
+ */
+ public long getLastModified() {
+ return this.wrappedSource.getLastModified();
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.Source#getMimeType()
+ */
+ public String getMimeType() {
+ return this.wrappedSource.getMimeType();
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.Source#getScheme()
+ */
+ public String getScheme() {
+ return this.wrappedSource.getScheme();
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.Source#getURI()
+ */
+ public String getURI() {
+ return this.wrappedSource.getURI();
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.Source#getValidity()
+ */
+ public SourceValidity getValidity() {
+ return this.wrappedSource.getValidity();
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.Source#refresh()
+ */
+ public void refresh() {
+ this.wrappedSource.refresh();
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.TraversableSource#getChild(java.lang.String)
+ */
+ public Source getChild(String name) throws SourceException {
+ final String postfixOne = '/' + name + '/';
+ final String postfixTwo = '/' + name;
+ final Iterator i = this.children.iterator();
+ while ( i.hasNext() ) {
+ String uri = (String)i.next();
+ if ( uri.endsWith(postfixOne ) ){
+ uri = "context:/" + uri;
+ uri = uri.substring(0, uri.length()-1);
+ try {
+ return this.factory.getSource(uri, null);
+ } catch (IOException ioe) {
+ throw new SourceException("Unable to get source for: " + uri);
+ }
+ } else if ( uri.endsWith(postfixTwo) ) {
+ uri = "context:/" + uri;
+ try {
+ return this.factory.getSource(uri, null);
+ } catch (IOException ioe) {
+ throw new SourceException("Unable to get source for: " + uri);
+ }
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.TraversableSource#getChildren()
+ */
+ public Collection getChildren() throws SourceException {
+ final List l = new ArrayList();
+ final Iterator i = this.children.iterator();
+ while ( i.hasNext() ) {
+ String uri = (String)i.next();
+ uri = "context:/" + uri;
+ try {
+ l.add(this.factory.getSource(uri, null));
+ } catch (IOException ioe) {
+ final Iterator ci = l.iterator();
+ while ( ci.hasNext() ) {
+ this.factory.release((Source)ci.next());
+ }
+ throw new SourceException("Unable to get source for: " + uri);
+ }
+ }
+ return l;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.TraversableSource#getName()
+ */
+ public String getName() {
+ final String uri = this.wrappedSource.getURI();
+ return uri.substring(uri.lastIndexOf('/')+1);
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.TraversableSource#getParent()
+ */
+ public Source getParent() throws SourceException {
+ String uri = "context:/" + this.path;
+ uri = uri.substring(0, uri.lastIndexOf('/'));
+ try {
+ return this.factory.getSource(uri, null);
+ } catch (IOException ioe) {
+ throw new SourceException("Unable to get source for: " + uri);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.excalibur.source.TraversableSource#isCollection()
+ */
+ public boolean isCollection() {
+ return true;
+ }
+}