blob: 6abecc066dfa7539e3f52950b03363c9639c4c72 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import org.apache.cocoon.components.source.helpers.SourceLock;
import org.apache.cocoon.components.source.helpers.SourceProperty;
import org.apache.excalibur.source.ModifiableTraversableSource;
import org.apache.excalibur.source.MoveableSource;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
import org.apache.excalibur.source.SourceValidity;
import org.apache.excalibur.source.TraversableSource;
/**
* Data transfer object for a Source object.
*
* @version CVS $Id$
*/
public class SourceDTO implements Source, ModifiableTraversableSource,
MoveableSource, LockableSource, InspectableSource,
VersionableSource {
private String uri;
private String scheme;
private SourceValidity validity;
private String mimetype;
private boolean exists;
private long contentlength;
private long lastmodified;
private ArrayList children = new ArrayList();
private String name;
private SourceDTO parent;
private boolean iscollection;
private SourceProperty[] properties;
private boolean isversioned;
private String revision;
private String revisionbranch;
private String lastrevision;
/**
* Create a data transfer object for a Source.
*
* @param source Source
*/
public SourceDTO(Source source) {
this(source, true);
}
/**
* Create a data transfer object for a Source.
*
* @param source Source
*/
public SourceDTO(Source source, boolean deep) {
uri = source.getURI();
scheme = source.getScheme();
exists = source.exists();
if (exists) {
validity = source.getValidity();
mimetype = source.getMimeType();
contentlength = source.getContentLength();
lastmodified = source.getLastModified();
if (source instanceof TraversableSource) {
TraversableSource traversablesource = (TraversableSource) source;
iscollection = traversablesource.isCollection();
name = traversablesource.getName();
try {
if (iscollection && deep)
for(Iterator i = traversablesource.getChildren().iterator(); i.hasNext(); )
children.add(new SourceDTO((Source)i.next(), false));
} catch (SourceException se) {}
try {
if (deep && (traversablesource.getParent()!=null))
parent = new SourceDTO(traversablesource.getParent(), false);
} catch (SourceException se) {}
}
if (source instanceof InspectableSource) {
InspectableSource inspectablesource = (InspectableSource) source;
try {
properties = inspectablesource.getSourceProperties();
} catch (SourceException se) {}
}
if (source instanceof VersionableSource) {
VersionableSource versionablesource = (VersionableSource) source;
try {
isversioned = versionablesource.isVersioned();
if (isversioned) {
revision = versionablesource.getSourceRevision();
revisionbranch = versionablesource.getSourceRevisionBranch();
lastrevision = versionablesource.getLatestSourceRevision();
}
} catch (SourceException se) {}
}
}
}
/**
* Return an <code>InputStream</code> object 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 Input stream for the source.
*
* @throws IOException If an IO excepetion occurs.
* @throws SourceException If an exception occurs.
*/
public InputStream getInputStream() throws IOException, SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
/**
* Return the unique identifer for this source
*
* @return System identifier for the source.
*/
public String getURI() {
return uri;
}
/**
* @see org.apache.excalibur.source.Source#getScheme()
*
* @return Scheme of the source.
*/
public String getScheme() {
return scheme;
}
/**
* Return the authority of a URI. This authority is
* typically defined by an Internet-based server or a scheme-specific
* registry of naming authorities
* (see <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>).
*
* @return Scheme of the URI.
*/
public String getAuthority() {
return SourceUtil.getAuthority(uri);
}
/**
* Return the path of a URI. The path contains data, specific to the
* authority (or the scheme if there is no authority component),
* identifying the resource within the scope of that scheme and authority
* (see <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>).
*
* @return Path of the URI.
*/
public String getPath() {
return SourceUtil.getPath(uri);
}
/**
* Return the query of a URI. The query is a string of information to
* be interpreted by the resource
* (see <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>).
*
* @return Query of the URI.
*/
public String getQuery() {
return SourceUtil.getQuery(uri);
}
/**
* Return the fragment of a URI. When a URI reference is used to perform
* a retrieval action on the identified resource, the optional fragment
* identifier, consists of additional reference information to be
* interpreted by the user agent after the retrieval action has been
* successfully completed
* (see <a href="http://www.ietf.org/rfc/rfc2396.txt">RFC 2396</a>).
*
* @return Fragment of the URI.
*/
public String getFragment() {
return SourceUtil.getFragment(uri);
}
/**
* 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.
*
* @return Validity for the source.
*/
public SourceValidity getValidity() {
return validity;
}
/**
* Refresh the content of this object after the underlying data
* content has changed.
*/
public void refresh() {
throw new IllegalStateException("Data transfer object does not support this operation");
}
/**
* 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 null.
*
* @return Mime type of the source.
*/
public String getMimeType() {
return mimetype;
}
/**
* Does this source actually exist ?
*
* @return true if the resource exists.
*/
public boolean exists() {
return exists;
}
/**
* Return the content length of the content or -1 if the length is
* unknown.
*
* @return Content length of the source.
*/
public long getContentLength() {
return contentlength;
}
/**
* Get the last modification date of the source or 0 if it
* is not possible to determine the date.
*
* @return Last modified date of the source.
*/
public long getLastModified() {
return lastmodified;
}
// ---------------------------------------------------- ModifiableTraversableSource
/**
* Get an <code>OutputStream</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
*
* @throws IOException
* @throws SourceException
*/
public OutputStream getOutputStream()
throws IOException, SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
/**
* Can the data sent to an <code>OutputStream</code> returned by
* {@link #getOutputStream()} be cancelled ?
*
* @param stream The ouput stream, which should be cancelled.
* @return true if the stream can be cancelled
*/
public boolean canCancel(OutputStream stream) {
throw new IllegalStateException("Data transfer object does not support this operation");
}
/**
* Cancel the data sent to an <code>OutputStream</code> returned by
* {@link #getOutputStream()}.
* <p>
* After cancel, the stream should no more be used.
*
* @param stream The ouput stream, which should be cancelled.
*
* @throws SourceException If the ouput stream can't be cancelled.
*/
public void cancel(OutputStream stream) throws SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
/**
* Delete the source.
*/
public void delete() {
throw new IllegalStateException("Data transfer object does not support this operation");
}
public void makeCollection() throws SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
public Source getChild(String name) throws SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
public Collection getChildren() throws SourceException {
return children;
}
public String getName() {
return name;
}
public Source getParent() throws SourceException {
return parent;
}
public boolean isCollection() {
//System.out.println("uri="+uri+" isCollection="+iscollection);
return iscollection;
}
// ---------------------------------------------------- MoveableSource
/**
* Move the current source to a specified destination.
*
* @param source
*
* @throws SourceException If an exception occurs during the move.
*/
public void moveTo(Source source) throws SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
/**
* Copy the current source to a specified destination.
*
* @param source
*
* @throws SourceException If an exception occurs during the copy.
*/
public void copyTo(Source source) throws SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
// ---------------------------------------------------- InspectableSource
/**
* Returns a property from a source.
*
* @param namespace Namespace of the property
* @param name Name of the property
*
* @return Property of the source.
*
* @throws SourceException If an exception occurs.
*/
public SourceProperty getSourceProperty(String namespace, String name)
throws SourceException {
for (int i = 0; i<properties.length; i++)
if (properties[i].getNamespace().equals(namespace) &&
properties[i].getName().equals(name))
return properties[i];
return null;
}
/**
* Sets a property for a source.
*
* @param property Property of the source
*
* @throws SourceException If an exception occurs during this operation
*/
public void setSourceProperty(SourceProperty property)
throws SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
/**
* Returns a enumeration of the properties
*
* @return Enumeration of SourceProperty
*
* @throws SourceException If an exception occurs.
*/
public SourceProperty[] getSourceProperties() throws SourceException {
//System.out.println("getProperties()");
//for(int i=0; i<properties.length; i++)
// System.out.println(i+". namespace="+properties[i].getNamespace()+" name="+properties[i].getName()+" value="+properties[i].getValue());
return properties;
}
/**
* Remove a specified source property.
*
* @param namespace Namespace of the property.
* @param name Name of the property.
*
* @throws SourceException If an exception occurs.
*/
public void removeSourceProperty(String namespace, String name) throws SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
// ---------------------------------------------------- LockableSource
/**
* Add a lock to this source
*
* @param sourcelock Lock, which should be added
*
* @throws SourceException If an exception occurs during this operation
*/
public void addSourceLocks(SourceLock sourcelock) throws SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
/**
* Returns a enumeration of the existing locks
*
* @return Enumeration of SourceLock
*
* @throws SourceException If an exception occurs.
*/
public SourceLock[] getSourceLocks() throws SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
// ---------------------------------------------------- VersionableSource
/**
* If this source versioned
*
* @return True if the current source is versioned.
*
* @throws SourceException If an exception occurs.
*/
public boolean isVersioned() throws SourceException {
return isversioned;
}
/**
* Get the current revision of the source
*
* @return The current revision of the source
*
*/
public String getSourceRevision() {
return revision;
}
/**
* Not implemented.
*
* @param revision The revision, which should be used.
*
* @throws SourceException If an exception occurs.
*/
public void setSourceRevision(String revision) throws SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
/**
* Get the current branch of the revision from the source
*
* @return The branch of the revision
*
* @throws SourceException If an exception occurs.
*/
public String getSourceRevisionBranch() throws SourceException {
return revisionbranch;
}
/**
* Not implemented.
*
* @param branch The branch, which should be used.
*
* @throws SourceException If an exception occurs.
*/
public void setSourceRevisionBranch(String branch) throws SourceException {
throw new IllegalStateException("Data transfer object does not support this operation");
}
/**
* Get the latest revision
*
* @return Last revision of the source.
*
* @throws SourceException If an exception occurs.
*/
public String getLatestSourceRevision() throws SourceException {
return lastrevision;
}
}