You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by gc...@apache.org on 2003/08/22 14:23:41 UTC

cvs commit: cocoon-2.1/src/blocks/webdav/java/org/apache/cocoon/components/source/impl WebDAVSource.java WebDAVSourceFactory.java

gcasper     2003/08/22 05:23:41

  Modified:    src/blocks/webdav/java/org/apache/cocoon/components/source/impl
                        WebDAVSource.java WebDAVSourceFactory.java
  Log:
  Implemented InspectableSource.
  I know, the design of the InspectableSource interface (and the
  SourceProperty class in particular) is debatable.
  I just want to first come up with an easy tryable sample before discussing
  it.
  
  Revision  Changes    Path
  1.5       +178 -3    cocoon-2.1/src/blocks/webdav/java/org/apache/cocoon/components/source/impl/WebDAVSource.java
  
  Index: WebDAVSource.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/webdav/java/org/apache/cocoon/components/source/impl/WebDAVSource.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- WebDAVSource.java	27 Jul 2003 20:53:39 -0000	1.4
  +++ WebDAVSource.java	22 Aug 2003 12:23:41 -0000	1.5
  @@ -56,9 +56,11 @@
   import java.io.IOException;
   import java.io.InputStream;
   import java.io.OutputStream;
  +import java.io.StringReader;
   import java.util.Collection;
   import java.util.Iterator;
   import java.util.Vector;
  +import java.util.Enumeration;
   
   import javax.xml.transform.TransformerFactory;
   import javax.xml.transform.sax.SAXTransformerFactory;
  @@ -68,18 +70,31 @@
   import org.apache.cocoon.components.source.RestrictableSource;
   import org.apache.cocoon.components.source.helpers.SourceCredential;
   import org.apache.cocoon.components.source.helpers.SourcePermission;
  +import org.apache.cocoon.components.source.helpers.SourceProperty;
  +import org.apache.cocoon.components.source.InspectableSource;
   import org.apache.commons.httpclient.HttpException;
  +import org.apache.avalon.framework.component.Composable;
  +import org.apache.avalon.framework.component.Component;
  +import org.apache.avalon.framework.component.ComponentManager;
  +import org.apache.avalon.framework.component.ComponentException;
   import org.apache.excalibur.source.ModifiableTraversableSource;
   import org.apache.excalibur.source.Source;
   import org.apache.excalibur.source.SourceException;
   import org.apache.excalibur.source.SourceValidity;
   import org.apache.excalibur.source.impl.validity.TimeStampValidity;
  +import org.apache.excalibur.xml.dom.DOMParser;
   import org.apache.util.HttpURL;
   import org.apache.webdav.lib.WebdavResource;
   import org.apache.webdav.lib.methods.DepthSupport;
  +import org.apache.webdav.lib.Property;
  +import org.apache.webdav.lib.PropertyName;
  +import org.apache.webdav.lib.ResponseEntity;
   import org.xml.sax.ContentHandler;
   import org.xml.sax.SAXException;
   import org.xml.sax.helpers.AttributesImpl;
  +import org.xml.sax.InputSource;
  +
  +import org.w3c.dom.Document;
   
   /**
    *  A source implementation to get access to WebDAV repositories. Use it
  @@ -90,8 +105,8 @@
    *  @author <a href="mailto:d.madama@pro-netics.com">Daniele Madama</a>
    *  @version $Id$
   */
  -public class WebDAVSource
  -    implements Source, RestrictableSource, ModifiableTraversableSource {
  +public class WebDAVSource implements Composable, Source,
  +    RestrictableSource, ModifiableTraversableSource, InspectableSource {
   
   
       private final String NAMESPACE = "http://apache.org/cocoon/webdav/1.0";
  @@ -102,6 +117,8 @@
   
       private final String COLLECTION_NAME = "collection";
   
  +    private ComponentManager manager = null;
  +
       private String systemId;
       
       private String location;
  @@ -193,6 +210,18 @@
       }
   
       /**
  +     * Pass the ComponentManager to the composer. The Composable implementation
  +     * should use the specified ComponentManager to acquire the components it needs for execution
  +     *
  +     * @param manager The ComponentManager which this Composable uses
  +     *
  +     * @throws ComponentException
  +     */
  +    public void compose(ComponentManager manager) throws ComponentException {
  +        this.manager = manager;
  +    }
  +
  +    /**
        * Get the scheme for this Source (webdav://).
        */
   
  @@ -670,5 +699,151 @@
           }
       }
       
  +    /**
  +     * Returns a enumeration of the properties
  +     *
  +     * @return Enumeration of SourceProperty
  +     *
  +     * @throws SourceException If an exception occurs.
  +     */
  +     public SourceProperty[] getSourceProperties() throws SourceException {
  +
  +         Vector sourceproperties = new Vector();
  +         DOMParser parser = null;
  +         String xml = "";
  +         Enumeration props= null;
  +         org.apache.webdav.lib.Property prop = null;
  +         String propValue = null;
  +        
  +         try {
  +             parser = (DOMParser)this.manager.lookup(DOMParser.ROLE);
  +             Enumeration responses = this.resource.propfindMethod(0);
  +             while (responses.hasMoreElements()) {
  +
  +                 ResponseEntity response = (ResponseEntity)responses.nextElement();
  +                 props = response.getProperties();
  +                 final String quote = "\"";
  +                 while (props.hasMoreElements()) {
  +
  +                     prop = (Property) props.nextElement();
  +                     String localName = prop.getLocalName();
  +                     String namespaceURI = prop.getNamespaceURI();
  +                     String pre = "<"+localName+" xmlns="+quote+namespaceURI+quote+" >";
  +                     String post = "</"+localName+" >";
  +                     propValue = prop.getPropertyAsString();
  +                     xml = pre+propValue+post;
  +                     StringReader reader = new StringReader(xml);
  +                     Document doc = parser.parseDocument(new InputSource(reader));
  +                     SourceProperty srcProperty = new SourceProperty(doc.getDocumentElement());
  +                     sourceproperties.addElement(srcProperty);
  +                 }
  +             }
  +
  +         } catch (Exception e) {
  +             throw new SourceException("Could not parse property "+xml, e);
  +
  +         } finally {
  +             this.manager.release((Component) parser);
  +         }
  +         SourceProperty[] sourcepropertiesArray = new SourceProperty[sourceproperties.size()];
  +         for (int i = 0; i<sourceproperties.size(); i++) {
  +             sourcepropertiesArray[i] = (SourceProperty) sourceproperties.elementAt(i);
  +         }
  +         return sourcepropertiesArray;
  +    }
  +
  +    /**
  +     * 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 {
  +
  +          Vector sourceproperties = new Vector();
  +          DOMParser parser = null;
  +          String xml = "";
  +          Enumeration props= null;
  +          org.apache.webdav.lib.Property prop = null;
  +          String propValue = null;
  +
  +          try {
  +              parser = (DOMParser)this.manager.lookup(DOMParser.ROLE);
  +              Enumeration responses = this.resource.propfindMethod(0);
  +              while (responses.hasMoreElements()) {
  +                  ResponseEntity response = (ResponseEntity)responses.nextElement();
  +                  props = response.getProperties();
  +                  final String quote = "\"";
  +                  while (props.hasMoreElements()) {
  +                      prop = (Property) props.nextElement();
  +
  +                      if (namespace.equals(prop.getNamespaceURI())
  +                          && name.equals(prop.getLocalName())){
  +
  +                          String localName = prop.getLocalName();
  +                          String namespaceURI = prop.getNamespaceURI();
  +                          String pre = "<"+localName+" xmlns="+quote+namespaceURI+quote+" >";
  +                          String post = "</"+localName+" >";
  +                          propValue = prop.getPropertyAsString();
  +                          xml = pre+propValue+post;
  +                          StringReader reader = new StringReader(xml);
  +                          Document doc = parser.parseDocument(new InputSource(reader));
  +    
  +                          return new SourceProperty(doc.getDocumentElement());
  +                      }
  +
  +                  }
  +              }
  +          } catch (Exception e) {
  +              throw new SourceException("Could not parse property "+xml, e);
  +          } finally {
  +              this.manager.release((Component) parser);
  +          }
  +          return null;
  +    }
  +
  +    /**
  +     * 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 {
  +
  +        try {
  +            this.resource.proppatchMethod(new PropertyName(namespace, name), "", false);
  +        } catch (Exception e) {
  +            throw new SourceException("Could not remove property ", e);
  +        }
  +    }
  +
  +    /**
  +     * Sets a property for a source.
  +     *
  +     * @param sourceproperty Property of the source
  +     *
  +     * @throws SourceException If an exception occurs during this operation
  +     */
  +    public void setSourceProperty(SourceProperty sourceproperty)
  +    throws SourceException {
  +
  +        try {
  +            // FIXME SourceProperty.getValueAsString only delivers Text nodes
  +            this.resource.proppatchMethod(
  +                   new PropertyName(sourceproperty.getNamespace(),sourceproperty.getName()),
  +                   sourceproperty.getValueAsString(), true);
  +        } catch (Exception e) {
  +            throw new SourceException("Could not set property ", e);
  +        }
  +    }
  +
   
   }
  
  
  
  1.4       +9 -2      cocoon-2.1/src/blocks/webdav/java/org/apache/cocoon/components/source/impl/WebDAVSourceFactory.java
  
  Index: WebDAVSourceFactory.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/webdav/java/org/apache/cocoon/components/source/impl/WebDAVSourceFactory.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- WebDAVSourceFactory.java	17 Jul 2003 12:24:52 -0000	1.3
  +++ WebDAVSourceFactory.java	22 Aug 2003 12:23:41 -0000	1.4
  @@ -54,6 +54,7 @@
   import java.net.MalformedURLException;
   import java.util.Map;
   
  +import org.apache.avalon.framework.component.Composable;
   import org.apache.avalon.framework.component.ComponentException;
   import org.apache.avalon.framework.component.ComponentManager;
   import org.apache.avalon.framework.logger.AbstractLogEnabled;
  @@ -74,7 +75,7 @@
   */
   public class WebDAVSourceFactory
       extends AbstractLogEnabled
  -    implements SourceFactory, ThreadSafe {
  +    implements SourceFactory, ThreadSafe, Composable {
   
       /** The component manager instance */
       private ComponentManager manager = null;
  @@ -115,6 +116,12 @@
   
           WebDAVSource source =
               WebDAVSource.newWebDAVSource(location, principal, password, protocol);
  +            
  +        try {
  +            source.compose(this.manager);
  +        } catch (ComponentException ce) {
  +            getLogger().error("Could not lookup for component.", ce);
  +        }
   
           return source;
       }