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 lu...@apache.org on 2004/07/21 19:36:29 UTC

cvs commit: jakarta-slide/src/stores/org/apache/slide/store/mem AbstractTransientStore.java TransientContentStore.java TransientDescriptorsStore.java TransientDescriptorStore.java TransientLockStore.java TransientNodeStore.java TransientSecurityStore.java VersionedUriKey.java

luetzkendorf    2004/07/21 10:36:29

  Added:       src/stores/org/apache/slide/store/mem
                        AbstractTransientStore.java
                        TransientContentStore.java
                        TransientDescriptorsStore.java
                        TransientDescriptorStore.java
                        TransientLockStore.java TransientNodeStore.java
                        TransientSecurityStore.java VersionedUriKey.java
  Log:
  first versions of transient utility stores added
  (they are successfully tested with the transaction package
  checked out 20040721 but not with the version currently checked in)
  this is WORK IN PROGRESS
  
  Revision  Changes    Path
  1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/AbstractTransientStore.java
  
  Index: AbstractTransientStore.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/AbstractTransientStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/21 17:36:29 $
   *
   * ====================================================================
   *
   * Copyright 1999-2002 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   */
  package org.apache.slide.store.mem;
  
  import java.lang.reflect.Constructor;
  import java.lang.reflect.InvocationTargetException;
  import java.text.MessageFormat;
  import java.util.Collections;
  import java.util.Enumeration;
  import java.util.HashMap;
  import java.util.Hashtable;
  import java.util.Iterator;
  import java.util.Map;
  import java.util.NoSuchElementException;
  
  import javax.transaction.xa.XAException;
  import javax.transaction.xa.XAResource;
  import javax.transaction.xa.Xid;
  
  import org.apache.commons.transaction.memory.ConflictException;
  import org.apache.commons.transaction.memory.TransactionalMapWrapper;
  import org.apache.commons.transaction.memory.jca.MapXAResource;
  import org.apache.commons.transaction.util.xa.XidWrapper;
  
  import org.apache.slide.common.AbstractServiceBase;
  import org.apache.slide.common.NamespaceAccessToken;
  import org.apache.slide.common.ServiceAccessException;
  import org.apache.slide.common.ServiceConnectionFailedException;
  import org.apache.slide.common.ServiceDisconnectionFailedException;
  import org.apache.slide.common.ServiceInitializationFailedException;
  import org.apache.slide.common.ServiceParameterErrorException;
  import org.apache.slide.common.ServiceParameterMissingException;
  import org.apache.slide.common.ServiceResetFailedException;
  import org.apache.slide.util.logger.Logger;
  
  
  /**
   * @author Stefan L�tzkendorf
   */
  public abstract class AbstractTransientStore extends AbstractServiceBase {
     
     static final String MAP_IMPL_PARAMETER = "map-classname";
     static final String MAP_IMPL_PARAMETER_DEFAULT = 
        "org.apache.commons.transaction.memory.OptimisticMapWrapper";
     
     private Map parameters = null;
     private boolean isConnected = false;
     
     /**
      * The map containing the stored content.
      */
     private TransactionalMapWrapper store = null;
  
     /**
      * The XAResource to delegate all XA requests.
      */
     private MapXAResource xaResource = null; 
  
     private Map suspendedContexts = Collections.synchronizedMap(new HashMap());
  
     public AbstractTransientStore() {
        
     }
     
     // ----------------------------------------------------- XAResource Mathods
     
     public void start(Xid xid, int flags)
        throws XAException 
     {
        debug("start {0} {1}", xid, Integer.toString(flags));
        this.xaResource.start(xid, flags);
        // >>
        if (flags == XAResource.TMRESUME) {
           Xid key = XidWrapper.wrap(xid);
           TransactionalMapWrapper.TxContext txContext = 
                 (TransactionalMapWrapper.TxContext)suspendedContexts.get(key);
           if (txContext != null) {
              this.store.resumeTransaction(txContext);
              this.suspendedContexts.remove(key);
           } else {
              throw new XAException("no such suspended txn");
           }
        } else {
           this.store.startTransaction();
        }
        // <<
     }
     
     public void commit(Xid xid, boolean onePhase)
        throws XAException 
     {
        debug("commit {0} {1}", xid, Boolean.valueOf(onePhase));
        try {
           this.xaResource.commit(xid, onePhase);
        }
        catch (ConflictException e) {
           this.xaResource.rollback(xid);
           // TODO it would be great if we could if we could throw something
           // that would (on the webdav layer) leads to a 409 Conflict
           // instead of 500 Internal Server Erroe
           throw new XAException(XAException.XA_RBOTHER); // ??
        }
     }
     
     public int prepare(Xid xid)
        throws XAException 
     {
        debug("prepare {0}", xid);
        // >>
        // resume if suspended, because the transactional map throws an exception
        // if we call prepare on suspended txns
        Xid key = XidWrapper.wrap(xid);
        TransactionalMapWrapper.TxContext txContext = 
              (TransactionalMapWrapper.TxContext)this.suspendedContexts.get(key);
        if (txContext != null) {
           this.store.resumeTransaction(txContext);
           this.suspendedContexts.remove(key);
        }
        // <<
        return this.xaResource.prepare(xid);   
     }
  
     public void end(Xid xid, int flags)
         throws XAException 
     {
        debug("end {0} {1}", xid, Integer.toString(flags));
        this.xaResource.end(xid, flags);
        // >>
        if (flags == XAResource.TMSUSPEND) {
           TransactionalMapWrapper.TxContext txContext = 
              this.store.suspendTransaction();
           this.suspendedContexts.put(XidWrapper.wrap(xid), txContext);
        }
        // <<
     }
     
     public void rollback(Xid xid)
         throws XAException 
     {
        debug("rollback {0}", xid);
        // >>
        // resume if suspended, because the transactional map throws an exception
        // if we call prepare on suspended txns
        Xid key = XidWrapper.wrap(xid);
        TransactionalMapWrapper.TxContext txContext = 
              (TransactionalMapWrapper.TxContext)this.suspendedContexts.get(key);
        if (txContext != null) {
           this.store.resumeTransaction(txContext);
           this.suspendedContexts.remove(key);
        }
        // <<
        this.xaResource.rollback(xid);
     }
     
     public Xid[] recover(int flag)
        throws XAException 
     {
        debug("recover {0}", Integer.toString(flag));
        return this.xaResource.recover(flag);
     }
  
     public void forget(Xid xid)
         throws XAException 
     {
         debug("forget {0}", xid);
         this.xaResource.forget(xid);
     }
     
     public int getTransactionTimeout()
         throws XAException 
     {
         return this.xaResource.getTransactionTimeout();
     }
  
     public boolean setTransactionTimeout(int seconds)
         throws XAException
     {
         return this.xaResource.setTransactionTimeout(seconds);
     }
     
     public boolean isSameRM(XAResource xares)
         throws XAException 
     {
        return this == xares;
     }
     
     
     
  
     // ------------------------------------- Store accessors for implementations
  
     protected void put(Object key, Object value) {
        this.store.put(key, value);
     }
     
     protected Object get(Object key) {
        return this.store.get(key);
     }
     
     protected Object remove(Object key) {
        return this.store.remove(key);
     }
     
     // ------------------------------------------------ ContextTuple InnerClass
     
     public void setParameters(Hashtable parameters)
           throws ServiceParameterErrorException,
                  ServiceParameterMissingException 
     {
        this.parameters = new HashMap(parameters);
     }
     
     protected String getParameter(String name) {
        if (this.parameters != null) {
           return (String)this.parameters.get(name);
        } else {
           throw new IllegalStateException("Parameter not yet set!");
        }
     }
     public void initialize(NamespaceAccessToken token)
        throws ServiceInitializationFailedException
     {
        super.initialize(token);
        
        String param = (String)this.parameters.get(MAP_IMPL_PARAMETER);
        if (param == null) {
           param = MAP_IMPL_PARAMETER_DEFAULT;
        }
        try {
           info("Initializing {0} using {1}.", getClass().getName(), param);
           Map toBeWrapped = new HashMap();
           Class mapClass = Class.forName(param);
           Class[] ctorFormalArgs = { Map.class };
           Constructor ctor = mapClass.getConstructor(ctorFormalArgs);
           Object[] ctorArgs = { toBeWrapped };
           this.store = (TransactionalMapWrapper)ctor.newInstance(ctorArgs);
        } 
        catch (ClassNotFoundException e) {
           throw new ServiceInitializationFailedException(this, e);
        } 
        catch (InstantiationException e) {
           throw new ServiceInitializationFailedException(this, e);
        } 
        catch (IllegalAccessException e) {
           throw new ServiceInitializationFailedException(this, e);
        }
        catch (NoSuchMethodException e) {
           throw new ServiceInitializationFailedException(this, e);
        }
        catch (InvocationTargetException e) {
           throw new ServiceInitializationFailedException(this, e);
        }
        catch (ClassCastException e) {
           throw new ServiceInitializationFailedException(this, 
                 "class in parameter '" + MAP_IMPL_PARAMETER + "' must " +
                       "be derived from TransactionalMapWrapper");
        }
        
        this.xaResource = new MapXAResource(this.store);
        // FIXME logging
     }
  
     public void connect() throws ServiceConnectionFailedException {
        this.isConnected = true;
     }
     public void disconnect() throws ServiceDisconnectionFailedException {
        this.isConnected = false;
     }
     public void reset() throws ServiceResetFailedException {
     }
     public boolean isConnected() throws ServiceAccessException {
        return this.isConnected;
     }
     
  
     // -------------------------------------------------------------------
  
     
     protected String LogChannel() {  
        return LOG_CHANNEL;
     }
     protected void debug(String msg, Object o) {
       if (this.getLogger().isEnabled(Logger.DEBUG)) {
          Object[] args = { o };
          this.getLogger().log(MessageFormat.format(msg, args), 
                               LogChannel(), Logger.DEBUG);
       }
     }
     protected void debug(String msg, Object o1, Object o2) {
       if (this.getLogger().isEnabled(Logger.DEBUG)) {
          Object[] args = { o1, o2 };
          this.getLogger().log(MessageFormat.format(msg, args), 
                               LogChannel(), Logger.DEBUG);
       }
     }
     private void info(String msg, Object o1, Object o2) {
        if (this.getLogger().isEnabled(Logger.INFO)) {
           Object[] args = { o1, o2 };
           this.getLogger().log(MessageFormat.format(msg, args), 
                                LogChannel(), Logger.INFO);
        }
     }
     
     /**
      * Empty enumeration.
      */
     protected static Enumeration EMPTY_ENUM = new Enumeration() {
        public boolean hasMoreElements() {
           return false;
        }
        public Object nextElement() {
           throw new NoSuchElementException();
        }
     };
     
     /**
      * Enumeration wrapper for an Iterator. 
      */
     protected static class IteratorEnum implements Enumeration {
        private Iterator iterator;
        public IteratorEnum(Iterator iterator){
           this.iterator = iterator;
        }
        public boolean hasMoreElements() {
           return this.iterator.hasNext();
        }
        public Object nextElement() {
           return this.iterator.next();
        }
     }
  }
  
  
  
  1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientContentStore.java
  
  Index: TransientContentStore.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientContentStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/21 17:36:29 $
   *
   * ====================================================================
   *
   * Copyright 1999-2002 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   */
  package org.apache.slide.store.mem;
  
  import org.apache.slide.common.ServiceAccessException;
  import org.apache.slide.common.Uri;
  import org.apache.slide.content.NodeRevisionContent;
  import org.apache.slide.content.NodeRevisionDescriptor;
  import org.apache.slide.content.RevisionAlreadyExistException;
  import org.apache.slide.content.RevisionNotFoundException;
  import org.apache.slide.store.ContentStore;
  
  
  /**
   * @author Stefan L�tzkendorf
   */
  public class TransientContentStore extends AbstractTransientStore implements
        ContentStore
  {
     // FIXME: should we clone the content byte array?
  
     public NodeRevisionContent retrieveRevisionContent(Uri uri,
           NodeRevisionDescriptor revisionDescriptor)
           throws ServiceAccessException, RevisionNotFoundException
     {
        VersionedUriKey key = new VersionedUriKey(uri, 
              revisionDescriptor.getRevisionNumber());
        debug("retrieveRevisionContent {0}", key);
        
        byte[] content = (byte[])get(key);
        if (content != null) {
           NodeRevisionContent revisionContent = new NodeRevisionContent();
           revisionContent.setContent(content);
           return revisionContent;
        } else {
           throw new RevisionNotFoundException(uri.toString(), 
                 revisionDescriptor.getRevisionNumber());
        }
     }
  
     public void createRevisionContent(Uri uri,
           NodeRevisionDescriptor revisionDescriptor,
           NodeRevisionContent revisionContent) throws ServiceAccessException,
           RevisionAlreadyExistException
     {
        VersionedUriKey key = new VersionedUriKey(uri, 
              revisionDescriptor.getRevisionNumber());
        debug("createRevisionContent {0}", key);
        
        byte[] content = (byte[])get(key);
        if (content == null) {
           put(key, revisionContent.getContentBytes());
        } else {
           throw new RevisionAlreadyExistException(uri.toString(), 
                 revisionDescriptor.getRevisionNumber());
        }
     }
     
     public void storeRevisionContent(Uri uri,
           NodeRevisionDescriptor revisionDescriptor,
           NodeRevisionContent revisionContent) throws ServiceAccessException,
           RevisionNotFoundException
     {
        VersionedUriKey key = new VersionedUriKey(uri, 
              revisionDescriptor.getRevisionNumber());
        debug("storeRevisionContent {0}", key);
       
        byte[] content = (byte[])get(key);
        if (content != null) {
           put(key, revisionContent.getContentBytes());
        } else {
           throw new RevisionNotFoundException(uri.toString(), 
                 revisionDescriptor.getRevisionNumber());
        }
     }
  
     public void removeRevisionContent(Uri uri,
           NodeRevisionDescriptor revisionDescriptor)
           throws ServiceAccessException
     {
        VersionedUriKey key = new VersionedUriKey(uri, 
              revisionDescriptor.getRevisionNumber());
        debug("storeRevisionContent {0}", key);
        
        remove(key);
     }
  }
  
  
  
  1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientDescriptorsStore.java
  
  Index: TransientDescriptorsStore.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientDescriptorsStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/21 17:36:29 $
   *
   * ====================================================================
   *
   * Copyright 1999-2002 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   */
  package org.apache.slide.store.mem;
  
  import org.apache.slide.common.ServiceAccessException;
  import org.apache.slide.common.Uri;
  import org.apache.slide.content.NodeRevisionDescriptors;
  import org.apache.slide.content.RevisionDescriptorNotFoundException;
  import org.apache.slide.store.RevisionDescriptorsStore;
  
  
  /**
   * @author Stefan L�tzkendorf
   */
  public class TransientDescriptorsStore extends AbstractTransientStore implements
        RevisionDescriptorsStore
  {
     // Note: cloning is done by the ExtendedStore
     
     public NodeRevisionDescriptors retrieveRevisionDescriptors(Uri uri)
           throws ServiceAccessException, RevisionDescriptorNotFoundException
     {
        NodeRevisionDescriptors descriptors = 
              (NodeRevisionDescriptors)get(uri.toString());
        if (descriptors != null) {
           return descriptors;
        } else {
           throw new RevisionDescriptorNotFoundException(uri.toString());
        }
     }
  
     public void createRevisionDescriptors(Uri uri,
           NodeRevisionDescriptors revisionDescriptors)
           throws ServiceAccessException
     {
        put(uri.toString(), revisionDescriptors);
     }
  
     public void storeRevisionDescriptors(Uri uri,
           NodeRevisionDescriptors revisionDescriptors)
           throws ServiceAccessException, RevisionDescriptorNotFoundException
     {
        NodeRevisionDescriptors descriptors = 
              (NodeRevisionDescriptors)get(uri.toString());
        if (descriptors != null) {
           put(uri.toString(), revisionDescriptors);
        } else {
           throw new RevisionDescriptorNotFoundException(uri.toString());
        }
     }
  
     public void removeRevisionDescriptors(Uri uri) throws ServiceAccessException
     {
        remove(uri.toString());
     }
  }
  
  
  
  1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientDescriptorStore.java
  
  Index: TransientDescriptorStore.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientDescriptorStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/21 17:36:29 $
   *
   * ====================================================================
   *
   * Copyright 1999-2002 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   */
  package org.apache.slide.store.mem;
  
  import org.apache.slide.common.ServiceAccessException;
  import org.apache.slide.common.Uri;
  import org.apache.slide.content.NodeRevisionDescriptor;
  import org.apache.slide.content.NodeRevisionNumber;
  import org.apache.slide.content.RevisionDescriptorNotFoundException;
  import org.apache.slide.store.RevisionDescriptorStore;
  
  
  /**
   * @author Stefan L�tzkendorf
   */
  public class TransientDescriptorStore extends AbstractTransientStore implements
        RevisionDescriptorStore
  {
     // Note: we don't clone the descriptors because ExtendedStore does
  
     public NodeRevisionDescriptor retrieveRevisionDescriptor(Uri uri,
           NodeRevisionNumber revisionNumber) throws ServiceAccessException,
           RevisionDescriptorNotFoundException
     {
        NodeRevisionDescriptor descriptor = 
           (NodeRevisionDescriptor)get(new VersionedUriKey(uri, revisionNumber));
        if (descriptor != null) {
           return descriptor;
        } else {
           throw new RevisionDescriptorNotFoundException(uri.toString());
        }
     }
  
     public void createRevisionDescriptor(Uri uri,
           NodeRevisionDescriptor revisionDescriptor)
           throws ServiceAccessException
     {
        put(new VersionedUriKey(uri, revisionDescriptor.getRevisionNumber()), 
              revisionDescriptor);
     }
  
     public void storeRevisionDescriptor(Uri uri,
           NodeRevisionDescriptor revisionDescriptor)
           throws ServiceAccessException, RevisionDescriptorNotFoundException
     {
        VersionedUriKey key = new VersionedUriKey(uri, 
              revisionDescriptor.getRevisionNumber());
        NodeRevisionDescriptor descriptor = (NodeRevisionDescriptor)get(key);
        if (descriptor != null) {
           put(key, revisionDescriptor);
        } else {
           throw new RevisionDescriptorNotFoundException(uri.toString());
        }
     }
  
     public void removeRevisionDescriptor(Uri uri,
           NodeRevisionNumber revisionNumber) throws ServiceAccessException
     {
        remove(new VersionedUriKey(uri, revisionNumber));
     }
  }
  
  
  
  1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientLockStore.java
  
  Index: TransientLockStore.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientLockStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/21 17:36:29 $
   *
   * ====================================================================
   *
   * Copyright 1999-2002 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   */
  package org.apache.slide.store.mem;
  
  import java.util.ArrayList;
  import java.util.Enumeration;
  import java.util.List;
  
  import org.apache.slide.common.ServiceAccessException;
  import org.apache.slide.common.Uri;
  import org.apache.slide.lock.LockTokenNotFoundException;
  import org.apache.slide.lock.NodeLock;
  import org.apache.slide.store.LockStore;
  
  
  /**
   * @author Stefan L�tzkendorf
   */
  public class TransientLockStore extends AbstractTransientStore 
     implements LockStore 
  {
     // Note: we don't clone Locks because ExtendedStore clones
  
     public void putLock(Uri uri, NodeLock lock) throws ServiceAccessException {
        debug("putLock {0} {1}", uri, lock.getLockId());
        List list = (List)get(uri.toString());
        if (list != null) {
           list = new ArrayList(list);
        } else {
           list = new ArrayList();
        }
        list.add(lock);
        put(uri.toString(), list);
     }
     
     public void renewLock(Uri uri, NodeLock lock)
        throws ServiceAccessException, LockTokenNotFoundException 
     {
        debug("renewLock {0} {1}", uri, lock.getLockId());
        List list = (List)get(uri.toString());
        if (list == null || !list.contains(lock)) {
           throw new LockTokenNotFoundException(lock);
        }
        list = new ArrayList(list);
        list.remove(lock);
        list.add(lock);
        put(uri.toString(), list);
     }
  
     public void removeLock(Uri uri, NodeLock lock)
        throws ServiceAccessException, LockTokenNotFoundException 
     {
        debug("removeLock {0} {1}", uri, lock.getLockId());
        List list = (List)get(uri.toString());
        if (list == null) {
           throw new LockTokenNotFoundException(lock);
        }
        if (!list.contains(lock)) {
           throw new LockTokenNotFoundException(lock);
        } else {
           if (list.size() == 1) {
              remove(uri.toString());
           } else {
              list = new ArrayList(list);
              list.remove(lock);
              put(uri.toString(), list);
           }
        }
     }
     
     public void killLock(Uri uri, NodeLock lock)
        throws ServiceAccessException, LockTokenNotFoundException 
     {
        debug("killLock {0} {1}", uri, lock.getLockId());
        removeLock(uri, lock);
     }
  
     public Enumeration enumerateLocks(Uri uri) throws ServiceAccessException 
     {
        debug("enumerateLocks {0}", uri);
  
        List list = (List)get(uri.toString());
        if (list != null) {
           return new IteratorEnum(list.iterator());
        } else {
           return EMPTY_ENUM;
        }
     }
  }
  
  
  
  1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientNodeStore.java
  
  Index: TransientNodeStore.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientNodeStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/21 17:36:29 $
   *
   * ====================================================================
   *
   * Copyright 1999-2002 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   */
  package org.apache.slide.store.mem;
  
  import org.apache.slide.common.ServiceAccessException;
  import org.apache.slide.common.Uri;
  import org.apache.slide.store.NodeStore;
  import org.apache.slide.structure.ObjectAlreadyExistsException;
  import org.apache.slide.structure.ObjectNode;
  import org.apache.slide.structure.ObjectNotFoundException;
  
  
  /**
   * NodeStore that stores ObjectNodes in transient memory. 
   * 
   * @author Stefan L�tzkendorf
   */
  public class TransientNodeStore extends AbstractTransientStore implements
        NodeStore
  {
     // Note: we don't clone ObjectNodes because ExtendedStore clones
  
     public ObjectNode retrieveObject(Uri uri) throws ServiceAccessException,
           ObjectNotFoundException
     {
        ObjectNode node = (ObjectNode)get(uri.toString());
        if (node != null) {
           return node;
        } else {
           throw new ObjectNotFoundException(uri);
        }
     }
  
     public void storeObject(Uri uri, ObjectNode object)
           throws ServiceAccessException, ObjectNotFoundException
     {
        ObjectNode node = (ObjectNode)get(uri.toString());
        if (node != null) {
           put(uri.toString(), object);
        } else {
           throw new ObjectNotFoundException(uri);
        }
     }
  
     public void createObject(Uri uri, ObjectNode object)
           throws ServiceAccessException, ObjectAlreadyExistsException
     {
        ObjectNode node = (ObjectNode)get(uri.toString());
        if (node == null) {
           put(uri.toString(), object); 
        } else {
           throw new ObjectAlreadyExistsException(uri.toString());
        }
     }
  
     public void removeObject(Uri uri, ObjectNode object)
           throws ServiceAccessException, ObjectNotFoundException
     {
        ObjectNode node = (ObjectNode)get(uri.toString());
        if (node != null) {
           remove(uri.toString());
        } else {
           throw new ObjectNotFoundException(uri);
        }
     }
  }
  
  
  
  1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientSecurityStore.java
  
  Index: TransientSecurityStore.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientSecurityStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/21 17:36:29 $
   *
   * ====================================================================
   *
   * Copyright 1999-2002 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   */
  package org.apache.slide.store.mem;
  
  import java.util.ArrayList;
  import java.util.Enumeration;
  import java.util.List;
  
  import org.apache.slide.common.ServiceAccessException;
  import org.apache.slide.common.Uri;
  import org.apache.slide.security.NodePermission;
  import org.apache.slide.store.SecurityStore;
  
  
  /**
   * @author Stefan L�tzkendorf
   */
  public class TransientSecurityStore extends AbstractTransientStore implements
        SecurityStore
  {
     // ExtendendStore always caches, so we don't
     
     public void grantPermission(Uri uri, NodePermission permission)
           throws ServiceAccessException
     {
        List list = (List)get(uri.toString());
        if (list != null) {
           list = new ArrayList(list);
        } else {
           list = new ArrayList();
        }
        list.add(permission);
        put(uri.toString(), list);
     }
  
     public void revokePermission(Uri uri, NodePermission permission)
           throws ServiceAccessException
     {
        List list = (List)get(uri.toString());
        if (list != null) {
           list = new ArrayList(list);
           if (list.remove(permission)) {
              if (list.size() > 0) {
                 put(uri.toString(), list);
              } else {
                 remove(uri.toString());
              }
           } 
        }
     }
  
     public void revokePermissions(Uri uri) throws ServiceAccessException
     {
        List list = (List)get(uri.toString());
        if (list != null) {
           remove(uri.toString());
        }
     }
  
     public Enumeration enumeratePermissions(Uri uri)
           throws ServiceAccessException
     {
        List list = (List)get(uri.toString());
        if (list != null) {
           return new IteratorEnum(list.iterator());
        } else {
           return EMPTY_ENUM;
        }
     }
  
  }
  
  
  
  1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/VersionedUriKey.java
  
  Index: VersionedUriKey.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/VersionedUriKey.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/21 17:36:29 $
   *
   * ====================================================================
   *
   * Copyright 1999-2002 The Apache Software Foundation
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   */
  package org.apache.slide.store.mem;
  
  import org.apache.slide.common.Uri;
  import org.apache.slide.content.NodeRevisionNumber;
  
  
  /**
   * Class to hold an URI and a version number to be used as key in maps.
   * 
   * @author Stefan L�tzkendorf
   */
  class VersionedUriKey {
     private String uri;
     private String version;
     VersionedUriKey(Uri uri, NodeRevisionNumber number) 
     {
        this.uri = uri.toString();
        this.version = number.toString();
     }
     public boolean equals(Object obj)
     {
        if (obj == this) return true;
        if (obj instanceof VersionedUriKey) {
           VersionedUriKey that = (VersionedUriKey)obj;
           return this.uri.equals(that.uri) && this.version.equals(that.version);
        }
        return false;
     }
     public int hashCode()
     {
        return (uri.hashCode() + version.hashCode());
     }
     public String toString()
     {
        return uri + " - " + version;
     }
  }
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org


