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"/>