stephan     2003/03/05 10:48:00

  Modified:    src/blocks/slide/conf slide-repository.xconf
                        slide-repository.xroles
               src/blocks/slide/java/org/apache/cocoon/components/repository
                        Repository.java
               src/blocks/slide/java/org/apache/cocoon/components/repository/impl
                        SlidePrincipalProvider.java
               src/blocks/slide/java/org/apache/cocoon/components/source/impl
                        SlideSource.java SlideSourceFactory.java
               src/blocks/slide/samples sitemap.xmap
  Log:
  Add transaction support for setProperty, see Bug 17496.
  Add some fixes to use XML fragments in SourceProperties.
  And reverting the usage of the ComponentSelector, since the
  repository role depend heavy on Slide.
  
  Revision  Changes    Path
  1.2       +21 -28    xml-cocoon2/src/blocks/slide/conf/slide-repository.xconf
  
  Index: slide-repository.xconf
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/blocks/slide/conf/slide-repository.xconf,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- slide-repository.xconf    31 Jan 2003 18:08:42 -0000      1.1
  +++ slide-repository.xconf    5 Mar 2003 18:47:59 -0000       1.2
  @@ -1,33 +1,26 @@
   <?xml version="1.0"?>
  -<xconf xpath="/cocoon" unless="[EMAIL 
PROTECTED]'org.apache.cocoon.components.repository.SourceRepositorySelector']">
  +<xconf xpath="/cocoon" unless="repository">
   
  - <!-- Source repositories:
  -   Each source repository handles serveral sources sorted in namspaces. Which
  -   can be access via the RepositorySourceFactory.
  -   -->
  - <component role="org.apache.cocoon.components.repository.SourceRepositorySelector" 
  -            class="org.apache.cocoon.components.ExtendedComponentSelector"
  -            logger="core.repositories"
  -            default="slide">
  +  <!--+ 
  +      | Jakarta Slide repository
  +      |
  +      | The Slide repository handles serveral sources sorted in namspaces.
  +      +-->
  +  <repository logger="core.repositories.slide"
  +              file="context://samples/slide/slide.xconf"/>
   
  -  <!-- Default implementation via Jakarta Slide -->
  -  <component-instance 
class="org.apache.cocoon.components.repository.impl.SlideRepository" 
  -                      name="slide"
  -                      logger="core.repositories.slide"
  -                      file="context://samples/slide/slide.xconf"/>
  - </component>
  +  <!--+
  +      | Principal providers:
  +      | The principal providers handles principals/users, should be used for 
  +      | user management.
  +      +-->
  +  <principal-provider 
role="org.apache.cocoon.components.repository.PrincipalProviderSelector" 
  +                      class="org.apache.cocoon.components.ExtendedComponentSelector"
  +                      logger="core.repositories.principalprovider" default="slide">
   
  - <!-- Principal providers:
  -   The principal providers handles principals/users, they should use for user
  -   management,
  -   -->
  - <component 
role="org.apache.cocoon.components.repository.PrincipalProviderSelector" 
  -            class="org.apache.cocoon.components.ExtendedComponentSelector"
  -            logger="core.repositories.principalprovider" default="slide">
  -
  -  <!-- Default implementation via Jakarta Slide -->
  -  <component-instance 
class="org.apache.cocoon.components.repository.impl.SlidePrincipalProvider" 
  -                      name="slide" 
logger="core.repositories.principalprovider.slide"
  -                      repository="slide" namespace="myrepository"/>
  - </component>
  +    <!-- Default implementation via Jakarta Slide -->
  +    <component-instance 
class="org.apache.cocoon.components.repository.impl.SlidePrincipalProvider" 
  +                        name="slide" 
logger="core.repositories.principalprovider.slide"
  +                        namespace="myrepository"/>
  +  </principal-provider>
   </xconf>
  
  
  
  1.2       +4 -6      xml-cocoon2/src/blocks/slide/conf/slide-repository.xroles
  
  Index: slide-repository.xroles
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/blocks/slide/conf/slide-repository.xroles,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- slide-repository.xroles   31 Jan 2003 18:08:42 -0000      1.1
  +++ slide-repository.xroles   5 Mar 2003 18:47:59 -0000       1.2
  @@ -1,11 +1,9 @@
   <?xml version="1.0"?>
  -<xroles xpath="/role-list" unless="[EMAIL 
