You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2004/11/12 00:04:20 UTC

cvs commit: db-ojb/src/java/org/apache/ojb/broker/locking LockServerServlet.java LockMap.java LockManager.java AbstractLockStrategy.java SerializableStrategy.java LockManagerDefaultImpl.java LockEntry.java ReadUncommittedStrategy.java LockStrategy.java LockMapInMemoryImpl.java ReadCommittedStrategy.java LockMapRemoteImpl.java RepeatableReadStrategy.java

arminw      2004/11/11 15:04:20

  Modified:    src/java/org/apache/ojb/broker/locking Tag: OJB_1_0_RELEASE
                        LockServerServlet.java LockMap.java
                        LockManager.java AbstractLockStrategy.java
                        SerializableStrategy.java
                        LockManagerDefaultImpl.java LockEntry.java
                        ReadUncommittedStrategy.java LockStrategy.java
                        LockMapInMemoryImpl.java ReadCommittedStrategy.java
                        LockMapRemoteImpl.java RepeatableReadStrategy.java
  Log:
  LockManager#releaseLock: if a write lock was found, now all read locks will be released too.
  http://nagoya.apache.org/eyebrowse/ReadMsg?listName=ojb-user@db.apache.org&msgNo=14885
  
  LockMap#releaseLock method signature changed
  
  fix javadoc
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.1.2.2   +8 -8      db-ojb/src/java/org/apache/ojb/broker/locking/LockServerServlet.java
  
  Index: LockServerServlet.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/LockServerServlet.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- LockServerServlet.java	18 Sep 2004 13:01:05 -0000	1.1.2.1
  +++ LockServerServlet.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -207,16 +207,16 @@
       private LockEntry getWriter(byte[] data) throws IOException, ClassNotFoundException
       {
           LockEntry entry;
  -        String lockedObj = (String) deserialize(data);
  -        entry = lockmap.getWriter(lockedObj);
  +        String resourceId = (String) deserialize(data);
  +        entry = lockmap.getWriter(resourceId);
           return entry;
       }
   
       private Collection getAllReaders(byte[] data) throws IOException, ClassNotFoundException
       {
           Collection readers;
  -        String lockedObj = (String) deserialize(data);
  -        readers = lockmap.getReaders(lockedObj);
  +        String resourceId = (String) deserialize(data);
  +        readers = lockmap.getReaders(resourceId);
   
           return new ArrayList(readers);
       }
  @@ -298,17 +298,17 @@
   
       private Boolean hasReadLock(byte[] data) throws IOException, ClassNotFoundException
       {
  -        Boolean result = Boolean.TRUE;
  +        boolean result = false;
           LockEntry lock = (LockEntry) deserialize(data);
           try
           {
  -            lockmap.hasReadLock(lock);
  +            result = lockmap.hasReadLock(lock);
           }
           catch(Throwable t)
           {
  -            result = Boolean.FALSE;
  +            result = false;
           }
  -        return result;
  +        return result ? Boolean.TRUE : Boolean.FALSE;
       }
   
   
  
  
  
  1.1.2.2   +37 -22    db-ojb/src/java/org/apache/ojb/broker/locking/LockMap.java
  
  Index: LockMap.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/LockMap.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- LockMap.java	18 Sep 2004 13:01:06 -0000	1.1.2.1
  +++ LockMap.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -17,53 +17,68 @@
   
   import java.util.Collection;
   
  +/**
  + * This class encapsulates the locked objects and is responsible to guarantee
  + * consistence of locked objects.
  + * <p>
  + * The default implementation {@link LockMapInMemoryImpl} only provide support for
  + * single JVM locking.
  + * </p>
  + *
  + * @see LockMapInMemoryImpl
  + * @version $Id$
  + */
   public interface LockMap
   {
       /**
  -     * returns the LockEntry for the Writer of object obj.
  +     * Returns the {@link LockEntry} for the writer
  +     * for the specified resource object.
        * If now writer exists, null is returned.
        */
  -    public LockEntry getWriter(Object lockedObj);
  +    public LockEntry getWriter(Object resourceId);
   
       /**
  -     * returns a collection of Reader LockEntries for object obj.
  -     * If now LockEntries could be found an empty Vector is returned.
  +     * Returns a collection of Reader {@link LockEntry} instances
  +     * for the specified resource object
  +     * If no lock entry could be found an empty collection is returned.
        */
  -    public Collection getReaders(Object lockedObj);
  +    public Collection getReaders(Object resourceId);
   
       /**
  -     * Add a reader lock entry for transaction tx on object obj
  -     * to the persistent storage.
  +     * Add a reader lock entry for the specified key on
  +     * the resource object.
        */
  -    public boolean addReader(Object key, Object lockedObj, int isolationLevel);
  +    public boolean addReader(Object key, Object resourceId, int isolationLevel);
   
       /**
  -     * remove a reader lock entry for transaction tx on object obj
  -     * from the persistent storage.
  +     * Remove a reader lock entry for the specified key on
  +     * the resource object, returns <code>true</code> if an reader
  +     * was found and removed.
        */
  -    public void removeReader(Object key, Object lockedObj);
  +    public boolean removeReader(Object key, Object resourceId);
   
       /**
  -     * remove a writer lock entry for transaction tx on object obj
  -     * from the persistent storage.
  +     * Remove a writer lock entry for the specified key on
  +     * the resource object, returns <code>true</code> if an reader
  +     * was found and removed.
        */
  -    public void removeWriter(LockEntry writer);
  +    public boolean removeWriter(LockEntry writer);
   
       /**
  -     * upgrade a reader lock entry for transaction tx on object obj
  -     * and write it to the persistent storage.
  +     * Upgrade a reader lock entry for the specified key on
  +     * the resource object.
        */
       public boolean upgradeLock(LockEntry reader);
   
       /**
  -     * generate a writer lock entry for transaction tx on object obj
  -     * and write it to the persistent storage.
  +     * Generate a writer lock entry for the specified key on
  +     * the resource object.
        */
  -    public boolean setWriter(Object key, Object lockedObj, int isolationLevel);
  +    public boolean setWriter(Object key, Object resourceId, int isolationLevel);
   
       /**
  -     * check if there is a reader lock entry for transaction tx on object obj
  -     * in the persistent storage.
  +     * Check if there is a reader lock entry for the specified key on
  +     * the resource object.
        */
  -    public boolean hasReadLock(Object key, Object lockedObj);
  +    public boolean hasReadLock(Object key, Object resourceId);
   }
  
  
  
  1.1.2.2   +30 -18    db-ojb/src/java/org/apache/ojb/broker/locking/LockManager.java
  
  Index: LockManager.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/LockManager.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- LockManager.java	18 Sep 2004 13:01:05 -0000	1.1.2.1
  +++ LockManager.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -18,51 +18,63 @@
   
   
   /**
  - * This interface declares the functionality of the OJB internal Locking mechanism.
  - * A default implementaion LockManagerDefaultImpl is provided. This implementaion
  - * keeps distributed locks in the database. The locking mechanisms thus involves a
  - * lot of database lookups and writes. For some environments this solution may not
  - * be adequate. OJB allows to provide user defined implementations of this interface.
  - * To activate a user defined LockManagerDefaultImpl it must be configured in the OJB.properties file.
  + * This interface declares the functionality of the OJB internal
  + * pessimistic Locking mechanism.
  + * <p>
  + * A default implementaion {@link LockManagerDefaultImpl} is provided.
  + * OJB allows to provide user defined implementations of this interface.
  + * To activate a user defined LockManager implementation it must be configured in
  + * the OJB.properties file. Normally the default implementation of this class fit
  + * all requirements.
  + * </p>
  + * <p>
  + * Much more important are the pluggable {@link LockMap} implementations, these implementations
  + * keep the lock keys and the locked objects.
  + * </p>
  + *
  + * @see LockManagerDefaultImpl
  + * @see LockStrategy
  + * @see LockMap
    *
    * @author thma
  + * @version $Id$
    */
   public interface LockManager
   {
       /**
  -     * aquires a readlock for transaction tx on object obj.
  +     * Aquires a readlock for lock key on resource object.
        * Returns true if successful, else false.
        */
  -    public abstract boolean readLock(Object key, Object lockedObj, int isolationLevel);
  +    public abstract boolean readLock(Object key, Object resourceId, int isolationLevel);
   
       /**
  -     * aquires a writelock for transaction tx on object obj.
  +     * Aquires a writelock for lock key on resource object.
        * Returns true if successful, else false.
        */
  -    public abstract boolean writeLock(Object key, Object lockedObj, int isolationLevel);
  +    public abstract boolean writeLock(Object key, Object resourceId, int isolationLevel);
   
       /**
  -     * upgrades readlock for transaction tx on object obj to a writelock.
  +     * Upgrades readlock for lock key on resource object.
        * If no readlock existed a writelock is acquired anyway.
        * Returns true if successful, else false.
        */
  -    public abstract boolean upgradeLock(Object key, Object lockedObj, int isolationLevel);
  +    public abstract boolean upgradeLock(Object key, Object resourceId, int isolationLevel);
   
       /**
  -     * releases a lock for transaction tx on object obj.
  +     * Releases a lock for lock key on resource object.
        * Returns true if successful, else false.
        */
  -    public abstract boolean releaseLock(Object key, Object lockedObj, int isolationLevel);
  +    public abstract boolean releaseLock(Object key, Object resourceId, int isolationLevel);
   
       /**
  -     * checks if there is a readlock for transaction tx on object obj.
  +     * Checks if there is a readlock for lock key on resource object.
        * Returns true if so, else false.
        */
  -    public abstract boolean checkRead(Object key, Object lockedObj, int isolationLevel);
  +    public abstract boolean checkRead(Object key, Object resourceId, int isolationLevel);
   
       /**
  -     * checks if there is a writelock for transaction tx on object obj.
  +     * Checks if there is a writelock for lock key on resource object.
        * Returns true if so, else false.
        */
  -    public abstract boolean checkWrite(Object key, Object lockedObj, int isolationLevel);
  +    public abstract boolean checkWrite(Object key, Object resourceId, int isolationLevel);
   }
  
  
  
  1.1.2.2   +23 -27    db-ojb/src/java/org/apache/ojb/broker/locking/AbstractLockStrategy.java
  
  Index: AbstractLockStrategy.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/AbstractLockStrategy.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- AbstractLockStrategy.java	18 Sep 2004 13:01:04 -0000	1.1.2.1
  +++ AbstractLockStrategy.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -18,7 +18,7 @@
   import java.util.Collection;
   
   /**
  - * The base class of all LockingStrategies. It provides the basic
  + * The base class of all {@link LockStrategy}. It provides the basic
    * infrastructure to read and write locks to the persistent storage.
    *
    * @author Thomas Mahler
  @@ -41,54 +41,52 @@
       }
   
       /**
  -     * returns the LockEntry for the Writer of object obj.
  +     * returns the LockEntry for the Writer of object resourceId.
        * If now writer exists, null is returned.
        */
  -    protected LockEntry getWriter(Object lockedObj)
  +    protected LockEntry getWriter(Object resourceId)
       {
  -        return lockMap.getWriter(lockedObj);
  +        return lockMap.getWriter(resourceId);
       }
   
       /**
  -     * returns a collection of Reader LockEntries for object obj.
  +     * returns a collection of Reader LockEntries for object resourceId.
        * If now LockEntries could be found an empty Vector is returned.
        */
  -    protected Collection getReaders(Object lockedObj)
  +    protected Collection getReaders(Object resourceId)
       {
  -        return lockMap.getReaders(lockedObj);
  +        return lockMap.getReaders(resourceId);
       }
   
       /**
  -     * Add a reader lock entry for transaction tx on object obj
  +     * Add a reader lock entry for object 'key' on object resourceId
        * to the persistent storage.
        */
  -    protected boolean addReader(Object key, Object lockedObj, int isolationLevel)
  +    protected boolean addReader(Object key, Object resourceId, int isolationLevel)
       {
  -        return lockMap.addReader(key, lockedObj, isolationLevel);
  +        return lockMap.addReader(key, resourceId, isolationLevel);
       }
   
       /**
  -     * remove a reader lock entry for transaction tx on object obj
  +     * Remove a reader lock entry for lock key on object resourceId
        * from the persistent storage.
        */
  -    protected void removeReader(Object key, Object lockedObj)
  +    protected boolean removeReader(Object key, Object resourceId)
       {
  -        lockMap.removeReader(key, lockedObj);
  +        return lockMap.removeReader(key, resourceId);
       }
   
       /**
  -     * remove a writer lock entry for transaction tx on object obj
  -     * from the persistent storage.
  +     * Remove a writer lock entry for given {@link LockEntry}.
        */
  -    protected void removeWriter(LockEntry writer)
  +    protected boolean removeWriter(LockEntry writer)
       {
  -        lockMap.removeWriter(writer);
  +        return lockMap.removeWriter(writer);
       }
   
   
       /**
  -     * upgrade a reader lock entry for transaction tx on object obj
  -     * and write it to the persistent storage.
  +     * Upgrade a reader lock entry for given {@link LockEntry}.
        */
       protected boolean upgradeLock(LockEntry reader)
       {
  @@ -96,20 +94,18 @@
       }
   
       /**
  -     * generate a writer lock entry for transaction tx on object obj
  -     * and write it to the persistent storage.
  +     * Generate a writer lock entry for the specified key on object resourceId.
        */
  -    protected boolean setWriter(Object key, Object lockedObj, int isolationLevel)
  +    protected boolean setWriter(Object key, Object resourceId, int isolationLevel)
       {
  -        return lockMap.setWriter(key, lockedObj, isolationLevel);
  +        return lockMap.setWriter(key, resourceId, isolationLevel);
       }
   
       /**
  -     * check if there is a reader lock entry for transaction tx on object obj
  -     * in the persistent storage.
  +     * check if there is a reader lock entry for given key on object resourceId.
        */
  -    protected boolean hasReadLock(Object key, Object lockedObj)
  +    protected boolean hasReadLock(Object key, Object resourceId)
       {
  -        return lockMap.hasReadLock(key, lockedObj);
  +        return lockMap.hasReadLock(key, resourceId);
       }
   }
  
  
  
  1.1.2.2   +42 -38    db-ojb/src/java/org/apache/ojb/broker/locking/SerializableStrategy.java
  
  Index: SerializableStrategy.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/SerializableStrategy.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- SerializableStrategy.java	18 Sep 2004 13:01:05 -0000	1.1.2.1
  +++ SerializableStrategy.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -37,30 +37,30 @@
       /**
        * @see LockStrategy#readLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean readLock(Object key, Object lockedObj)
  +    public boolean readLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  -        Collection readers = getReaders(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
  +        Collection readers = getReaders(resourceId);
           if(writer == null)
           {
               // only one reader at a time
               if(readers.size() == 0)
               {
  -                if(addReader(key, lockedObj, ISOLATION_LEVEL))
  +                if(addReader(key, resourceId, ISOLATION_LEVEL))
                   {
  -                    readers = getReaders(lockedObj);
  +                    readers = getReaders(resourceId);
                       if(readers.size() == 1)
                       {
                           return true;
                       }
                       else
                       {
  -                        removeReader(key, lockedObj);
  -                        return readLock(key, lockedObj);
  +                        removeReader(key, resourceId);
  +                        return readLock(key, resourceId);
                       }
                   }
                   else
  -                    return readLock(key, lockedObj);
  +                    return readLock(key, resourceId);
               }
               else if((readers.size() == 1) && (((LockEntry) readers.iterator().next()).isOwnedBy(key)))
               {
  @@ -79,24 +79,24 @@
       /**
        * @see LockStrategy#writeLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean writeLock(Object key, Object lockedObj)
  +    public boolean writeLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  -        Collection readers = getReaders(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
  +        Collection readers = getReaders(resourceId);
           if(writer == null)
           {
               if(readers.size() == 0)
               {
  -                if(setWriter(key, lockedObj, ISOLATION_LEVEL))
  +                if(setWriter(key, resourceId, ISOLATION_LEVEL))
                       return true;
                   else
  -                    return writeLock(key, lockedObj);
  +                    return writeLock(key, resourceId);
               }
   
               else if(readers.size() == 1)
               {
                   if(((LockEntry) readers.iterator().next()).isOwnedBy(key))
  -                    return upgradeLock(key, lockedObj);
  +                    return upgradeLock(key, resourceId);
               }
           }
           else if(writer.isOwnedBy(key))
  @@ -109,12 +109,12 @@
       /**
        * @see LockStrategy#upgradeLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean upgradeLock(Object key, Object lockedObj)
  +    public boolean upgradeLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           if(writer == null)
           {
  -            Collection readers = getReaders(lockedObj);
  +            Collection readers = getReaders(resourceId);
               if(readers.size() == 1)
               {
                   LockEntry reader = (LockEntry) readers.iterator().next();
  @@ -123,17 +123,17 @@
                       if(upgradeLock(reader))
                           return true;
                       else
  -                        return upgradeLock(key, lockedObj);
  +                        return upgradeLock(key, resourceId);
                   }
               }
               else
               {
                   if(readers.size() == 0)
                   {
  -                    if(setWriter(key, lockedObj, ISOLATION_LEVEL))
  +                    if(setWriter(key, resourceId, ISOLATION_LEVEL))
                           return true;
                       else
  -                        return upgradeLock(key, lockedObj);
  +                        return upgradeLock(key, resourceId);
                   }
               }
           }
  @@ -148,35 +148,39 @@
       /**
        * @see LockStrategy#readLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean releaseLock(Object key, Object lockedObj)
  +    public boolean releaseLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
  +        boolean result = false;
  +//        if(writer != null && writer.isOwnedBy(key))
  +//        {
  +//            removeWriter(writer);
  +//            result = true;
  +//        }
  +//
  +//        if(hasReadLock(key, resourceId))
  +//        {
  +//            removeReader(key, resourceId);
  +//            result = true;
  +//        }
           if(writer != null && writer.isOwnedBy(key))
           {
  -            removeWriter(writer);
  -            return true;
  -        }
  -
  -        if(hasReadLock(key, lockedObj))
  -        {
  -            removeReader(key, lockedObj);
  -            return true;
  +            result = removeWriter(writer);
           }
  -        else
  -            return false;
  -
  +        if(removeReader(key, resourceId)) result = true;
  +        return result;
       }
   
       /**
        * @see LockStrategy#checkRead(java.lang.Object, java.lang.Object)
        */
  -    public boolean checkRead(Object key, Object lockedObj)
  +    public boolean checkRead(Object key, Object resourceId)
       {
  -        if(hasReadLock(key, lockedObj))
  +        if(hasReadLock(key, resourceId))
           {
               return true;
           }
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           if(writer != null && writer.isOwnedBy(key))
           {
               return true;
  @@ -188,9 +192,9 @@
       /**
        * @see LockStrategy#checkWrite(java.lang.Object, java.lang.Object)
        */
  -    public boolean checkWrite(Object key, Object lockedObj)
  +    public boolean checkWrite(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           return (writer != null && writer.isOwnedBy(key));
       }
   }
  
  
  
  1.1.2.2   +36 -48    db-ojb/src/java/org/apache/ojb/broker/locking/LockManagerDefaultImpl.java
  
  Index: LockManagerDefaultImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/LockManagerDefaultImpl.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- LockManagerDefaultImpl.java	18 Sep 2004 13:01:05 -0000	1.1.2.1
  +++ LockManagerDefaultImpl.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -20,28 +20,23 @@
   
   /**
    * The OJB default implementation of a Locking mechanism.
  + * <p>
    * This Implementation supports 4 transaction isolation levels
  - * as specified in the interface org.apache.ojb.broker.metadata.IsolationLevels:
  - * public final int IL_READ_UNCOMMITTED = 0;
  - * public final int IL_READ_COMMITTED = 1;
  - * public final int IL_REPEATABLE_READ = 2;
  - * public final int IL_SERIALIZABLE = 3;
  + * as specified in the interface {@link org.apache.ojb.broker.metadata.IsolationLevels}:
  + * <br/>public final int IL_READ_UNCOMMITTED = 0;
  + * <br/>public final int IL_READ_COMMITTED = 1;
  + * <br/>public final int IL_REPEATABLE_READ = 2;
  + * <br/>public final int IL_SERIALIZABLE = 3;
  + * <p/>
    * Isolationlevels can be adjusted per class.
  - * The proper lockhandling is done in the respective LockStrategy implementation.
  - * This default implementation provides persistent Locks that are stored in
  - * a special database table.
  - * To keep the locks in the database and not in memory allows to use
  - * them accross multiple distributed ODMG clients.
  + * The proper lock handling is done in the respective
  + * {@link LockStrategy} implementation.
    * <p/>
  - * Of course this solution causes a lot of database reads and writes even if
  - * no real application data is written to the database. This solution may
  - * thus not be suited for all environments. As the LockManager is pluggable
  - * its possible to replace the default implementation by user defined
  - * implementations.
  - * A different solution might be to implement the LockManager as an additional
  - * standalone server, that allows to elminate additional db reads and writes.
  + * As the LockManager is pluggable its possible to replace the default implementation
  + * by user defined implementations.
    *
    * @author thma
  + * @version $Id$
    */
   public class LockManagerDefaultImpl implements LockManager
   {
  @@ -54,69 +49,62 @@
       }
   
       /**
  -     * aquires a readlock for transaction tx on object obj.
  -     * Returns true if successful, else false.
  +     * @see LockManager#readLock(Object, Object, int)
        */
  -    public synchronized boolean readLock(Object key, Object lockedObj, int isolationLevel)
  +    public synchronized boolean readLock(Object key, Object resourceId, int isolationLevel)
       {
  -        if(log.isDebugEnabled()) log.debug("LM.readLock(tx-" + key + ", " + lockedObj + ")");
  +        if(log.isDebugEnabled()) log.debug("LM.readLock(tx-" + key + ", " + resourceId + ")");
           LockStrategy lockStrategy = lockStrategyManager.getStrategyFor(isolationLevel);
  -        return lockStrategy.readLock(key, lockedObj);
  +        return lockStrategy.readLock(key, resourceId);
       }
   
       /**
  -     * aquires a writelock for transaction tx on object obj.
  -     * Returns true if successful, else false.
  +     * @see LockManager#writeLock(Object, Object, int)
        */
  -    public synchronized boolean writeLock(Object key, Object lockedObj, int isolationLevel)
  +    public synchronized boolean writeLock(Object key, Object resourceId, int isolationLevel)
       {
  -        if(log.isDebugEnabled()) log.debug("LM.writeLock(tx-" + key + ", " + lockedObj + ")");
  +        if(log.isDebugEnabled()) log.debug("LM.writeLock(tx-" + key + ", " + resourceId + ")");
           LockStrategy lockStrategy = lockStrategyManager.getStrategyFor(isolationLevel);
  -        return lockStrategy.writeLock(key, lockedObj);
  +        return lockStrategy.writeLock(key, resourceId);
       }
   
       /**
  -     * upgrades readlock for transaction tx on object obj to a writelock.
  -     * If no readlock existed a writelock is acquired anyway.
  -     * Returns true if successful, else false.
  +     * @see LockManager#upgradeLock(Object, Object, int)
        */
  -    public synchronized boolean upgradeLock(Object key, Object lockedObj, int isolationLevel)
  +    public synchronized boolean upgradeLock(Object key, Object resourceId, int isolationLevel)
       {
  -        if(log.isDebugEnabled()) log.debug("LM.upgradeLock(tx-" + key + ", " + lockedObj + ")");
  +        if(log.isDebugEnabled()) log.debug("LM.upgradeLock(tx-" + key + ", " + resourceId + ")");
           LockStrategy lockStrategy = lockStrategyManager.getStrategyFor(isolationLevel);
  -        return lockStrategy.upgradeLock(key, lockedObj);
  +        return lockStrategy.upgradeLock(key, resourceId);
       }
   
       /**
  -     * releases a lock for transaction tx on object obj.
  -     * Returns true if successful, else false.
  +     * @see LockManager#releaseLock(Object, Object, int)
        */
  -    public synchronized boolean releaseLock(Object key, Object lockedObj, int isolationLevel)
  +    public synchronized boolean releaseLock(Object key, Object resourceId, int isolationLevel)
       {
  -        if(log.isDebugEnabled()) log.debug("LM.releaseLock(tx-" + key + ", " + lockedObj + ")");
  +        if(log.isDebugEnabled()) log.debug("LM.releaseLock(tx-" + key + ", " + resourceId + ")");
           LockStrategy lockStrategy = lockStrategyManager.getStrategyFor(isolationLevel);
  -        return lockStrategy.releaseLock(key, lockedObj);
  +        return lockStrategy.releaseLock(key, resourceId);
       }
   
       /**
  -     * checks if there is a readlock for transaction tx on object obj.
  -     * Returns true if so, else false.
  +     * @see LockManager#checkRead(Object, Object, int)
        */
  -    public synchronized boolean checkRead(Object key, Object lockedObj, int isolationLevel)
  +    public synchronized boolean checkRead(Object key, Object resourceId, int isolationLevel)
       {
  -        if(log.isDebugEnabled()) log.debug("LM.checkRead(tx-" + key + ", " + lockedObj + ")");
  +        if(log.isDebugEnabled()) log.debug("LM.checkRead(tx-" + key + ", " + resourceId + ')');
           LockStrategy lockStrategy = lockStrategyManager.getStrategyFor(isolationLevel);
  -        return lockStrategy.checkRead(key, lockedObj);
  +        return lockStrategy.checkRead(key, resourceId);
       }
   
       /**
  -     * checks if there is a writelock for transaction tx on object obj.
  -     * Returns true if so, else false.
  +     * @see LockManager#checkWrite(Object, Object, int)
        */
  -    public synchronized boolean checkWrite(Object key, Object lockedObj, int isolationLevel)
  +    public synchronized boolean checkWrite(Object key, Object resourceId, int isolationLevel)
       {
  -        if(log.isDebugEnabled()) log.debug("LM.checkWrite(tx-" + key + ", " + lockedObj + ")");
  +        if(log.isDebugEnabled()) log.debug("LM.checkWrite(tx-" + key + ", " + resourceId + ")");
           LockStrategy lockStrategy = lockStrategyManager.getStrategyFor(isolationLevel);
  -        return lockStrategy.checkWrite(key, lockedObj);
  +        return lockStrategy.checkWrite(key, resourceId);
       }
   }
  
  
  
  1.1.2.2   +17 -20    db-ojb/src/java/org/apache/ojb/broker/locking/LockEntry.java
  
  Index: LockEntry.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/LockEntry.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- LockEntry.java	18 Sep 2004 13:01:05 -0000	1.1.2.1
  +++ LockEntry.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -18,9 +18,7 @@
   import java.io.Serializable;
   
   /**
  - * a persistent entry for locks. All locks that are hold from
  - * transaction on objects are represented by a LockENtry and made
  - * persistent to the database.
  + * A lock entry encapsulates locking information.
    *
    * @author Thomas Mahler
    */
  @@ -38,9 +36,9 @@
       public static int LOCK_WRITE = 1;
   
       /**
  -     * the unique OID of the object to be locked.
  +     * the object to be locked.
        */
  -    private Object lockedObj;
  +    private Object resourceId;
   
       /**
        * key for locked object
  @@ -67,13 +65,13 @@
       /**
        * Multiargument constructor for fast loading of LockEntries by OJB.
        */
  -    public LockEntry(Object lockedObj,
  +    public LockEntry(Object resourceId,
                        Object key,
                        long timestamp,
                        int isolationLevel,
                        int lockType)
       {
  -        this.lockedObj = lockedObj;
  +        this.resourceId = resourceId;
           this.key = key;
           this.timestamp = timestamp;
           this.isolationLevel = isolationLevel;
  @@ -82,24 +80,24 @@
       }
   
       /**
  -     * build a LockEntry from an OID and a Transaction ID
  +     * Build an entry only from resourceId and lock key.
        */
  -    public LockEntry(Object lockedObj, Object key)
  +    public LockEntry(Object resourceId, Object key)
       {
  -        this.lockedObj = lockedObj;
  +        this.resourceId = resourceId;
           this.key = key;
       }
   
       /**
  -     * returns the OID STring of the locked object.
  +     * Returns the resource id of the locked object (or the locked object itself).
        */
  -    public Object getLockedObj()
  +    public Object getResourceId()
       {
  -        return lockedObj;
  +        return resourceId;
       }
   
       /**
  -     * returns the GUID string of the locking transaction.
  +     * Returns lock key.
        */
       public Object getKey()
       {
  @@ -144,7 +142,7 @@
       }
   
       /**
  -     * returns true if this lock is owned by transaction tx, else false.
  +     * Returns true if this lock is owned by the specified key.
        */
       public boolean isOwnedBy(Object key)
       {
  @@ -163,13 +161,13 @@
       }
   
       /**
  -     * Sets the lockedObj.
  +     * Sets the resourceId.
        *
  -     * @param lockedObj The lockedObj to set
  +     * @param resourceId The resourceId to set
        */
  -    public void setLockedObj(String lockedObj)
  +    public void setresourceId(String resourceId)
       {
  -        this.lockedObj = lockedObj;
  +        this.resourceId = resourceId;
       }
   
       /**
  @@ -191,5 +189,4 @@
       {
           this.key = key;
       }
  -
   }
  
  
  
  1.1.2.2   +15 -19    db-ojb/src/java/org/apache/ojb/broker/locking/ReadUncommittedStrategy.java
  
  Index: ReadUncommittedStrategy.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/ReadUncommittedStrategy.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- ReadUncommittedStrategy.java	18 Sep 2004 13:01:05 -0000	1.1.2.1
  +++ ReadUncommittedStrategy.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -24,9 +24,6 @@
    * but since it will probably try to get them, it will
    * always give it to them.
    * <p/>
  - * Locks are obtained on modifications to the database and held until end of
  - * transaction (EOT). Reading from the database does not involve any locking.
  - * <p/>
    * Allows:
    * Dirty Reads
    * Non-Repeatable Reads
  @@ -46,7 +43,7 @@
       /**
        * @see LockStrategy#readLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean readLock(Object key, Object lockedObj)
  +    public boolean readLock(Object key, Object resourceId)
       {
           return true;
       }
  @@ -54,15 +51,15 @@
       /**
        * @see LockStrategy#writeLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean writeLock(Object key, Object lockedObj)
  +    public boolean writeLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           if(writer == null)
           {
  -            if(setWriter(key, lockedObj, ISOLATION_LEVEL))
  +            if(setWriter(key, resourceId, ISOLATION_LEVEL))
                   return true;
               else
  -                return writeLock(key, lockedObj);
  +                return writeLock(key, resourceId);
           }
           if(writer.isOwnedBy(key))
           {
  @@ -74,15 +71,15 @@
       /**
        * @see LockStrategy#upgradeLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean upgradeLock(Object key, Object lockedObj)
  +    public boolean upgradeLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           if(writer == null)
           {
  -            if(setWriter(key, lockedObj, ISOLATION_LEVEL))
  +            if(setWriter(key, resourceId, ISOLATION_LEVEL))
                   return true;
               else
  -                return upgradeLock(key, lockedObj);
  +                return upgradeLock(key, resourceId);
           }
           if(writer.isOwnedBy(key))
           {
  @@ -94,13 +91,12 @@
       /**
        * @see LockStrategy#readLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean releaseLock(Object key, Object lockedObj)
  +    public boolean releaseLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           if(writer != null && writer.isOwnedBy(key))
           {
               removeWriter(writer);
  -            return true;
           }
           // readlocks cannot (and need not) be released, thus:
           return true;
  @@ -109,17 +105,17 @@
       /**
        * @see LockStrategy#checkRead(java.lang.Object, java.lang.Object)
        */
  -    public boolean checkRead(Object key, Object lockedObj)
  +    public boolean checkRead(Object key, Object resourceId)
       {
  -        return true;
  +        return checkWrite(key, resourceId);
       }
   
       /**
        * @see LockStrategy#checkWrite(java.lang.Object, java.lang.Object)
        */
  -    public boolean checkWrite(Object key, Object lockedObj)
  +    public boolean checkWrite(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           return (writer != null && writer.isOwnedBy(key));
       }
   }
  
  
  
  1.1.2.2   +31 -29    db-ojb/src/java/org/apache/ojb/broker/locking/LockStrategy.java
  
  Index: LockStrategy.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/LockStrategy.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- LockStrategy.java	18 Sep 2004 13:01:05 -0000	1.1.2.1
  +++ LockStrategy.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -16,65 +16,67 @@
    */
   
   
  -
   /**
  - * this interface defines method that a Locking Strategy must implement
  - * according to the transaction isolation level it represents. *
  + * This interface defines method that a Locking Strategy must implement
  + * according to the isolation level it represents.
    */
   public interface LockStrategy
   {
  -
       /**
  -     * acquire a read lock on Object obj for Transaction tx.
  +     * Acquire a read lock on Object obj for Object key.
        *
  -     * @param tx  the transaction requesting the lock
  -     * @param obj the Object to be locked
  +     * @param key The key requesting the lock
  +     * @param resourceId the resource object to be locked
        * @return true if successful, else false
        */
  -    public boolean readLock(Object key, Object lockedObj);
  +    public boolean readLock(Object key, Object resourceId);
   
       /**
  -     * acquire a write lock on Object obj for Transaction tx.
  +     * Acquire a write lock on Object resourceId for Object key.
        *
  -     * @param tx  the transaction requesting the lock
  -     * @param obj the Object to be locked
  +     * @param key The key requesting the lock
  +     * @param resourceId the resource object to be locked
        * @return true if successful, else false
        */
  -    public boolean writeLock(Object key, Object lockedObj);
  +    public boolean writeLock(Object key, Object resourceId);
   
       /**
  -     * acquire a lock upgrade (from read to write) lock on Object obj for Transaction tx.
  +     * Acquire a lock upgrade (from read to write) lock on
  +     * Object resourceId for Object key.
        *
  -     * @param tx  the transaction requesting the lock
  -     * @param obj the Object to be locked
  +     * @param key The key requesting the lock
  +     * @param resourceId the resource object to be locked
        * @return true if successful, else false
        */
  -    public boolean upgradeLock(Object key, Object lockedObj);
  +    public boolean upgradeLock(Object key, Object resourceId);
   
       /**
  -     * release a lock on Object obj for Transaction tx.
  +     * Release all locks on Object resourceId for Object key.
        *
  -     * @param tx  the transaction releasing the lock
  -     * @param obj the Object to be unlocked
  -     * @return true if successful, else false
  +     * @param key The key requesting the lock
  +     * @param resourceId the Object to be unlocked
  +     * @return <code>true</code> if successful a read or write
  +     * lock was released, else <code>false</code>
        */
  -    public boolean releaseLock(Object key, Object lockedObj);
  +    public boolean releaseLock(Object key, Object resourceId);
   
       /**
  -     * checks whether the specified Object obj is read-locked by Transaction tx.
  +     * Checks whether the specified Object resourceId is
  +     * read-locked by Object key.
        *
  -     * @param tx  the transaction
  -     * @param obj the Object to be checked
  +     * @param key The key requesting the lock
  +     * @param resourceId the resource object to be checked
        * @return true if lock exists, else false
        */
  -    public boolean checkRead(Object key, Object lockedObj);
  +    public boolean checkRead(Object key, Object resourceId);
   
       /**
  -     * checks whether the specified Object obj is write-locked by Transaction tx.
  +     * Checks whether the specified Object resourceId is
  +     * write-locked by Object key.
        *
  -     * @param tx  the transaction
  -     * @param obj the Object to be checked
  +     * @param key The key requesting the lock
  +     * @param resourceId the resource object to be checked
        * @return true if lock exists, else false
        */
  -    public boolean checkWrite(Object key, Object lockedObj);
  +    public boolean checkWrite(Object key, Object resourceId);
   }
  
  
  
  1.1.2.2   +62 -73    db-ojb/src/java/org/apache/ojb/broker/locking/LockMapInMemoryImpl.java
  
  Index: LockMapInMemoryImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/LockMapInMemoryImpl.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- LockMapInMemoryImpl.java	18 Sep 2004 13:01:05 -0000	1.1.2.1
  +++ LockMapInMemoryImpl.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -18,14 +18,13 @@
   import java.util.ArrayList;
   import java.util.Collection;
   import java.util.HashMap;
  +import java.util.Hashtable;
   import java.util.Iterator;
   import java.util.Map;
  -import java.util.Hashtable;
   
   /**
  - * We use a HashMap and synchronize blocks of access for a get "check" then put
  - * operation. We cannot use the hashtable as you could check in one synchronized call
  - * then put in another while a different thread is doing the same thing.
  + * This implementation of {@link LockMap} supports locking for single JVM
  + * applications.
    *
    * @author <a href="mailto:mattbaird@yahoo.com">Matthew Baird<a>
    *         update for use of Hashmap with synchronization.
  @@ -48,42 +47,39 @@
       private static int MAX_LOCKS_TO_CLEAN = 50;
   
       /**
  -     * returns the LockEntry for the Writer of object obj.
  -     * If now writer exists, null is returned.
  +     * @see LockMap#getWriter(Object)
        */
  -    public LockEntry getWriter(Object lockedObj)
  +    public LockEntry getWriter(Object resourceId)
       {
           checkTimedOutLocks();
           ObjectLocks objectLocks = null;
           synchronized(locktable)
           {
  -            objectLocks = (ObjectLocks) locktable.get(lockedObj);
  +            objectLocks = (ObjectLocks) locktable.get(resourceId);
           }
           return objectLocks == null ? null : objectLocks.getWriter();
       }
   
       /**
  -     * returns a collection of Reader LockEntries for object obj.
  -     * If no LockEntries could be found an empty Vector is returned.
  +     * @see LockMap#getReaders(Object)
        */
  -    public Collection getReaders(Object lockedObj)
  +    public Collection getReaders(Object resourceId)
       {
           ObjectLocks objectLocks = null;
           synchronized(locktable)
           {
  -            objectLocks = (ObjectLocks) locktable.get(lockedObj);
  +            objectLocks = (ObjectLocks) locktable.get(resourceId);
           }
           return objectLocks == null ? new ArrayList() : objectLocks.getReaders().values();
       }
   
       /**
  -     * Add a reader lock entry for transaction tx on object obj
  -     * to the persistent storage.
  +     * @see LockMap#addReader(Object, Object, int)
        */
  -    public boolean addReader(Object key, Object lockedObj, int isolationLevel)
  +    public boolean addReader(Object key, Object resourceId, int isolationLevel)
       {
           checkTimedOutLocks();
  -        LockEntry reader = new LockEntry(lockedObj,
  +        LockEntry reader = new LockEntry(resourceId,
                   key,
                   System.currentTimeMillis(),
                   isolationLevel,
  @@ -102,7 +98,7 @@
            */
           synchronized(locktable)
           {
  -            Object oid = reader.getLockedObj();
  +            Object oid = reader.getResourceId();
               objectLocks = (ObjectLocks) locktable.get(oid);
               if(objectLocks == null)
               {
  @@ -114,27 +110,23 @@
       }
   
       /**
  -     * remove a reader lock entry for transaction tx on object obj
  -     * from the persistent storage.
  +     * @see LockMap#removeReader(Object, Object)
        */
  -    public void removeReader(Object key, Object lockedObj)
  +    public boolean removeReader(Object key, Object resourceId)
       {
           checkTimedOutLocks();
  -        removeReaderInternal(lockedObj, key);
  +        return removeReaderInternal(resourceId, key);
       }
   
  -    private void removeReaderInternal(Object lockedObj, Object key)
  +    private boolean removeReaderInternal(Object resourceId, Object key)
       {
  +        boolean result = false;
           ObjectLocks objectLocks = null;
           synchronized(locktable)
           {
  -            objectLocks = (ObjectLocks) locktable.get(lockedObj);
  +            objectLocks = (ObjectLocks) locktable.get(resourceId);
           }
  -        if(objectLocks == null)
  -        {
  -            return;
  -        }
  -        else
  +        if(objectLocks != null)
           {
               /**
                * MBAIRD, last one out, close the door and turn off the lights.
  @@ -144,41 +136,38 @@
               synchronized(locktable)
               {
                   Map readers = objectLocks.getReaders();
  -                readers.remove(key);
  +                result = readers.remove(key) != null;
                   if((objectLocks.getWriter() == null) && (readers.size() == 0))
                   {
  -                    locktable.remove(lockedObj);
  +                    locktable.remove(resourceId);
                   }
               }
           }
  +        return result;
       }
   
       void removeReaderByLock(LockEntry lock)
       {
  -        Object lockedObj = lock.getLockedObj();
  +        Object resourceId = lock.getResourceId();
           Object key = lock.getKey();
  -        removeReaderInternal(lockedObj, key);
  +        removeReaderInternal(resourceId, key);
       }
   
       /**
  -     * remove a writer lock entry for transaction tx on object obj
  -     * from the persistent storage.
  +     * @see LockMap#removeWriter(LockEntry)
        */
  -    public void removeWriter(LockEntry writer)
  +    public boolean removeWriter(LockEntry writer)
       {
           checkTimedOutLocks();
  +        boolean result = false;
   
  -        Object oid = writer.getLockedObj();
  +        Object oid = writer.getResourceId();
           ObjectLocks objectLocks = null;
           synchronized(locktable)
           {
               objectLocks = (ObjectLocks) locktable.get(oid);
           }
  -        if(objectLocks == null)
  -        {
  -            return;
  -        }
  -        else
  +        if(objectLocks != null)
           {
               /**
                * MBAIRD, last one out, close the door and turn off the lights.
  @@ -187,26 +176,29 @@
                */
               synchronized(locktable)
               {
  -                Map readers = objectLocks.getReaders();
  -                objectLocks.setWriter(null);
  +                if(objectLocks.getWriter() != null)
  +                {
  +                    objectLocks.setWriter(null);
  +                    result = true;
  +                }
                   // no need to check if writer is null, we just set it.
  -                if(readers.size() == 0)
  +                if(objectLocks.getReaders().size() == 0)
                   {
                       locktable.remove(oid);
                   }
               }
           }
  +        return result;
       }
   
       /**
  -     * upgrade a reader lock entry for transaction tx on object obj
  -     * and write it to the persistent storage.
  +     * @see LockMap#upgradeLock(LockEntry)
        */
       public boolean upgradeLock(LockEntry reader)
       {
           checkTimedOutLocks();
   
  -        Object oid = reader.getLockedObj();
  +        Object oid = reader.getResourceId();
           ObjectLocks objectLocks = null;
           synchronized(locktable)
           {
  @@ -220,7 +212,7 @@
           else
           {
               // add writer entry
  -            LockEntry writer = new LockEntry(reader.getLockedObj(),
  +            LockEntry writer = new LockEntry(reader.getResourceId(),
                       reader.getKey(),
                       System.currentTimeMillis(),
                       reader.getIsolationLevel(),
  @@ -233,22 +225,21 @@
       }
   
       /**
  -     * generate a writer lock entry for transaction tx on object obj
  -     * and write it to the persistent storage.
  +     * @see LockMap#setWriter(Object, Object, int)
        */
  -    public boolean setWriter(Object key, Object lockedObj, int isolationLevel)
  +    public boolean setWriter(Object key, Object resourceId, int isolationLevel)
       {
           checkTimedOutLocks();
  -        LockEntry writer = new LockEntry(lockedObj,
  +        LockEntry writer = new LockEntry(resourceId,
                   key,
                   System.currentTimeMillis(),
                   isolationLevel,
                   LockEntry.LOCK_WRITE);
  -        setWriterInternal(writer, lockedObj);
  +        setWriterInternal(writer, resourceId);
           return true;
       }
   
  -    private void setWriterInternal(LockEntry writer, Object lockedObj)
  +    private void setWriterInternal(LockEntry writer, Object resourceId)
       {
           ObjectLocks objectLocks = null;
           /**
  @@ -257,11 +248,11 @@
            */
           synchronized(locktable)
           {
  -            objectLocks = (ObjectLocks) locktable.get(lockedObj);
  +            objectLocks = (ObjectLocks) locktable.get(resourceId);
               if(objectLocks == null)
               {
                   objectLocks = new ObjectLocks();
  -                locktable.put(lockedObj, objectLocks);
  +                locktable.put(resourceId, objectLocks);
               }
           }
           objectLocks.setWriter(writer);
  @@ -269,26 +260,25 @@
   
       void setWriterByLock(LockEntry writer)
       {
  -        Object oid = writer.getLockedObj();
  +        Object oid = writer.getResourceId();
           setWriterInternal(writer, oid);
       }
   
       /**
  -     * check if there is a reader lock entry for transaction tx on object obj
  -     * in the persistent storage.
  +     * @see LockMap#hasReadLock(Object, Object)
        */
  -    public boolean hasReadLock(Object key, Object lockedObj)
  +    public boolean hasReadLock(Object key, Object resourceId)
       {
           checkTimedOutLocks();
  -        return hasReadLockInternal(lockedObj, key);
  +        return hasReadLockInternal(resourceId, key);
       }
   
  -    private boolean hasReadLockInternal(Object lockedObj, Object key)
  +    private boolean hasReadLockInternal(Object resourceId, Object key)
       {
           ObjectLocks objectLocks = null;
           synchronized(locktable)
           {
  -            objectLocks = (ObjectLocks) locktable.get(lockedObj);
  +            objectLocks = (ObjectLocks) locktable.get(resourceId);
           }
   
           if(objectLocks == null)
  @@ -312,7 +302,7 @@
   
       boolean hasReadLock(LockEntry entry)
       {
  -        Object oid = entry.getLockedObj();
  +        Object oid = entry.getResourceId();
           Object key = entry.getKey();
           return hasReadLockInternal(oid, key);
       }
  @@ -396,7 +386,7 @@
       //===============================================================
       // inner class
       //===============================================================
  -    final class ObjectLocks
  +    static final class ObjectLocks
       {
           private LockEntry writer;
           private Hashtable readers;
  @@ -408,22 +398,22 @@
               readers = new Hashtable();
           }
   
  -        public LockEntry getWriter()
  +        LockEntry getWriter()
           {
               return writer;
           }
   
  -        public void setWriter(LockEntry writer)
  +        void setWriter(LockEntry writer)
           {
               this.writer = writer;
           }
   
  -        public Hashtable getReaders()
  +        Hashtable getReaders()
           {
               return readers;
           }
   
  -        public void addReader(LockEntry reader)
  +        void addReader(LockEntry reader)
           {
               /**
                * MBAIRD:
  @@ -437,15 +427,14 @@
               this.readers.put(reader.getKey(), reader);
           }
   
  -        public long getYoungestReader()
  +        long getYoungestReader()
           {
               return m_youngestReader;
           }
   
  -        public LockEntry getReader(Object key)
  +        LockEntry getReader(Object key)
           {
               return (LockEntry) this.readers.get(key);
           }
       }
  -
   }
  
  
  
  1.1.2.2   +40 -35    db-ojb/src/java/org/apache/ojb/broker/locking/ReadCommittedStrategy.java
  
  Index: ReadCommittedStrategy.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/ReadCommittedStrategy.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- ReadCommittedStrategy.java	18 Sep 2004 13:01:05 -0000	1.1.2.1
  +++ ReadCommittedStrategy.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -18,7 +18,7 @@
   import org.apache.ojb.broker.metadata.IsolationLevels;
   
   /**
  - * The implementation of the Commited Reads Locking stra
  + * The implementation of the Commited Reads Locking strategy.
    * ReadCommitted - Reads and Writes require locks.
    * <p/>
    * Locks are acquired for reading and modifying the database.
  @@ -26,8 +26,8 @@
    * are held until EOT.
    * <p/>
    * Allows:
  - * Non-Repeatable Reads
  - * Phantom Readstegy.
  + * Non-Repeatable Reads,
  + * Phantom Reads.
    *
    * @author Thomas Mahler & David Dixon-Peugh
    */
  @@ -43,20 +43,20 @@
       /**
        * @see LockStrategy#readLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean readLock(Object key, Object lockedObj)
  +    public boolean readLock(Object key, Object resourceId)
       {
   
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           if(writer == null)
           {
  -            addReader(key, lockedObj, ISOLATION_LEVEL);
  +            addReader(key, resourceId, ISOLATION_LEVEL);
               // if there has been a successful write locking, try again
  -            if(getWriter(lockedObj) == null)
  +            if(getWriter(resourceId) == null)
                   return true;
               else
               {
  -                removeReader(key, lockedObj);
  -                return readLock(key, lockedObj);
  +                removeReader(key, resourceId);
  +                return readLock(key, resourceId);
               }
           }
           if(writer.isOwnedBy(key))
  @@ -72,18 +72,18 @@
       /**
        * @see LockStrategy#writeLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean writeLock(Object key, Object lockedObj)
  +    public boolean writeLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           // if there is no writer yet we can try to get the global write lock
           if(writer == null)
           {
               // if lock could be acquired return true
  -            if(setWriter(key, lockedObj, ISOLATION_LEVEL))
  +            if(setWriter(key, resourceId, ISOLATION_LEVEL))
                   return true;
               // else try again
               else
  -                return writeLock(key, lockedObj);
  +                return writeLock(key, resourceId);
           }
           if(writer.isOwnedBy(key))
           {
  @@ -96,17 +96,17 @@
       /**
        * @see LockStrategy#upgradeLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean upgradeLock(Object key, Object lockedObj)
  +    public boolean upgradeLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           if(writer == null)
           {
               // if lock could be acquired return true
  -            if(setWriter(key, lockedObj, ISOLATION_LEVEL))
  +            if(setWriter(key, resourceId, ISOLATION_LEVEL))
                   return true;
               // else try again
               else
  -                return upgradeLock(key, lockedObj);
  +                return upgradeLock(key, resourceId);
           }
           if(writer.isOwnedBy(key))
           {
  @@ -119,35 +119,40 @@
       /**
        * @see LockStrategy#readLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean releaseLock(Object key, Object lockedObj)
  +    public boolean releaseLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  -
  +        LockEntry writer = getWriter(resourceId);
  +        boolean result = false;
  +//        if(writer != null && writer.isOwnedBy(key))
  +//        {
  +//            removeWriter(writer);
  +//            result = true;
  +//        }
  +//
  +//        if(hasReadLock(key, resourceId))
  +//        {
  +//            result = removeReader(key, resourceId);
  +//            result = true;
  +//        }
           if(writer != null && writer.isOwnedBy(key))
           {
  -            removeWriter(writer);
  -            return true;
  +            result = removeWriter(writer);
           }
  -
  -        if(hasReadLock(key, lockedObj))
  -        {
  -            removeReader(key, lockedObj);
  -            return true;
  -        }
  -        return false;
  +        if(removeReader(key, resourceId)) result = true;
  +        return result;
       }
   
       /**
        * @see LockStrategy#checkRead(java.lang.Object, java.lang.Object)
        */
  -    public boolean checkRead(Object key, Object lockedObj)
  +    public boolean checkRead(Object key, Object resourceId)
       {
  -        if(hasReadLock(key, lockedObj))
  +        if(hasReadLock(key, resourceId))
           {
               return true;
           }
  -        LockEntry writer = getWriter(lockedObj);
  -        if(writer.isOwnedBy(key))
  +        LockEntry writer = getWriter(resourceId);
  +        if(writer != null && writer.isOwnedBy(key))
           {
               return true;
           }
  @@ -157,9 +162,9 @@
       /**
        * @see LockStrategy#checkWrite(java.lang.Object, java.lang.Object)
        */
  -    public boolean checkWrite(Object key, Object lockedObj)
  +    public boolean checkWrite(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           if(writer == null)
               return false;
           else if(writer.isOwnedBy(key))
  
  
  
  1.1.2.2   +48 -52    db-ojb/src/java/org/apache/ojb/broker/locking/LockMapRemoteImpl.java
  
  Index: LockMapRemoteImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/LockMapRemoteImpl.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- LockMapRemoteImpl.java	18 Sep 2004 13:01:05 -0000	1.1.2.1
  +++ LockMapRemoteImpl.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -47,15 +47,14 @@
       private static URL lockservlet = null;
   
       /**
  -     * returns the LockEntry for the Writer of object obj.
  -     * If now writer exists, null is returned.
  +     * @see LockMap#getWriter(Object)
        */
  -    public LockEntry getWriter(Object lockedObj)
  +    public LockEntry getWriter(Object resourceId)
       {
           LockEntry result = null;
           try
           {
  -            result = getWriterRemote(lockedObj);
  +            result = getWriterRemote(resourceId);
           }
           catch(Throwable e)
           {
  @@ -64,7 +63,7 @@
           return result;
       }
   
  -    private LockEntry getWriterRemote(Object lockedObj)
  +    private LockEntry getWriterRemote(Object resourceId)
               throws
               MalformedURLException,
               IOException,
  @@ -72,7 +71,7 @@
               ClassNotFoundException
       {
           byte selector = (byte) 'w';
  -        byte[] requestBarr = buildRequestArray(lockedObj, selector);
  +        byte[] requestBarr = buildRequestArray(resourceId, selector);
   
           HttpURLConnection conn = getHttpUrlConnection();
           
  @@ -125,16 +124,15 @@
   
   
       /**
  -     * returns a collection of Reader LockEntries for object obj.
  -     * If now LockEntries could be found an empty Vector is returned.
  +     * @see LockMap#getReaders(Object)
        */
  -    public Collection getReaders(Object lockedObj)
  +    public Collection getReaders(Object resourceId)
       {
           Collection result = null;
           try
           {
               byte selector = (byte) 'r';
  -            byte[] requestBarr = buildRequestArray(lockedObj, selector);
  +            byte[] requestBarr = buildRequestArray(resourceId, selector);
   
               HttpURLConnection conn = getHttpUrlConnection();
   
  @@ -162,14 +160,13 @@
   
   
       /**
  -     * Add a reader lock entry for transaction tx on object obj
  -     * to the persistent storage.
  +     * @see LockMap#addReader(Object, Object, int)
        */
  -    public boolean addReader(Object key, Object lockedObj, int isolationLevel)
  +    public boolean addReader(Object key, Object resourceId, int isolationLevel)
       {
           try
           {
  -            LockEntry lock = new LockEntry(lockedObj,
  +            LockEntry lock = new LockEntry(resourceId,
                       key,
                       System.currentTimeMillis(),
                       isolationLevel,
  @@ -179,7 +176,7 @@
           }
           catch(Throwable t)
           {
  -            log.error("Cannot store LockEntry for '" + lockedObj + "' using key '" + key + "'", t);
  +            log.error("Cannot store LockEntry for '" + resourceId + "' using key '" + key + "'", t);
               return false;
           }
       }
  @@ -223,23 +220,24 @@
       }
   
       /**
  -     * remove a reader lock entry for transaction tx on object obj
  -     * from the persistent storage.
  +     * @see LockMap#removeReader(Object, Object)
        */
  -    public void removeReader(Object key, Object lockedObj)
  +    public boolean removeReader(Object key, Object resourceId)
       {
  +        boolean result = false;
           try
           {
  -            LockEntry lock = new LockEntry(lockedObj, key);
  -            removeReaderRemote(lock);
  +            LockEntry lock = new LockEntry(resourceId, key);
  +            result = removeReaderRemote(lock);
           }
           catch(Throwable t)
           {
  -            log.error("Cannot remove LockEntry for '" + lockedObj + "' using key '" + key + "'");
  +            log.error("Cannot remove LockEntry for resource '" + resourceId + "' using key '" + key + "'");
           }
  +        return result;
       }
   
  -    private void removeReaderRemote(LockEntry lock) throws IOException, ClassNotFoundException
  +    private boolean removeReaderRemote(LockEntry lock) throws IOException, ClassNotFoundException
       {
           byte selector = (byte) 'e';
           byte[] requestBarr = buildRequestArray(lock, selector);
  @@ -260,30 +258,32 @@
           ois.close();
           out.close();
           conn.disconnect();
  -        if(!result.booleanValue())
  -        {
  -            throw new PersistenceBrokerException("could not remove reader!");
  -        }
  -
  +// TODO: arminw: why should we throw an exception?
  +//        if(!result.booleanValue())
  +//        {
  +//            throw new PersistenceBrokerException("could not remove reader!");
  +//        }
  +        return result.booleanValue();
       }
   
       /**
  -     * remove a writer lock entry for transaction tx on object obj
  -     * from the persistent storage.
  +     * @see LockMap#removeWriter(LockEntry)
        */
  -    public void removeWriter(LockEntry writer)
  +    public boolean removeWriter(LockEntry writer)
       {
  +        boolean result = false;
           try
           {
  -            removeWriterRemote(writer);
  +            result = removeWriterRemote(writer);
           }
           catch(Throwable t)
           {
               log.error("Cannot remove LockEntry", t);
           }
  +        return result;
       }
   
  -    private void removeWriterRemote(LockEntry lock) throws IOException, ClassNotFoundException
  +    private boolean removeWriterRemote(LockEntry lock) throws IOException, ClassNotFoundException
       {
           byte selector = (byte) 'm';
           byte[] requestBarr = buildRequestArray(lock, selector);
  @@ -304,16 +304,16 @@
           ois.close();
           out.close();
           conn.disconnect();
  -        if(!result.booleanValue())
  -        {
  -            throw new PersistenceBrokerException("could not remove writer!");
  -        }
  -
  +// TODO: arminw: why should we throw an exception?
  +//        if(!result.booleanValue())
  +//        {
  +//            throw new PersistenceBrokerException("could not remove writer!");
  +//        }
  +        return result.booleanValue();
       }
   
       /**
  -     * upgrade a reader lock entry for transaction tx on object obj
  -     * and write it to the persistent storage.
  +     * @see LockMap#upgradeLock(LockEntry)
        */
       public boolean upgradeLock(LockEntry reader)
       {
  @@ -359,14 +359,13 @@
       }
   
       /**
  -     * generate a writer lock entry for transaction tx on object obj
  -     * and write it to the persistent storage.
  +     * @see LockMap#setWriter(Object, Object, int)
        */
  -    public boolean setWriter(Object key, Object lockedObj, int isolationLevel)
  +    public boolean setWriter(Object key, Object resourceId, int isolationLevel)
       {
           try
           {
  -            LockEntry lock = new LockEntry(lockedObj,
  +            LockEntry lock = new LockEntry(resourceId,
                       key,
                       System.currentTimeMillis(),
                       isolationLevel,
  @@ -377,7 +376,7 @@
           }
           catch(Throwable t)
           {
  -            log.error("Cannot set LockEntry for '" + lockedObj + "' using key '" + key + "'");
  +            log.error("Cannot set LockEntry for '" + resourceId + "' using key '" + key + "'");
               return false;
           }
       }
  @@ -411,20 +410,19 @@
       }
   
       /**
  -     * check if there is a reader lock entry for transaction tx on object obj
  -     * in the persistent storage.
  +     * @see LockMap#hasReadLock(Object, Object)
        */
  -    public boolean hasReadLock(Object key, Object lockedObj)
  +    public boolean hasReadLock(Object key, Object resourceId)
       {
           try
           {
  -            LockEntry lock = new LockEntry(lockedObj, key);
  +            LockEntry lock = new LockEntry(resourceId, key);
               boolean result = hasReadLockRemote(lock);
               return result;
           }
           catch(Throwable t)
           {
  -            log.error("Cannot check read lock for '" + lockedObj + "' using key '" + key + "'", t);
  +            log.error("Cannot check read lock for '" + resourceId + "' using key '" + key + "'", t);
               return false;
           }
       }
  @@ -453,7 +451,6 @@
           return result.booleanValue();
       }
   
  -
       /**
        * @see org.apache.ojb.broker.util.configuration.Configurable#configure(org.apache.ojb.broker.util.configuration.Configuration)
        */
  @@ -470,5 +467,4 @@
           }
   
       }
  -
   }
  
  
  
  1.1.2.2   +37 -31    db-ojb/src/java/org/apache/ojb/broker/locking/RepeatableReadStrategy.java
  
  Index: RepeatableReadStrategy.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/locking/RepeatableReadStrategy.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- RepeatableReadStrategy.java	18 Sep 2004 13:01:05 -0000	1.1.2.1
  +++ RepeatableReadStrategy.java	11 Nov 2004 23:04:19 -0000	1.1.2.2
  @@ -41,15 +41,15 @@
       /**
        * @see LockStrategy#readLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean readLock(Object key, Object lockedObj)
  +    public boolean readLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           if(writer == null)
           {
  -            if(addReader(key, lockedObj, ISOLATION_LEVEL))
  +            if(addReader(key, resourceId, ISOLATION_LEVEL))
                   return true;
               else
  -                return readLock(key, lockedObj);
  +                return readLock(key, resourceId);
           }
           if(writer.isOwnedBy(key))
           {
  @@ -63,24 +63,24 @@
       /**
        * @see LockStrategy#writeLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean writeLock(Object key, Object lockedObj)
  +    public boolean writeLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  -        Collection readers = getReaders(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
  +        Collection readers = getReaders(resourceId);
           if(writer == null)
           {
               if(readers.size() == 0)
               {
  -                if(setWriter(key, lockedObj, ISOLATION_LEVEL))
  +                if(setWriter(key, resourceId, ISOLATION_LEVEL))
                       return true;
                   else
  -                    return writeLock(key, lockedObj);
  +                    return writeLock(key, resourceId);
               }
   
               else if(readers.size() == 1)
               {
                   if(((LockEntry) readers.iterator().next()).isOwnedBy(key))
  -                    return upgradeLock(key, lockedObj);
  +                    return upgradeLock(key, resourceId);
               }
           }
           else if(writer.isOwnedBy(key))
  @@ -94,12 +94,12 @@
       /**
        * @see LockStrategy#upgradeLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean upgradeLock(Object key, Object lockedObj)
  +    public boolean upgradeLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           if(writer == null)
           {
  -            Collection readers = this.getReaders(lockedObj);
  +            Collection readers = this.getReaders(resourceId);
               if(readers.size() == 1)
               {
                   LockEntry reader = (LockEntry) readers.iterator().next();
  @@ -108,15 +108,15 @@
                       if(upgradeLock(reader))
                           return true;
                       else
  -                        return upgradeLock(key, lockedObj);
  +                        return upgradeLock(key, resourceId);
                   }
               }
               else if(readers.size() == 0)
               {
  -                if(setWriter(key, lockedObj, ISOLATION_LEVEL))
  +                if(setWriter(key, resourceId, ISOLATION_LEVEL))
                       return true;
                   else
  -                    return upgradeLock(key, lockedObj);
  +                    return upgradeLock(key, resourceId);
               }
   
   
  @@ -132,32 +132,38 @@
       /**
        * @see LockStrategy#readLock(java.lang.Object, java.lang.Object)
        */
  -    public boolean releaseLock(Object key, Object lockedObj)
  +    public boolean releaseLock(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
  +        boolean result = false;
  +//        if(writer != null && writer.isOwnedBy(key))
  +//        {
  +//            removeWriter(writer);
  +//            result = true;
  +//        }
  +//        if(hasReadLock(key, resourceId))
  +//        {
  +//            removeReader(key, resourceId);
  +//            result = true;
  +//        }
           if(writer != null && writer.isOwnedBy(key))
           {
  -            removeWriter(writer);
  -            return true;
  +            result = removeWriter(writer);
           }
  -        if(hasReadLock(key, lockedObj))
  -        {
  -            removeReader(key, lockedObj);
  -            return true;
  -        }
  -        return false;
  +        if(removeReader(key, resourceId)) result = true;
  +        return result;
       }
   
       /**
        * @see LockStrategy#checkRead(java.lang.Object, java.lang.Object)
        */
  -    public boolean checkRead(Object key, Object lockedObj)
  +    public boolean checkRead(Object key, Object resourceId)
       {
  -        if(hasReadLock(key, lockedObj))
  +        if(hasReadLock(key, resourceId))
           {
               return true;
           }
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           if(writer != null && writer.isOwnedBy(key))
           {
               return true;
  @@ -169,9 +175,9 @@
       /**
        * @see LockStrategy#checkWrite(java.lang.Object, java.lang.Object)
        */
  -    public boolean checkWrite(Object key, Object lockedObj)
  +    public boolean checkWrite(Object key, Object resourceId)
       {
  -        LockEntry writer = getWriter(lockedObj);
  +        LockEntry writer = getWriter(resourceId);
           return (writer != null && writer.isOwnedBy(key));
       }
   }
  
  
  

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