stephan 2002/06/24 09:26:15 Modified: src/scratchpad/src/org/apache/cocoon/components/source LockableSource.java RestrictableSource.java VersionableSource.java src/scratchpad/src/org/apache/cocoon/components/source/helpers SourceProperty.java src/scratchpad/src/org/apache/cocoon/components/source/impl SlideSource.java src/scratchpad/src/org/apache/cocoon/generation SourceDescriptionGenerator.java Added: src/scratchpad/src/org/apache/cocoon/components/source SourceInspector.java TraversableSource.java src/scratchpad/src/org/apache/cocoon/components/source/impl XPathSourceInspector.java Removed: src/scratchpad/src/org/apache/cocoon/components/source BrowseableSource.java Log: Implementation of a replacement for the several DirectoryGenerators through SourceInspectors. Clean up the SourceProperty. Renamed the BrowseableSource to TraversableSource, also added the method getParent to this Interface. Revision Changes Path 1.2 +2 -2 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/LockableSource.java Index: LockableSource.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/LockableSource.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- LockableSource.java 21 Jun 2002 13:39:42 -0000 1.1 +++ LockableSource.java 24 Jun 2002 16:26:14 -0000 1.2 @@ -65,7 +65,7 @@ /** * A source, which could be locked * - * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> * @version $Id$ */ public interface LockableSource extends Source { 1.2 +2 -2 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/RestrictableSource.java Index: RestrictableSource.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/RestrictableSource.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- RestrictableSource.java 21 Jun 2002 13:39:42 -0000 1.1 +++ RestrictableSource.java 24 Jun 2002 16:26:14 -0000 1.2 @@ -63,7 +63,7 @@ /** * A source, which is restrictable, which means you need a username and password. * - * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> * @version $Id$ */ public interface RestrictableSource extends Source { 1.2 +2 -2 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/VersionableSource.java Index: VersionableSource.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/VersionableSource.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- VersionableSource.java 21 Jun 2002 13:39:43 -0000 1.1 +++ VersionableSource.java 24 Jun 2002 16:26:15 -0000 1.2 @@ -61,7 +61,7 @@ /** * A source, which could exist in different versions * - * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> * @version $Id$ */ public interface VersionableSource extends Source { 1.1 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/SourceInspector.java Index: SourceInspector.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.component.Component; import org.apache.excalibur.source.Source; import org.apache.excalibur.source.SourceException; import org.apache.cocoon.components.source.helpers.SourceProperty; /** * A source inspector helps to get properties from sources * * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> * @version $Id: SourceInspector.java,v 1.1 2002/06/24 16:26:14 stephan Exp $ */ public interface SourceInspector extends Component { public final static String ROLE = "org.apache.cocoon.components.source.SourceInspector"; public SourceProperty getSourceProperty(Source source, String namespace, String name) throws SourceException; public SourceProperty[] getSourceProperties(Source source) throws SourceException; } 1.1 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/TraversableSource.java Index: TraversableSource.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.util.Enumeration; /** * A source, which can a directory or collection of sources. * * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> * @version $Id: TraversableSource.java,v 1.1 2002/06/24 16:26:15 stephan Exp $ */ public interface TraversableSource extends Source { /** * If the source a directory or a collection */ public boolean isSourceCollection() throws SourceException; /** * Returns the count of child sources. */ public int getChildSourceCount() throws SourceException; /** * Return the system id of a child source. * * @param index Index of the child */ public String getChildSource(int index) throws SourceException; /** * Return the system if of the parent source. The method should return * null if the source hasn't a parent. */ public String getParent(); } 1.2 +65 -15 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/helpers/SourceProperty.java Index: SourceProperty.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/helpers/SourceProperty.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SourceProperty.java 21 Jun 2002 13:39:43 -0000 1.1 +++ SourceProperty.java 24 Jun 2002 16:26:15 -0000 1.2 @@ -55,10 +55,17 @@ package org.apache.cocoon.components.source.helpers; +import org.apache.avalon.excalibur.xml.XMLizable; + import org.apache.cocoon.xml.dom.DOMBuilder; +import org.apache.cocoon.xml.dom.DOMStreamer; + import org.w3c.dom.Document; import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; @@ -66,10 +73,10 @@ /** * This interface for a property of a source * - * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> * @version $Id$ */ -public class SourceProperty { +public class SourceProperty implements XMLizable { private String namespace; private String name; @@ -94,12 +101,17 @@ * @param name The name of the property * @param value The value of the property */ - /*public SourceProperty(String namespace, String name, String value) { + public SourceProperty(String namespace, String name, String value) { this.namespace = namespace; this.name = name; - this.value = value; - }*/ + setValue(value); + } + /** + * Creates a new property for a source + * + * @param property The property in DOM representation + */ public SourceProperty(Element property) { this.namespace = property.getNamespaceURI(); this.name = property.getLocalName(); @@ -154,6 +166,9 @@ DOMBuilder builder = new DOMBuilder(); builder.startDocument(); builder.startElement(namespace, name, name, new AttributesImpl()); + + builder.characters(value.toCharArray(), 0, value.length()); + builder.endElement(namespace, name, name); builder.endDocument(); @@ -169,9 +184,17 @@ * * @return Value of the property */ - /*public String getValueAsString() { - return this.value; - }*/ + public String getValueAsString() { + + NodeList nodeslist = this.value.getChildNodes(); + StringBuffer buffer = new StringBuffer(); + for(int i=0; i<nodeslist.getLength(); i++) + if ((nodeslist.item(i).getNodeType()==Node.TEXT_NODE) || + (nodeslist.item(i).getNodeType()==Node.CDATA_SECTION_NODE)) + buffer.append(nodeslist.item(i).getNodeValue()); + + return buffer.toString(); + } /** * Sets the value of the property @@ -185,15 +208,42 @@ } /** - * Returns the value of the property - * - * @return Value of the property + * Sets the value of the property + * + * @param value Value of the property */ - /*public String getValueAsElement() { - return this.value; - }*/ + public void setValue(NodeList values) { + try { + DOMBuilder builder = new DOMBuilder(); + builder.startDocument(); + builder.startElement(namespace, name, name, new AttributesImpl()); + + DOMStreamer stream = new DOMStreamer(builder); + for (int i = 0; i < values.getLength(); i++) + stream.stream(values.item(i)); + + builder.endElement(namespace, name, name); + builder.endDocument(); + + Document doc = builder.getDocument(); + this.value = doc.getDocumentElement(); + } catch (SAXException se) { + // do nothing + } + } public Element getValue() { return this.value; + } + + /** + * Generates SAX events representing the object's state.<br/> + * <b>NOTE</b> : if the implementation can produce lexical events, care should be taken + * that <code>handler</code> can actually be a {@link org.apache.cocoon.xml.XMLConsumer} that accepts such + * events. + */ + public void toSAX(ContentHandler handler) throws SAXException { + DOMStreamer stream = new DOMStreamer(handler); + stream.stream(this.value); } } 1.3 +17 -3 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/impl/SlideSource.java Index: SlideSource.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/impl/SlideSource.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- SlideSource.java 22 Jun 2002 18:00:01 -0000 1.2 +++ SlideSource.java 24 Jun 2002 16:26:15 -0000 1.3 @@ -67,10 +67,10 @@ import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.cocoon.Constants; -import org.apache.cocoon.components.source.BrowseableSource; import org.apache.cocoon.components.source.InspectableSource; import org.apache.cocoon.components.source.LockableSource; import org.apache.cocoon.components.source.RestrictableSource; +import org.apache.cocoon.components.source.TraversableSource; import org.apache.cocoon.components.source.WriteableSource; import org.apache.cocoon.components.source.VersionableSource; import org.apache.cocoon.components.source.helpers.SourceCredential; @@ -131,7 +131,7 @@ * @version $Id$ */ public class SlideSource extends AbstractLoggable implements - Source, WriteableSource, BrowseableSource, RestrictableSource, + Source, WriteableSource, TraversableSource, RestrictableSource, LockableSource/*, InspectableSource*/, VersionableSource { /** Component manager */ @@ -518,6 +518,20 @@ } catch (SlideException se) { throw new SourceException("Could not get children", se); } + } + + /** + * Return the system if of the parent source. The method should return + * null if the source hasn't a parent. + */ + public String getParent() { + if ((this.uri==null) || (this.uri.length()<=1)) + return null; + + if (this.uri.endsWith("/")) + return this.uri.substring(0, this.uri.substring(0,this.uri.length()-1).lastIndexOf("/")); + + return this.uri.substring(0, this.uri.lastIndexOf("/")); } /** 1.1 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/components/source/impl/XPathSourceInspector.java Index: XPathSourceInspector.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.impl; import org.apache.avalon.excalibur.xml.Parser; import org.apache.avalon.excalibur.xml.xpath.XPathProcessor; import org.apache.avalon.framework.activity.Startable; import org.apache.avalon.framework.component.ComponentException; import org.apache.avalon.framework.component.ComponentManager; import org.apache.avalon.framework.component.Composable; import org.apache.avalon.framework.logger.AbstractLoggable; import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.parameters.Parameterizable; import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.excalibur.source.Source; import org.apache.excalibur.source.SourceException; import org.apache.cocoon.components.source.SourceInspector; import org.apache.cocoon.components.source.helpers.SourceProperty; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import java.io.IOException; /** * This source inspector inspects XML files with a xpath expression * * @author <a href="mailto:[EMAIL PROTECTED]">Stephan Michels</a> * @version $Id: XPathSourceInspector.java,v 1.1 2002/06/24 16:26:15 stephan Exp $ */ public class XPathSourceInspector extends AbstractLoggable implements SourceInspector, ThreadSafe, Parameterizable { private String propertynamespace = "http://xml.apache.org/cocoon/XPathSourceInspector"; private String propertyname = "result"; private String extension = null; private String xpath = null; private ComponentManager manager = null; public void compose(ComponentManager manager) { this.manager = manager; } public void parameterize(Parameters params) { this.propertynamespace = params.getParameter("namespace", "http://xml.apache.org/cocoon/XPathSourceInspector"); this.propertyname = params.getParameter("name", "result"); this.extension = params.getParameter("extension", ".xml"); this.xpath = params.getParameter("xpath", "/*"); } public SourceProperty getSourceProperty(Source source, String namespace, String name) throws SourceException { if ((namespace.equals(propertynamespace)) && (name.equals(propertyname)) && (source.getSystemId().endsWith(extension))) { Parser parser = null; Document doc = null; try { parser = (Parser)manager.lookup(Parser.ROLE); doc = parser.parseDocument(new InputSource(source.getInputStream())); } catch (SAXException se) { this.getLogger().error(source.getSystemId() + " is not a valid XML file"); } catch (IOException ioe) { this.getLogger().error("Could not read file", ioe); } catch (ComponentException ce) { this.getLogger().error("Could not retrieve component", ce); } finally { if (parser!=null) this.manager.release(parser); } if (doc != null) { XPathProcessor processor = null; try { processor = (XPathProcessor)manager.lookup(XPathProcessor.ROLE); NodeList nodelist = processor.selectNodeList(doc.getDocumentElement(), this.xpath); SourceProperty property = new SourceProperty(this.propertynamespace, this.propertyname); property.setValue(nodelist); return property; } catch (ComponentException ce) { this.getLogger().error("Could not retrieve component", ce); } finally { if (processor!=null) this.manager.release(processor); } } } return null; } public SourceProperty[] getSourceProperties(Source source) throws SourceException { SourceProperty property = getSourceProperty(source, this.propertynamespace, this.propertyname); if (property!=null) return new SourceProperty[]{property}; return null; } } 1.2 +5 -5 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/generation/SourceDescriptionGenerator.java Index: SourceDescriptionGenerator.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/generation/SourceDescriptionGenerator.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- SourceDescriptionGenerator.java 21 Jun 2002 13:39:43 -0000 1.1 +++ SourceDescriptionGenerator.java 24 Jun 2002 16:26:15 -0000 1.2 @@ -65,7 +65,7 @@ import org.apache.avalon.framework.parameters.Parameters; import org.apache.cocoon.ProcessingException; -import org.apache.cocoon.components.source.BrowseableSource; +import org.apache.cocoon.components.source.TraversableSource; import org.apache.cocoon.components.source.InspectableSource; import org.apache.cocoon.components.source.LockableSource; import org.apache.cocoon.components.source.RestrictableSource; @@ -199,8 +199,8 @@ pushSourcePermissions((RestrictableSource)source);*/ if (source instanceof LockableSource) pushSourceLocks((LockableSource)source); - if ((source instanceof BrowseableSource) && (deep>0)) - pushSourceChilds((BrowseableSource)source, deep); + if ((source instanceof TraversableSource) && (deep>0)) + pushSourceChilds((TraversableSource)source, deep); this.contentHandler.endElement(RDF_NS, DESCRIPTION_NODE_NAME, RDF_PREFIX+':'+DESCRIPTION_NODE_NAME); } catch (SAXException saxe) { throw saxe; @@ -209,7 +209,7 @@ } } - private void pushSourceChilds(BrowseableSource source, int deep) + private void pushSourceChilds(TraversableSource source, int deep) throws SAXException, SourceException, ProcessingException, IOException { if (source.isSourceCollection()) {
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]