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]