package com.founderdpt.comm.xworld.util.config.builder; import java.io.StringReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import ognl.NoSuchPropertyException; import ognl.OgnlContext; import ognl.OgnlException; import ognl.OgnlParser; import ognl.OgnlRuntime; import ognl.PropertyAccessor; import org.apache.commons.beanutils.BeanUtils; import org.apache.log4j.Logger; import org.w3c.dom.Node; import com.founderdpt.comm.xworld.orm.XMLConfigClientTemplate; import com.founderdpt.comm.xworld.orm.parsing.XNode; /** * 查询的环境定义 * @author Administrator * */ public class DynamicContext { /** * 参数默认的KEY值 */ public static final String PARAMETER_OBJECT_KEY = "_parameter"; static { //注册OGNL的适配器 OgnlRuntime.setPropertyAccessor(ContextMap.class, new ContextAccessor()); } private ContextMap bindings; private StringBuilder xql = new StringBuilder(); private List<String> xql_list=new ArrayList<String>(); private List<XNode> nodes= new ArrayList<XNode>(); public void setXql(StringBuilder xql) { this.xql = xql; } public List<String> getXql_list() { return xql_list; } public void setXql_list(List<String> xql_list) { this.xql_list = xql_list; } public List<XNode> getNodes() { return nodes; } public void setNodes(List<XNode> nodes) { this.nodes = nodes; } public String getXql() { return xql.toString(); } public StringBuilder getXqlBuilder() { return xql; } public void getXqlBuilder(StringBuilder xql) { this.xql = xql; } public void setXql(String xql) { this.xql = new StringBuilder(xql); } public void appendXQ(String xq) { this.xql.append(xq); } public Object getParameter() { if (bindings != null) { return bindings.get(PARAMETER_OBJECT_KEY); } return null; } public void setParameter(Object parameter) { if (bindings == null) { bindings = new ContextMap(); } if (parameter != null && !(parameter instanceof Map)) { bindings.put(PARAMETER_OBJECT_KEY, parameter); }else { bindings.put(PARAMETER_OBJECT_KEY, parameter); } } public Map getBindings() { return bindings; } public void setBindings(ContextMap bindings) { this.bindings = bindings; } static class ContextMap extends HashMap<String, Object> { private static final long serialVersionUID = 2977601501966151582L; @Override public Object get(Object key) { String strKey = (String) key; if (super.containsKey(strKey)) { return super.get(strKey); } return null; } } static class ContextAccessor implements PropertyAccessor { private static Logger log = Logger.getLogger(ContextAccessor.class); public Object getProperty(Map context, Object target, Object name) throws OgnlException { Map map = (Map) target; //System.out.println("_----------------<name:"+name); Object result = map.get(name); if (result == null) { Object parameterObject = map.get(PARAMETER_OBJECT_KEY); if (parameterObject instanceof Map) { result= ((Map)parameterObject).get(name); }else{ // try { //BeanUtils.getProperty(parameterObject, String.valueOf(name)); result= OgnlCache.getValue(String.valueOf(name),parameterObject); /*} catch (Exception e) { if(log.isDebugEnabled()){ log.debug("OGNL 获取数据为空 KEY:"+name+" msg:"+e.getMessage()); } return null; }*/ } } if(log.isDebugEnabled()){ if(result==null){ log.debug("OGNL 获取数据为空 KEY:"+name); } } return result; } public void setProperty(Map context, Object target, Object name, Object value) throws OgnlException { Map map = (Map) target; map.put(name, value); } @Override public String getSourceAccessor(OgnlContext arg0, Object arg1, Object arg2) { // TODO Auto-generated method stub return null; } @Override public String getSourceSetter(OgnlContext arg0, Object arg1, Object arg2) { // TODO Auto-generated method stub return null; } } }