cziegeler 2003/01/28 22:56:02
Modified: sourceresolve/src/java/org/apache/excalibur/source
SourceException.java SourceValidity.java
TraversableSource.java Source.java
SourceResolver.java SourceFactory.java
ModifiableSource.java SourceUtil.java
SourceParameters.java
xmlutil/src/java/org/apache/excalibur/xml/xslt
XSLTProcessorImpl.java
sourceresolve/src/java/org/apache/excalibur/source/impl
ResourceSource.java AbstractSource.java
SourceResolverImpl.java URLSource.java
store/src/java/org/apache/excalibur/store/impl
AbstractJispFilesystemStore.java
StoreJanitorImpl.java
monitor/src/java/org/apache/avalon/excalibur/monitor
SourceResource.java
Added: sourceresolve/src/java/org/apache/excalibur/source
ModifiableTraversableSource.java
Log:
Applying patch #16500 by Sylvain Wallez ([EMAIL PROTECTED])
Revision Changes Path
1.7 +28 -9
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceException.java
Index: SourceException.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceException.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- SourceException.java 9 Jan 2003 08:33:34 -0000 1.6
+++ SourceException.java 29 Jan 2003 06:56:01 -0000 1.7
@@ -54,36 +54,55 @@
*/
package org.apache.excalibur.source;
-import org.apache.avalon.framework.CascadingException;
+import java.io.IOException;
+
+import org.apache.avalon.framework.CascadingThrowable;
/**
* This Exception is thrown every time there is a problem in processing
- * the source.
+ * a source.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
* @version CVS $Revision$ $Date$
*/
public class SourceException
- extends CascadingException
+ extends IOException implements CascadingThrowable
{
/**
+ * The Throwable that caused this exception to be thrown.
+ */
+ private final Throwable m_throwable;
+
+ /**
* Construct a new <code>SourceException</code> instance.
*
- * @param message The detail message for this exception.
+ * @param message the detail message for this exception.
*/
public SourceException( final String message )
{
- super( message, null );
+ this( message, null );
}
/**
* Construct a new <code>SourceException</code> instance.
*
- * @param message The detail message for this exception.
- * @param throwable the root cause of the exception
+ * @param message the detail message for this exception.
+ * @param throwable the root cause of the exception.
*/
public SourceException( final String message, final Throwable throwable )
{
- super( message, throwable );
+ super( message );
+ m_throwable = throwable;
+ }
+
+ /**
+ * Retrieve the cause of the exception.
+ *
+ * @return the cause.
+ */
+ public final Throwable getCause()
+ {
+ return m_throwable;
}
}
1.7 +31 -20
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceValidity.java
Index: SourceValidity.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceValidity.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- SourceValidity.java 13 Jan 2003 13:14:12 -0000 1.6
+++ SourceValidity.java 29 Jan 2003 06:56:01 -0000 1.7
@@ -57,17 +57,22 @@
import java.io.Serializable;
/**
- * A Validity object contains all information to check if a Source object is
- * still valid.
- * There are two possibilities: The validity object has all information
- * to check by itself how long it is valid (e.g. given an expires date).
- * The other possibility needs another (newer) validity object to compare
- * against (e.g. to test a last modification date).
- * To avoid testing, what the actual implementation of the validity
- * object supports, the invocation order is to first call {@link #isValid()} and
only if
- * this results in <code>0</code>, then to call {@link #isValid}.
- * But remember to call the second isValid(SourceValidity) when <code>0</code>
- * is returned by the first invocation!
+ * A <code>SourceValidity</code> object contains all information to check if a
Source
+ * object is still valid.
+ * <p>
+ * There are two possibilities:
+ * <ul>
+ * <li>The validity object has all information to check by itself if it is valid
+ * (e.g. given an expires date).</li>
+ * <li>The validity object possibility needs another (newer) validity object to
compare
+ * against (e.g. to test a last modification date).</li>
+ * </ul>
+ * To avoid testing what the actual implementation of the validity object supports,
+ * the invocation order is to first call {@link #isValid()} and only if this result
+ * is <code>0</code> (i.e. "don't know"), then to call {@link
#isValid(SourceValidity)}.
+ * <p>
+ * Remember to call {@link #isValid(SourceValidity)} when {@link #isValid()}
returned
+ * <code>0</code> !
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
* @version CVS $Revision$ $Date$
@@ -75,19 +80,25 @@
public interface SourceValidity
extends Serializable
{
+ final int VALID = +1;
+ final int INVALID = -1;
+ final int UNKNWON = 0;
+
/**
- * Check if the component is still valid.
- * If <code>0</code> is returned the isValid(SourceValidity) must be
- * called afterwards!
- * If -1 is returned, the component is not valid anymore and if +1
- * is returnd, the component is valid.
+ * Check if the component is still valid. The possible results are :
+ * <ul>
+ * <li><code>-1</code>: invalid. The component isn't valid anymore.</li>
+ * <li><code>0</code>: don't know. This validity should be checked against a new
+ * validity object using {@link #isValid(SourceValidity)}.</li>
+ * <li><code>1</code>: valid. The component is still valid.</li>
+ * </ul>
*/
int isValid();
/**
- * Check if the component is still valid.
- * This is only true, if the incoming Validity is of the same
- * type and has the "same" values.
+ * Check if the component is still valid. This is only true if the incoming
Validity
+ * is of the same type and has the "same" values.
+ * <p>
* The invocation order is that the isValid
* method of the old Validity object is called with the new one as a
* parameter.
1.3 +51 -11
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/TraversableSource.java
Index: TraversableSource.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/TraversableSource.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TraversableSource.java 9 Jan 2003 08:33:34 -0000 1.2
+++ TraversableSource.java 29 Jan 2003 06:56:01 -0000 1.3
@@ -54,7 +54,6 @@
*/
package org.apache.excalibur.source;
-import org.apache.excalibur.source.Source;
import java.util.Collection;
@@ -63,26 +62,67 @@
* a parent, like a file system.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
* @version CVS $Revision$ $Date$
*/
public interface TraversableSource extends Source {
/**
- * Does this source point to a directory?
+ * Does this source point to a directory (i.e. it possibly has children) ?
+ *
+ * @return true if the source is a directory.
*/
- boolean hasChildren();
+ boolean isDirectory();
/**
- * Return the URIs of the children
- * The returned URIs are relative to the URI of the parent
- * (this object)
+ * Get the absolute URIs of the children of this source.
+ *
+ * @return a possibly-empty collection if this source is a directory,
+ * <code>null</code> otherwise
+ * @throws SourceException if some problem occurs.
*/
- Collection getChildrenLocations() throws SourceException;
+ Collection getChildrenURIs() throws SourceException;
/**
- * Return the complete URI of the parent source.
- * The method should return null if the source hasn't a parent.
+ * Get the children of this source as {@link Source} objects.
+ * <p>
+ * <em>Note:</em> only those sources actually fetched from the
+ * collection need to be released using the {@link SourceResolver}.
+ *
+ * @return a possibly-empty collection if this source is a directory,
+ * <code>null</code> otherwise
+ * @throws SourceException if some problem occurs.
*/
- String getParentLocation() throws SourceException;
+ Collection getChildrenSources() throws SourceException;
+
+ /**
+ * Get the children of this source as relative names.
+ * @return a possibly-empty collection if this source is a directory,
+ * <code>null</code> otherwise
+ * @throws SourceException if some problem occurs.
+ */
+ Collection getChildrenNames() throws SourceException;
+
+ /**
+ * Return the name of this source relative to its parent.
+ * @throws SourceException if some problem occurs.
+ */
+ String getName() throws SourceException;
+
+ /**
+ * Return the absolute URI of the parent source.
+ *
+ * @return the parent URI, or <code>null</code> if this source has no parent.
+ * @throws SourceException if some problem occurs.
+ */
+ String getParentURI() throws SourceException;
+
+ /**
+ * Get the parent of this source as a {@link Source} object.
+ *
+ * @return the parent source, or <code>null</code> if this source has no parent.
+ * @throws SourceException if some problem occurs.
+ */
+ Source getParentSource() throws SourceException;
}
1.14 +64 -57
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/Source.java
Index: Source.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/Source.java,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- Source.java 9 Jan 2003 08:45:51 -0000 1.13
+++ Source.java 29 Jan 2003 06:56:01 -0000 1.14
@@ -56,24 +56,22 @@
import java.io.IOException;
import java.io.InputStream;
-import java.util.Iterator;
/**
- * Description of a source. This interface provides a simple interface
- * for accessing a source of data.
- *
+ * This interface provides a simple interface for accessing a source of data.
+ * <p>
* When the <code>Source</code> object is no longer needed
- * it must be released using the resolver. This is very similar like
- * looking up components from a <code>ComponentLocator</code>.
+ * it must be released using the {@link SourceResolver}. This is very similar to
+ * looking up components from a <code>ServiceSelector</code>.
* In fact a source object can implement most lifecycle interfaces
* like Composable, Initializable, Disposable etc.
- *
- * Thee data content can be constant or change over time.
- * Using the getInputStream() method you get always the upto-date content.
- * When you're done with using the source object, you have to release it.
+ * <p>
+ * The data content can be constant or change over time.
+ * Using the {@link #getInputStream()} method you get always the up-to-date content.
+ * <p>
* If you want to track changes of the source object, this interface
* offers you some support for it by providing a SourceValidity object.
- *
+ * <p>
* How does the caching work?
* The first time you get a Source object, you simply ask
* it for it's content via getInputStream() and then get the validity
@@ -84,96 +82,105 @@
* The next time, the caching algorithm wants to check if the cached
* content is still valid. It has a validity object already to check
* against.
- *
+ * <p>
* If it is still the same Source than the first time, you
- * have to call discardValidity() in order to discard the stored validity
+ * have to call refresh() in order to discard the stored validity
* in the Source object. If it is a new Source object,
- * calling discardValidity() should do no harm.
- * After that an upto-date validity object can retrieved by calling
+ * calling refresh() should do no harm.
+ * After that an up-to-date validity object can retrieved by calling
* getValidity(). This can be used to test if the content is still valid
* as discribed in the source validity documentation.
* If the content is still valid, the cache knows what to do, if not,
* the new content can be get using getInputStream().
* So either after a call to getValidity() or the getInputStream the
- * validity object must be the same until discardValidity is called!
+ * validity object must be the same until refresh is called!
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
* @version CVS $Revision$ $Date$
*/
public interface Source
{
/**
- * Return an <code>InputStream</code> object to read from the source.
+ * Does this source exist ?
+ *
+ * @return true if the source exists
+ */
+ public boolean exists();
+
+ /**
+ * Return an <code>InputStream</code> to read from the source.
* This is the data at the point of invocation of this method,
* so if this is Modifiable, you might get different content
* from two different invocations.
+ *
+ * @return the <code>InputStream</code> to read data from (never
<code>null</code>).
+ * @throws IOException if some I/O problem occurs.
+ * @throws SourceNotFoundException if the source doesn't exist.
*/
InputStream getInputStream()
- throws IOException, SourceException;
+ throws IOException, SourceNotFoundException;
/**
- * Return the unique identifier for this source
+ * Get the absolute URI for this source.
+ *
+ * @return the source URI.
*/
- String getSystemId();
+ String getURI();
/**
- * Return the protocol identifier.
+ * Return the URI scheme identifier, i.e. the part preceding the fist ':' in
the URI
+ * (see <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>).
+ * <p>
+ * This scheme can be used to get the {@link SourceFactory} responsible for
this object.
+ *
+ * @return the URI scheme.
*/
- String getProtocol();
+ String getScheme();
/**
- * Get the Validity object. This can either wrap the last modification
- * date or the expires information or...
- * If it is currently not possible to calculate such an information
- * <code>null</code> is returned.
+ * Get the Validity object. This can either wrap the last modification date or
+ * some expiry information or anything else describing this object's validity.
+ * <p>
+ * If it is currently not possible to calculate such an information,
+ * <code>null</code> is returned.
+ *
+ * @return the validity, or <code>null</code>.
*/
SourceValidity getValidity();
/**
- * Refresh the content of this object after the underlying data
- * content has changed.
+ * Refresh the content of this object after the underlying data content has
changed.
+ * <p>
+ * Some implementations may cache some values to speedup sucessive calls.
Refreshing
+ * ensures you get the latest information.
*/
- void discardValidity();
+ void refresh();
/**
- * The mime-type of the content described by this object.
+ * Get the mime-type of the content described by this object.
* If the source is not able to determine the mime-type by itself
* this can be <code>null</code>.
+ *
+ * @return the source's mime-type or <code>null</code>.
*/
String getMimeType();
/**
- * Return the content length of the content or -1 if the length is
- * unknown
+ * Get the content length of this source's content or -1 if the length is
+ * unknown.
+ *
+ * @return the source's content length or -1.
*/
long getContentLength();
/**
- * Get the last modification date.
- * @return The last modification in milliseconds since January 1, 1970 GMT
- * or 0 if it is unknown
+ * Get the last modification date of this source. The date is
+ * measured in milliseconds since the epoch (00:00:00 GMT, January 1, 1970),
+ * and is <code>0</code> if it's unknown.
+ *
+ * @return the last modification date or <code>0</code>.
*/
long getLastModified();
-
- /**
- * Get the value of a parameter.
- * Using this it is possible to get custom information provided by the
- * source implementation, like an expires date, HTTP headers etc.
- */
- String getParameter( String name );
-
- /**
- * Get the value of a parameter.
- * Using this it is possible to get custom information provided by the
- * source implementation, like an expires date, HTTP headers etc.
- */
- long getParameterAsLong( String name );
-
- /**
- * Get parameter names
- * Using this it is possible to get custom information provided by the
- * source implementation, like an expires date, HTTP headers etc.
- */
- Iterator getParameterNames();
}
1.7 +14 -7
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceResolver.java
Index: SourceResolver.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceResolver.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- SourceResolver.java 15 Dec 2002 11:56:48 -0000 1.6
+++ SourceResolver.java 29 Jan 2003 06:56:01 -0000 1.7
@@ -88,10 +88,13 @@
/**
* Get a <code>Source</code> object.
* This is a shortcut for <code>resolve(location, null, null)</code>
- * @throws SourceNotFoundException if the source cannot be found
+ *
+ * @return the resolved source object.
+ * @throws MalformetURLException if <code>location</code> is malformed.
+ * @throws IOException if the source couldn't be created for some other reason.
*/
Source resolveURI( String location )
- throws MalformedURLException, IOException, SourceException;
+ throws MalformedURLException, IOException;
/**
* Get a <code>Source</code> object.
@@ -102,16 +105,20 @@
* @param base - a base URI for resolving relative locations. This
* is optional and can be <code>null</code>.
* @param parameters - Additional parameters for the URI. The parameters
- * are specific to the used protocol.
- * @throws SourceNotFoundException if the source cannot be found
+ * are specific to the used scheme.
+ * @return the resolved source object.
+ * @throws MalformetURLException if <code>location</code> is malformed.
+ * @throws IOException if the source couldn't be created for some other reason.
*/
Source resolveURI( String location,
String base,
Map parameters )
- throws MalformedURLException, IOException, SourceException;
+ throws MalformedURLException, IOException;
/**
- * Releases a resolved resource
+ * Releases a resolved resource.
+ *
+ * @param source the source to release.
*/
void release( Source source );
}
1.6 +18 -9
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceFactory.java
Index: SourceFactory.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceFactory.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- SourceFactory.java 15 Dec 2002 11:56:48 -0000 1.5
+++ SourceFactory.java 29 Jan 2003 06:56:01 -0000 1.6
@@ -62,12 +62,12 @@
/**
* A source factory creates new source objects.
- *
+ * <p>
* Source factories are used to extend the source resolving mechanism
- * with a new protocol. A new source factory is added in order to
+ * with new URI schemes. A new source factory is added in order to
* handle a specific prototol. The {@link SourceResolver} delegates
- * the handling of a URI containing this new protocol to the factory
- * and the factory can created a coresponding {@link Source} object.
+ * the handling of a URI containing this new scheme to the factory,
+ * and the factory can create a corresponding {@link Source} object.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
* @version $Id$
@@ -82,16 +82,25 @@
* The factory creates a new {@link Source} object that can be used
* by the application. However, when this source object is not needed
* anymore it has to be released again using the {@link #release(Source)}
- * method.
+ * method. This is achieved by using {@link SourceResolver#release(Source)}
which
+ * finds the appropriate <code>SourceFactory</code>.
*
- * @param location The URI to resolve - this URI includes the protocol.
- * @param parameters This is optional.
+ * @param location The URI to resolve - this URI includes the scheme.
+ * @param parameters additionnal named parameters (optionnal and can be
<code>null</code>)
+ * that drive the creation of the <code>Source</code> object. Each
implementation
+ * must specify what parameters it accepts.
+ * @return the created source object.
+ * @throws MalformedURLException if the location is malformed.
+ * @throws IOException if the source couldn't be created for some other reason.
*/
+ //FIXME : can we really have an IOException here ?
Source getSource( String location, Map parameters )
- throws MalformedURLException, IOException, SourceException;
+ throws MalformedURLException, IOException;
/**
* Release a {@link Source} object.
+ *
+ * @param source the source to release.
*/
void release( Source source );
}
1.4 +12 -4
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/ModifiableSource.java
Index: ModifiableSource.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/ModifiableSource.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ModifiableSource.java 9 Jan 2003 08:56:10 -0000 1.3
+++ ModifiableSource.java 29 Jan 2003 06:56:01 -0000 1.4
@@ -54,14 +54,22 @@
*/
package org.apache.excalibur.source;
+import java.io.IOException;
import java.io.OutputStream;
/**
- * Description of a modifiable source. This interface provides a
- * simple interface for manipulation data.
- * for accessing a source of data.
+ * A {@link Source} that can be written to.
+ * <p>
+ * As far a possible, implementations should provide a kind of transaction or
+ * buffering of data written to the source. This is especially important in
+ * stream-based systems such as Cocoon where an error that occurs during the
+ * processing should lead to cancelling data written to the source.
+ * <p>
+ * This is the role of the {@link #canCancel(OutputStream)} and
+ * {@link #cancel(OutputStream)} methods.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
* @version CVS $Revision$ $Date$
*/
public interface ModifiableSource
@@ -70,7 +78,7 @@
/**
* Return an {@link OutputStream} to write to.
*/
- OutputStream getOutputStream();
+ OutputStream getOutputStream() throws IOException;
/**
* Delete the source
1.4 +2 -2
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceUtil.java
Index: SourceUtil.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceUtil.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SourceUtil.java 15 Dec 2002 11:56:48 -0000 1.3
+++ SourceUtil.java 29 Jan 2003 06:56:01 -0000 1.4
@@ -317,7 +317,7 @@
*/
public static File getFile( Source source )
{
- final String systemId = source.getSystemId();
+ final String systemId = source.getURI();
if( systemId.startsWith( "file:" ) )
{
return new File( systemId.substring( 5 ) );
1.5 +8 -2
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceParameters.java
Index: SourceParameters.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/SourceParameters.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- SourceParameters.java 15 Dec 2002 11:56:48 -0000 1.4
+++ SourceParameters.java 29 Jan 2003 06:56:01 -0000 1.5
@@ -68,7 +68,13 @@
/**
* This class holds parameters for a <code>Source</code> object.
* It differs from the usual Parameters object because it can hold
- * more than one value for a parameter.
+ * more than one value for a parameter, as is the case for HTTP
+ * request parameters.
+ * <p>
+ * Only particular kinds of <code>Source</code> implementations, such as
+ * {@link org.apache.excalibur.source.impl.URLSource} support this kind of
+ * parameters, passed as an entry in the <code>parameters</code> argument of
+ * {@link SourceResolver#resolveURI(String, String, Map)}.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a>
* @version $Id$
1.1
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/ModifiableTraversableSource.java
Index: ModifiableTraversableSource.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software
* itself, if and wherever such third-party acknowledgments
* normally appear.
*
* 4. The names "Jakarta", "Avalon", and "Apache Software Foundation"
* must not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.excalibur.source;
/**
* A modifiable traversable source. This adds to {@link ModifiableSource} the
* ability to create a directory.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
* @version CVS $Revision: 1.1 $ $Date: 2003/01/29 06:56:01 $
*/
public interface ModifiableTraversableSource extends ModifiableSource,
TraversableSource
{
/**
* If it doesn't already exist, create the directory corresponding to this
source
* (equivalent to <code>File.mkdirs()</code>)
* <p>
* If the source already exists, this method does nothing if it's already
* a directory, and fails otherwise.
*/
public void makeDirectory() throws SourceException;
}
1.24 +7 -7
jakarta-avalon-excalibur/xmlutil/src/java/org/apache/excalibur/xml/xslt/XSLTProcessorImpl.java
Index: XSLTProcessorImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/xmlutil/src/java/org/apache/excalibur/xml/xslt/XSLTProcessorImpl.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- XSLTProcessorImpl.java 22 Jan 2003 02:18:17 -0000 1.23
+++ XSLTProcessorImpl.java 29 Jan 2003 06:56:01 -0000 1.24
@@ -189,7 +189,7 @@
{
try
{
- final String id = stylesheet.getSystemId();
+ final String id = stylesheet.getURI();
TransformerHandlerAndValidity handlerAndValidity = getTemplates(
stylesheet, id );
if( null == handlerAndValidity )
{
@@ -238,7 +238,7 @@
{
throw new XSLTProcessorException(
"Unable to create templates for stylesheet: "
- + stylesheet.getSystemId() );
+ + stylesheet.getURI() );
}
putTemplates( template, stylesheet, id );
@@ -311,7 +311,7 @@
{
final InputStream inputStream = source.getInputStream();
final String mimeType = source.getMimeType();
- final String systemId = source.getSystemId();
+ final String systemId = source.getURI();
m_xmlizer.toSAX( inputStream, mimeType, systemId, handler );
}
}
@@ -624,7 +624,7 @@
if( getLogger().isDebugEnabled() )
{
- getLogger().debug( "xslSource = " + xslSource + ", system id = " +
xslSource.getSystemId() );
+ getLogger().debug( "xslSource = " + xslSource + ", system id = " +
xslSource.getURI() );
}
// Populate included validities
@@ -634,7 +634,7 @@
SourceValidity included = xslSource.getValidity();
if( included != null )
{
- includes.add( new Object[]{xslSource.getSystemId(),
xslSource.getValidity()} );
+ includes.add( new Object[]{xslSource.getURI(),
xslSource.getValidity()} );
}
else
{
@@ -694,7 +694,7 @@
throws IOException, SourceException
{
final InputSource newObject = new InputSource( source.getInputStream() );
- newObject.setSystemId( source.getSystemId() );
+ newObject.setSystemId( source.getURI() );
return newObject;
}
}
1.8 +20 -12
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/impl/ResourceSource.java
Index: ResourceSource.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/impl/ResourceSource.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- ResourceSource.java 27 Jan 2003 10:38:44 -0000 1.7
+++ ResourceSource.java 29 Jan 2003 06:56:01 -0000 1.8
@@ -83,7 +83,12 @@
this.systemId = systemId;
final int pos = systemId.indexOf( "://" );
m_location = systemId.substring( pos + 3 );
- this.protocol = systemId.substring(0, pos);
+ this.scheme = systemId.substring(0, pos);
+ }
+
+ public boolean exists()
+ {
+ return getClassLoader().getResource( m_location ) != null;
}
/**
@@ -92,27 +97,30 @@
public InputStream getInputStream()
throws IOException, SourceException
{
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
- if( loader == null )
- {
- loader = getClass().getClassLoader();
- }
- InputStream in = loader.getResourceAsStream( m_location );
+ InputStream in = getClassLoader().getResourceAsStream( m_location );
if ( in == null )
throw new SourceNotFoundException( "Source '"+m_location+"' was not
found" );
return in;
}
/**
- * Get the Validity object. This can either wrap the last modification
- * date or the expires information or...
- * If it is currently not possible to calculate such an information
- * <code>null</code> is returned.
+ * Returns {@link NOPValidity#SHARED_INSTANCE} since a resource doesn't change.
+ *
*/
public SourceValidity getValidity()
{
// we are always valid
return NOPValidity.SHARED_INSTANCE;
+ }
+
+ private ClassLoader getClassLoader() {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ if( loader == null )
+ {
+ loader = getClass().getClassLoader();
+ }
+
+ return loader;
}
}
1.9 +6 -60
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/impl/AbstractSource.java
Index: AbstractSource.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/impl/AbstractSource.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- AbstractSource.java 8 Jan 2003 21:33:51 -0000 1.8
+++ AbstractSource.java 29 Jan 2003 06:56:01 -0000 1.9
@@ -56,9 +56,6 @@
import java.io.IOException;
import java.io.InputStream;
-import java.util.Collections;
-import java.util.Collection;
-import java.util.Iterator;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
@@ -79,7 +76,7 @@
protected long contentLength;
protected String systemId;
- protected String protocol;
+ protected String scheme;
/**
* Get the last modification date and content length of the source.
@@ -117,7 +114,7 @@
/**
* Return the unique identifer for this source
*/
- public String getSystemId()
+ public String getURI()
{
return this.systemId;
}
@@ -125,9 +122,9 @@
/**
* Return the protocol identifier.
*/
- public String getProtocol()
+ public String getScheme()
{
- return this.protocol;
+ return this.scheme;
}
/**
@@ -145,7 +142,7 @@
* Refresh this object and update the last modified date
* and content length.
*/
- public void discardValidity()
+ public void refresh()
{
this.gotInfos = false;
}
@@ -178,56 +175,5 @@
{
checkInfos();
return this.lastModificationDate;
- }
-
- /**
- * Get the value of a parameter.
- * Using this it is possible to get custom information provided by the
- * source implementation, like an expires date, HTTP headers etc.
- */
- public String getParameter( final String name )
- {
- checkInfos();
- return null;
- }
-
- /**
- * Get the value of a parameter.
- * Using this it is possible to get custom information provided by the
- * source implementation, like an expires date, HTTP headers etc.
- */
- public long getParameterAsLong( final String name )
- {
- checkInfos();
- return 0;
- }
-
- /**
- * Get parameter names
- * Using this it is possible to get custom information provided by the
- * source implementation, like an expires date, HTTP headers etc.
- */
- public Iterator getParameterNames()
- {
- checkInfos();
- return Collections.EMPTY_LIST.iterator();
- }
-
- /**
- * Does this source point to a directory?
- */
- public boolean isDirectory()
- {
- return false;
- }
-
- /**
- * Return the URIs of the children
- * The returned URIs are relative to the URI of the parent
- * (this object)
- */
- public Collection getChildrenLocations()
- {
- return Collections.EMPTY_LIST;
}
}
1.23 +9 -8
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/impl/SourceResolverImpl.java
Index: SourceResolverImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/impl/SourceResolverImpl.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- SourceResolverImpl.java 17 Jan 2003 14:26:21 -0000 1.22
+++ SourceResolverImpl.java 29 Jan 2003 06:56:01 -0000 1.23
@@ -61,6 +61,8 @@
import java.util.Map;
import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.component.ComponentException;
+import org.apache.avalon.framework.component.ComponentSelector;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
@@ -70,7 +72,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.avalon.framework.thread.ThreadSafe;
import org.apache.excalibur.source.Source;
@@ -114,7 +115,7 @@
protected ServiceManager m_manager;
/** The special Source factories */
- protected ServiceSelector m_factorySelector;
+ protected ComponentSelector m_factorySelector;
/** The context */
protected Context m_context;
@@ -180,7 +181,7 @@
throws ServiceException
{
m_manager = manager;
- m_factorySelector = (ServiceSelector)m_manager.lookup( SourceFactory.ROLE +
"Selector" );
+ m_factorySelector = (ComponentSelector)m_manager.lookup( SourceFactory.ROLE
+ "Selector" );
}
public void dispose()
@@ -314,7 +315,7 @@
factory = (SourceFactory)m_factorySelector.select( protocol );
source = factory.getSource( systemID, parameters );
}
- catch( final ServiceException ce )
+ catch( final ComponentException ce )
{
// no selector available, use fallback
//throw new SourceException( "Unable to select source factory for
protocol " + protocol, ce );
@@ -384,14 +385,14 @@
if( source == null ) return;
// search for a SourceFactory implementing the protocol
- final String protocol = source.getProtocol();
+ final String scheme = source.getScheme();
SourceFactory factory = null;
try
{
- factory = (SourceFactory)m_factorySelector.select( protocol );
+ factory = (SourceFactory)m_factorySelector.select( scheme );
factory.release( source );
}
- catch( ServiceException ce )
+ catch( ComponentException ce )
{
//no factory available, so use fallback
//throw new CascadingRuntimeException( "Unable to select source factory
for protocol " + protocol, ce );
1.18 +21 -4
jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/impl/URLSource.java
Index: URLSource.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/sourceresolve/src/java/org/apache/excalibur/source/impl/URLSource.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- URLSource.java 8 Jan 2003 21:33:50 -0000 1.17
+++ URLSource.java 29 Jan 2003 06:56:01 -0000 1.18
@@ -111,6 +111,9 @@
/** Is this a post? */
protected boolean isPost = false;
+
+ /** Does this source exist ? */
+ protected boolean exists = false;
/** the prev returned SourceValidity */
@@ -135,7 +138,7 @@
{
this.systemId = url.toExternalForm();
int pos = systemId.indexOf(':');
- this.protocol = systemId.substring(0, pos);
+ this.scheme = systemId.substring(0, pos);
if (systemId.startsWith( FILE ))
{
this.file = new File( this.systemId.substring( FILE.length() ) );
@@ -192,10 +195,14 @@
*/
protected void getInfos()
{
+ // exists will be set below depending on the url type
+ this.exists = false;
+
if( null != this.file )
{
this.lastModificationDate = this.file.lastModified();
this.contentLength = this.file.length();
+ this.exists = this.file.exists();
}
else
{
@@ -214,6 +221,7 @@
}
this.lastModificationDate = this.connection.getLastModified();
this.contentLength = this.connection.getContentLength();
+ this.exists = true;
}
catch( IOException ignore )
{
@@ -229,6 +237,15 @@
}
/**
+ * Does this source exist ?
+ */
+ public boolean exists()
+ {
+ this.checkInfos();
+ return this.exists;
+ }
+
+ /**
* Return an <code>InputStream</code> object to read from the source.
*
* @throws SourceException if file not found or
@@ -393,11 +410,11 @@
* Refresh this object and update the last modified date
* and content length.
*/
- public void discardValidity()
+ public void refresh()
{
// reset connection
this.connection = null;
- super.discardValidity();
+ super.refresh();
}
/**
1.2 +1 -2
jakarta-avalon-excalibur/store/src/java/org/apache/excalibur/store/impl/AbstractJispFilesystemStore.java
Index: AbstractJispFilesystemStore.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/store/src/java/org/apache/excalibur/store/impl/AbstractJispFilesystemStore.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- AbstractJispFilesystemStore.java 12 Oct 2002 10:36:55 -0000 1.1
+++ AbstractJispFilesystemStore.java 29 Jan 2003 06:56:01 -0000 1.2
@@ -22,7 +22,6 @@
import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;
-import java.util.Vector;
/**
* This store is based on the Jisp library
1.2 +2 -2
jakarta-avalon-excalibur/store/src/java/org/apache/excalibur/store/impl/StoreJanitorImpl.java
Index: StoreJanitorImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/store/src/java/org/apache/excalibur/store/impl/StoreJanitorImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- StoreJanitorImpl.java 2 May 2002 08:55:39 -0000 1.1
+++ StoreJanitorImpl.java 29 Jan 2003 06:56:02 -0000 1.2
@@ -138,7 +138,7 @@
}
}
try {
- Thread.currentThread().sleep(this.cleanupthreadinterval * 1000);
+ Thread.sleep(this.cleanupthreadinterval * 1000);
} catch (InterruptedException ignore) {}
}
}
1.10 +4 -4
jakarta-avalon-excalibur/monitor/src/java/org/apache/avalon/excalibur/monitor/SourceResource.java
Index: SourceResource.java
===================================================================
RCS file:
/home/cvs/jakarta-avalon-excalibur/monitor/src/java/org/apache/avalon/excalibur/monitor/SourceResource.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- SourceResource.java 14 Jan 2003 07:45:10 -0000 1.9
+++ SourceResource.java 29 Jan 2003 06:56:02 -0000 1.10
@@ -36,7 +36,7 @@
public SourceResource( final Source source )
throws Exception
{
- super( source.getSystemId() );
+ super( source.getURI() );
m_source = source;
setPreviousModified( System.currentTimeMillis() );
@@ -58,7 +58,7 @@
boolean isValid = false;
SourceValidity newVal = null;
if ( valid == 0 ) {
- m_source.discardValidity();
+ m_source.refresh();
newVal = m_source.getValidity();
if( newVal != null)
{
@@ -72,7 +72,7 @@
return getPreviousModified();
} else {
if ( null == newVal ) {
- m_source.discardValidity();
+ m_source.refresh();
m_validity = m_source.getValidity();
}
return System.currentTimeMillis();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]