KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > hibernate > event > def > AbstractLockUpgradeEventListener


1 //$Id: AbstractLockUpgradeEventListener.java,v 1.4 2005/05/11 22:12:45 oneovthafew Exp $
2
package org.hibernate.event.def;
3
4 import org.apache.commons.logging.Log;
5 import org.apache.commons.logging.LogFactory;
6
7 import org.hibernate.HibernateException;
8 import org.hibernate.LockMode;
9 import org.hibernate.ObjectDeletedException;
10 import org.hibernate.cache.CacheConcurrencyStrategy;
11 import org.hibernate.cache.CacheKey;
12 import org.hibernate.engine.EntityEntry;
13 import org.hibernate.engine.Status;
14 import org.hibernate.engine.SessionImplementor;
15 import org.hibernate.persister.entity.EntityPersister;
16 import org.hibernate.pretty.MessageHelper;
17
18 /**
19  * A convenience base class for listeners that respond to requests to perform a
20  * pessimistic lock upgrade on an entity.
21  *
22  * @author Gavin King
23  */

24 public class AbstractLockUpgradeEventListener extends AbstractReassociateEventListener {
25
26     private static final Log log = LogFactory.getLog(AbstractLockUpgradeEventListener.class);
27
28     /**
29      * Performs a pessimistic lock upgrade on a given entity, if needed.
30      *
31      * @param object The entity for which to upgrade the lock.
32      * @param entry The entity's EntityEntry instance.
33      * @param requestedLockMode The lock mode being requested for locking.
34      * @param source The session which is the source of the event being processed.
35      * @throws HibernateException
36      */

37     protected void upgradeLock(Object JavaDoc object, EntityEntry entry, LockMode requestedLockMode, SessionImplementor source)
38     throws HibernateException {
39
40         if ( requestedLockMode.greaterThan( entry.getLockMode() ) ) {
41
42             if ( entry.getStatus() != Status.MANAGED ) {
43                 throw new ObjectDeletedException(
44                         "attempted to lock a deleted instance",
45                         entry.getId(),
46                         entry.getPersister().getEntityName()
47                 );
48             }
49
50             final EntityPersister persister = entry.getPersister();
51
52             if ( log.isTraceEnabled() )
53                 log.trace(
54                         "locking " +
55                         MessageHelper.infoString( persister, entry.getId(), source.getFactory() ) +
56                         " in mode: " +
57                         requestedLockMode
58                 );
59
60             final CacheConcurrencyStrategy.SoftLock lock;
61             final CacheKey ck;
62             if ( persister.hasCache() ) {
63                 ck = new CacheKey(
64                         entry.getId(),
65                         persister.getIdentifierType(),
66                         persister.getRootEntityName(),
67                         source.getEntityMode(),
68                         source.getFactory()
69                 );
70                 lock = persister.getCache().lock( ck, entry.getVersion() );
71             }
72             else {
73                 ck = null;
74                 lock = null;
75             }
76             
77             try {
78                 persister.lock( entry.getId(), entry.getVersion(), object, requestedLockMode, source );
79                 entry.setLockMode(requestedLockMode);
80             }
81             finally {
82                 // the database now holds a lock + the object is flushed from the cache,
83
// so release the soft lock
84
if ( persister.hasCache() ) {
85                     persister.getCache().release(ck, lock );
86                 }
87             }
88
89         }
90     }
91
92 }
93
Popular Tags