PROTECTED]'org.apache.cocoon.components.repository.RepositorySelector']">
  +<xroles xpath="/role-list" unless="[EMAIL 
PROTECTED]'org.apache.cocoon.components.repository.Repository']">
   
  -  <role name="org.apache.cocoon.components.repository.RepositorySelector"
  -        shorthand="repositories"
  -        default-class="org.apache.cocoon.components.ExtendedComponentSelector">
  -    <hint shorthand="slide" 
class="org.apache.cocoon.components.repository.impl.SlideRepository"/>   
  -  </role>
  +  <role name="org.apache.cocoon.components.repository.Repository"
  +        shorthand="repository"
  +        
default-class="org.apache.cocoon.components.repository.impl.SlideRepository"/>
   
     <role name="org.apache.cocoon.components.repository.PrincipalProviderSelector"
           shorthand="principal-provider"
  
  
  
  1.2       +2 -2      
xml-cocoon2/src/blocks/slide/java/org/apache/cocoon/components/repository/Repository.java
  
  Index: Repository.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/blocks/slide/java/org/apache/cocoon/components/repository/Repository.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Repository.java   31 Jan 2003 18:08:43 -0000      1.1
  +++ Repository.java   5 Mar 2003 18:47:59 -0000       1.2
  @@ -66,6 +66,6 @@
   public interface Repository extends Component {
   
       /** Role for the component */
  -    public final static String ROLE = 
"org.apache.cocoon.components.repository.SourceRepository";
  +    public final static String ROLE = 
"org.apache.cocoon.components.repository.Repository";
   }
   
  
  
  
  1.3       +4 -15     