Re: cvs commit: jakarta-slide/src/stores/org/apache/slide/store/mem AbstractTransientStore.java TransientContentStore.java TransientDescriptorsStore.java TransientDescriptorStore.java TransientLockStore.java TransientNodeStore.java TransientSecurityStore.java VersionedUriKey.java

Posted by Oliver Zeigermann <ol...@zeigermann.de>.
That's great stuff! I was just wondering about the XAResource 
implementation. Why not using the AbstractXAResource from commons 
transaction? Works fine and leaves a single source to modify for the XA 
methods...

Oliver

luetzkendorf@apache.org wrote:

> luetzkendorf    2004/07/21 10:36:29
> 
>   Added:       src/stores/org/apache/slide/store/mem
>                         AbstractTransientStore.java
>                         TransientContentStore.java
>                         TransientDescriptorsStore.java
>                         TransientDescriptorStore.java
>                         TransientLockStore.java TransientNodeStore.java
>                         TransientSecurityStore.java VersionedUriKey.java
>   Log:
>   first versions of transient utility stores added
>   (they are successfully tested with the transaction package
>   checked out 20040721 but not with the version currently checked in)
>   this is WORK IN PROGRESS
>   
>   Revision  Changes    Path
>   1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/AbstractTransientStore.java
>   
>   Index: AbstractTransientStore.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/AbstractTransientStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
>    * $Revision: 1.1 $
>    * $Date: 2004/07/21 17:36:29 $
>    *
>    * ====================================================================
>    *
>    * Copyright 1999-2002 The Apache Software Foundation
>    *
>    * Licensed under the Apache License, Version 2.0 (the "License");
>    * you may not use this file except in compliance with the License.
>    * You may obtain a copy of the License at
>    *
>    *     http://www.apache.org/licenses/LICENSE-2.0
>    *
>    * Unless required by applicable law or agreed to in writing, software
>    * distributed under the License is distributed on an "AS IS" BASIS,
>    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>    * See the License for the specific language governing permissions and
>    * limitations under the License.
>    *
>    */
>   package org.apache.slide.store.mem;
>   
>   import java.lang.reflect.Constructor;
>   import java.lang.reflect.InvocationTargetException;
>   import java.text.MessageFormat;
>   import java.util.Collections;
>   import java.util.Enumeration;
>   import java.util.HashMap;
>   import java.util.Hashtable;
>   import java.util.Iterator;
>   import java.util.Map;
>   import java.util.NoSuchElementException;
>   
>   import javax.transaction.xa.XAException;
>   import javax.transaction.xa.XAResource;
>   import javax.transaction.xa.Xid;
>   
>   import org.apache.commons.transaction.memory.ConflictException;
>   import org.apache.commons.transaction.memory.TransactionalMapWrapper;
>   import org.apache.commons.transaction.memory.jca.MapXAResource;
>   import org.apache.commons.transaction.util.xa.XidWrapper;
>   
>   import org.apache.slide.common.AbstractServiceBase;
>   import org.apache.slide.common.NamespaceAccessToken;
>   import org.apache.slide.common.ServiceAccessException;
>   import org.apache.slide.common.ServiceConnectionFailedException;
>   import org.apache.slide.common.ServiceDisconnectionFailedException;
>   import org.apache.slide.common.ServiceInitializationFailedException;
>   import org.apache.slide.common.ServiceParameterErrorException;
>   import org.apache.slide.common.ServiceParameterMissingException;
>   import org.apache.slide.common.ServiceResetFailedException;
>   import org.apache.slide.util.logger.Logger;
>   
>   
>   /**
>    * @author Stefan Lützkendorf
>    */
>   public abstract class AbstractTransientStore extends AbstractServiceBase {
>      
>      static final String MAP_IMPL_PARAMETER = "map-classname";
>      static final String MAP_IMPL_PARAMETER_DEFAULT = 
>         "org.apache.commons.transaction.memory.OptimisticMapWrapper";
>      
>      private Map parameters = null;
>      private boolean isConnected = false;
>      
>      /**
>       * The map containing the stored content.
>       */
>      private TransactionalMapWrapper store = null;
>   
>      /**
>       * The XAResource to delegate all XA requests.
>       */
>      private MapXAResource xaResource = null; 
>   
>      private Map suspendedContexts = Collections.synchronizedMap(new HashMap());
>   
>      public AbstractTransientStore() {
>         
>      }
>      
>      // ----------------------------------------------------- XAResource Mathods
>      
>      public void start(Xid xid, int flags)
>         throws XAException 
>      {
>         debug("start {0} {1}", xid, Integer.toString(flags));
>         this.xaResource.start(xid, flags);
>         // >>
>         if (flags == XAResource.TMRESUME) {
>            Xid key = XidWrapper.wrap(xid);
>            TransactionalMapWrapper.TxContext txContext = 
>                  (TransactionalMapWrapper.TxContext)suspendedContexts.get(key);
>            if (txContext != null) {
>               this.store.resumeTransaction(txContext);
>               this.suspendedContexts.remove(key);
>            } else {
>               throw new XAException("no such suspended txn");
>            }
>         } else {
>            this.store.startTransaction();
>         }
>         // <<
>      }
>      
>      public void commit(Xid xid, boolean onePhase)
>         throws XAException 
>      {
>         debug("commit {0} {1}", xid, Boolean.valueOf(onePhase));
>         try {
>            this.xaResource.commit(xid, onePhase);
>         }
>         catch (ConflictException e) {
>            this.xaResource.rollback(xid);
>            // TODO it would be great if we could if we could throw something
>            // that would (on the webdav layer) leads to a 409 Conflict
>            // instead of 500 Internal Server Erroe
>            throw new XAException(XAException.XA_RBOTHER); // ??
>         }
>      }
>      
>      public int prepare(Xid xid)
>         throws XAException 
>      {
>         debug("prepare {0}", xid);
>         // >>
>         // resume if suspended, because the transactional map throws an exception
>         // if we call prepare on suspended txns
>         Xid key = XidWrapper.wrap(xid);
>         TransactionalMapWrapper.TxContext txContext = 
>               (TransactionalMapWrapper.TxContext)this.suspendedContexts.get(key);
>         if (txContext != null) {
>            this.store.resumeTransaction(txContext);
>            this.suspendedContexts.remove(key);
>         }
>         // <<
>         return this.xaResource.prepare(xid);   
>      }
>   
>      public void end(Xid xid, int flags)
>          throws XAException 
>      {
>         debug("end {0} {1}", xid, Integer.toString(flags));
>         this.xaResource.end(xid, flags);
>         // >>
>         if (flags == XAResource.TMSUSPEND) {
>            TransactionalMapWrapper.TxContext txContext = 
>               this.store.suspendTransaction();
>            this.suspendedContexts.put(XidWrapper.wrap(xid), txContext);
>         }
>         // <<
>      }
>      
>      public void rollback(Xid xid)
>          throws XAException 
>      {
>         debug("rollback {0}", xid);
>         // >>
>         // resume if suspended, because the transactional map throws an exception
>         // if we call prepare on suspended txns
>         Xid key = XidWrapper.wrap(xid);
>         TransactionalMapWrapper.TxContext txContext = 
>               (TransactionalMapWrapper.TxContext)this.suspendedContexts.get(key);
>         if (txContext != null) {
>            this.store.resumeTransaction(txContext);
>            this.suspendedContexts.remove(key);
>         }
>         // <<
>         this.xaResource.rollback(xid);
>      }
>      
>      public Xid[] recover(int flag)
>         throws XAException 
>      {
>         debug("recover {0}", Integer.toString(flag));
>         return this.xaResource.recover(flag);
>      }
>   
>      public void forget(Xid xid)
>          throws XAException 
>      {
>          debug("forget {0}", xid);
>          this.xaResource.forget(xid);
>      }
>      
>      public int getTransactionTimeout()
>          throws XAException 
>      {
>          return this.xaResource.getTransactionTimeout();
>      }
>   
>      public boolean setTransactionTimeout(int seconds)
>          throws XAException
>      {
>          return this.xaResource.setTransactionTimeout(seconds);
>      }
>      
>      public boolean isSameRM(XAResource xares)
>          throws XAException 
>      {
>         return this == xares;
>      }
>      
>      
>      
>   
>      // ------------------------------------- Store accessors for implementations
>   
>      protected void put(Object key, Object value) {
>         this.store.put(key, value);
>      }
>      
>      protected Object get(Object key) {
>         return this.store.get(key);
>      }
>      
>      protected Object remove(Object key) {
>         return this.store.remove(key);
>      }
>      
>      // ------------------------------------------------ ContextTuple InnerClass
>      
>      public void setParameters(Hashtable parameters)
>            throws ServiceParameterErrorException,
>                   ServiceParameterMissingException 
>      {
>         this.parameters = new HashMap(parameters);
>      }
>      
>      protected String getParameter(String name) {
>         if (this.parameters != null) {
>            return (String)this.parameters.get(name);
>         } else {
>            throw new IllegalStateException("Parameter not yet set!");
>         }
>      }
>      public void initialize(NamespaceAccessToken token)
>         throws ServiceInitializationFailedException
>      {
>         super.initialize(token);
>         
>         String param = (String)this.parameters.get(MAP_IMPL_PARAMETER);
>         if (param == null) {
>            param = MAP_IMPL_PARAMETER_DEFAULT;
>         }
>         try {
>            info("Initializing {0} using {1}.", getClass().getName(), param);
>            Map toBeWrapped = new HashMap();
>            Class mapClass = Class.forName(param);
>            Class[] ctorFormalArgs = { Map.class };
>            Constructor ctor = mapClass.getConstructor(ctorFormalArgs);
>            Object[] ctorArgs = { toBeWrapped };
>            this.store = (TransactionalMapWrapper)ctor.newInstance(ctorArgs);
>         } 
>         catch (ClassNotFoundException e) {
>            throw new ServiceInitializationFailedException(this, e);
>         } 
>         catch (InstantiationException e) {
>            throw new ServiceInitializationFailedException(this, e);
>         } 
>         catch (IllegalAccessException e) {
>            throw new ServiceInitializationFailedException(this, e);
>         }
>         catch (NoSuchMethodException e) {
>            throw new ServiceInitializationFailedException(this, e);
>         }
>         catch (InvocationTargetException e) {
>            throw new ServiceInitializationFailedException(this, e);
>         }
>         catch (ClassCastException e) {
>            throw new ServiceInitializationFailedException(this, 
>                  "class in parameter '" + MAP_IMPL_PARAMETER + "' must " +
>                        "be derived from TransactionalMapWrapper");
>         }
>         
>         this.xaResource = new MapXAResource(this.store);
>         // FIXME logging
>      }
>   
>      public void connect() throws ServiceConnectionFailedException {
>         this.isConnected = true;
>      }
>      public void disconnect() throws ServiceDisconnectionFailedException {
>         this.isConnected = false;
>      }
>      public void reset() throws ServiceResetFailedException {
>      }
>      public boolean isConnected() throws ServiceAccessException {
>         return this.isConnected;
>      }
>      
>   
>      // -------------------------------------------------------------------
>   
>      
>      protected String LogChannel() {  
>         return LOG_CHANNEL;
>      }
>      protected void debug(String msg, Object o) {
>        if (this.getLogger().isEnabled(Logger.DEBUG)) {
>           Object[] args = { o };
>           this.getLogger().log(MessageFormat.format(msg, args), 
>                                LogChannel(), Logger.DEBUG);
>        }
>      }
>      protected void debug(String msg, Object o1, Object o2) {
>        if (this.getLogger().isEnabled(Logger.DEBUG)) {
>           Object[] args = { o1, o2 };
>           this.getLogger().log(MessageFormat.format(msg, args), 
>                                LogChannel(), Logger.DEBUG);
>        }
>      }
>      private void info(String msg, Object o1, Object o2) {
>         if (this.getLogger().isEnabled(Logger.INFO)) {
>            Object[] args = { o1, o2 };
>            this.getLogger().log(MessageFormat.format(msg, args), 
>                                 LogChannel(), Logger.INFO);
>         }
>      }
>      
>      /**
>       * Empty enumeration.
>       */
>      protected static Enumeration EMPTY_ENUM = new Enumeration() {
>         public boolean hasMoreElements() {
>            return false;
>         }
>         public Object nextElement() {
>            throw new NoSuchElementException();
>         }
>      };
>      
>      /**
>       * Enumeration wrapper for an Iterator. 
>       */
>      protected static class IteratorEnum implements Enumeration {
>         private Iterator iterator;
>         public IteratorEnum(Iterator iterator){
>            this.iterator = iterator;
>         }
>         public boolean hasMoreElements() {
>            return this.iterator.hasNext();
>         }
>         public Object nextElement() {
>            return this.iterator.next();
>         }
>      }
>   }
>   
>   
>   
>   1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientContentStore.java
>   
>   Index: TransientContentStore.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientContentStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
>    * $Revision: 1.1 $
>    * $Date: 2004/07/21 17:36:29 $
>    *
>    * ====================================================================
>    *
>    * Copyright 1999-2002 The Apache Software Foundation
>    *
>    * Licensed under the Apache License, Version 2.0 (the "License");
>    * you may not use this file except in compliance with the License.
>    * You may obtain a copy of the License at
>    *
>    *     http://www.apache.org/licenses/LICENSE-2.0
>    *
>    * Unless required by applicable law or agreed to in writing, software
>    * distributed under the License is distributed on an "AS IS" BASIS,
>    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>    * See the License for the specific language governing permissions and
>    * limitations under the License.
>    *
>    */
>   package org.apache.slide.store.mem;
>   
>   import org.apache.slide.common.ServiceAccessException;
>   import org.apache.slide.common.Uri;
>   import org.apache.slide.content.NodeRevisionContent;
>   import org.apache.slide.content.NodeRevisionDescriptor;
>   import org.apache.slide.content.RevisionAlreadyExistException;
>   import org.apache.slide.content.RevisionNotFoundException;
>   import org.apache.slide.store.ContentStore;
>   
>   
>   /**
>    * @author Stefan Lützkendorf
>    */
>   public class TransientContentStore extends AbstractTransientStore implements
>         ContentStore
>   {
>      // FIXME: should we clone the content byte array?
>   
>      public NodeRevisionContent retrieveRevisionContent(Uri uri,
>            NodeRevisionDescriptor revisionDescriptor)
>            throws ServiceAccessException, RevisionNotFoundException
>      {
>         VersionedUriKey key = new VersionedUriKey(uri, 
>               revisionDescriptor.getRevisionNumber());
>         debug("retrieveRevisionContent {0}", key);
>         
>         byte[] content = (byte[])get(key);
>         if (content != null) {
>            NodeRevisionContent revisionContent = new NodeRevisionContent();
>            revisionContent.setContent(content);
>            return revisionContent;
>         } else {
>            throw new RevisionNotFoundException(uri.toString(), 
>                  revisionDescriptor.getRevisionNumber());
>         }
>      }
>   
>      public void createRevisionContent(Uri uri,
>            NodeRevisionDescriptor revisionDescriptor,
>            NodeRevisionContent revisionContent) throws ServiceAccessException,
>            RevisionAlreadyExistException
>      {
>         VersionedUriKey key = new VersionedUriKey(uri, 
>               revisionDescriptor.getRevisionNumber());
>         debug("createRevisionContent {0}", key);
>         
>         byte[] content = (byte[])get(key);
>         if (content == null) {
>            put(key, revisionContent.getContentBytes());
>         } else {
>            throw new RevisionAlreadyExistException(uri.toString(), 
>                  revisionDescriptor.getRevisionNumber());
>         }
>      }
>      
>      public void storeRevisionContent(Uri uri,
>            NodeRevisionDescriptor revisionDescriptor,
>            NodeRevisionContent revisionContent) throws ServiceAccessException,
>            RevisionNotFoundException
>      {
>         VersionedUriKey key = new VersionedUriKey(uri, 
>               revisionDescriptor.getRevisionNumber());
>         debug("storeRevisionContent {0}", key);
>        
>         byte[] content = (byte[])get(key);
>         if (content != null) {
>            put(key, revisionContent.getContentBytes());
>         } else {
>            throw new RevisionNotFoundException(uri.toString(), 
>                  revisionDescriptor.getRevisionNumber());
>         }
>      }
>   
>      public void removeRevisionContent(Uri uri,
>            NodeRevisionDescriptor revisionDescriptor)
>            throws ServiceAccessException
>      {
>         VersionedUriKey key = new VersionedUriKey(uri, 
>               revisionDescriptor.getRevisionNumber());
>         debug("storeRevisionContent {0}", key);
>         
>         remove(key);
>      }
>   }
>   
>   
>   
>   1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientDescriptorsStore.java
>   
>   Index: TransientDescriptorsStore.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientDescriptorsStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
>    * $Revision: 1.1 $
>    * $Date: 2004/07/21 17:36:29 $
>    *
>    * ====================================================================
>    *
>    * Copyright 1999-2002 The Apache Software Foundation
>    *
>    * Licensed under the Apache License, Version 2.0 (the "License");
>    * you may not use this file except in compliance with the License.
>    * You may obtain a copy of the License at
>    *
>    *     http://www.apache.org/licenses/LICENSE-2.0
>    *
>    * Unless required by applicable law or agreed to in writing, software
>    * distributed under the License is distributed on an "AS IS" BASIS,
>    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>    * See the License for the specific language governing permissions and
>    * limitations under the License.
>    *
>    */
>   package org.apache.slide.store.mem;
>   
>   import org.apache.slide.common.ServiceAccessException;
>   import org.apache.slide.common.Uri;
>   import org.apache.slide.content.NodeRevisionDescriptors;
>   import org.apache.slide.content.RevisionDescriptorNotFoundException;
>   import org.apache.slide.store.RevisionDescriptorsStore;
>   
>   
>   /**
>    * @author Stefan Lützkendorf
>    */
>   public class TransientDescriptorsStore extends AbstractTransientStore implements
>         RevisionDescriptorsStore
>   {
>      // Note: cloning is done by the ExtendedStore
>      
>      public NodeRevisionDescriptors retrieveRevisionDescriptors(Uri uri)
>            throws ServiceAccessException, RevisionDescriptorNotFoundException
>      {
>         NodeRevisionDescriptors descriptors = 
>               (NodeRevisionDescriptors)get(uri.toString());
>         if (descriptors != null) {
>            return descriptors;
>         } else {
>            throw new RevisionDescriptorNotFoundException(uri.toString());
>         }
>      }
>   
>      public void createRevisionDescriptors(Uri uri,
>            NodeRevisionDescriptors revisionDescriptors)
>            throws ServiceAccessException
>      {
>         put(uri.toString(), revisionDescriptors);
>      }
>   
>      public void storeRevisionDescriptors(Uri uri,
>            NodeRevisionDescriptors revisionDescriptors)
>            throws ServiceAccessException, RevisionDescriptorNotFoundException
>      {
>         NodeRevisionDescriptors descriptors = 
>               (NodeRevisionDescriptors)get(uri.toString());
>         if (descriptors != null) {
>            put(uri.toString(), revisionDescriptors);
>         } else {
>            throw new RevisionDescriptorNotFoundException(uri.toString());
>         }
>      }
>   
>      public void removeRevisionDescriptors(Uri uri) throws ServiceAccessException
>      {
>         remove(uri.toString());
>      }
>   }
>   
>   
>   
>   1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientDescriptorStore.java
>   
>   Index: TransientDescriptorStore.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientDescriptorStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
>    * $Revision: 1.1 $
>    * $Date: 2004/07/21 17:36:29 $
>    *
>    * ====================================================================
>    *
>    * Copyright 1999-2002 The Apache Software Foundation
>    *
>    * Licensed under the Apache License, Version 2.0 (the "License");
>    * you may not use this file except in compliance with the License.
>    * You may obtain a copy of the License at
>    *
>    *     http://www.apache.org/licenses/LICENSE-2.0
>    *
>    * Unless required by applicable law or agreed to in writing, software
>    * distributed under the License is distributed on an "AS IS" BASIS,
>    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>    * See the License for the specific language governing permissions and
>    * limitations under the License.
>    *
>    */
>   package org.apache.slide.store.mem;
>   
>   import org.apache.slide.common.ServiceAccessException;
>   import org.apache.slide.common.Uri;
>   import org.apache.slide.content.NodeRevisionDescriptor;
>   import org.apache.slide.content.NodeRevisionNumber;
>   import org.apache.slide.content.RevisionDescriptorNotFoundException;
>   import org.apache.slide.store.RevisionDescriptorStore;
>   
>   
>   /**
>    * @author Stefan Lützkendorf
>    */
>   public class TransientDescriptorStore extends AbstractTransientStore implements
>         RevisionDescriptorStore
>   {
>      // Note: we don't clone the descriptors because ExtendedStore does
>   
>      public NodeRevisionDescriptor retrieveRevisionDescriptor(Uri uri,
>            NodeRevisionNumber revisionNumber) throws ServiceAccessException,
>            RevisionDescriptorNotFoundException
>      {
>         NodeRevisionDescriptor descriptor = 
>            (NodeRevisionDescriptor)get(new VersionedUriKey(uri, revisionNumber));
>         if (descriptor != null) {
>            return descriptor;
>         } else {
>            throw new RevisionDescriptorNotFoundException(uri.toString());
>         }
>      }
>   
>      public void createRevisionDescriptor(Uri uri,
>            NodeRevisionDescriptor revisionDescriptor)
>            throws ServiceAccessException
>      {
>         put(new VersionedUriKey(uri, revisionDescriptor.getRevisionNumber()), 
>               revisionDescriptor);
>      }
>   
>      public void storeRevisionDescriptor(Uri uri,
>            NodeRevisionDescriptor revisionDescriptor)
>            throws ServiceAccessException, RevisionDescriptorNotFoundException
>      {
>         VersionedUriKey key = new VersionedUriKey(uri, 
>               revisionDescriptor.getRevisionNumber());
>         NodeRevisionDescriptor descriptor = (NodeRevisionDescriptor)get(key);
>         if (descriptor != null) {
>            put(key, revisionDescriptor);
>         } else {
>            throw new RevisionDescriptorNotFoundException(uri.toString());
>         }
>      }
>   
>      public void removeRevisionDescriptor(Uri uri,
>            NodeRevisionNumber revisionNumber) throws ServiceAccessException
>      {
>         remove(new VersionedUriKey(uri, revisionNumber));
>      }
>   }
>   
>   
>   
>   1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientLockStore.java
>   
>   Index: TransientLockStore.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientLockStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
>    * $Revision: 1.1 $
>    * $Date: 2004/07/21 17:36:29 $
>    *
>    * ====================================================================
>    *
>    * Copyright 1999-2002 The Apache Software Foundation
>    *
>    * Licensed under the Apache License, Version 2.0 (the "License");
>    * you may not use this file except in compliance with the License.
>    * You may obtain a copy of the License at
>    *
>    *     http://www.apache.org/licenses/LICENSE-2.0
>    *
>    * Unless required by applicable law or agreed to in writing, software
>    * distributed under the License is distributed on an "AS IS" BASIS,
>    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>    * See the License for the specific language governing permissions and
>    * limitations under the License.
>    *
>    */
>   package org.apache.slide.store.mem;
>   
>   import java.util.ArrayList;
>   import java.util.Enumeration;
>   import java.util.List;
>   
>   import org.apache.slide.common.ServiceAccessException;
>   import org.apache.slide.common.Uri;
>   import org.apache.slide.lock.LockTokenNotFoundException;
>   import org.apache.slide.lock.NodeLock;
>   import org.apache.slide.store.LockStore;
>   
>   
>   /**
>    * @author Stefan Lützkendorf
>    */
>   public class TransientLockStore extends AbstractTransientStore 
>      implements LockStore 
>   {
>      // Note: we don't clone Locks because ExtendedStore clones
>   
>      public void putLock(Uri uri, NodeLock lock) throws ServiceAccessException {
>         debug("putLock {0} {1}", uri, lock.getLockId());
>         List list = (List)get(uri.toString());
>         if (list != null) {
>            list = new ArrayList(list);
>         } else {
>            list = new ArrayList();
>         }
>         list.add(lock);
>         put(uri.toString(), list);
>      }
>      
>      public void renewLock(Uri uri, NodeLock lock)
>         throws ServiceAccessException, LockTokenNotFoundException 
>      {
>         debug("renewLock {0} {1}", uri, lock.getLockId());
>         List list = (List)get(uri.toString());
>         if (list == null || !list.contains(lock)) {
>            throw new LockTokenNotFoundException(lock);
>         }
>         list = new ArrayList(list);
>         list.remove(lock);
>         list.add(lock);
>         put(uri.toString(), list);
>      }
>   
>      public void removeLock(Uri uri, NodeLock lock)
>         throws ServiceAccessException, LockTokenNotFoundException 
>      {
>         debug("removeLock {0} {1}", uri, lock.getLockId());
>         List list = (List)get(uri.toString());
>         if (list == null) {
>            throw new LockTokenNotFoundException(lock);
>         }
>         if (!list.contains(lock)) {
>            throw new LockTokenNotFoundException(lock);
>         } else {
>            if (list.size() == 1) {
>               remove(uri.toString());
>            } else {
>               list = new ArrayList(list);
>               list.remove(lock);
>               put(uri.toString(), list);
>            }
>         }
>      }
>      
>      public void killLock(Uri uri, NodeLock lock)
>         throws ServiceAccessException, LockTokenNotFoundException 
>      {
>         debug("killLock {0} {1}", uri, lock.getLockId());
>         removeLock(uri, lock);
>      }
>   
>      public Enumeration enumerateLocks(Uri uri) throws ServiceAccessException 
>      {
>         debug("enumerateLocks {0}", uri);
>   
>         List list = (List)get(uri.toString());
>         if (list != null) {
>            return new IteratorEnum(list.iterator());
>         } else {
>            return EMPTY_ENUM;
>         }
>      }
>   }
>   
>   
>   
>   1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientNodeStore.java
>   
>   Index: TransientNodeStore.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientNodeStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
>    * $Revision: 1.1 $
>    * $Date: 2004/07/21 17:36:29 $
>    *
>    * ====================================================================
>    *
>    * Copyright 1999-2002 The Apache Software Foundation
>    *
>    * Licensed under the Apache License, Version 2.0 (the "License");
>    * you may not use this file except in compliance with the License.
>    * You may obtain a copy of the License at
>    *
>    *     http://www.apache.org/licenses/LICENSE-2.0
>    *
>    * Unless required by applicable law or agreed to in writing, software
>    * distributed under the License is distributed on an "AS IS" BASIS,
>    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>    * See the License for the specific language governing permissions and
>    * limitations under the License.
>    *
>    */
>   package org.apache.slide.store.mem;
>   
>   import org.apache.slide.common.ServiceAccessException;
>   import org.apache.slide.common.Uri;
>   import org.apache.slide.store.NodeStore;
>   import org.apache.slide.structure.ObjectAlreadyExistsException;
>   import org.apache.slide.structure.ObjectNode;
>   import org.apache.slide.structure.ObjectNotFoundException;
>   
>   
>   /**
>    * NodeStore that stores ObjectNodes in transient memory. 
>    * 
>    * @author Stefan Lützkendorf
>    */
>   public class TransientNodeStore extends AbstractTransientStore implements
>         NodeStore
>   {
>      // Note: we don't clone ObjectNodes because ExtendedStore clones
>   
>      public ObjectNode retrieveObject(Uri uri) throws ServiceAccessException,
>            ObjectNotFoundException
>      {
>         ObjectNode node = (ObjectNode)get(uri.toString());
>         if (node != null) {
>            return node;
>         } else {
>            throw new ObjectNotFoundException(uri);
>         }
>      }
>   
>      public void storeObject(Uri uri, ObjectNode object)
>            throws ServiceAccessException, ObjectNotFoundException
>      {
>         ObjectNode node = (ObjectNode)get(uri.toString());
>         if (node != null) {
>            put(uri.toString(), object);
>         } else {
>            throw new ObjectNotFoundException(uri);
>         }
>      }
>   
>      public void createObject(Uri uri, ObjectNode object)
>            throws ServiceAccessException, ObjectAlreadyExistsException
>      {
>         ObjectNode node = (ObjectNode)get(uri.toString());
>         if (node == null) {
>            put(uri.toString(), object); 
>         } else {
>            throw new ObjectAlreadyExistsException(uri.toString());
>         }
>      }
>   
>      public void removeObject(Uri uri, ObjectNode object)
>            throws ServiceAccessException, ObjectNotFoundException
>      {
>         ObjectNode node = (ObjectNode)get(uri.toString());
>         if (node != null) {
>            remove(uri.toString());
>         } else {
>            throw new ObjectNotFoundException(uri);
>         }
>      }
>   }
>   
>   
>   
>   1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/TransientSecurityStore.java
>   
>   Index: TransientSecurityStore.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/TransientSecurityStore.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
>    * $Revision: 1.1 $
>    * $Date: 2004/07/21 17:36:29 $
>    *
>    * ====================================================================
>    *
>    * Copyright 1999-2002 The Apache Software Foundation
>    *
>    * Licensed under the Apache License, Version 2.0 (the "License");
>    * you may not use this file except in compliance with the License.
>    * You may obtain a copy of the License at
>    *
>    *     http://www.apache.org/licenses/LICENSE-2.0
>    *
>    * Unless required by applicable law or agreed to in writing, software
>    * distributed under the License is distributed on an "AS IS" BASIS,
>    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>    * See the License for the specific language governing permissions and
>    * limitations under the License.
>    *
>    */
>   package org.apache.slide.store.mem;
>   
>   import java.util.ArrayList;
>   import java.util.Enumeration;
>   import java.util.List;
>   
>   import org.apache.slide.common.ServiceAccessException;
>   import org.apache.slide.common.Uri;
>   import org.apache.slide.security.NodePermission;
>   import org.apache.slide.store.SecurityStore;
>   
>   
>   /**
>    * @author Stefan Lützkendorf
>    */
>   public class TransientSecurityStore extends AbstractTransientStore implements
>         SecurityStore
>   {
>      // ExtendendStore always caches, so we don't
>      
>      public void grantPermission(Uri uri, NodePermission permission)
>            throws ServiceAccessException
>      {
>         List list = (List)get(uri.toString());
>         if (list != null) {
>            list = new ArrayList(list);
>         } else {
>            list = new ArrayList();
>         }
>         list.add(permission);
>         put(uri.toString(), list);
>      }
>   
>      public void revokePermission(Uri uri, NodePermission permission)
>            throws ServiceAccessException
>      {
>         List list = (List)get(uri.toString());
>         if (list != null) {
>            list = new ArrayList(list);
>            if (list.remove(permission)) {
>               if (list.size() > 0) {
>                  put(uri.toString(), list);
>               } else {
>                  remove(uri.toString());
>               }
>            } 
>         }
>      }
>   
>      public void revokePermissions(Uri uri) throws ServiceAccessException
>      {
>         List list = (List)get(uri.toString());
>         if (list != null) {
>            remove(uri.toString());
>         }
>      }
>   
>      public Enumeration enumeratePermissions(Uri uri)
>            throws ServiceAccessException
>      {
>         List list = (List)get(uri.toString());
>         if (list != null) {
>            return new IteratorEnum(list.iterator());
>         } else {
>            return EMPTY_ENUM;
>         }
>      }
>   
>   }
>   
>   
>   
>   1.1                  jakarta-slide/src/stores/org/apache/slide/store/mem/VersionedUriKey.java
>   
>   Index: VersionedUriKey.java
>   ===================================================================
>   /*
>    * $Header: /home/cvs/jakarta-slide/src/stores/org/apache/slide/store/mem/VersionedUriKey.java,v 1.1 2004/07/21 17:36:29 luetzkendorf Exp $
>    * $Revision: 1.1 $
>    * $Date: 2004/07/21 17:36:29 $
>    *
>    * ====================================================================
>    *
>    * Copyright 1999-2002 The Apache Software Foundation
>    *
>    * Licensed under the Apache License, Version 2.0 (the "License");
>    * you may not use this file except in compliance with the License.
>    * You may obtain a copy of the License at
>    *
>    *     http://www.apache.org/licenses/LICENSE-2.0
>    *
>    * Unless required by applicable law or agreed to in writing, software
>    * distributed under the License is distributed on an "AS IS" BASIS,
>    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>    * See the License for the specific language governing permissions and
>    * limitations under the License.
>    *
>    */
>   package org.apache.slide.store.mem;
>   
>   import org.apache.slide.common.Uri;
>   import org.apache.slide.content.NodeRevisionNumber;
>   
>   
>   /**
>    * Class to hold an URI and a version number to be used as key in maps.
>    * 
>    * @author Stefan Lützkendorf
>    */
>   class VersionedUriKey {
>      private String uri;
>      private String version;
>      VersionedUriKey(Uri uri, NodeRevisionNumber number) 
>      {
>         this.uri = uri.toString();
>         this.version = number.toString();
>      }
>      public boolean equals(Object obj)
>      {
>         if (obj == this) return true;
>         if (obj instanceof VersionedUriKey) {
>            VersionedUriKey that = (VersionedUriKey)obj;
>            return this.uri.equals(that.uri) && this.version.equals(that.version);
>         }
>         return false;
>      }
>      public int hashCode()
>      {
>         return (uri.hashCode() + version.hashCode());
>      }
>      public String toString()
>      {
>         return uri + " - " + version;
>      }
>   }
>   
>   
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: slide-dev-help@jakarta.apache.org
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org