KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tirsen > nanning > locking > PessimisticLockingAspect


1 package com.tirsen.nanning.locking;
2
3 import com.tirsen.nanning.AspectInstance;
4 import com.tirsen.nanning.Invocation;
5 import com.tirsen.nanning.MethodInterceptor;
6 import com.tirsen.nanning.MixinInstance;
7 import com.tirsen.nanning.config.AllPointcut;
8 import com.tirsen.nanning.config.Pointcut;
9
10 public class PessimisticLockingAspect extends SimpleMixinAspect implements Lockable {
11     private boolean islocked;
12     private Pointcut lockingPointcut;
13
14     public PessimisticLockingAspect() {
15     }
16
17     public PessimisticLockingAspect(Pointcut lockingPointcut) {
18         this.lockingPointcut = lockingPointcut;
19     }
20
21     public void lock() {
22         islocked = true;
23     }
24
25     public boolean isLocked() {
26         return islocked;
27     }
28
29     public boolean isLocked(Lockable lockable) {
30         return lockable.isLocked();
31     }
32
33     /**
34      * Override to change methods that requires lock-checks in a subclass.
35      * @return Pointcut defining what methods require lock-checks.
36      */

37     protected Pointcut lockingPointcut() {
38         return lockingPointcut;
39     }
40
41     protected void doAdvise(AspectInstance aspectInstance) {
42         // remove methods in Locking-mixin, otherwise it won't be possible to unlock a locked object
43
Pointcut pointcut =
44                 P.and(lockingPointcut(),
45                         new AllPointcut() {
46                             public boolean adviseMixin(MixinInstance mixin) {
47                                 return mixin.getInterfaceClass() != Lockable.class;
48                             }
49                         });
50
51         pointcut.advise(aspectInstance, new MethodInterceptor() {
52             public Object JavaDoc invoke(Invocation invocation) throws Throwable JavaDoc {
53                 if (islocked) {
54                     throw new LockedException();
55                 }
56
57                 return invocation.invokeNext();
58             }
59         });
60     }
61 }
62
Popular Tags