package org.frameworkset.spi.assemble; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; import org.frameworkset.spi.ProviderInterceptor; import org.frameworkset.spi.UNmodify; import org.frameworkset.spi.interceptor.DummyInterceptorFacttory; import org.frameworkset.spi.interceptor.DumyInterceptor; import org.frameworkset.spi.interceptor.InterceptorChain; import org.frameworkset.spi.interceptor.InterceptorFacttory; import org.frameworkset.spi.interceptor.InterceptorWrapper; import com.frameworkset.proxy.Interceptor; public abstract class BaseTXManager implements java.io.Serializable,UNmodify { private static Logger log = Logger.getLogger(ProviderManagerInfo.class); private static InterceptorFacttory interceptorFacttory; static { try { interceptorFacttory = (InterceptorFacttory) Class.forName("org.frameworkset.spi.interceptor.InterceptorFacttoryImpl").newInstance(); } catch (Exception e) { log.debug("class org.frameworkset.spi.interceptor.InterceptorFacttoryImpl not found in classpath,use DummyInterceptorFacttory. "); interceptorFacttory = new DummyInterceptorFacttory(); } } protected Transactions txs; protected List<InterceptorInfo> interceptors = new ArrayList<InterceptorInfo>(); protected boolean callorder_sequence = false; protected AOPMethods asyncMethods; /** * 用户是否自己定义了拦截器 */ protected boolean usedCustomInterceptor = false; protected String transactionInterceptorClass; public void setTransactions(Transactions txs) { this.txs = txs; } public SynchronizedMethod isTransactionMethod(Method method,String muuid) { this.loadTXAnnotation(); if(txs == null) return null; return txs.isTransactionMethod(method,muuid); } public SynchronizedMethod isAsyncMethod(Method method,String muuid) { this.loadAsyncAnnotation(); if(this.asyncMethods == null) return null; return this.asyncMethods.isAsyncMethod(method,muuid); } private Object lock_ = new Object(); protected void loadAsyncAnnotation() { if(this.loadAsyncAnnotation ) return; synchronized(lock_) { if(this.loadAsyncAnnotation ) return; try { this.initAsyncMethods(); } catch(Exception e) { } this.loadAsyncAnnotation = true; } } private boolean loadAsyncAnnotation = false; public boolean enableAsyncCall() { this.loadAsyncAnnotation(); if (this.asyncMethods != null && asyncMethods.size() > 0) return true; return false; } protected void setAsyncMethods(AOPMethods asyncMethods) { this.asyncMethods = asyncMethods; } public Interceptor getSynTransactionInterceptor(Method method,String muuid) { if (this.enableInterceptor()) { if(muuid == null) muuid = SynchronizedMethod.buildMethodUUID(method); if (!callorder_sequence) { Interceptor intercptor = getChainInterceptor( method, muuid); if (this.enableTransaction()) { if (intercptor != null) { SynchronizedMethod synmethod = txs.isTransactionMethod(method,muuid); if(synmethod == null) return intercptor; Interceptor wrapInterceptor = interceptorFacttory.getInterceptor(synmethod); InterceptorChain inteceptor = new InterceptorChain(wrapInterceptor, intercptor, true); return inteceptor; } else { SynchronizedMethod synmethod = txs.isTransactionMethod(method,muuid); if(synmethod == null) return null; Interceptor wrapInterceptor = interceptorFacttory.getInterceptor(synmethod); return wrapInterceptor; } } else { return intercptor; } } else { Interceptor intercptor = this.getSequenceInterceptor(method, muuid); return intercptor; } } else if (this.enableTransaction()) { SynchronizedMethod synmethod = txs.isTransactionMethod(method,muuid); if(synmethod == null) return null; return interceptorFacttory.getInterceptor(synmethod);//new TransactionInterceptor(synmethod); } return null; } // public Interceptor getTransactionInterceptor(Method method) // { // // if (this.enableTransaction()) // { // TransactionInterceptor wrapInterceptor = new TransactionInterceptor(this.txs,method); // return wrapInterceptor; // } // return null; // } /** * * @return */ // public Interceptor getInterceptorChain(Method method,String methoduuid) // { // // if (this.interceptors != null && this.interceptors.size() > 0) // { // Interceptor intercptor = getChainInterceptor( method, methoduuid); // return intercptor; // } // // return null; // } public Interceptor getTransactionInterceptor(Method method,String muuid) { if (this.enableTransaction()) { SynchronizedMethod synmethod = txs.isTransactionMethod(method,muuid); if(synmethod == null) return null; Interceptor wrapInterceptor = interceptorFacttory.getInterceptor(synmethod);//new TransactionInterceptor(synmethod); return wrapInterceptor; } return null; } private Object InterceptorChainLock = new Object(); private Interceptor nullintercptor = new DumyInterceptor(); private Map<String,Interceptor> methodInterceptorMap = new HashMap<String,Interceptor>(); /** * * @return */ public Interceptor getChainInterceptor(Method method,String methoduuid) { return _getInterceptor( method, methoduuid, false); } private Interceptor getSequenceInterceptor(Method method,String methoduuid) { return _getInterceptor( method, methoduuid, true); } private Object lock = new Object(); protected void loadTXAnnotation() { if(this.loadTXAnnotation ) return; synchronized(lock) { if(this.loadTXAnnotation ) return; try { this.initTransactions(); } catch(Exception e) { } this.loadTXAnnotation = true; } } private boolean loadTXAnnotation = false; public boolean enableTransaction() { loadTXAnnotation(); if (this.txs != null && txs.size() > 0) return true; return false; } protected abstract void initAsyncMethods() ; protected abstract void initTransactions(); public boolean enableInterceptor() { if(this.interceptors == null || this.interceptors.size() == 0) return false; return true; } private Interceptor _getInterceptor(Method method,String methoduuid,boolean sequence) { if(!enableInterceptor()) return null; if(methoduuid == null) methoduuid = SynchronizedMethod.buildMethodUUID(method); Interceptor intercptorChain = methodInterceptorMap.get(methoduuid); if(intercptorChain != null) { if(intercptorChain == nullintercptor) return null; else { return intercptorChain; } } synchronized(InterceptorChainLock) { intercptorChain = methodInterceptorMap.get(methoduuid); if(intercptorChain != null) { if(intercptorChain == nullintercptor) return null; else { return intercptorChain; } } if(!sequence) intercptorChain = _getChainInterceptor( method,methoduuid); else intercptorChain = _getSequenceInterceptor( method,methoduuid); if(intercptorChain == null) methodInterceptorMap.put(methoduuid, nullintercptor); else methodInterceptorMap.put(methoduuid, intercptorChain); return intercptorChain; } } private Interceptor _getSequenceInterceptor(Method method,String muuid) { loadTXAnnotation(); if (enableInterceptor()) { int size = interceptors.size(); List _t = new ArrayList(size); for (int i = 0; i < size; i++) { try { InterceptorInfo it = (InterceptorInfo) interceptors.get(i); if(!it.allWillBeIntercept() || it.isInterceptMethod(method, muuid )== null)//如果不是一个需要被本拦截器拦截的方法,则忽略该拦截器 continue; // Interceptor transactionInterceptor = (Interceptor) Class.forName(it.getClazz()).newInstance(); Interceptor transactionInterceptor = (Interceptor)it.getBean(); if (transactionInterceptor instanceof ProviderInterceptor) ((ProviderInterceptor) transactionInterceptor).setProviderManagerInfo(this); _t.add(transactionInterceptor); } catch (Exception ne) { log.error("",ne); } } if (this.enableTransaction()) { SynchronizedMethod synmethod = txs.isTransactionMethod(method,muuid); if(synmethod == null) return new InterceptorWrapper(_t); Interceptor wrapInterceptor = interceptorFacttory.getInterceptor(synmethod);//new TransactionInterceptor(synmethod); InterceptorWrapper wraper = new InterceptorWrapper(wrapInterceptor, _t); return wraper; } else { InterceptorWrapper wraper = new InterceptorWrapper(_t); return wraper; } } else { SynchronizedMethod synmethod = txs.isTransactionMethod(method,muuid); if(synmethod == null) return null; Interceptor wrapInterceptor = interceptorFacttory.getInterceptor(synmethod);//new TransactionInterceptor(synmethod); return wrapInterceptor; } } /** * 构建拦截器链表,根据拦截器配置的顺序构造链接,配置在前的先调用。 * * @return */ private Interceptor _getChainInterceptor(Method method,String methoduuid) { if (enableInterceptor()) { int size = interceptors.size(); Interceptor next = null; for (int i = size - 1; i >= 0; i--) { try { InterceptorInfo it = (InterceptorInfo) interceptors.get(i); if(!it.allWillBeIntercept() )//如果不是一个需要被本拦截器拦截的方法,则忽略该拦截器 { if( it.isInterceptMethod(method, methoduuid )== null) continue; } // Interceptor transactionInterceptor = (Interceptor) Class.forName(it.getClazz()).newInstance(); Interceptor transactionInterceptor = (Interceptor)it.getBean(); if (transactionInterceptor instanceof ProviderInterceptor) ((ProviderInterceptor) transactionInterceptor).setProviderManagerInfo(this); if (next != null) { InterceptorChain chain = new InterceptorChain(transactionInterceptor, next); next = chain; } else { next = transactionInterceptor; } } catch (Exception ne) { log.info("",ne); } } return next; } return null; } public void setTransactionInterceptorClass(String transactionInterceptorClass) { this.transactionInterceptorClass = transactionInterceptorClass; } public boolean usedCustomInterceptor() { return this.usedCustomInterceptor; } public void addInterceptor(InterceptorInfo interceptorinfo) { this.interceptors.add(interceptorinfo); this.usedCustomInterceptor = true; } public List getInterceptors() { return interceptors; } public boolean isCallorder_sequence() { return callorder_sequence; } public void setCallorder_sequence(boolean callorder_sequence) { this.callorder_sequence = callorder_sequence; } public String getTransactionInterceptorClass() { return transactionInterceptorClass; } public List getTransactionMethods(){ this.loadTXAnnotation(); if(txs != null){ return txs.getTransactionMethods(); }else{ return null; } } public void unmodify() { interceptors = java.util.Collections.unmodifiableList(interceptors); } }