/* * 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.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Stack; import org.apache.log4j.Logger; import org.frameworkset.soa.SerialFactory; import org.frameworkset.soa.SerialFactory.MagicClass; import org.frameworkset.spi.BaseApplicationContext; import org.frameworkset.spi.SPIException; import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; /** * * * <p> * Title: ProviderParser.java * </p> * * <p> * Description: 管理服务配置文件解析器,bean定义 * 针对soa的优化节点和属性对照表 properties转换为ps property转换为p name转换为n value转换为v class转换为cs list转换为l array转换为a map转换为m set转换为s soa:type_null_value转换为s:nvl soa:type转换为s:t componentType转换为cmt * </p> * * <p> * Copyright: Copyright (c) 2007 * </p> * * <p> * bboss workgroup * </p> * * @Date Sep 8, 2008 10:02:46 AM * @author biaoping.yin,尹标平 * @version 1.0 */ public class ProviderParser extends DefaultHandler { private Stack traceStack; private StringBuilder currentValue; private Map managers; private List mangerimports; private boolean serial = false; protected PropertiesContainer configPropertiesFile; public void setSerial(boolean serial) { this.serial = serial; } private Map<String,Pro> properties = new HashMap<String,Pro>(); protected BaseApplicationContext applicationContext; public BaseApplicationContext getApplicationContext() { return applicationContext; } public Map<String,Pro> getProperties() { return properties; } public Pro _getProperty(String name){ if(properties == null || properties.size() == 0){ return null; } else { return this.properties.get(name); } } protected LinkConfigFile linkfile; private String file; private static Logger log = Logger.getLogger(ProviderParser.class); public ProviderParser(BaseApplicationContext applicationContext,String file, LinkConfigFile linkfile) { traceStack = new Stack(); managers = new HashMap(); mangerimports = new ArrayList(); currentValue = new StringBuilder(); this.file = file; this.linkfile = linkfile; this.applicationContext = applicationContext; mergeParentConfigProperties(); // isSOAApplicationContext = applicationContext instanceof SOAApplicationContext; } protected void mergeParentConfigProperties() { if(this.linkfile != null && linkfile.getParent() != null) { if( linkfile.getParent().hasConfigProperties()) { configPropertiesFile = new PropertiesContainer(); configPropertiesFile.mergeParentConfigProperties(linkfile.getParent().getConfigPropertiesFile()); } } } public ProviderParser(BaseApplicationContext applicationContext) { if(applicationContext.isfile()) { managers = new HashMap(); mangerimports = new ArrayList(); // this.file = applicationContext.getConfigfile(); // this.parent = applicationContext.getp; } currentValue = new StringBuilder(); this.applicationContext = applicationContext; if(applicationContext.getServiceProviderManager().findVariableFromSelf()) configPropertiesFile = new PropertiesContainer(); // isSOAApplicationContext = applicationContext instanceof SOAApplicationContext; traceStack = new Stack(); } public void characters(char[] ch, int start, int length) { currentValue.append(ch, start, length); } /** * 判断组件是否是bean组件,如果是返回true * 如果是普通属性,或者是引用那么返回false * @param p * @return */ private boolean isbean(Pro p) { boolean isbean = p.isBean() || p.getValue() == null && p.getClazz() != null && !p.getClazz().equals("") && (p.getRefid() == null || p.getRefid().equals("")) ; if(isbean) return true; if(p.getMagicclass() != null) return true; if(p.getValue() != null) { isbean = p.getValue() instanceof ProList || p.getValue() instanceof ProMap || p.getValue() instanceof ProSet || p.getValue() instanceof ProArray || p.getValue() instanceof ProProperties; } if(isbean) return true; String factory_bean = p.getFactory_bean(); if(factory_bean != null && !factory_bean.equals("")) return true; String factory_class = p.getFactory_class(); if(factory_class != null && !factory_class.equals("")) return true; String iocplugin = p.getIocplugin(); if(iocplugin != null && !iocplugin.equals("")) return true; return false; } private void endProperty(Pro p,String s1, String s2, String name) { // Pro p = (Pro) traceStack.pop(); boolean isinterceptor = (p instanceof InterceptorInfo); if(!isinterceptor) { if ( p.getValue() == null) { String _value = null; // if(this.serial) // _value = currentValue.toString(); // else // _value = currentValue.toString().trim(); if(this.currentValue.length() > 0) { if(this.serial) { _value = this.currentValue.toString(); p.setValue(_value,configPropertiesFile,this); currentValue.delete(0, currentValue.length()); // currentValue.delete(0, currentValue.length()); // this.currentValue = null; } else { _value = this.currentValue.toString().trim(); if(_value.length() > 0) { p.setValue(_value,configPropertiesFile,this); // currentValue.delete(0, currentValue.length()); // this.currentValue = null; currentValue.delete(0, currentValue.length()); } } } // else if(p.getClazz() != null && !p.getClazz().equals("") // && (p.getRefid() == null || p.getRefid().equals(""))) // else if(isbean(p))@setBean 注释开始 // { // p.setBean(true); // // }@setBean 注释结束 } } if(isbean(p)) { p.setBean(true); } if(traceStack.size() > 0) { Object value = this.traceStack.peek(); if(value instanceof Pro) { if(!isinterceptor ) { Pro pro = (Pro)value; pro.addReferenceParam(p); } else { BaseTXManager providerManagerInfo = (BaseTXManager)value; providerManagerInfo.addInterceptor((InterceptorInfo)p); } } else if (value instanceof List) { ProList<Pro> list = (ProList<Pro>) value; // list.add(p.getValue()); list.add(p); } else if (value instanceof ProProperties) { ProProperties<String,Pro> map = (ProProperties<String,Pro>)value; // map.put(p.getName(), p.value); map.put(p.getName(), p); } else if (value instanceof Map) { ProMap<String,Pro> map = (ProMap<String,Pro>)value; // map.put(p.getName(), p.value); map.put(p.getName(), p); } else if (value instanceof ProArray) { ProArray set = (ProArray)value; // set.add(p.value); set.addPro(p); } else if(value instanceof Construction) { Construction construction = (Construction)value; construction.addParam(p); } else if (value instanceof Set) { ProSet<Pro> set = (ProSet<Pro>)value; // set.add(p.value); set.add(p); } else if(value instanceof ProviderManagerInfo) { ProviderManagerInfo providerManagerInfo = (ProviderManagerInfo) value; if(!isinterceptor ) { providerManagerInfo.addReference(p); } else { providerManagerInfo.addInterceptor((InterceptorInfo)p); } // if(p.getName() != null) // p.setUuid(providerManagerInfo.getId() + Pro.id_mask + p.getName()); // else // { // p.setUuid(providerManagerInfo.getId()); // } } else { this.properties.put(p.getName(), p); } } else { this.properties.put(p.getName(), p); } // /** // * 初始化事务信息 // */ // p.initTransactions(); p.freeze(); p = null; } @SuppressWarnings("unchecked") public void endElement(String s1, String s2, String name) { if (name.equals("p") || name.equals("property")) { Pro p = (Pro) traceStack.pop(); if(p.getIocplugin()!= null) System.out.println(); endProperty(p, s1, s2, name); } else if (name.equals("l")||name.equals("list")) { ProList list = (ProList) this.traceStack.pop(); Pro pro = (Pro) this.traceStack.peek(); // List l = java.util.Collections.unmodifiableList(list); list.freeze(); pro.setCollectionValue(list); pro.setList(true); } else if (name.equals("m") || name.equals("map")) { ProMap map = (ProMap) this.traceStack.pop(); Pro pro = (Pro) this.traceStack.peek(); // Map t = java.util.Collections.unmodifiableMap(map); map.freeze(); pro.setCollectionValue(map); pro.setMap(true); } else if ( name.equals("propes")) { ProProperties map = (ProProperties)this.traceStack.pop(); Pro pro = (Pro) this.traceStack.peek(); // Map t = java.util.Collections.unmodifiableMap(map); map.freeze(); pro.setCollectionValue(map); pro.setIsProperties(true); } else if (name.equals("construction")) { Construction construction = (Construction) this.traceStack.pop(); } else if (name.equals("a") || name.equals("array")) { ProArray array = (ProArray) this.traceStack.pop(); Pro pro = (Pro) this.traceStack.peek(); // List l = java.util.Collections.unmodifiableList(list); array.freeze(); pro.setCollectionValue(array); pro.setArray(true); } else if (name.equals("s") || name.equals("set")) { ProSet set = (ProSet) this.traceStack.pop(); Pro pro = (Pro) this.traceStack.peek(); // Set t = java.util.Collections.unmodifiableSet(set); set.freeze(); pro.setCollectionValue(set); pro.setSet(true); } else if (name.equals("manager")) { ProviderManagerInfo providerManger = (ProviderManagerInfo)traceStack.pop(); providerManger.unmodify(); } else if (name.equals("provider")) { traceStack.pop(); } else if (name.equals("synchronize")) { // do nothing } else if (name.equals("managerimport")) { // do nothing; } else if (name.equals("transactions")) { Transactions txs = (Transactions)traceStack.pop(); txs.unmodify(); } else if (name.equals("reference")) { // do nothing } else if (name.equals("method")) { SynchronizedMethod synchronizedMethod = (SynchronizedMethod) this.traceStack.pop(); Object parent = this.traceStack.peek(); if (parent instanceof ProviderManagerInfo) { ProviderManagerInfo providerManagerInfo = (ProviderManagerInfo) this.traceStack.peek(); providerManagerInfo.addSynchronizedMethod(synchronizedMethod); } else if(parent instanceof InterceptorInfo) { InterceptorInfo txs = (InterceptorInfo) this.traceStack.peek(); txs.addInterceptMethod(synchronizedMethod); } else { Transactions txs = (Transactions) this.traceStack.peek(); txs.addTransactionMethod(synchronizedMethod); } } else if (name.equals("rollbackexceptions")) { // do nothing } else if (name.equals("exception")) { // do nothing } else if (name.equals("param")) // 添加方法参数信息 { // do nothing } else if (name.equals("description")) { if(this.traceStack.size() <= 0) { // System.out.println(currentValue); // currentValue.delete(0, currentValue.length()); // this.currentValue = null; currentValue.delete(0, currentValue.length()); return ; } Object p = this.traceStack.peek(); if(p instanceof Pro) { Pro pro = (Pro)p; pro.setDescription(this.currentValue.toString()); } } else if(name.equals("editor")) { } else if (name.equals("interceptor")) { InterceptorInfo interceptor = (InterceptorInfo)this.traceStack.pop(); this.endProperty(interceptor,s1, s2, name); // Object obj = this.traceStack.peek(); // // BaseTXManager providerManagerInfo = (BaseTXManager) obj; // InterceptorInfo interceptor = new InterceptorInfo(); // String clazz = attributes.getValue("class"); // interceptor.setClazz(clazz); // // providerManagerInfo.addInterceptor(interceptor); } // currentValue.delete(0, currentValue.length()); // this.currentValue = null; currentValue.delete(0, currentValue.length()); } protected Pro _buildPro() { return new Pro(applicationContext); } @SuppressWarnings("unchecked") protected void setFAttr(Pro property,Attributes attributes) { if(attributes == null || attributes.getLength() == 0) return; int length = attributes.getLength(); Map<String,Object> extendsAttributes = new HashMap<String,Object>(); Map<String,String> pathAttributes = new HashMap<String,String>(); Map<String,String> WSAttributes = new HashMap<String,String>(); Map<String,String> SOAAttributes = new HashMap<String,String>(); Map<String,String> RMIAttributes = new HashMap<String,String>(); for(int i = 0; i < length; i ++) { String name = attributes.getQName(i); if(name.equals("n") || name.equals("name")) { continue; } else if(name.startsWith("s:"))//soa: { SOAAttributes.put(name, attributes.getValue(i)); } else if( name.equals("cs") || name.equals("v") || name.equals("class") || name.equals("value")) { continue; } else if(name.startsWith("f:"))//通过property的属性来制定对象中field的值 { Pro f = this._buildPro();// new Pro(applicationContext); f.setName(name.substring(2)); String value = attributes.getValue(i); if(value.startsWith(ServiceProviderManager.SERVICE_PREFIX) || value.startsWith(ServiceProviderManager.ATTRIBUTE_PREFIX)) { f.setRefid(value); } else { f.setValue(value,configPropertiesFile,this); } //增加xpath信息 f.setXpath(property.getXpath() + Pro.REF_TOKEN + f.getName()); property.addReferenceParam(f); } else if(name.startsWith("path:")) { pathAttributes.put(name,attributes.getValue(i)); } else if(name.startsWith("ws:")) { WSAttributes.put(name, attributes.getValue(i)); } else if(name.startsWith("rmi:")) { RMIAttributes.put(name, attributes.getValue(i)); } else if(!Pro.isFixAttribute(name)) { String value = attributes.getValue(i); if(configPropertiesFile != null && configPropertiesFile.size() > 0) { value = Pro.evalValue( value, configPropertiesFile,this); } extendsAttributes.put(name, value); } } if(pathAttributes .size() > 0) { property.setMvcpaths(pathAttributes); } if(WSAttributes.size() > 0) property.setWSAttributes(WSAttributes); if(SOAAttributes.size() > 0) { property.setSOAAttributes(SOAAttributes); } if(RMIAttributes.size() > 0) { property.setRMIAttributes(RMIAttributes); } property.setExtendsAttributes(extendsAttributes); // return null; } /** * 构建元素的xpath值 * @param p * @return */ private void buildXpath(Pro p) { String xpath = null; if(traceStack.size() > 0) { Object value = this.traceStack.peek(); if(value instanceof Pro) { Pro pro = (Pro)value; xpath = pro.getXpath() + Pro.REF_TOKEN + p.getName(); p.setXpath(xpath); } else if (value instanceof List) { ProList<Pro> list = (ProList<Pro>) value; Pro pp = (Pro)traceStack.get(traceStack.size() - 2); // list.add(p.getValue()); if(list.size() > 0) xpath = pp.getXpath() + "[" + (list.size() - 1) + "]"; else xpath = pp.getXpath() + "[0]"; // list.add(p); p.setXpath(xpath); } else if (value instanceof Map) { // ProMap<String,Pro> map = (ProMap<String,Pro>)value; // map.put(p.getName(), p.value); // map.put(p.getName(), p); Pro pp = (Pro)traceStack.get(traceStack.size() - 2); // list.add(p.getValue()); // if(list.size() > 0) xpath = pp.getXpath() + "[" + p.getName() + "]"; // else // xpath = pp.getXpath() + "[0]"; // list.add(p); p.setXpath(xpath); } else if (value instanceof ProArray) { ProArray set = (ProArray)value; // set.add(p.value); // set.addPro(p); Pro pp = (Pro)traceStack.get(traceStack.size() - 2); // list.add(p.getValue()); if(set.size() > 0) xpath = pp.getXpath() + "[" + (set.size() - 1) + "]"; else xpath = pp.getXpath() + "[0]"; // list.add(p); p.setXpath(xpath); } else if(value instanceof Construction) { Construction construction = (Construction)value; // construction.addParam(p); Pro pp = (Pro)traceStack.get(traceStack.size() - 2); // list.add(p.getValue()); if(construction.getParams() != null && construction.getParams().size() > 0) xpath = pp.getXpath() + "{" + (construction.getParams().size() - 1) + "}"; else xpath = pp.getXpath() + "{0}"; // list.add(p); p.setXpath(xpath); } else if (value instanceof Set) { ProSet<Pro> set = (ProSet<Pro>)value; Pro pp = (Pro)traceStack.get(traceStack.size() - 2); // list.add(p.getValue()); if(set.size() > 0) xpath = pp.getXpath() + "[" + (set.size() - 1) + "]"; else xpath = pp.getXpath() + "[0]"; // list.add(p); p.setXpath(xpath); } else if(value instanceof ProviderManagerInfo) { // ProviderManagerInfo providerManagerInfo = (ProviderManagerInfo) value; // // // // xpath = providerManagerInfo.getXpath() + Pro.REF_TOKEN + p.getName(); // p.setXpath(xpath); xpath = p.getName(); p.setXpath(xpath); // if(p.getName() != null) // p.setUuid(providerManagerInfo.getId() + Pro.id_mask + p.getName()); // else // { // p.setUuid(providerManagerInfo.getId()); // } } else { xpath = p.getName(); p.setXpath(xpath); } } else { xpath = p.getName(); p.setXpath(xpath); } // return xpath; } private void startProperty(Pro p,String s1, String s2, String name, Attributes attributes) { String name_ = null; String value = null; String clazz = null; if(this.serial) { name_ = attributes.getValue("n"); if(name_ == null) { name_ = attributes.getValue("name"); if(name_ == null || name_.equals("")) { String id = attributes.getValue("id"); name_ = id; } } value = attributes.getValue("v"); if(value == null) value = attributes.getValue("value"); clazz = attributes.getValue("cs"); // if(clazz == null) //@setBean 注释开始 // { // clazz = attributes.getValue(Pro.soa_type_attribute); // }//@setBean 注释结束 if(clazz == null) clazz = attributes.getValue("class"); } else { name_ = attributes.getValue("name"); if(name_ == null || name_.equals("")) { String id = attributes.getValue("id"); name_ = id; } value = attributes.getValue("value"); clazz = attributes.getValue("class"); } if (name_ != null && !name_.equals("")) { p.setName(name_.trim()); } if (value != null) { p.setValue(value,configPropertiesFile,this); } if (clazz != null && !clazz.equals("")) { p.setClazz(clazz); } String refid = attributes.getValue("refid"); String label = attributes.getValue("label"); String factory_bean = attributes.getValue("factory-bean"); String factory_class = attributes.getValue("factory-class"); String factory_method = attributes.getValue("factory-method"); String iocplugin = attributes.getValue("iocplugin"); boolean singlable = getBoolean(attributes.getValue("singlable"), true); if(iocplugin != null) { p.setIocplugin(iocplugin); } String enablerpc = attributes.getValue("enablerpc"); if(enablerpc != null && enablerpc.equals("true")) { p.setEnablerpc(true); } p.setConfigFile(this.file); p.setSinglable(singlable); p.setFactory_bean(factory_bean); p.setFactory_class(factory_class); p.setFactory_method(factory_method); String destroyMethod = attributes.getValue("destroy-method"); p.setDestroyMethod(destroyMethod); String initMethod = attributes.getValue("init-method"); p.setInitMethod(initMethod); //callorder_sequence标识组件配置的拦截器以顺序方式执行还是以堆栈方式执行, //true:顺序方式执行,拦截器中的每个方法都是按照配置顺序执行,before、after、afterthrow、afterfinally都是按照先后顺序执行 //false:链式方式执行,拦截器中的每个方法都是按照配置堆栈方式执行执行, //先按先后顺序执行所有拦截器的before方法,然后按逆序执行所有拦截器的after、afterthrow、afterfinally三个方法 //默认值为false p .setCallorder_sequence(getBoolean(attributes.getValue("callorder_sequence"), false)); this.buildXpath(p); // if(this.serial) { String mg = attributes.getValue("mg"); if(mg != null) { p.setMagicNumber(mg); // String serial = attributes.getValue("serial"); // String preserial = attributes.getValue("preserial"); // if(serial == null && preserial == null) { MagicClass mgc = SerialFactory.getSerialFactory().getMagicClassByMagicNumber(mg); if(mgc == null) throw new java.lang.IllegalArgumentException("magic="+mg + "对应的MagicClass不存在,请检查org/frameworkset/soa/serialconf.xml文件中是否定义了magic='"+mg+"'的序列化插件."); if(mgc.getMagicclass() != null && p.getClazz() == null) { p.setClazz(mgc.getMagicclass()); } p.setMagicclass(mgc); } } } setFAttr(p, attributes); if(label != null && !label.equals("")) p.setLabel(label); if (refid != null && !refid.equals("")) { p.setRefid(refid); } } public void startElement(String s1, String s2, String name, Attributes attributes) { if(currentValue.length() > 0) currentValue.delete(0, currentValue.length()); // currentValue = null; if ( name.equals("propes")) { ProProperties properties = new ProProperties(); this.traceStack.push(properties); } else if (name.equals("p") || name.equals("property")) { Pro p = this._buildPro();// new Pro(applicationContext); startProperty(p,s1, s2, name, attributes); this.traceStack.push(p); } else if (name.equals("l")||name.equals("list")) { ProList list = new ProList(); String componentType = null; // if(this.serial) { componentType = attributes.getValue("cmt"); if(componentType == null) componentType = attributes.getValue("componentType"); } // else // { // componentType = attributes.getValue("componentType"); // } list.setComponentType(componentType); this.traceStack.push(list); } else if (name.equals("m") || name.equals("map")) { ProMap map = new ProMap<String,Pro>(); String componentType = null; // if(this.serial) { componentType = attributes.getValue("cmt"); if(componentType == null) componentType = attributes.getValue("componentType"); } // else // { // componentType = attributes.getValue("componentType"); // } map.setComponentType(componentType); this.traceStack.push(map); } else if (name.equals("a") || name.equals("array")) { ProArray array = new ProArray(); String componentType = null; // if(this.serial) { componentType = attributes.getValue("cmt"); if(componentType == null) componentType = attributes.getValue("componentType"); } // else // { // componentType = attributes.getValue("componentType"); // } array.setComponentType(componentType); this.traceStack.push(array); } else if (name.equals("construction")) { Construction construction = new Construction(); Object parent = this.traceStack.peek(); if(parent instanceof ProviderManagerInfo) { ProviderManagerInfo providerManagerInfo = (ProviderManagerInfo) parent; providerManagerInfo.setConstruction(construction); } else if(parent instanceof Pro) { Pro p = (Pro)parent; p.addConstructor(construction); } this.traceStack.push(construction); } else if (name.equals("s") || name.equals("set")) { ProSet set = new ProSet(); String componentType = null; // if(this.serial) { componentType = attributes.getValue("cmt"); if(componentType == null) componentType = attributes.getValue("componentType"); } // else // { // componentType = attributes.getValue("componentType"); // } set.setComponentType(componentType); this.traceStack.push(set); } else if (name.equals("manager")) { String id = attributes.getValue("id"); ProviderManagerInfo providerManger = new ProviderManagerInfo(); providerManger.setId(id); String enablerpc = attributes.getValue("enablerpc"); if(enablerpc != null && enablerpc.equals("true")) { providerManger.setEnablerpc(true); } providerManger.setJndiName(attributes.getValue("jndiname")); // providerManger.setTransactionInterceptorClass(attributes // .getValue("interceptor")); providerManger.setSinglable(getBoolean(attributes.getValue("singlable"), true)); providerManger.setDefaultable(getBoolean(attributes.getValue("default"), false)); providerManger .setCallorder_sequence(getBoolean(attributes.getValue("callorder_sequence"), false)); managers.put(id, providerManger); traceStack.push(providerManger); } else if (name.equals("managerimport")) { ManagerImport mi = new ManagerImport(); mi.setFile(attributes.getValue("file")); mangerimports.add(mi); } else if (name.equals("provider")) { ProviderManagerInfo providerManager = (ProviderManagerInfo) traceStack.peek(); SecurityProviderInfo provider = new SecurityProviderInfo(); provider.setConfigFile(this.file); boolean isdefault = getBoolean(attributes.getValue("default"), false); provider.setIsdefault(isdefault); provider.setProviderClass(attributes.getValue("class")); provider.setType(attributes.getValue("type")); provider.setUsed(getBoolean(attributes.getValue("used"), false)); String destroyMethod = attributes.getValue("destroy-method"); provider.setDestroyMethod(destroyMethod); String initMethod = attributes.getValue("init-method"); provider.setInitMethod(initMethod); provider.setApplicationContext(applicationContext); if (isdefault) providerManager.setDefaulProviderInfo(provider); providerManager.addSecurityProviderInfo(provider); traceStack.push(provider); } else if (name.equals("synchronize")) { ProviderManagerInfo providerManagerInfo = (ProviderManagerInfo) this.traceStack.peek(); providerManagerInfo.setSynchronizedEnabled(getBoolean(attributes.getValue("enabled"), false)); } else if (name.equals("transactions")) { Object tobj = this.traceStack.peek(); if(tobj instanceof ProviderManagerInfo) { ProviderManagerInfo providerManagerInfo = (ProviderManagerInfo) tobj; Transactions txs = new Transactions(); providerManagerInfo.setTransactions(txs); traceStack.push(txs); } else { Pro pro = (Pro) tobj; Transactions txs = new Transactions(); pro.setTransactions(txs); traceStack.push(txs); } } else if (name.equals("reference")) { ProviderManagerInfo providerManagerInfo = (ProviderManagerInfo) this.traceStack.peek(); Pro ref = this._buildPro();// new Pro(applicationContext); String fieldname = attributes.getValue("fieldname"); if(fieldname == null) fieldname = attributes.getValue("name");; String refid = attributes.getValue("refid"); String reftype = attributes.getValue("reftype"); String value = attributes.getValue("value"); String clazz = attributes.getValue("class"); if(value == null && refid == null ) { if(clazz != null && !clazz.equals("")) { ref.setBean(true); } else { throw new SPIException("reference元素必须带class,value,refid三个属性中的任何一个。"); } } ref.setName(fieldname); ref.setRefid(refid); ref.setReftype(reftype); ref.setValue(value,configPropertiesFile,this); ref.setClazz(clazz); providerManagerInfo.addReference(ref); } else if (name.equals("interceptor")) { InterceptorInfo interceptor = new InterceptorInfo(this.applicationContext); this.startProperty(interceptor, s1, s2, name, attributes); this.traceStack.push(interceptor); // Object obj = this.traceStack.peek(); // // BaseTXManager providerManagerInfo = (BaseTXManager) obj; // InterceptorInfo interceptor = new InterceptorInfo(); // String clazz = attributes.getValue("class"); // interceptor.setClazz(clazz); // // providerManagerInfo.addInterceptor(interceptor); } else if (name.equals("method")) { SynchronizedMethod synchronizedMethod = new SynchronizedMethod(); synchronizedMethod.setMethodName(attributes.getValue("name")); synchronizedMethod.setPattern(attributes.getValue("pattern")); synchronizedMethod.setTxtype(attributes.getValue("txtype")); traceStack.push(synchronizedMethod); } else if (name.equals("rollbackexceptions")) { // do nothing } else if (name.equals("exception")) { RollbackException e = new RollbackException(); String exceptionName = attributes.getValue("class"); String exceptionType = attributes.getValue("type"); e.setExceptionName(exceptionName); e.setExceptionType(exceptionType); SynchronizedMethod method = (SynchronizedMethod) traceStack.peek(); method.addRollbackException(e); } else if (name.equals("param")) // 添加方法参数信息 { String paramType = attributes.getValue("type"); if(paramType == null) paramType = attributes.getValue("class"); String value = attributes.getValue("value"); String refid = attributes.getValue("refid"); Param param = new Param(applicationContext); param.setClazz(paramType); param.setRefid(refid); param.setValue(value,configPropertiesFile,this); Object o = traceStack.peek(); if (o instanceof SynchronizedMethod) { SynchronizedMethod method = (SynchronizedMethod) o; method.addParam(param); } else if (o instanceof Construction) { Construction construction = (Construction) o; construction.addParam(param); } } else if (name.equals("description")) { // this.currentValue.delete(0, this.currentValue.length()); currentValue.delete(0, currentValue.length()); // Object p = this.traceStack.peek(); // if(p instanceof Pro) // { // Pro pro = (Pro)p; // pro.setDescription(description) // } } else if(name.equals("editor")) { Editor editor = new Editor(); String clazz = attributes.getValue("class"); if(clazz == null || clazz.equals("")) throwable("editor 节点没有指定class属性。"); editor.setEditor(clazz); Pro currentElement = (Pro)this.traceStack.peek(); currentElement.setEditor(editor); } else if(name.equals("config")) { if(this.configPropertiesFile == null) configPropertiesFile = new PropertiesContainer(); String file = attributes.getValue("file"); if(file != null) this.configPropertiesFile.addConfigPropertiesFile(file,this.linkfile); } else { // if(this.applicationContext.isfile()) // log.info("解析文件时[" + this.parent + "]遇到元素[" + name + "],忽略处理。"); // else // log.info("解析报文时遇到元素[" + name + "],忽略处理。"); } } public Map getManagers() { return managers; } public List getMangerimports() { return this.mangerimports; } public void throwable(String message) { if(linkfile == null) throw new IllegalArgumentException("editor 节点没有指定class属性。对应的配置文件为:" + this.file); else { throw new IllegalArgumentException("editor 节点没有指定class属性。对应的配置文件为:" + this.linkfile.toString(this.file) ); } } public static boolean getBoolean(String value, boolean nullReplace) { boolean ret = false; if (value == null) ret = nullReplace; else if (value.trim().equalsIgnoreCase("true")) ret = true; else ret = false; return ret; } public PropertiesContainer getConfigPropertiesFile() { return configPropertiesFile; } }