You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by re...@apache.org on 2001/12/24 23:12:14 UTC

cvs commit: jakarta-slide/src/stores/slidestore/file XMLMemDescriptorsStore.java UriProperties.java AbstractUriProperties.java

remm        01/12/24 14:12:14

  Added:       src/stores/slidestore/file XMLMemDescriptorsStore.java
                        UriProperties.java AbstractUriProperties.java
  Log:
  - Adding many of the contributed patches (sorry for the delay).
  - Filesystem based descriptors store.
  - Code submitted by Marc Decugis <mdecugis at mds-design.fr>
  - From Marc's email:
  
  It's based on the Remy's MemoryDescriptorsStore, but instead of using
  a hashtable for each kind of attributes (permissions,locks,...),
  we defined a hashtable of "UriProperties".
  
  UriProperties encapsulates :
          object
          permissions
          locks
          revisionDescriptors,...
  and is store in XML format with JDOM.
  
  We've tested it with :
          DAVExplorer 0.80
          Mac OS X (work for drag and drop, folder creation).
  
  We are testing it in our application.
  The slide configuration file slide.def we use :
  slide.def
  
      <store name="Fichiers">
        <lockstore>
          <reference store="nodestore" />
        </lockstore>
        <nodestore classname="slidestore.file.XMLMemDescriptorsStore">
          <parameter name="rootpath">/TestsWebDAV</parameter>
        </nodestore>
        <securitystore>
          <reference store="nodestore" />
        </securitystore>
        <revisiondescriptorsstore>
          <reference store="nodestore" />
        </revisiondescriptorsstore>
        <revisiondescriptorstore>
          <reference store="nodestore" />
        </revisiondescriptorstore>
        <contentstore classname="slidestore.reference.FileContentStore">
          <parameter name="rootpath">/TestsWebDAV/contentstore</parameter>
          <parameter name="resetBeforeStarting">false</parameter>
        </contentstore>
      </store>
  
  Revision  Changes    Path
  1.1                  jakarta-slide/src/stores/slidestore/file/XMLMemDescriptorsStore.java
  
  Index: XMLMemDescriptorsStore.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/slidestore/file/XMLMemDescriptorsStore.java,v 1.1 2001/12/24 22:12:14 remm Exp $
   * $Revision: 1.1 $
   * $Date: 2001/12/24 22:12:14 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 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 acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", 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 apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 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/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */
  
  package slidestore.file;
  
  import java.util.Hashtable;
  import java.util.Enumeration;
  import java.util.Vector;
  import java.io.File;
  import org.apache.slide.common.*;
  import org.apache.slide.store.*;
  import org.apache.slide.structure.*;
  import org.apache.slide.security.*;
  import org.apache.slide.lock.*;
  import org.apache.slide.content.*;
  
  /**
   * Memory with persistence, reorganization of the <a href="mailto:remm@apache.org">Remy Maucherat</a>
   * Reference implementation.
   * Use of UriProperties.
   * @author <a href="mailto:mdecugis@mds-desing.fr">Marc D�cugis</a>
   * @contact <a href="mailto:remm@apache.org">Remy Maucherat</a> 
   * @version $Revision: 1.1 $ , $Date: 2001/12/24 22:12:14 $
   */
  public class XMLMemDescriptorsStore extends AbstractService
      implements LockStore, NodeStore, RevisionDescriptorsStore,
      RevisionDescriptorStore, SecurityStore {
      
      
      // ----------------------------------------------------- Instance Variables
      
      
      /** Caches all the uri's definition */
      protected Hashtable definitions;
  
      /**
       * Path from which files are stored.
       */
      protected String rootpath;
  	
  	/**Return de uri properties associated with uri
  	* @return null if the uri has no properties
  	*/
  	protected UriProperties getUriProperties(Uri uri) {
  		return (UriProperties)definitions.get(uri.toString());
  	}
      
      // ---------------------------------------------------- ServiceImpl Methods
      
      
      /**
       * Initializes the descriptors store with a set of parameters.
       * Those could be :
       * <li>User name, login info
       * <li>Host name on which to connect
       * <li>Remote port
       * <li>JDBC driver whoich is to be used :-)
       * <li>Anything else ...
       *
       * @param parameters Hashtable containing the parameters' name
       * and associated value
       */
      public void setParameters(Hashtable parameters)
          throws ServiceParameterErrorException,
          ServiceParameterMissingException {
  		// copy/paste of FileDescriptorsStoreNoVersioning
  		
  		
          // A parameter will tell were serialization files are.
          rootpath = (String) parameters.get("rootpath");
          if (rootpath == null) {
              // Default is that files are stored starting in the 
              // current directory
              rootpath = "";
          }
  		System.out.println("----------- XMLMemDescriptorsStore setParameters rootpath="+rootpath);
      }
      
      
      /**
       * Connects to descriptors store.
       *
       * @exception DataException
       */
      public synchronized void connect()
          throws ServiceConnectionFailedException {
  		System.out.println("----------- XMLMemDescriptorsStore connect definitions="+definitions);
          if (definitions == null) {
              definitions = new Hashtable();
          }
      }
      
      
      /**
       * Disconnects from descriptors store.
       *
       * @exception ServiceDisconnectionFailedException
       */
      public void disconnect()
          throws ServiceDisconnectionFailedException {
      }
      
      
      /**
       * Initializes descriptors store.
       *
       * @exception ServiceInitializationFailedException Throws an exception
       * if the descriptors store has already been initialized before
       */
      public synchronized void initialize(NamespaceAccessToken token)
          throws ServiceInitializationFailedException {
          super.initialize(token);
  		System.out.println("----------- XMLMemDescriptorsStore initialize token="+token);
  		definitions = new Hashtable();
      }
      
      
      /**
       * Deletes descriptors store. Should remove stored data if possible.
       *
       * @exception ServiceResetFailedException Reset failed
       */
      public synchronized void reset()
          throws ServiceResetFailedException {
  		
  		definitions = new Hashtable();
      }
      
      
      /**
       * Does nothing.
       *
       * @exception ServiceAccessException Service access error
       */
      public void commit()
          throws ServiceAccessException {
      }
      
      
      /**
       * This function tells whether or not the descriptors store is connected.
       *
       * @return boolean true if we are connected
       * @exception ServiceAccessException Service access error
       */
      public boolean isConnected()
          throws ServiceAccessException {
          return true;
      }
      
      
      
      // ----------------------------------------------- DescriptorsStore Methods
      
      
      /**
       * Retrive an object from the Descriptors Store.
       *
       * @param uri Uri of the object we want to retrieve
       * @exception ServiceAccessException Error accessing the Descriptors Store
       * @exception ObjectNotFoundException The object to retrieve was not found
       */
      public ObjectNode retrieveObject(Uri uri)
          throws ServiceAccessException, ObjectNotFoundException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore retrieveObject uri="+uri+" aProps="+aProps);
          if (aProps == null) {
  			File aFile=UriProperties.getFile(rootpath,uri);
  			if (aFile.exists()) {
  				try {
  					aProps=new UriProperties(rootpath,uri);
  				}
  				catch (ServiceAccessException e) {
  					throw new ObjectNotFoundException(uri);
  				}
  				definitions.put(uri.toString(),aProps);
  			}
  			else {
  				throw new ObjectNotFoundException(uri);
  			}
          }
          return aProps.retrieveObject(uri);
      }
      
      
      /**
       * Store an object in the Descriptors Store.
       *
       * @param object Object to update
       * @exception ServiceAccessException Error accessing the Descriptors Store
       * @exception ObjectNotFoundException The object to update was not found
       */
      public void storeObject(Uri uri, ObjectNode object)
          throws ServiceAccessException, ObjectNotFoundException {
          UriProperties aProps = getUriProperties(uri);
  		try {
  			if (aProps == null) {
  				aProps=new UriProperties(rootpath,uri);
  				definitions.put(uri.toString(),aProps);
  			}
  		}
  		catch (Throwable t) {
  			t.printStackTrace();
  		}
  		aProps.storeObject(uri,object);
  		System.out.println("----------- XMLMemDescriptorsStore storeObject 3/n uri="+uri+" aProps="+aProps);
  
      }
      
      
      /**
       * Create a new object in the Descriptors Store.
       *
       * @param object SlideObject
       * @param uri Uri of the object we want to create
       * @exception ServiceAccessException Error accessing the Descriptors Store
       * @exception ObjectAlreadyExistsException An object already exists
       * at this Uri
       */
      public void createObject(Uri uri, ObjectNode object)
          throws ServiceAccessException, ObjectAlreadyExistsException {
          try {
  			UriProperties aProps = getUriProperties(uri);
  			System.out.println("----------- XMLMemDescriptorsStore 1/n createObject uri="+uri+" aProps="+aProps);
  			if (aProps == null) {
  				storeObject(uri,object);
              }
  			else {
  				aProps.createObject(uri, object);
  			}
          } catch(ObjectNotFoundException e) {
              // Never happens
          }
      }
      
      
      /**
       * Remove an object from the Descriptors Store.
       *
       * @param object Object to remove
       * @exception ServiceAccessException Error accessing the Descriptors Store
       * @exception ObjectNotFoundException The object to remove was not found
       */
      public void removeObject(Uri uri, ObjectNode object)
          throws ServiceAccessException, ObjectNotFoundException {
  		UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore removeObject 1/n uri="+uri+" aProps="+aProps);
  		if (aProps == null) {
              throw new ObjectNotFoundException(uri);
          }
          aProps.removeObject(uri,object);
  		System.out.println("----------- XMLMemDescriptorsStore removeObject 2/n uri="+uri+" aProps="+aProps);
      }
      
      
      /**
       * Store an object permissions in the Descriptors Store.
       *
       * @param permission Permission we want to create
       * @exception ServiceAccessException Error accessing the Descriptors Store
       */
      public void grantPermission(Uri uri, NodePermission permission)
          throws ServiceAccessException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore grantPermission 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
  			aProps=new UriProperties(rootpath,uri);
  			definitions.put(uri.toString(),aProps);
          }
  		aProps.grantPermission(uri,permission);
  		System.out.println("----------- XMLMemDescriptorsStore grantPermission 2/n uri="+uri+" aProps="+aProps);
      }
      
      
      /**
       * Store an object permissions in the Descriptors Store.
       *
       * @param permission Permission we want to create
       * @exception ServiceAccessException Error accessing the Descriptors Store
       */
      public void revokePermission(Uri uri, NodePermission permission)
          throws ServiceAccessException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore revokePermission 1/n uri="+uri+" aProps="+aProps);
          if (aProps != null) {
  			aProps.revokePermission(uri,permission);
          }
  		System.out.println("----------- XMLMemDescriptorsStore revokePermission 2/n uri="+uri+" aProps="+aProps);
      }
      
      
      /**
       * Revoke all the permissions on the object .
       *
       * @param permission Permission we want to create
       * @exception ServiceAccessException Error accessing the Descriptors Store
       */
      public void revokePermissions(Uri uri)
          throws ServiceAccessException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore revokePermissions 1/n uri="+uri+" aProps="+aProps);
          if (aProps != null) {
  			aProps.revokePermissions(uri);
          }
  		System.out.println("----------- XMLMemDescriptorsStore revokePermissions 2/n uri="+uri+" aProps="+aProps);
      }
      
      
      /**
       * Store an object permissions in the Descriptors Store.
       *
       * @param permission Permission we want to create
       * @exception ServiceAccessException Error accessing the Descriptors Store
       */
      public Enumeration enumeratePermissions(Uri uri)
          throws ServiceAccessException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore enumeratePermissions 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
  			return new Vector().elements();
          }
          else {
  			return aProps.enumeratePermissions();
  		}
      }
      
      
      /**
       * Puts a lock on a subject.
       *
       * @param lock Lock token
       * @exception ServiceAccessException Service access error
       */
      public void putLock(Uri uri, NodeLock lock)
          throws ServiceAccessException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore putLock 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
  			aProps=new UriProperties(rootpath,uri);
  			definitions.put(uri.toString(),aProps);
          }
  		aProps.putLock(uri,lock);
  		System.out.println("----------- XMLMemDescriptorsStore putLock 2/n uri="+uri+" aProps="+aProps);
       }
      
      
      /**
       * Renews a lock.
       *
       * @param lock Token to renew
       * @exception ServiceAccessException Service access error
       * @exception LockTokenNotFoundException Lock token was not found
       */
      public void renewLock(Uri uri, NodeLock lock)
          throws ServiceAccessException, LockTokenNotFoundException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore renewLock 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
  			aProps=new UriProperties(rootpath,uri);
  			definitions.put(uri.toString(),aProps);
          }
  		aProps.renewLock(uri,lock);
  		System.out.println("----------- XMLMemDescriptorsStore renewLock 2/n uri="+uri+" aProps="+aProps);
      }
      
      
      /**
       * Removes (cancels) a lock.
       *
       * @param lock Token to remove
       * @exception ServiceAccessException Service access error
       * @exception LockTokenNotFoundException Lock token was not found
       */
      public void removeLock(Uri uri, NodeLock lock)
          throws ServiceAccessException, LockTokenNotFoundException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore removeLock 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
              throw new LockTokenNotFoundException(lock);
          } else {
  			aProps.removeLock(uri,lock);
          }
  		System.out.println("----------- XMLMemDescriptorsStore removeLock 2/n uri="+uri+" aProps="+aProps);
      }
      
      
      /**
       * Kills a lock.
       *
       * @param lock Token to remove
       * @exception ServiceAccessException Service access error
       * @exception LockTokenNotFoundException Lock token was not found
       */
      public void killLock(Uri uri, NodeLock lock)
          throws ServiceAccessException, LockTokenNotFoundException {
          removeLock(uri, lock);
      }
      
      
      /**
       * Returns the list of locks put on a subject.
       *
       * @param subject Subject
       * @return Enumeration List of locks which have been put on the subject
       * @exception ServiceAccessException Service access error
       */
      public Enumeration enumerateLocks(Uri uri)
          throws ServiceAccessException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore enumerateLocks 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
  			return new Vector().elements();
          }
          else {
  			return aProps.enumerateLocks();
  		}
      }
      
      
      /**
       * Retrieve a revision descriptors.
       *
       * @param uri Uri
       * @exception ServiceAccessException Service access error
       * @exception RevisionDescriptorNotFoundException Revision descriptor
       * was not found
       */
      public NodeRevisionDescriptors retrieveRevisionDescriptors(Uri uri)
          throws ServiceAccessException, RevisionDescriptorNotFoundException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore retrieveRevisionDescriptors 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
              throw new RevisionDescriptorNotFoundException(uri.toString());
          }
  		System.out.println("----------- XMLMemDescriptorsStore retrieveRevisionDescriptors 2/n uri="+uri+" aProps="+aProps);
          return aProps.retrieveRevisionDescriptors(uri);
      }
      
      
      /**
       * Create new revision descriptors.
       *
       * @param uri Uri
       * @param revisionDescriptors Node revision descriptors
       * @exception ServiceAccessException Service access error
       */
      public void createRevisionDescriptors
          (Uri uri, NodeRevisionDescriptors revisionDescriptors)
          throws ServiceAccessException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore createRevisionDescriptors 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
  			aProps=new UriProperties(rootpath,uri);
  			definitions.put(uri.toString(),aProps);
          }
  		aProps.createRevisionDescriptors(uri,revisionDescriptors);
  		System.out.println("----------- XMLMemDescriptorsStore createRevisionDescriptors 2/n uri="+uri+" aProps="+aProps);
      }
      
      
      /**
       * Update revision descriptors.
       *
       * @param uri Uri
       * @param revisionDescriptors Node revision descriptors
       * @exception ServiceAccessException Service access error
       * @exception RevisionDescriptorNotFoundException Revision descriptor
       * was not found
       */
      public void storeRevisionDescriptors
          (Uri uri, NodeRevisionDescriptors revisionDescriptors)
          throws ServiceAccessException, RevisionDescriptorNotFoundException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore storeRevisionDescriptors 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
              throw new RevisionDescriptorNotFoundException(uri.toString());
          }
          aProps.storeRevisionDescriptors(uri, revisionDescriptors);
  		System.out.println("----------- XMLMemDescriptorsStore storeRevisionDescriptors 2/n uri="+uri+" aProps="+aProps);
      }
      
      
      /**
       * Remove revision descriptors.
       *
       * @param uri Uri
       * @exception ServiceAccessException Service access error
       */
      public void removeRevisionDescriptors(Uri uri)
          throws ServiceAccessException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore removeRevisionDescriptors 1/n uri="+uri+" aProps="+aProps);
          if (aProps != null) {
  			aProps.removeRevisionDescriptors(uri);
          }
  		System.out.println("----------- XMLMemDescriptorsStore removeRevisionDescriptors 2/n uri="+uri+" aProps="+aProps);
      }
      
      
      /**
       * Retrieve revision descriptor.
       *
       * @param Uri uri
       * @param revisionNumber Node revision number
       */
      public NodeRevisionDescriptor retrieveRevisionDescriptor (Uri uri, NodeRevisionNumber revisionNumber)
          throws ServiceAccessException, RevisionDescriptorNotFoundException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore retrieveRevisionDescriptor 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
  			aProps=new UriProperties(rootpath,uri);
  			definitions.put(uri.toString(),aProps);
          }
  		System.out.println("----------- XMLMemDescriptorsStore retrieveRevisionDescriptor 2/n uri="+uri+" revisionNumber="+revisionNumber);
  		try {
  			return aProps.retrieveRevisionDescriptor(uri,revisionNumber);
  		}
  		catch (RevisionDescriptorNotFoundException e) {
  			System.out.println("----------- XMLMemDescriptorsStore retrieveRevisionDescriptor 3/n uri="+uri+" aProps="+aProps);
  			e.printStackTrace();
  			throw e;
  		}
      }
      
      
      /**
       * Create new revision descriptor.
       *
       * @param uri Uri
       * @param revisionDescriptor Node revision descriptor
       * @exception ServiceAccessException Service access error
       */
      public void createRevisionDescriptor
          (Uri uri, NodeRevisionDescriptor revisionDescriptor)
          throws ServiceAccessException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore createRevisionDescriptor 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
  			aProps=new UriProperties(rootpath,uri);
  			definitions.put(uri.toString(),aProps);
          }
  		aProps.createRevisionDescriptor(uri,revisionDescriptor);
  		System.out.println("----------- XMLMemDescriptorsStore createRevisionDescriptor 2/n uri="+uri+" aProps="+aProps);
      }
      
      
      /**
       * Update revision descriptor.
       *
       * @param uri Uri
       * @param revisionDescriptors Node revision descriptor
       * @exception ServiceAccessException Service access error
       * @exception RevisionDescriptorNotFoundException Revision descriptor
       * was not found
       */
      public void storeRevisionDescriptor(Uri uri, NodeRevisionDescriptor revisionDescriptor)
          throws ServiceAccessException, RevisionDescriptorNotFoundException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore storeRevisionDescriptor 1/n uri="+uri+" aProps="+aProps);
          if (aProps == null) {
              throw new RevisionDescriptorNotFoundException(uri.toString());
          }
  		aProps.storeRevisionDescriptor(uri,revisionDescriptor);
  		System.out.println("----------- XMLMemDescriptorsStore storeRevisionDescriptor 2/n uri="+uri+" aProps="+aProps);
      }
      
      
      /**
       * Remove revision descriptor.
       *
       * @param uri Uri
       * @param revisionNumber Revision number
       * @exception ServiceAccessException Service access error
       */
      public void removeRevisionDescriptor(Uri uri, NodeRevisionNumber number)
          throws ServiceAccessException {
          UriProperties aProps = getUriProperties(uri);
  		System.out.println("----------- XMLMemDescriptorsStore removeRevisionDescriptor 1/n uri="+uri+" aProps="+aProps);
          if (aProps != null) {
  			aProps.removeRevisionDescriptor(uri,number);
          }
  		System.out.println("----------- XMLMemDescriptorsStore removeRevisionDescriptor 2/n uri="+uri+" aProps="+aProps);
      }
  
  
      
  }
  
  
  
  
  
  1.1                  jakarta-slide/src/stores/slidestore/file/UriProperties.java
  
  Index: UriProperties.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/slidestore/file/UriProperties.java,v 1.1 2001/12/24 22:12:14 remm Exp $
   * $Revision: 1.1 $
   * $Date: 2001/12/24 22:12:14 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 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 acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", 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 apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 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/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */
  package slidestore.file;
  
  //----------------------------------------
  import java.io.*;
  import java.util.*;
  import java.lang.reflect.Constructor;
  import java.text.SimpleDateFormat;
  import org.apache.slide.common.*;
  import org.apache.slide.store.*;
  import org.apache.slide.structure.*;
  import org.apache.slide.security.*;
  import org.apache.slide.lock.*;
  import org.apache.slide.content.*;
  
  import org.jdom.Document;
  import org.jdom.Element;
  import org.jdom.JDOMException;
  import org.jdom.output.XMLOutputter;
  import org.jdom.input.SAXBuilder;
  //----------------------------------------
  /**
   * Handles the saving and retreiving of descriptions attached to an Uri</a>
   * @author <a href="mailto:mdecugis@mds-desing.fr">Marc D�cugis</a>
   * @contact <a href="mailto:remm@apache.org">Remy Maucherat</a> 
   * @version $Revision: 1.1 $ , $Date: 2001/12/24 22:12:14 $
   */
  
  //----------------------------------------
  //----------------------------------------
  //----------------------------------------
  
  //----------------------------------------
  public class UriProperties extends AbstractUriProperties {
  	/** A simple date format.*/
  	protected SimpleDateFormat dateFormat;
  	
  	//----------------------------------------
  	public UriProperties(String aRootPath,Uri aUri) throws ServiceAccessException {
  		super(aRootPath,aUri);
  		dateFormat=new SimpleDateFormat();
  		File aFile=getFile(aUri);
  		if (aFile.exists()) {
  			init(aFile);
  		}
  	}
  	// --------------------------------------
      public static File getFile(String aRootPath,Uri aUri) {
  		System.out.println("----------- UriProperties getFile 1/n aUri="+aUri);
          // String aRelative = aUri.getRelative();
  		// System.out.println("----------- UriProperties getFile 2/n aRelative="+aRelative);
         //  if (aRelative.equals("")) aRelative = "/";
  		// System.out.println("----------- UriProperties getFile 3/n aRelative="+aRelative);
  
  		// File aFile = new File(rootpath + aRelative + ".def.xml");
  		File aFile = new File(aRootPath + aUri + ".def.xml");
  		File aParentFile = new File(aFile.getParent());
  		if ((aParentFile != null) && (!aParentFile.exists())) {
  			aParentFile.mkdirs();
  		}
  		return aFile;
  	}
  	// --------------------------------------
      public File getFile(Uri aUri) {
  		return getFile(rootpath,aUri);
  	}
  	// --------------------------------------
  	public static XMLOutputter getXMLOutputter() {
  		XMLOutputter aOutputter = new XMLOutputter();
  		aOutputter.setEncoding("ISO-8859-1");//Unicode
  		aOutputter.setNewlines(true);
  		aOutputter.setIndent(true);
  		aOutputter.setLineSeparator("\n");
  		//aOutputter.setTextNormalize(true);
  
  
  		return aOutputter;
  	}
  	// --------------------------------------
  	public static String booleanToString(boolean aBoolean) {
  		return aBoolean ? "true" : "false";
  	}
  	//----------------------------------------
  	//----------------------------------------
  	//----------------------------------------
  	
  	//----------------------------------------
  	protected void save(Uri aUri) throws ServiceAccessException {
  		try {
  			File aFile=getFile(aUri);
  			System.out.println("--------- save 1/n aFile="+aFile);
  			Element aRoot=encode();
  			System.out.println("--------- save 2/n");
  			Document aDocument=new Document(aRoot);
  			System.out.println("--------- save 3/n");
  			OutputStream aOut=new FileOutputStream(aFile);
  			XMLOutputter aOutputter = getXMLOutputter();
  			// aOutputter.output(aDocument, System.out);
  			aOutputter.output(aDocument, aOut);
  			// if (DEBUG) trace("--------- enregistre 3/n");
  			System.out.println("--------- save 4/n");
  			aOut.flush();
  			aOut.close();
  			System.out.println("--------- save 5/n");
  		}
  		catch (Exception e) {
  			e.printStackTrace();
  			throw new ServiceAccessException(null,e);
  		}
  	}
  	//----------------------------------------
  	protected Element encode() throws ServiceAccessException {
  		Element aRoot=new Element("data");
  		aRoot.addContent(encodeObject());
  		aRoot.addContent(encodePermissions());
  		aRoot.addContent(encodeLocks());
  		aRoot.addContent(encodeRevisionDescriptors());
  		aRoot.addContent(encodeRevisionDescriptor());
  		return aRoot;
  	}
  	// --------------------------------------
  	public Element encodeObject() {
  		Element aElementObjectNode=new Element("objectnode");
  		aElementObjectNode.setAttribute("classname",object.getClass().getName());
  		aElementObjectNode.setAttribute("uri",object.getUri());
  		aElementObjectNode.addContent(createElements("childs","child",object.enumerateChildren()));
  		aElementObjectNode.addContent(createElements("links","link",object.enumerateLinks()));
  		if (object instanceof LinkNode) {
  			aElementObjectNode.setAttribute("linkTo",((LinkNode)object).getLinkedUri());
  		}
  		return aElementObjectNode;
  	}
  	// --------------------------------------
  	public Element encodePermissions() {
  		Element aPermissions=new Element("permissions");
  		if (permissions==null) return aPermissions;
  		
  		for (int aSize=permissions.size(),i=0;i<aSize;i++) {
  			NodePermission aPermission=(NodePermission)permissions.elementAt(i);
  			aPermissions.addContent(encodeNodePermission(aPermission));
  		}
  		return aPermissions;
  	}
  	// --------------------------------------
  	public Element encodeNodePermission(NodePermission aPermission) {
  		Element aElementPermission=new Element("permission");
  		NodeRevisionNumber aRevisionNumber=aPermission.getRevisionNumber();
  		if (aRevisionNumber!=null) {
  			aElementPermission.setAttribute("revisionNumber",encodeRevisionNumber(aRevisionNumber));
  		}
  		aElementPermission.setAttribute("subjectUri",aPermission.getSubjectUri());
  		aElementPermission.setAttribute("actionUri",aPermission.getActionUri());
  		aElementPermission.setAttribute("inheritable",booleanToString(aPermission.isInheritable()));
  		aElementPermission.setAttribute("negative",booleanToString(aPermission.isNegative()));
  		return aElementPermission;
      }
  	// --------------------------------------
  	public Element encodeLocks() {
  		Element aElementLocks=new Element("locks");
  		if (locks==null) return aElementLocks;
  		
  		for (int aSize=locks.size(),i=0;i<aSize;i++) {
  			NodeLock aLock=(NodeLock)locks.elementAt(i);
  			Element aElementLock=new Element("lock");
  			aElementLock.setAttribute("subjectUri",aLock.getSubjectUri());
  			aElementLock.setAttribute("typeUri",aLock.getTypeUri());
  			aElementLock.setAttribute("date",dateFormat.format(aLock.getExpirationDate()));
  			aElementLock.setAttribute("inheritance",booleanToString(aLock.isInheritable()));
  			aElementLock.setAttribute("exclusive",booleanToString(aLock.isExclusive()));
  			aElementLock.setAttribute("lockId",aLock.getLockId());
  			aElementLocks.addContent(aElementLock);
  		}
  		return aElementLocks;
  	}
  	// --------------------------------------
  	public Element encodeRevisionDescriptors() {
  		
  		Element aRevisionsHistory=new Element("revisionsHistory");
  		if (revisionDescriptors==null) return aRevisionsHistory;
  
  		aRevisionsHistory.setAttribute("initialRevision",encodeRevisionNumber(revisionDescriptors.getInitialRevision()));
  		aRevisionsHistory.setAttribute("useVersioning",booleanToString(revisionDescriptors.hasRevisions()));
  		
  		System.out.println("---------- encodeRevisionDescriptors getLatestRevision="+
  			revisionDescriptors.getLatestRevision());
  		
  		Element aBranchesElement=new Element("branches");
  		Enumeration aBranches=revisionDescriptors.enumerateBranchNames();
  		while (aBranches.hasMoreElements()) {
  			String aBranchName=(String)aBranches.nextElement();
  			Element aElementBranch=new Element("branch");
  			aElementBranch.setAttribute("name",aBranchName);
  			NodeRevisionNumber aRevisionNumber=revisionDescriptors.getLatestRevision(aBranchName);
  			aElementBranch.setAttribute("lastestRevision",encodeRevisionNumber(aRevisionNumber));
  			aBranchesElement.addContent(aElementBranch);
  		}
  		aRevisionsHistory.addContent(aBranchesElement);
  		
  		Element aRevisionsElement=new Element("revisions");
  		Enumeration aRevisions=revisionDescriptors.enumerateRevisionNumbers();
  		while (aRevisions.hasMoreElements()) {
  			NodeRevisionNumber aRevisionNumber=(NodeRevisionNumber)aRevisions.nextElement();
  			Element aRevisionElement=new Element("branch");
  			aRevisionElement.setAttribute("start",encodeRevisionNumber(aRevisionNumber));
  			
  			Enumeration aSuccessors=revisionDescriptors.getSuccessors(aRevisionNumber);
  			while (aSuccessors.hasMoreElements()) {
  				NodeRevisionNumber aSuccessorRevisionNumber=(NodeRevisionNumber)aRevisions.nextElement();
  				Element aSuccessorRevisionElement=new Element("revision");
  				aSuccessorRevisionElement.setAttribute("number",encodeRevisionNumber(aSuccessorRevisionNumber));
  				aRevisionElement.addContent(aSuccessorRevisionElement);
  			}
  			aRevisionsElement.addContent(aRevisionElement);
  		}
  		aRevisionsHistory.addContent(aRevisionsElement);
  		
  		return aRevisionsHistory;
  	}
  	// --------------------------------------
  	public Element encodeRevisionDescriptor() {
  		Element aRet=new Element("descriptor");
  		if (descriptor==null) return aRet;
  
  		for (Enumeration aEnum=descriptor.elements();aEnum.hasMoreElements();) {
  			NodeRevisionDescriptor aRevisionDescriptor=(NodeRevisionDescriptor)aEnum.nextElement();
  			aRet.addContent(encodeRevisionDescriptor(aRevisionDescriptor));
  		}
  		return aRet;
  	}
  	// --------------------------------------
  	public Element encodeRevisionDescriptor(NodeRevisionDescriptor aDescriptor) {
  		Element aRevisions=new Element("revisions");
  		aRevisions.setAttribute("branchName",aDescriptor.getBranchName());
  		aRevisions.setAttribute("number",encodeRevisionNumber(aDescriptor.getRevisionNumber()));
  		aRevisions.addContent(createElements("labels","label",aDescriptor.enumerateLabels()));
  		Element aProperties=new Element("properties");		
  		
  		for (Enumeration aEnum=aDescriptor.enumerateProperties();aEnum.hasMoreElements();) {
  			Object aObject=aEnum.nextElement();
  			System.out.println("---------- encodeRevisionDescriptor aObject="+aObject+" "+aObject.getClass().getName());
  			NodeProperty aProp=(NodeProperty)aObject;
  			aProperties.addContent(encodeNodeProperty(aProp));
  		}
  		aRevisions.addContent(aProperties);
  		return aRevisions;
  	}
  	// --------------------------------------
  	public String encodeRevisionNumber(NodeRevisionNumber aRevisionNumber) {
  		return aRevisionNumber.getMajor()+"."+aRevisionNumber.getMinor();
  	}
  	// --------------------------------------
  	public Element encodeNodeProperty(NodeProperty aProp) {
  		Element aElement=new Element("property");
  		aElement.setAttribute("name",aProp.getName());
  		aElement.setAttribute("namespace",aProp.getNamespace());
  		aElement.setAttribute("value",aProp.getValue().toString());
  		aElement.setAttribute("type",aProp.getType());
  		aElement.setAttribute("protected",booleanToString(aProp.isProtected()));
  		Element aPermissions=new Element("permissions");
  		
  		for (Enumeration aEnum=aProp.enumeratePermissions();aEnum.hasMoreElements();) {
  			NodePermission aPermission=(NodePermission)aEnum.nextElement();
  			aPermissions.addContent(encodeNodePermission(aPermission));
  		}
  		aElement.addContent(aPermissions);
  		return aElement;
  	}
  	// --------------------------------------
  	public Element createElements(String aParent,String aChild,Enumeration aEnum) {
  		Element aElement=new Element(aParent);
  		while (aEnum.hasMoreElements()) {
  			Object aObject=aEnum.nextElement();
  			Element aItem=new Element(aChild);
  			aItem.setAttribute("val",aObject.toString());
  			aElement.addContent(aItem);
  		}
  		return aElement;
  	}
  	//----------------------------------------
  	//----------------------------------------
  	//----------------------------------------
  	
  	//----------------------------------------
  	protected void init(File aFile) throws ServiceAccessException {
  		try {
  			System.out.println("--------- init 1/n aFile="+aFile);
  			SAXBuilder aBuilder=new SAXBuilder();
  			FileInputStream aIn=new FileInputStream(aFile);
  			Document aDocument=aBuilder.build(aIn);
  			System.out.println("--------- init 2/n");
  			decode(aDocument.getRootElement());
  			System.out.println("--------- init 3/n");
  			aIn.close();
  			System.out.println("--------- init 5/n");
  		}
  		catch (Exception e) {
  			e.printStackTrace();
  			throw new ServiceAccessException(null,e);
  		}
  	}
  	//----------------------------------------
  	protected void decode(Element aRoot) throws ServiceAccessException {
  		decodeObject(aRoot);
  		decodePermissions(aRoot);
  		decodeLocks(aRoot);
  		decodeRevisionDescriptors(aRoot);
  		decodeRevisionDescriptor(aRoot);
  	}
  	// --------------------------------------
  	public void decodeObject(Element aElement) throws ServiceAccessException {
  		try {
  			Element aElementObjectNode=aElement.getChild("objectnode");
  			String aClasseName=aElementObjectNode.getAttributeValue("classname");
  			String aUri=aElementObjectNode.getAttributeValue("uri");
  			Vector aChilds=createVector(aElementObjectNode,"childs","child");
  			Vector aLinks=createVector(aElementObjectNode,"links","link");
  			System.out.println("--------- decodeObject  aChilds="+aChilds);
  			System.out.println("--------- decodeObject  aLinks="+aLinks);
  			Class aTypes[] = null;
  			Object aArgs[] = null;
  
  			if (aClasseName.equals(LinkNode.class.getName())) {
  				String aLinkTo=aElementObjectNode.getAttributeValue("linkTo");
  				aTypes= new Class[]{String.class,Vector.class,Vector.class,String.class};
  				aArgs= new Object[]{aUri, aChilds, aLinks,aLinkTo};
  			}
  			else {
  				aTypes=new Class[] {String.class,Vector.class,Vector.class};
  				aArgs=new Object[] {aUri, aChilds, aLinks};
  			}
  			object=(ObjectNode) createObject(aClasseName,aTypes,aArgs);
  		}
  		catch (Exception e) {
  			e.printStackTrace();
  			throw new ServiceAccessException(null,e);
  		}
  	}
  	
  	// --------------------------------------
  	public void decodePermissions(Element aElement) {
  		permissions=new Vector();
  		String aUri=object.getUri().toString();
  		Element aPermissions=aElement.getChild("permissions");
  		List aList=aPermissions.getChildren();
  		for (int i=0;i<aList.size();i++) {
  			Element aChild=(Element)aList.get(i);
  			permissions.addElement(decodePermission(aChild,aUri));
  		}
  	}
  	// --------------------------------------
  	public void decodeLocks(Element aElement) throws ServiceAccessException {
  		try {
  			locks=new Vector();
  			Element aElementLocks=aElement.getChild("locks");
  			List aList=aElementLocks.getChildren();
  			
  			for (int i=0;i<aList.size();i++) {
  				Element aChild=(Element)aList.get(i);
  				String aSubject=aChild.getAttributeValue("subjectUri");
  				String aType=aChild.getAttributeValue("typeUri");
  				Date aDateExpiration=dateFormat.parse(aChild.getAttributeValue("date"));
  				boolean aInheritable=Boolean.getBoolean(aChild.getAttributeValue("inheritance"));
  				boolean aNegative=Boolean.getBoolean(aChild.getAttributeValue("exclusive"));
  				String aLockId=aChild.getAttributeValue("lockId");
  				locks.addElement(
  					new NodeLock(aLockId,object.getUri(),aSubject,aType,aDateExpiration,aInheritable,aNegative)
  				);
  			}
  		}
  		catch (Exception e) {
  			e.printStackTrace();
  			throw new ServiceAccessException(null,e);
  		}
  		
  	}
  	// --------------------------------------
  	public void decodeRevisionDescriptors(Element aElement) {
  		Element aRevisionsHistory=aElement.getChild("revisionsHistory");
  
  		NodeRevisionNumber aInitialRevision=decodeRevisionNumber(aRevisionsHistory.getAttributeValue("initialRevision"));
  		boolean aUseVersionning=Boolean.getBoolean(aRevisionsHistory.getAttributeValue("useVersioning"));
  
  		Element aBranchesElement=aElement.getChild("branches");
  		if (aBranchesElement==null) {
  			revisionDescriptors=new NodeRevisionDescriptors(
  				object.getUri().toString(),aInitialRevision,new Hashtable(),new Hashtable(),new Hashtable(),aUseVersionning);			
  				return; 
  		}
  		
  		List aList=aBranchesElement.getChildren();
  		Hashtable aLastestRevisions=new Hashtable();
  		for (int i=0;i<aList.size();i++) {
  			Element aChild=(Element)aList.get(i);
  			String aName=aChild.getAttributeValue("name");
  			NodeRevisionNumber aRevisionNumber=decodeRevisionNumber(aChild.getAttributeValue("lastestRevision"));
  			aLastestRevisions.put(aName,aRevisionNumber);
  		}
  		Hashtable aBranches=new Hashtable();
  		Element aRevisionsElement=aElement.getChild("revisions");
  		aList=aRevisionsElement.getChildren();
  		for (int i=0;i<aList.size();i++) {
  			Element aChild=(Element)aList.get(i);
  			NodeRevisionNumber aStartNumber=decodeRevisionNumber(aChild.getAttributeValue("start"));
  			List aSuccessors=aChild.getChildren();
  			Vector aSuccessorsNumbers=new Vector();
  			for (int k=0;k<aSuccessors.size();k++) {
  				Element aSuccessor=(Element)aSuccessors.get(i);
  				NodeRevisionNumber aRevisionNumber=decodeRevisionNumber(aChild.getAttributeValue("number"));
  				aSuccessorsNumbers.addElement(aRevisionNumber);
  			}
  			aBranches.put(aStartNumber,aSuccessorsNumbers);
  		}
  		revisionDescriptors=new NodeRevisionDescriptors(
  				object.getUri().toString(),aInitialRevision,new Hashtable(),aLastestRevisions,aBranches,aUseVersionning);
  	}
  	// --------------------------------------
  	public void decodeRevisionDescriptor(Element aParent) {
  		descriptor=new Hashtable();
  		
  		Element aElement=aParent.getChild("descriptor");
  		if (aElement==null) return;
  		
  		List aList=aElement.getChildren();
  		String aUri=object.getUri().toString();
  		
  		for (int i=0;i<aList.size();i++) {
  			Element aChild=(Element)aList.get(i);
  			String aBranchName=aChild.getAttributeValue("branchName");
  			NodeRevisionNumber aRevisionNumber=decodeRevisionNumber(aChild.getAttributeValue("number"));
  
  			Vector aLabels=new Vector();
  			Element aLabelsElement=(Element)aChild.getChild("labels");
  			List aLabelList=aLabelsElement.getChildren();
  			for (int k=0;k<aLabelList.size();k++) {
  				Element aLabel=(Element)aLabelList.get(i);
  				aLabels.addElement(aLabel.getAttributeValue("val"));
  			}
  
  			Hashtable aProperties=new Hashtable();
  			Element aPropertiesElement=(Element)aChild.getChild("properties");
  			List aPropertiesList=aPropertiesElement.getChildren();
  			for (int k=0;k<aPropertiesList.size();k++) {
  				Element aPropertie=(Element)aPropertiesList.get(i);
  				NodeProperty aProp=decodeNodeProperty(aPropertie,aUri);
  				aProperties.put(aPropertie.getNamespace() + aPropertie.getName(),aProp);
  			}
  			NodeRevisionDescriptor aNode=new NodeRevisionDescriptor(aRevisionNumber,aBranchName,aLabels,aProperties);
  			descriptor.put(aRevisionNumber,aNode);
  		}		
  	}
  	// --------------------------------------
  	public NodePermission decodePermission(Element aElement,String aUri) {
  		String aRevisionNumber=aElement.getAttributeValue("revisionNumber");
  		String aSubject=aElement.getAttributeValue("subjectUri");
  		String aAction=aElement.getAttributeValue("actionUri");
  		boolean aInheritable=Boolean.getBoolean(aElement.getAttributeValue("inheritable"));
  		boolean aNegative=Boolean.getBoolean(aElement.getAttributeValue("negative"));
  		return new NodePermission(aUri,aRevisionNumber,aSubject,aAction,aInheritable,aNegative);
  
  	}
  	// --------------------------------------
  	public NodeRevisionNumber decodeRevisionNumber(Element aElement) {
  		Element aElementRevision=aElement.getChild("revision");
  		return new NodeRevisionNumber(Integer.parseInt(aElementRevision.getAttributeValue("major")),
  									  Integer.parseInt(aElementRevision.getAttributeValue("minor")));
  	}
  	// --------------------------------------
  	public NodeRevisionNumber decodeRevisionNumber(String aStr) {
  		return (aStr==null ? null : new NodeRevisionNumber(aStr));
  	}
  	// --------------------------------------
  	public NodeProperty decodeNodeProperty(Element aElement,String aUri) {
  		String aName=aElement.getAttributeValue("name");
  		String aValue=aElement.getAttributeValue("value");
  		String aNamespace=aElement.getAttributeValue("namespace");
  		String aType=aElement.getAttributeValue("type");
  		boolean aProtected=Boolean.getBoolean(aElement.getAttributeValue("protected"));
  		
  		Element aPermisionsElement=aElement.getChild("permissions");
  		List aList=aPermisionsElement.getChildren();
  		Vector aPermission=new Vector();
  		for (int i=0;i<aList.size();i++) {
  			Element aChild=(Element)aList.get(i);
  			aPermission.addElement(decodePermission(aChild,aUri));
  		}
  		return new NodeProperty(aName,aValue,aNamespace,aType,aProtected);
  	}
  
  	// --------------------------------------
  	public Vector createVector(Element aElement,String aParentName,String aChildName) {
  		Element aParent=aElement.getChild(aParentName);
  		Vector aRet=new Vector();
  		System.out.println("--------- createVector  aParentName="+aParentName+" aChildName="+aChildName);
  		List aList=aParent.getChildren(aChildName);
  		System.out.println("--------- createVector  aList="+aList);
  		for (int i=0;i<aList.size();i++) {
  			Element aChild=(Element)aList.get(i);
  			aRet.addElement(aChild.getAttributeValue("val"));
  		}
  		return aRet;
  	}
  	// --------------------------------------
  	public Object createObject(String aNomClasse,Class aTypes[],Object aArgs[]) throws UnknownObjectClassException {
  		Class aClasse = null;
  		try {
  			// First, load the object's class
  			aClasse = Class.forName(aNomClasse);
  			Constructor aConstructor = aClasse.getConstructor(aTypes);
  			if (aConstructor==null) aConstructor=aClasse.getSuperclass().getConstructor(aTypes);
  			return aConstructor.newInstance(aArgs);
  			
  		}
  		catch (Exception e) {
  			throw new UnknownObjectClassException(aNomClasse);
  		}
  	}
  	/*
  	// --------------------------------------
  	public Vector decodeObject(Vector aVector,Enumeration aEnum) {
  	}
  	*/
  }
  
  
  
  1.1                  jakarta-slide/src/stores/slidestore/file/AbstractUriProperties.java
  
  Index: AbstractUriProperties.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/slidestore/file/AbstractUriProperties.java,v 1.1 2001/12/24 22:12:14 remm Exp $
   * $Revision: 1.1 $
   * $Date: 2001/12/24 22:12:14 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 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 acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Tomcat", 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 apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 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/>.
   *
   * [Additional notices, if required by prior licensing conditions]
   *
   */
  
  package slidestore.file;
  
  //----------------------------------------
  import java.util.*;
  import java.io.*;
  import org.apache.slide.common.*;
  import org.apache.slide.store.*;
  import org.apache.slide.structure.*;
  import org.apache.slide.security.*;
  import org.apache.slide.lock.*;
  import org.apache.slide.content.*;
  //----------------------------------------
  
  //----------------------------------------
  //----------------------------------------
  //----------------------------------------
  /**
    * Handles the descriptions attached to an Uri</a>
   * @author <a href="mailto:mdecugis@mds-desing.fr">Marc D�cugis</a>
   * @contact <a href="mailto:remm@apache.org">Remy Maucherat</a> 
   * @version $Revision: 1.1 $ , $Date: 2001/12/24 22:12:14 $
  */
  
  //----------------------------------------
  public class AbstractUriProperties  {
  	
  	
  	/** Stored object.*/
  	protected ObjectNode object;
  	
  	/** Permissions vector. */
  	protected Vector permissions;
  	
  	/** Locks vector.*/
  	protected Vector locks;
  	
  	/** Revision descriptors.*/
  	protected NodeRevisionDescriptors revisionDescriptors;
  	
  	/** Revision descriptor hashtable.*/
  	protected Hashtable descriptor;
  	
  	/** The rootpath user to store uri descriptions.*/
  	protected String rootpath;
  	
  	
  	
  	//----------------------------------------
  	public AbstractUriProperties(String aRootPath,Uri aUri) {
  		rootpath=aRootPath;
  	}
  	//----------------------------------------
  	protected void save(Uri aUri) throws ServiceAccessException {
  		System.out.println("------------------------------------------------------------------------");
  		System.out.println("----------- AbstractUriProperties save aUri="+aUri);
  		System.out.println("----------- AbstractUriProperties save object="+object);
  		System.out.println("----------- AbstractUriProperties save permissions="+permissions);
  		System.out.println("----------- AbstractUriProperties save locks="+locks);
  		System.out.println("----------- AbstractUriProperties save revisionDescriptors="+revisionDescriptors);
  		System.out.println("----------- AbstractUriProperties save descriptor="+descriptor);
  		System.out.println("------------------------------------------------------------------------");
  	}
     
  	//----------------------------------------
  	//----------------------------------------
  	//----------------------------------------
  	
  	//----------------------------------------
  	/**
  	* Retrive an object from the Descriptors Store.
  	*
  	* @param uri Uri of the object we want to retrieve
  	* @exception ServiceAccessException Error accessing the Descriptors Store
  	* @exception ObjectNotFoundException The object to retrieve was not found
  	*/
  	//----------------------------------------
  	public ObjectNode retrieveObject(Uri uri)
          throws ServiceAccessException, ObjectNotFoundException {
  		System.out.println("----------- AbstractUriProperties retrieveObject uri="+uri+" object="+object);
          if (object == null) {
              throw new ObjectNotFoundException(uri);
          }
  		System.out.println("----------- AbstractUriProperties retrieveObject uri="+uri+" object="+object);
          return object.cloneObject();
      }
  
  	//----------------------------------------
  	/**
  	* Store an object in the Descriptors Store.
  	*
  	* @param object Object to update
  	* @exception ServiceAccessException Error accessing the Descriptors Store
  	* @exception ObjectNotFoundException The object to update was not found
  	*/
  	//----------------------------------------
      public void storeObject(Uri uri,ObjectNode aObject)
          throws ServiceAccessException, ObjectNotFoundException {
  		System.out.println("----------- AbstractUriProperties storeObject uri="+uri+" object="+object);
          object=aObject.cloneObject();
  		save(uri);
      }
      
      
  	//----------------------------------------
  	/**
  	* Create a new object in the Descriptors Store.
  	*
  	* @param object SlideObject
  	* @param uri Uri of the object we want to create
  	* @exception ServiceAccessException Error accessing the Descriptors Store
  	* @exception ObjectAlreadyExistsException An object already exists
  	* at this Uri
  	*/
  	//----------------------------------------
      public void createObject(Uri uri,ObjectNode aObject)
          throws ServiceAccessException, ObjectAlreadyExistsException {
          try {
              if (object.getUri().equals(uri.toString())) {
                  throw new ObjectAlreadyExistsException(uri.toString());
              }
              storeObject(uri,aObject);
          } catch(ObjectNotFoundException e) {
              // Never happens
          }
  		System.out.println("----------- AbstractUriProperties createObject uri="+uri+" object="+object);
      }
  	//----------------------------------------
  	/**
  	* Remove an object from the Descriptors Store.
  	*
  	* @param object Object to remove
  	* @exception ServiceAccessException Error accessing the Descriptors Store
  	* @exception ObjectNotFoundException The object to remove was not found
  	*/
  	//----------------------------------------
  	public void removeObject(Uri uri, ObjectNode aObject)
          throws ServiceAccessException, ObjectNotFoundException {
          object=null;
  		System.out.println("----------- AbstractUriProperties removeObject uri="+uri+" object="+object);
      }
          
  	//----------------------------------------
  	/**
  	* Store an object permissions in the Descriptors Store.
  	*
  	* @param permission Permission we want to create
  	* @exception ServiceAccessException Error accessing the Descriptors Store
  	*/
  	//----------------------------------------
      public void grantPermission(Uri uri,NodePermission permission)
          throws ServiceAccessException {
          if (permissions == null) permissions = new Vector();
          permissions.addElement(permission.cloneObject());
  		save(uri);
      }
      
      
  	//----------------------------------------
  	/**
  	* Store an object permissions in the Descriptors Store.
  	*
  	* @param permission Permission we want to create
  	* @exception ServiceAccessException Error accessing the Descriptors Store
  	*/
  	//----------------------------------------
      public void revokePermission(Uri uri,NodePermission permission)
          throws ServiceAccessException {
          if (permissions != null) 
  			permissions.removeElement(permission);
  		save(uri);
      }
      
      
  	//----------------------------------------
  	/**
  	* Revoke all the permissions on the object .
  	*
  	* @param permission Permission we want to create
  	* @exception ServiceAccessException Error accessing the Descriptors Store
  	*/
  	//----------------------------------------
      public void revokePermissions(Uri uri)
          throws ServiceAccessException {
          if (permissions != null) 
  			permissions.removeAllElements();
  		save(uri);
      }
      
      
  	//----------------------------------------
  	/**
  	* Store an object permissions in the Descriptors Store.
  	*
  	* @param permission Permission we want to create
  	* @exception ServiceAccessException Error accessing the Descriptors Store
  	*/
  	//----------------------------------------
      public Enumeration enumeratePermissions()
          throws ServiceAccessException {
          if (permissions == null) permissions = new Vector();
          return permissions.elements();
      }
      
      
  	//----------------------------------------
  	/**
  	* Puts a lock on a subject.
  	*
  	* @param lock Lock token
  	* @exception ServiceAccessException Service access error
  	*/
  	//----------------------------------------
      public void putLock(Uri uri, NodeLock lock)
          throws ServiceAccessException {
          if (locks == null) locks = new Vector();
          locks.addElement(lock.cloneObject());
  		save(uri);
      }
      
      
  	//----------------------------------------
  	/**
  	* Renews a lock.
  	*
  	* @param lock Token to renew
  	* @exception ServiceAccessException Service access error
  	* @exception LockTokenNotFoundException Lock token was not found
  	*/
  	//----------------------------------------
  	 public void renewLock(Uri uri, NodeLock lock) throws ServiceAccessException, LockTokenNotFoundException {
          if (locks == null) locks = new Vector();
  		 boolean wasPresent = locks.removeElement(lock);
  		 if (!wasPresent) {
  			 throw new LockTokenNotFoundException(lock);
  		 }
  		 locks.addElement(lock.cloneObject());
  		save(uri);
  	 }
  
      
  	//----------------------------------------
  	/**
  	* Removes (cancels) a lock.
  	*
  	* @param lock Token to remove
  	* @exception ServiceAccessException Service access error
  	* @exception LockTokenNotFoundException Lock token was not found
  	*/
  	//----------------------------------------
      public void removeLock(Uri uri,NodeLock lock)
          throws ServiceAccessException, LockTokenNotFoundException {
  		
  		if (locks == null) {
  			throw new LockTokenNotFoundException(lock);
  		}
  		boolean wasPresent = locks.removeElement(lock);
  		if (!wasPresent) {
  			throw new LockTokenNotFoundException(lock);
  		}
  		save(uri);
  	}
      
  	//----------------------------------------
  	/**
  	* Returns the list of locks put on a subject.
  	*
  	* @param subject Subject
  	* @return Enumeration List of locks which have been put on the subject
  	* @exception ServiceAccessException Service access error
  	*/
  	//----------------------------------------
  	public Enumeration enumerateLocks()
          throws ServiceAccessException {
          if (locks == null) locks = new Vector();
          return locks.elements();
      }
      
      
  	//----------------------------------------
  	/**
  	* Retrieve a revision descriptors.
  	*
  	* @param uri Uri
  	* @exception ServiceAccessException Service access error
  	* @exception RevisionDescriptorNotFoundException Revision descriptor
  	* was not found
  	*/
  	//----------------------------------------
  	public NodeRevisionDescriptors retrieveRevisionDescriptors(Uri uri)
  		throws ServiceAccessException, RevisionDescriptorNotFoundException {
  		if (revisionDescriptors == null) {
  			throw new RevisionDescriptorNotFoundException(uri.toString());
  		}
  		return revisionDescriptors.cloneObject();
  	}
  	
      
  	//----------------------------------------
  	/**
  	* Create new revision descriptors.
  	*
  	* @param uri Uri
  	* @param revisionDescriptors Node revision descriptors
  	* @exception ServiceAccessException Service access error
  	*/
  	//----------------------------------------
  	public void createRevisionDescriptors (Uri uri,NodeRevisionDescriptors aRevisionDescriptors)
          throws ServiceAccessException {
          revisionDescriptors = aRevisionDescriptors.cloneObject();
  		save(uri);
      }
      
      
  	//----------------------------------------
  	/**
  	* Update revision descriptors.
  	*
  	* @param uri Uri
  	* @param revisionDescriptors Node revision descriptors
  	* @exception ServiceAccessException Service access error
  	* @exception RevisionDescriptorNotFoundException Revision descriptor
  	* was not found
  	*/
  	//----------------------------------------
  	public void storeRevisionDescriptors(Uri uri, NodeRevisionDescriptors aRevisionDescriptors)
          throws ServiceAccessException, RevisionDescriptorNotFoundException {
          if (!revisionDescriptors.getUri().equals(uri.toString())) {
              throw new RevisionDescriptorNotFoundException(uri.toString());
          }
          revisionDescriptors = aRevisionDescriptors.cloneObject();
  		save(uri);
      }
      
      
  	//----------------------------------------
  	/**
  	* Remove revision descriptors.
  	*
  	* @param uri Uri
  	* @exception ServiceAccessException Service access error
  	*/
  	//----------------------------------------
  	public void removeRevisionDescriptors(Uri uri)
          throws ServiceAccessException {
          revisionDescriptors = null;
  		save(uri);
      }
      
      
  	//----------------------------------------
  	/**
  	* Retrieve revision descriptor.
  	*
  	* @param Uri uri
  	* @param revisionNumber Node revision number
  	*/
  	//----------------------------------------
  	public NodeRevisionDescriptor retrieveRevisionDescriptor(Uri uri, NodeRevisionNumber revisionNumber)
          throws ServiceAccessException, RevisionDescriptorNotFoundException {
          Object result = null;
  		
  		if (descriptor!=null && revisionNumber!=null) result = descriptor.get(revisionNumber.toString());
  			
          if (result == null) {
              throw new RevisionDescriptorNotFoundException(uri.toString());
          }
          return ((NodeRevisionDescriptor) result).cloneObject();
      }
      
      
  	//----------------------------------------
  	/**
  	* Create new revision descriptor.
  	*
  	* @param uri Uri
  	* @param revisionDescriptor Node revision descriptor
  	* @exception ServiceAccessException Service access error
  	*/
  	//----------------------------------------
  	public void createRevisionDescriptor(Uri uri, NodeRevisionDescriptor aRevisionDescriptor)
          throws ServiceAccessException {
  		if (descriptor==null) descriptor=new Hashtable();
  
          descriptor.put(aRevisionDescriptor.getRevisionNumber().toString(),
                         aRevisionDescriptor.cloneObject());
  		save(uri);
      }
      
      
  	//----------------------------------------
  	/**
  	* Update revision descriptor.
  	*
  	* @param uri Uri
  	* @param revisionDescriptors Node revision descriptor
  	* @exception ServiceAccessException Service access error
  	* @exception RevisionDescriptorNotFoundException Revision descriptor
  	* was not found
  	*/
  	//----------------------------------------
  	public void storeRevisionDescriptor(Uri uri, NodeRevisionDescriptor aRevisionDescriptor)
          throws ServiceAccessException, RevisionDescriptorNotFoundException {
          String key = aRevisionDescriptor.getRevisionNumber().toString();
          if (descriptor==null || !descriptor.containsKey(key)) {
              throw new RevisionDescriptorNotFoundException(uri.toString());
          }
          descriptor.put(key, aRevisionDescriptor.cloneObject());
  		save(uri);
      }
      
  	
  	//----------------------------------------
  	/**
  	* Remove revision descriptor.
  	*
  	* @param uri Uri
  	* @param revisionNumber Revision number
  	* @exception ServiceAccessException Service access error
  	*/
  	//----------------------------------------
  	public void removeRevisionDescriptor(Uri uri, NodeRevisionNumber number)
          throws ServiceAccessException {
  		if (descriptor==null) return;
  		
          descriptor.remove(number.toString());
  		save(uri);
      }
  	
  }
  
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: Filesystem based store for structure

Posted by Marc DECUGIS <md...@mds-design.fr>.
> Humble question:
> If it's a filesystem-based store, why is it called 
> XMLMemDescriptorsStore (assuming 'Mem' is short for 'Memory') ?
> Wouldn't XMLDescriptorsStore or XMLFileDescriptorsStore be more 
> appropriate ?
Formely I decided to store Remy's MemoryDescriptorStore
as is in a XML form file.
I agree we you that XMLFileDescriptorsStore is
now a more appropriate name.
-- 
Marc DECUGIS, Modelisation Design Simulation
e-mail: mdecugis@mds-design.fr
tel : (33) 04 78 54 62 96
fax : (33) 04 78 54 63 57


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>