xml-cocoon2/src/blocks/slide/java/org/apache/cocoon/components/repository/impl/SlidePrincipalProvider.java
  
  Index: SlidePrincipalProvider.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/blocks/slide/java/org/apache/cocoon/components/repository/impl/SlidePrincipalProvider.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SlidePrincipalProvider.java       31 Jan 2003 22:49:32 -0000      1.2
  +++ SlidePrincipalProvider.java       5 Mar 2003 18:47:59 -0000       1.3
  @@ -130,7 +130,6 @@
       /** Slide token. */
       // private SlideToken slidetoken;
   
  -    private String repository = null;
       private String namespace = null;
   
       /**
  @@ -156,7 +155,6 @@
       public void configure(Configuration configuration)
         throws ConfigurationException {
   
  -        this.repository = configuration.getAttribute("repository", null);
           this.namespace = configuration.getAttribute("namespace", null);
       }
   
  @@ -169,14 +167,10 @@
        */
       public void initialize() throws Exception {
   
  -        ComponentSelector repositories = null;
           Repository repository = null;
   
           try {
  -            repositories = (ComponentSelector) this.manager.lookup(Repository.ROLE+
  -                "Selector");
  -
  -            repository = (Repository) repositories.select(this.repository);
  +            repository = (Repository) this.manager.lookup(Repository.ROLE);
   
               if ( !(repository instanceof SlideRepository)) {
                   getLogger().error("Can't get Slide repository");
  @@ -203,15 +197,10 @@
           } catch (ComponentException ce) {
               getLogger().error("Could not lookup for component.", ce);
           } finally {
  -            if ((repository!=null) && (repository instanceof Component)) {
  -                repositories.release((Component) repository);
  +            if (repository!=null) {
  +                this.manager.release(repository);
               }
               repository = null;
  -
  -            if (repositories!=null) {
  -                this.manager.release(repositories);
  -            }
  -            repositories = null;
           }
       }
   
  
  
  
  1.5       +91 -19    
xml-cocoon2/src/blocks/slide/java/org/apache/cocoon/components/source/impl/SlideSource.java
  
  Index: SlideSource.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/blocks/slide/java/org/apache/cocoon/components/source/impl/SlideSource.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- SlideSource.java  15 Feb 2003 22:56:25 -0000      1.4
  +++ SlideSource.java  5 Mar 2003 18:47:59 -0000       1.5
  @@ -55,11 +55,16 @@
   import java.io.IOException;
   import java.io.InputStream;
   import java.io.OutputStream;
  +import java.io.StringReader;
   import java.util.ArrayList;
   import java.util.Date;
   import java.util.Enumeration;
   import java.util.Vector;
   
  +import org.apache.avalon.framework.component.Component;
  +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.context.Context;
   import org.apache.avalon.framework.context.ContextException;
   import org.apache.avalon.framework.context.Contextualizable;
  @@ -81,6 +86,7 @@
   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.slide.authenticate.CredentialsToken;
   import org.apache.slide.common.NamespaceAccessToken;
   import org.apache.slide.common.NamespaceConfig;
  @@ -99,6 +105,9 @@
   import org.apache.slide.structure.Structure;
   import org.apache.slide.structure.SubjectNode;
   
  +import org.w3c.dom.Document;
  +import org.xml.sax.InputSource;
  +
   /**
    * A sources from jakarta slide repositories.
    *
  @@ -106,13 +115,16 @@
    * @version $Id$
    */
   public class SlideSource extends AbstractLogEnabled
  -  implements Contextualizable, Source, ModifiableSource,
  +  implements Contextualizable, Composable, Source, ModifiableSource,
                ModifiableTraversableSource, MoveableSource, RestrictableSource,
                LockableSource, InspectableSource, VersionableSource {
   
       /** Component context */
       private Context context;
   
  +    /** Component manager */
  +    private ComponentManager manager;
  +
       /** Namespace access token. */
       private NamespaceAccessToken nat;
   
  @@ -190,7 +202,7 @@
           this.config = this.nat.getNamespaceConfig();
           this.scheme = scheme;
           this.path = path;
  -        this.uri = scheme+"://"+path;
  +        this.uri = scheme+":/"+path;
   
           this.sourcerevision = sourcerevision;
           this.sourcerevisionbranch = sourcerevisionbranch;
  @@ -217,13 +229,13 @@
   
           } catch (RevisionDescriptorNotFoundException rdnfe) {
   
  -            //getLogger().warn("Could not retrieve revision descriptor", rdnfe);
  +            // getLogger().warn("Could not retrieve revision descriptor", rdnfe);
   
               this.revisionDescriptor = null;
               this.sourcerevision = null;
               this.sourcerevisionbranch = null;
           } catch (ObjectNotFoundException onfe) {
  -            //getLogger().debug("Source doesn't exist", onfe);
  +            // getLogger().debug("Source doesn't exist", onfe);
               // ignore
           } catch (SlideException se) {
               throw new SourceException("Access denied for source '"+this.uri+
  @@ -244,6 +256,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;
  +    }
  +
  +    /**
        * 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
  @@ -537,7 +561,7 @@
   
               } catch (Exception e) {
                   if (e instanceof IOException) {
  -                    throw (IOException)e;
  +                    throw (IOException) e;
                   }
                   throw new CascadingIOException("Could not create source", e);
               } finally {
  @@ -576,7 +600,7 @@
       /**
        * Move the current source to a specified destination.
        *
  -     * @param source     
  +     * @param source
        *
        * @throws SourceException If an exception occurs during
        *                         the move.
  @@ -599,7 +623,7 @@
       /**
        * Copy the current source to a specified destination.
        *
  -     * @param source     
  +     * @param source
        *
        * @throws SourceException If an exception occurs during
        *                         the copy.
  @@ -1574,6 +1598,7 @@
        */
       public void setSourceProperty(SourceProperty sourceproperty)
         throws SourceException {
  +        getLogger().debug("Set source property");
           try {
               revisionDescriptor.setProperty(sourceproperty.getName(),
                                              sourceproperty.getNamespace(),
  @@ -1582,10 +1607,17 @@
               // Last modification date
               revisionDescriptor.setLastModified(new Date());
   
  +            nat.begin();
               content.store(slideToken, this.config.getFilesPath()+this.path,
                             revisionDescriptor, null);
  -        } catch (SlideException se) {
  -            throw new SourceException("Could not set property", se);
  +            nat.commit();
  +        } catch (Exception se) {
  +            try {
  +                nat.rollback();
  +            } catch (Exception rbe) {
  +                getLogger().error("Rollback failed for setting a source property", 
rbe);
  +            }
  +            throw new SourceException("Could not set source property", se);
           }
       }
   
  @@ -1607,9 +1639,28 @@
               return null;
           }
   
  -        return new SourceProperty(namespace, name,
  -                                  revisionDescriptor.getProperty(name,
  -                                      namespace).getValue().toString());
  +        final String quote = "\"";
  +        NodeProperty np = revisionDescriptor.getProperty(name, namespace);
  +        String pre = "<"+name+" xmlns="+quote+namespace+quote+" >";
  +        String post = "</"+name+" >";
  +
  +        StringReader reader = new StringReader(pre+np.getValue().toString()+
  +                                               post);
  +        InputSource src = new InputSource(reader);
  +
  +        DOMParser parser = null;
  +        Document doc = null;
  +
  +        try {
  +            parser = (DOMParser) this.manager.lookup(DOMParser.ROLE);
  +            doc = parser.parseDocument(src);
  +        } catch (Exception e) {
  +            throw new SourceException("Could not parse property", e);
  +        } finally {
  +            this.manager.release((Component) parser);
  +        }
  +
  +        return new SourceProperty(doc.getDocumentElement());
       }
   
       /**
  @@ -1627,13 +1678,34 @@
   
           Vector sourceproperties = new Vector();
   
  -        NodeProperty property;
  +        DOMParser parser = null;
  +        String xml = "";
  +
  +        try {
  +            parser = (DOMParser) this.manager.lookup(DOMParser.ROLE);
  +            final String quote = "\"";
  +
  +            for (Enumeration e = revisionDescriptor.enumerateProperties();
  +                e.hasMoreElements(); ) {
  +                NodeProperty property = (NodeProperty) e.nextElement();
  +                String name = property.getName();
  +                String namespace = property.getNamespace();
  +                String pre = "<"+name+" xmlns="+quote+namespace+quote+" >";
  +                String post = "</"+name+" >";
  +
  +                xml = pre+property.getValue().toString()+post;
  +                StringReader reader = new StringReader(xml);
  +
  +                Document doc = parser.parseDocument(new InputSource(reader));
   
  -        for (Enumeration e = revisionDescriptor.enumerateProperties();
  -            e.hasMoreElements(); ) {
  -            property = (NodeProperty) e.nextElement();
  -            sourceproperties.addElement(new SourceProperty(property.getNamespace(),
  -                property.getName(), property.getValue().toString()));
  +                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()];
  
  
  
  1.3       +5 -14     
xml-cocoon2/src/blocks/slide/java/org/apache/cocoon/components/source/impl/SlideSourceFactory.java
  
  Index: SlideSourceFactory.java
  ===================================================================
  RCS file: 
/home/cvs/xml-cocoon2/src/blocks/slide/java/org/apache/cocoon/components/source/impl/SlideSourceFactory.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SlideSourceFactory.java   31 Jan 2003 22:49:32 -0000      1.2
  +++ SlideSourceFactory.java   5 Mar 2003 18:47:59 -0000       1.3
  @@ -166,14 +166,9 @@
               path = "/";
           }
   
  -        ComponentSelector repositories = null;
           Repository repository = null;
  -
           try {
  -            repositories = (ComponentSelector) this.manager.lookup(Repository.ROLE+
  -                "Selector");
  -
  -            repository = (Repository) repositories.select(repositoryname);
  +            repository = (Repository) this.manager.lookup(Repository.ROLE);
   
               if ( !(repository instanceof SlideRepository)) {
                   getLogger().error("Can't get Slide repository");
  @@ -195,21 +190,17 @@
   
               source.enableLogging(getLogger());
               source.contextualize(this.context);
  +            source.compose(this.manager);
   
               return source;
   
           } catch (ComponentException ce) {
               getLogger().error("Could not lookup for component.", ce);
           } finally {
  -            if ((repository!=null) && (repository instanceof Component)) {
  -                repositories.release((Component) repository);
  +            if (repository!=null) {
  +                this.manager.release(repository);
               }
               repository = null;
  -
  -            if (repositories!=null) {
  -                this.manager.release(repositories);
  -            }
  -            repositories = null;
           }
   
           return null;
  
  
  
  1.6       +1 -1      xml-cocoon2/src/blocks/slide/samples/sitemap.xmap
  
  Index: sitemap.xmap
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/blocks/slide/samples/sitemap.xmap,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- sitemap.xmap      26 Feb 2003 15:28:32 -0000      1.5
  +++ sitemap.xmap      5 Mar 2003 18:48:00 -0000       1.6
  @@ -128,7 +128,7 @@
   
      <!-- =============  Source description ============= -->
      <map:match pattern="description/*/**">
  -    <map:generate type="sourcedescription" 
src="slide://{2}?cocoon-source-principal={1}">
  +    <map:generate type="sourcedescription" 
src="slide:/{2}?cocoon-source-principal={1}">
        <map:parameter name="repository" value="slide"/>
        <map:parameter name="namespace" value="myrepository"/>
        <map:parameter name="properties" value="true"/>
  
  
  

Reply via email to