cziegeler 02/05/07 01:44:35
Modified: src/java/org/apache/cocoon/components/source
AbstractStreamWriteableSource.java FileSource.java
Added: src/java/org/apache/cocoon/components/source
WriteableSAXSource.java WriteableSource.java
Log:
Added WritableSource/WriteableSAXSource interfaces
Revision Changes Path
1.3 +25 -25
xml-cocoon2/src/java/org/apache/cocoon/components/source/AbstractStreamWriteableSource.java
Index: AbstractStreamWriteableSource.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/source/AbstractStreamWriteableSource.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- AbstractStreamWriteableSource.java 28 Feb 2002 18:00:50 -0000 1.2
+++ AbstractStreamWriteableSource.java 7 May 2002 08:44:35 -0000 1.3
@@ -58,7 +58,6 @@
import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.ComponentSelector;
-import org.apache.cocoon.environment.WriteableSource;
import org.apache.cocoon.serialization.Serializer;
import org.apache.cocoon.xml.AbstractXMLPipe;
import org.apache.cocoon.ProcessingException;
@@ -77,23 +76,25 @@
/**
* This abstract class provides convenience methods to implement
- * a stream based <code>WriteableSource</code>. Implement getOutputStream()
- * to obtain a valid implementation.
+ * a stream based <code>org.apache.cocoon.environment.WriteableSource</code>.
+ * Implement getOutputStream() to obtain a valid implementation.
* <p>
* This base implementation creates a <code>ContentHandler</code> by using
* the sitemap 'xml' serializer to write SAX events to the stream returned by
* <code>getOutputStream()</code>.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
- * @version $Id: AbstractStreamWriteableSource.java,v 1.2 2002/02/28 18:00:50
sylvain Exp $
+ * @version $Id: AbstractStreamWriteableSource.java,v 1.3 2002/05/07 08:44:35
cziegeler Exp $
*/
-public abstract class AbstractStreamWriteableSource extends AbstractStreamSource
implements WriteableSource {
-
+public abstract class AbstractStreamWriteableSource
+ extends AbstractStreamSource
+ implements org.apache.cocoon.environment.WriteableSource {
+
protected AbstractStreamWriteableSource(ComponentManager manager) {
super(manager);
}
-
+
/**
* Checks if the <code>OutputStream</code> under <code>handler</code> can be
cancelled.
*
@@ -153,12 +154,12 @@
* exist in this source's component manager.
*/
public ContentHandler getContentHandler() throws SAXException,
ProcessingException {
-
+
Serializer serializer;
ComponentSelector selector;
-
+
String serializerName = this.isHTMLContent() ? "html" : "xml";
-
+
// Get the serializer
try {
selector =
@@ -167,7 +168,7 @@
} catch(ComponentException ce) {
throw new ProcessingException("Cannot get '" + serializerName + "'
serializer");
}
-
+
try {
return new WritingPipe(getOutputStream(), selector, serializer);
} catch(IOException ioe) {
@@ -175,34 +176,34 @@
throw new ProcessingException("Cannot open stream for " +
this.getSystemId(), ioe);
}
}
-
+
/**
* A pipe that closes the outputstream at the end of the document and handles
cancel().
*/
private class WritingPipe extends AbstractXMLPipe {
-
+
// The output stream
private OutputStream output;
-
+
// Serialier and its selector for proper release
private Serializer serializer;
private ComponentSelector selector;
-
+
public WritingPipe(OutputStream output, ComponentSelector selector,
Serializer serializer)
throws IOException {
this.output = output;
this.selector = selector;
this.serializer = serializer;
-
+
// Connect this pipe, the serializer and the output stream
this.setConsumer(this.serializer);
this.serializer.setOutputStream(this.output);
}
-
- public WriteableSource getSource() {
+
+ public org.apache.cocoon.environment.WriteableSource getSource() {
return AbstractStreamWriteableSource.this;
}
-
+
/**
* Close the underlying stream
*/
@@ -215,11 +216,11 @@
throw new SAXException("Error while closing output stream", e);
}
}
-
+
public boolean canCancel() {
return this.output != null;
}
-
+
/**
* Cancel the wrapped output stream
*/
@@ -227,7 +228,7 @@
AbstractStreamWriteableSource.this.cancel(output);
close();
}
-
+
private void close() throws IOException {
if (this.serializer != null) {
// Disconnect serializer;
@@ -236,13 +237,13 @@
this.selector.release(this.serializer);
this.serializer = null;
}
-
+
if (this.output != null) {
this.output.close();
this.output = null;
}
}
-
+
// Ensure all is closed properly
protected void finalize() throws Throwable {
close();
@@ -250,4 +251,3 @@
}
}
}
-
\ No newline at end of file
1.3 +32 -33
xml-cocoon2/src/java/org/apache/cocoon/components/source/FileSource.java
Index: FileSource.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/java/org/apache/cocoon/components/source/FileSource.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- FileSource.java 28 Feb 2002 18:00:50 -0000 1.2
+++ FileSource.java 7 May 2002 08:44:35 -0000 1.3
@@ -56,7 +56,6 @@
import org.apache.avalon.framework.component.ComponentManager;
-import org.apache.cocoon.environment.WriteableSource;
import org.apache.cocoon.ProcessingException;
import java.io.File;
@@ -72,52 +71,53 @@
import java.util.ConcurrentModificationException;
/**
- * A <code>WriteableSource</code> for 'file:/' system IDs.
+ * A <code>org.apache.cocoon.environment.WriteableSource</code> for 'file:/' system
IDs.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a>
- * @version $Id: FileSource.java,v 1.2 2002/02/28 18:00:50 sylvain Exp $
+ * @version $Id: FileSource.java,v 1.3 2002/05/07 08:44:35 cziegeler Exp $
*/
-public class FileSource extends AbstractStreamWriteableSource implements
WriteableSource {
-
+public class FileSource extends AbstractStreamWriteableSource
+ implements org.apache.cocoon.environment.WriteableSource {
+
/** The underlying file. */
private File file;
-
+
/** The system ID for this source (lazily created by getSystemId()) */
private String systemId = null;
-
+
/** Is this an html file ? */
private boolean isHTMLContent;
-
+
/**
* Create a file source from a 'file:' url and a component manager.
*/
public FileSource(String url, ComponentManager manager) {
-
+
super(manager);
-
+
if (!url.startsWith("file:")) {
throw new IllegalArgumentException("Malformed url for a file source : "
+ url);
}
-
+
if (url.endsWith(".htm") || url.endsWith(".html")) {
this.isHTMLContent = true;
}
-
+
this.file = new File(url.substring(5)); // 5 == "file:".length()
}
-
+
public boolean exists() {
return this.file.exists();
}
-
+
/**
* Returns <code>true</code> if the file name ends with ".htm" or ".html".
*/
protected boolean isHTMLContent() {
return this.isHTMLContent;
}
-
+
/**
* Return the unique identifer for this source
*/
@@ -139,15 +139,15 @@
public InputStream getInputStream() throws IOException, ProcessingException {
return new FileInputStream(this.file);
}
-
+
public long getLastModified() {
return this.file.lastModified();
}
-
+
public long getContentLength() {
return this.file.length();
}
-
+
/**
* Get an output stream to write to this source. The output stream returned
* actually writes to a temp file that replaces the real one on close. This
@@ -158,25 +158,25 @@
* writing to this file.
*/
public OutputStream getOutputStream() throws IOException, ProcessingException {
-
+
// Create a temp file. It will replace the right one when writing
terminates,
// and serve as a lock to prevent concurrent writes.
File tmpFile = new File(this.file.getPath() + ".tmp");
-
+
// Ensure the directory exists
tmpFile.getParentFile().mkdirs();
-
+
// Can we write the file ?
if (this.file.exists() && !this.file.canWrite()) {
throw new IOException("Cannot write to file " + this.file.getPath());
}
-
+
// Check if it temp file already exists, meaning someone else currently
writing
if (!tmpFile.createNewFile()) {
throw new ConcurrentModificationException("File " + this.file.getPath()
+
" is already being written by another thread");
}
-
+
// Return a stream that will rename the temp file on close.
return new FileSourceOutputStream(tmpFile);
}
@@ -212,21 +212,21 @@
// Not a valid stream for this source
throw new IllegalArgumentException("The stream is not associated to this
source");
}
-
+
/**
* A file outputStream that will rename the temp file to the destination file
upon close()
* and discard the temp file upon cancel().
*/
private class FileSourceOutputStream extends FileOutputStream {
-
+
private File tmpFile;
private boolean isClosed = false;
-
+
public FileSourceOutputStream(File tmpFile) throws IOException {
super(tmpFile);
this.tmpFile = tmpFile;
}
-
+
public FileSource getSource() {
return FileSource.this;
}
@@ -241,7 +241,7 @@
}
// Rename temp file to destination file
tmpFile.renameTo(FileSource.this.file);
-
+
} finally {
// Ensure temp file is deleted, ie lock is released.
// If there was a failure above, written data is lost.
@@ -251,21 +251,21 @@
this.isClosed = true;
}
}
-
+
public boolean canCancel() {
return !this.isClosed;
}
-
+
public void cancel() throws Exception {
if (this.isClosed) {
throw new IllegalStateException("Cannot cancel : outputstrem is
already closed");
}
-
+
this.isClosed = true;
super.close();
this.tmpFile.delete();
}
-
+
public void finalize() {
if (!this.isClosed && tmpFile.exists()) {
// Something wrong happened while writing : delete temp file
@@ -274,4 +274,3 @@
}
}
}
-
\ No newline at end of file
1.1
xml-cocoon2/src/java/org/apache/cocoon/components/source/WriteableSAXSource.java
Index: WriteableSAXSource.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 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 "Apache Cocoon" 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.cocoon.components.source;
import org.apache.excalibur.source.SourceException;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
/**
* A {@link Source} that can be written to. It provides two methods that
* allow for SAX-based and byte-based output.
* <p>
* Callers will use the most appropriate method for their use and
* it's up to the implementation to handle both sources. For example,
* an XML-based implementation can use a parser to convert bytes written
* to the <code>OutputStream</code> to SAX events, and a byte-based
* implementation (such as file), can use a serializer to convert
* SAX events to a byte stream.
*
* @since @next-version@
* @author <a href="[EMAIL PROTECTED]">Sylvain Wallez</a>
* @version CVS $Id: WriteableSAXSource.java,v 1.1 2002/05/07 08:44:35 cziegeler Exp
$
*/
public interface WriteableSAXSource
extends WriteableSource {
/**
* Get a <code>ContentHandler</code> where an XML document can
* be written using SAX events.
* <p>
* Care should be taken that the returned handler can actually
* be a {@link org.apache.cocoon.xml.XMLConsumer} supporting also
* lexical events such as comments.
*
* @return a handler for SAX events
*/
ContentHandler getContentHandler() throws SAXException, SourceException;
/**
* Can the data sent to a <code>ContentHandler</code> returned by
* {@link #getContentHandler()} be cancelled ?
*
* @return true if the handler can be cancelled
*/
boolean canCancel(ContentHandler handler);
/**
* Cancel the data sent to a <code>ContentHandler</code> returned by
* {@link #getContentHandler()}.
* <p>
* After cancel, the handler should no more be used.
*/
void cancel(ContentHandler handler) throws SAXException, SourceException;
}
1.1
xml-cocoon2/src/java/org/apache/cocoon/components/source/WriteableSource.java
Index: WriteableSource.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 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 "Apache Cocoon" 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.cocoon.components.source;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
import java.io.IOException;
import java.io.OutputStream;
/**
* A {@link Source} that can be written to. It provides methods that
* allow for byte-based output.
* <p>If a writable source can handle sax streams, it should implement
* the <code>WriteableSAXSource</code> interface instead.
* <p>
* Callers will use the most appropriate method for their use and
* it's up to the implementation to handle both sources. For example,
* an XML-based implementation can use a parser to convert bytes written
* to the <code>OutputStream</code> to SAX events, and a byte-based
* implementation (such as file), can use a serializer to convert
* SAX events to a byte stream.
*
* @since @next-version@
* @author <a href="[EMAIL PROTECTED]">Sylvain Wallez</a>
* @version CVS $Id: WriteableSource.java,v 1.1 2002/05/07 08:44:35 cziegeler Exp $
*/
public interface WriteableSource extends Source {
/**
* Does this source actually exist ?
*
* @return true if the resource exists.
*/
boolean exists();
/**
* Get an <code>InputStream</code> where raw bytes can be written to.
* The signification of these bytes is implementation-dependent and
* is not restricted to a serialized XML document.
*
* @return a stream to write to
*/
OutputStream getOutputStream() throws IOException, SourceException;
/**
* Can the data sent to an <code>OutputStream</code> returned by
* {@link #getOutputStream()} be cancelled ?
*
* @return true if the stream can be cancelled
*/
boolean canCancel(OutputStream stream);
/**
* Cancel the data sent to an <code>OutputStream</code> returned by
* {@link #getOutputStream()}.
* <p>
* After cancel, the stream should no more be used.
*/
void cancel(OutputStream stream) throws SourceException;
}
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]