/* * Copyright 2008 biaoping.yin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 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.UNmodify; /** * <p>Title: </p> * * <p>Description: 服务管理者信息封装器 * 封装每个服务组件的各种不同的提供者信息,提供者间的同步方法信息,方法的声明式事务管理信息 * </p> * * <p>Copyright: Copyright (c) 2006</p> * * <p>Company: 长沙科创</p> * * @author biaoping.yin * @version 1.0 */ public class ProviderManagerInfo extends BaseTXManager implements UNmodify { private static Logger log = Logger.getLogger(ProviderManagerInfo.class); private String id; private String jndiName; private ProviderInfoQueue providerQueue; private Map providerIndexByType; // private ApplicationInfo ApplicationInfo; private Map synchronizedMethods; private Map realysynchronizedMethods; private List synchronizedMethodLists; private Construction construction; /** * 是否允许将组建发布为远程服务 */ private boolean enablerpc = false; // private boolean callorder_sequence = true; // // private List interceptors; // // /** // * 用户是否自己定义了拦截器 // */ // private boolean usedCustomInterceptor = false; // // // //// private Interceptor transactionInterceptor; // private String transactionInterceptorClass; /**标识服务提供者实例是否为单例模式*/ private boolean singlable = true; private boolean defaultable = false; /**缺省的provider*/ private SecurityProviderInfo defaulProvider; private boolean synchronizedEnabled = false; // private Transactions txs; private List<Pro> references; public static void main(String[] args) { } // public List getTransactionMethods(){ // if(txs != null){ // return txs.getTransactionMethods(); // }else{ // return null; // } // } public ProviderManagerInfo() { providerIndexByType = java.util.Collections.synchronizedMap(new HashMap()); synchronizedMethods = java.util.Collections.synchronizedMap(new HashMap()); realysynchronizedMethods = java.util.Collections.synchronizedMap(new HashMap()); this.providerQueue = new ProviderInfoQueue(); this.synchronizedMethodLists = new ArrayList(); references = new ArrayList<Pro>(); // interceptors = new ArrayList(); } public SecurityProviderInfo getDefaulProviderInfo() { try { if(defaulProvider == null) { if(providerQueue != null && providerQueue.size() > 0) { defaulProvider = providerQueue.getSecurityProviderInfo(0); } } return defaulProvider; } catch(Exception e) { e.printStackTrace(); return null; } } public void addSynchronizedMethod(SynchronizedMethod synchronizedMethod) { this.synchronizedMethodLists.add(synchronizedMethod); this.synchronizedMethods.put(synchronizedMethod.getUUID(),synchronizedMethod); } /** * 从以方法名或者模式匹配名称索引的同步方法表获取同步方法对象 * @param methodUUID * @return */ public SynchronizedMethod getSynchronizedMethod(String methodUUID) { return (SynchronizedMethod)synchronizedMethods.get(methodUUID); } // public void setTransactions(Transactions txs) // { // this.txs = txs; // } public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false); /** * 判断方法是否包含同步方法,如果包含则返回true,否则返回false * @param method * @return */ public boolean isSynchronizedMethod(Method method) { String methodUUID = SynchronizedMethod.buildMethodUUID(method); Boolean match = (Boolean)this.realysynchronizedMethods.get(methodUUID) ; if(match == null) { for(int i = 0; i < this.synchronizedMethodLists.size(); i ++) { SynchronizedMethod m = (SynchronizedMethod)synchronizedMethodLists.get(i); if(m.match(method,methodUUID)) { realysynchronizedMethods.put(methodUUID, TRUE); return true; } } realysynchronizedMethods.put(methodUUID, FALSE); return false; } else { return match.booleanValue(); } } // public SynchronizedMethod isTransactionMethod(Method method) // { // if(txs == null) // return null; // return txs.isTransactionMethod(method); // } public String getId() { return id; } public String getJndiName() { return jndiName; } public ProviderInfoQueue getProviderInfoQueue() { return providerQueue; } // public ApplicationInfo getApplicationInfo() { // return ApplicationInfo; // } public boolean isSynchronizedEnabled() { return synchronizedEnabled; } public boolean isSinglable() { return singlable; } public boolean isDefaultable() { return defaultable; } // public Interceptor getTransactionInterceptor() { // // if(this.interceptors != null && this.interceptors.size() > 0) // { // if(!callorder_sequence) // { // Interceptor intercptor = getChainInterceptor(); // // if(this.enableTransaction()) // { // if(intercptor != null) // { // TransactionInterceptor wrapInterceptor = new TransactionInterceptor(this.txs); // InterceptorChain inteceptor = new InterceptorChain(wrapInterceptor,intercptor,true); // return inteceptor; // } // else // { // TransactionInterceptor wrapInterceptor = new TransactionInterceptor(this.txs); // // return wrapInterceptor; // } // } // else // { // return intercptor; // } // } // else // { // Interceptor intercptor = this.getSequenceInterceptor(); // return intercptor; // // } // } // else if(this.enableTransaction()) // { // return new TransactionInterceptor(this.txs); // } // return null; // } // // public boolean enableTransaction() // { // if(this.txs != null && txs.size() > 0) // return true; // return false; // } // private Interceptor getSequenceInterceptor() // { // // if(this.interceptors != null && interceptors.size() > 0) // { // int size = interceptors.size(); // List _t = new ArrayList(size); // for(int i = 0; i < size; i ++) // { // // try { // // InterceptorInfo it = (InterceptorInfo)interceptors.get(i); // Interceptor transactionInterceptor = (Interceptor) Class.forName( // it.getClazz()).newInstance(); // if(transactionInterceptor instanceof ProviderInterceptor) // ((ProviderInterceptor)transactionInterceptor).setProviderManagerInfo(this); // // _t.add(transactionInterceptor); // } catch (ClassNotFoundException ex) { //// ex.printStackTrace(); // log.error(ex); // } catch (IllegalAccessException ex) { // log.error(ex); // } catch (InstantiationException ex) { // log.error(ex); // } // catch(java.lang.NullPointerException ne) // { // log.error(ne); // } // // } // if(this.enableTransaction()) // { // TransactionInterceptor wrapInterceptor = new TransactionInterceptor(this.txs); // InterceptorWrapper wraper = new InterceptorWrapper(wrapInterceptor,_t); // return wraper; // // } // else // { // // InterceptorWrapper wraper = new InterceptorWrapper(_t); // return wraper; // } // // } // else // { // TransactionInterceptor wrapInterceptor = new TransactionInterceptor(this.txs); // return wrapInterceptor; // } // // } // /** // * 构建拦截器链表,根据拦截器配置的顺序构造链接,配置在前的先调用。 // * // * @return // */ // private Interceptor getChainInterceptor() // { // if(this.interceptors != null && interceptors.size() > 0) // { // int size = interceptors.size(); // Interceptor next = null; // for(int i = size-1; i >= 0; i --) // { // try { // // InterceptorInfo it = (InterceptorInfo)interceptors.get(i); // Interceptor transactionInterceptor = (Interceptor) Class.forName( // it.getClazz()).newInstance(); // if(transactionInterceptor instanceof ProviderInterceptor) // ((ProviderInterceptor)transactionInterceptor).setProviderManagerInfo(this); // if(next != null) // { // InterceptorChain chain = new InterceptorChain(transactionInterceptor,next); // next = chain; // } // else // { // next = transactionInterceptor; // } // } catch (ClassNotFoundException ex) { //// ex.printStackTrace(); // log.error(ex); // } catch (IllegalAccessException ex) { // log.error(ex); // } catch (InstantiationException ex) { // log.error(ex); // } // catch(java.lang.NullPointerException ne) // { // log.error(ne); // } // } // return next; // // // } // return null; // } // public String getTransactionInterceptorClass() { // return transactionInterceptorClass; // } public void setDefaulProviderInfo(SecurityProviderInfo defaulProvider) { this.defaulProvider = defaulProvider; } public void setId(String id) { this.id = id; } public void setJndiName(String jndiName) { this.jndiName = jndiName; } public void setProviderInfoQueue(ProviderInfoQueue providerQueue) { this.providerQueue = providerQueue; } // /** // * setSecuityInfo // * // * @param ApplicationInfo ApplicationInfo // */ // public void setApplicationInfo(ApplicationInfo ApplicationInfo) { // this.ApplicationInfo = ApplicationInfo; // } public void setSynchronizedEnabled(boolean synchronizedEnabled) { this.synchronizedEnabled = synchronizedEnabled; } public void setSinglable(boolean singlable) { this.singlable = singlable; } public void setDefaultable(boolean defaultable) { this.defaultable = defaultable; } // public void setTransactionInterceptorClass(String // transactionInterceptorClass) { // this.transactionInterceptorClass = transactionInterceptorClass; // // } /** * addSecurityProvider * * @param provider SecurityProvider */ public void addSecurityProviderInfo(SecurityProviderInfo provider) { provider.setProviderManagerInfo(this); this.providerIndexByType.put(provider.getType(),provider); this.getProviderInfoQueue().addSecurityProviderInfo(provider); } public SecurityProviderInfo getSecurityProviderInfoByType(String type) { return (SecurityProviderInfo)providerIndexByType.get(type); } public List<Pro> getReferences() { return references; } public void addReference(Pro ref) { this.references.add(ref); } // public boolean usedCustomInterceptor() // { // return this.usedCustomInterceptor; // } // // public void addInterceptor(InterceptorInfo interceptorinfo) // { // this.interceptors.add(interceptorinfo); // this.usedCustomInterceptor = true; // } public List getSynchronizedMethodLists() { return synchronizedMethodLists; } // 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 void setConstruction(Construction construction) { this.construction = construction; } public Construction getConstruction() { return this.construction; } public void unmodify() { super.unmodify(); this.synchronizedMethodLists = java.util.Collections.unmodifiableList(synchronizedMethodLists); this.synchronizedMethods = java.util.Collections.unmodifiableMap(synchronizedMethods); this.references = java.util.Collections.unmodifiableList(references); } @Override public void initTransactions() { // TODO Auto-generated method stub } @Override protected void initAsyncMethods() { // TODO Auto-generated method stub } public boolean isEnablerpc() { return enablerpc; } public void setEnablerpc(boolean enablerpc) { this.enablerpc = enablerpc; } }