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 37 protected Pointcut lockingPointcut() { 38 return lockingPointcut; 39 } 40 41 protected void doAdvise(AspectInstance aspectInstance) { 42 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 invoke(Invocation invocation) throws Throwable { 53 if (islocked) { 54 throw new LockedException(); 55 } 56 57 return invocation.invokeNext(); 58 } 59 }); 60 } 61 } 62 | Popular Tags |