nicolaken 02/05/22 08:28:38
Added: src/scratchpad/src/org/apache/cocoon/components/source
SlideSource.java SlideSourceFactory.java
Log:
[PATCH] SourceFactory for jakarta slide (Bug#: 9267 )
submitter by
[EMAIL PROTECTED] (Stephan Michels)
to use: build installscratchpadwar and then remove the comments for
the webdav servlet and mapping in web.xml.
Revision Changes Path
1.1
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/SlideSource.java
Index: SlideSource.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.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
import org.apache.avalon.framework.logger.AbstractLoggable;
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.cocoon.Constants;
import org.apache.cocoon.components.source.WriteableSource;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
import org.apache.excalibur.source.SourceFactory;
import org.apache.excalibur.source.SourceValidity;
import org.apache.excalibur.source.impl.validity.TimeStampValidity;
import org.apache.slide.authenticate.CredentialsToken;
import org.apache.slide.authenticate.SecurityToken;
import org.apache.slide.common.Domain;
import org.apache.slide.common.NamespaceAccessToken;
import org.apache.slide.common.ServiceAccessException;
import org.apache.slide.common.SlideToken;
import org.apache.slide.common.SlideTokenImpl;
import org.apache.slide.content.Content;
import org.apache.slide.content.NodeProperty;
import org.apache.slide.content.NodeRevisionContent;
import org.apache.slide.content.NodeRevisionDescriptor;
import org.apache.slide.content.NodeRevisionDescriptors;
import org.apache.slide.content.RevisionContentNotFoundException;
import org.apache.slide.content.RevisionDescriptorNotFoundException;
import org.apache.slide.content.RevisionNotFoundException;
import org.apache.slide.content.NodeRevisionNumber;
import org.apache.slide.lock.Lock;
import org.apache.slide.lock.ObjectLockedException;
import org.apache.slide.macro.Macro;
import org.apache.slide.security.AccessDeniedException;
import org.apache.slide.security.Security;
import org.apache.slide.structure.LinkedObjectNotFoundException;
import org.apache.slide.structure.ObjectNode;
import org.apache.slide.structure.ObjectNotFoundException;
import org.apache.slide.structure.Structure;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;
import java.util.Map;
/**
* A sources from jakarta slide domains. The sources wrappers
* to the stores of slide. It uses slide:// as pseudo-protocoll. It is also
* possible to get access to the store
* via webdav.
*
* Possible parameter are username and revision
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a>
* @version $Id: SlideSource.java,v 1.1 2002/05/22 15:28:38 nicolaken Exp $
*/
public class SlideSource implements Source, WriteableSource
{
/** Sytem id */
private String systemid;
/** Namespace access token. */
private NamespaceAccessToken token;
/** Structure helper. */
private Structure structure;
/** Content helper. */
private Content content;
/** Security helper. */
private Security security;
/** Lock helper. */
private Lock lock;
/** Macro helper. */
private Macro macro;
/** Slide token. */
private SlideToken slideToken;
/** Request URI */
private String requestUri;
/** Revision number */
private NodeRevisionNumber revisionNumber;
private SourceValidity validity;
private SlideSourceOutputStream outputstream;
protected SlideSource(String location, Map parameters) {
this.systemid = location;
if (location.indexOf("://") >= 0)
location =
location.substring(location.indexOf("://")+3);
String namespace = location.substring(0,
location.indexOf("/"));
//System.out.println("namespace = '"+namespace+"'");
location = location.substring(location.indexOf("/"));
//System.out.println("location = '"+location+"'");
if ((parameters!=null) &&
(parameters.containsKey("revision"))) {
this.revisionNumber = new
NodeRevisionNumber(parameters.get("revision").toString());
//System.out.println("revision =
'"+this.revisionNumber+"'");
} else {
this.revisionNumber = null;
}
this.token = Domain.accessNamespace(new
SecurityToken(new String()),
namespace);
this.structure = token.getStructureHelper();
this.content = token.getContentHelper();
this.security = token.getSecurityHelper();
this.lock = token.getLockHelper();
this.macro = token.getMacroHelper();
CredentialsToken credToken;
if ((parameters!=null) &&
(parameters.containsKey("username")))
credToken = new
CredentialsToken(parameters.get("username").toString());
else
credToken = new CredentialsToken(new
String("guest"));
this.slideToken = new SlideTokenImpl(credToken);
this.requestUri = location;
}
/**
* 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.
*/
public InputStream getInputStream()
throws IOException, SourceException
{
try
{
ObjectNode object =
structure.retrieve(this.slideToken, this.requestUri);
NodeRevisionDescriptors
revisionDescriptors =
content.retrieve(slideToken, this.requestUri);
if
(revisionDescriptors.hasRevisions()) {
NodeRevisionDescriptor
revisionDescriptor;
if
(this.revisionNumber!=null)
revisionDescriptor =
content.retrieve(this.slideToken, revisionDescriptors, this.revisionNumber);
else
//
Retrieve latest revision descriptor
revisionDescriptor =
content.retrieve(this.slideToken, revisionDescriptors);
if (revisionDescriptor
!= null)
return
content.retrieve(slideToken, revisionDescriptors,
revisionDescriptor).streamContent();
}
} catch (ServiceAccessException sae) {
throw new SourceException("Could not get
source", sae);
} catch (AccessDeniedException ade) {
throw new SourceException("Could not get
source", ade);
} catch (LinkedObjectNotFoundException lonfe) {
throw new SourceException("Could not get
source", lonfe);
} catch (ObjectNotFoundException onfe) {
throw new SourceException("Could not get
source", onfe);
} catch (RevisionDescriptorNotFoundException rdnfe) {
throw new SourceException("Could not get
source", rdnfe);
} catch (RevisionContentNotFoundException rcnfe) {
throw new SourceException("Could not get
source", rcnfe);
} catch (RevisionNotFoundException rnfe) {
throw new SourceException("Could not get
source", rnfe);
} catch (ObjectLockedException ole) {
throw new SourceException("Could not get
source", ole);
}
return null;
}
/**
* Return the unique identifer for this source
*/
public String getSystemId() {
return this.systemid;
}
/**
* 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.
*/
public SourceValidity getValidity() {
try {
if (validity!=null) {
ObjectNode object =
structure.retrieve(this.slideToken, this.requestUri);
NodeRevisionDescriptors revisionDescriptors =
content.retrieve(slideToken, this.requestUri);
if
(revisionDescriptors.hasRevisions()) {
NodeRevisionDescriptor revisionDescriptor;
if
(this.revisionNumber!=null)
revisionDescriptor =
content.retrieve(this.slideToken, revisionDescriptors,
this.revisionNumber);
else
// Retrieve latest revision descriptor
revisionDescriptor =
content.retrieve(this.slideToken, revisionDescriptors);
if
(revisionDescriptor != null)
this.validity = new TimeStampValidity(
revisionDescriptor.getLastModifiedAsDate().getTime());
}
}
} catch (Exception e) {
return null;
}
return this.validity;
}
/**
* Refresh the content of this object after the underlying data
* content has changed.
*/
public void discardValidity() {
this.validity = null;
}
/**
* 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.
*/
public String getMimeType()
{
try
{
ObjectNode object =
structure.retrieve(this.slideToken, this.requestUri);
NodeRevisionDescriptors
revisionDescriptors =
content.retrieve(slideToken, this.requestUri);
if
(revisionDescriptors.hasRevisions()) {
NodeRevisionDescriptor
revisionDescriptor;
if
(this.revisionNumber!=null)
revisionDescriptor =
content.retrieve(this.slideToken, revisionDescriptors, this.revisionNumber);
else
//
Retrieve latest revision descriptor
revisionDescriptor =
content.retrieve(this.slideToken, revisionDescriptors);
if (revisionDescriptor
!= null)
revisionDescriptor.getContentType();
}
} catch (Exception e) {
return null;
}
return null;
}
/**
* Does this source actually exist ?
*
* @return true if the resource exists.
*/
public boolean exists()
{
try {
structure.retrieve(this.slideToken,
this.requestUri);
} catch (Exception e) {
return false;
}
return true;
}
/**
* 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
*/
public OutputStream getOutputStream() throws IOException,
SourceException {
if (outputstream==null)
outputstream = new
SlideSourceOutputStream();
return outputstream;
}
/**
* Can the data sent to an <code>OutputStream</code> returned by
* {@link #getOutputStream()} be cancelled ?
*
* @return true if the stream can be cancelled
*/
public boolean canCancel(OutputStream stream) {
return outputstream.canCancel();
}
/**
* Cancel the data sent to an <code>OutputStream</code> returned by
* {@link #getOutputStream()}.
* <p>
* After cancel, the stream should no more be used.
*/
public void cancel(OutputStream stream) throws SourceException {
if (outputstream==stream) {
try {
outputstream.cancel();
} catch (Exception e) {
throw new
SourceException("Could not cancel output stream", e);
}
}
}
/**
* Tests whether a resource is a collection resource.
*
* @param revisionDescriptor revision descriptor of the resource
*
* @return true if the descriptor represents a collection, false
otherwise
*/
public boolean isCollection
(NodeRevisionDescriptor revisionDescriptor) {
boolean result = false;
if (revisionDescriptor == null)
return true;
NodeProperty property =
revisionDescriptor.getProperty("resourcetype");
if ((property != null)
&&
(property.getValue().equals("<collection/>"))) {
result = true;
}
return result;
}
/**
* A file outputStream that will rename the temp file to the
destination file upon close()
* and discard the temp file upon cancel().
*/
public class SlideSourceOutputStream extends ByteArrayOutputStream {
private boolean isClosed = false;
public void close() throws IOException {
super.close();
try {
NodeRevisionDescriptors revisionDescriptors =
content.retrieve(slideToken, requestUri);
NodeRevisionDescriptor
revisionDescriptor;
if
(revisionNumber!=null)
revisionDescriptor =
content.retrieve(slideToken, revisionDescriptors, revisionNumber);
else
//
Retrieve latest revision descriptor
revisionDescriptor =
content.retrieve(slideToken, revisionDescriptors);
NodeRevisionContent
revisionContent =
new
NodeRevisionContent();
byte[] bytes =
toByteArray();
revisionContent.setContent(bytes);
revisionDescriptor.setContentLength(bytes.length);
// Last modification
date
revisionDescriptor.setLastModified(new Date());
//token.begin();
if
(revisionNumber==null)
content.create(slideToken, requestUri, revisionDescriptor, null);
content.store(slideToken, requestUri, revisionDescriptor,
revisionContent);
//token.commit();
} catch (Exception e) {
// FIXME: What should
I do?
e.printStackTrace();
} finally {
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();
}
}
}
1.1
xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/SlideSourceFactory.java
Index: SlideSourceFactory.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.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
import org.apache.avalon.framework.logger.AbstractLoggable;
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.cocoon.Constants;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceFactory;
import org.apache.slide.common.Domain;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Map;
/**
* A factory for sources from jakarta slide domains. The sources wrappers
* to the stores of slide. It uses slide:// as pseudo-protocoll. It is also
* possible to get access to the store
* via webdav.
*
* Possible parameter are username and revision
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a>
* @version $Id: SlideSourceFactory.java,v 1.1 2002/05/22 15:28:38 nicolaken Exp $
*/
public class SlideSourceFactory extends AbstractLoggable
implements SourceFactory, ThreadSafe/*, Contextualizable, Configurable*/ {
/** The context */
// protected org.apache.cocoon.environment.Context context;
/** Contextualize this class */
/* public void contextualize(Context context)
throws ContextException {
this.context = (org.apache.cocoon.environment.Context)
context.get(Constants.CONTEXT_ENVIRONMENT_CONTEXT);
}*/
/**
* Pass the Configuration to the Configurable class. This method must
* always be called after the constructor and before any other method.
*
* @param configuration the class configurations.
*/
/* public void configure(Configuration configuration)
throws ConfigurationException {
if (configuration!=null) {
Configuration domainconfiguration =
configuration.getChild("domain-configuration");
if (domainconfiguration!=null) {
try {
System.out.println("domain-configuration = '"+
this.context.getRealPath(domainconfiguration.getValue())+"'");
Domain.init(this.context.getRealPath(domainconfiguration.getValue()));
} catch (Exception e) {
// Could not initialize the domain
e.printStackTrace();
}
}
}
}*/
/**
* Get a <code>Source</code> object.
* @param parameters This is optional.
*/
public Source getSource( String location, Map parameters )
throws MalformedURLException, IOException {
if ((this.getLogger()!=null) && (this.getLogger().isDebugEnabled())) {
this.getLogger().debug( "Creating source object for " + location );
}
return new SlideSource(location, parameters);
}
}
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]