/* * 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" bboss persistent, * 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 com.frameworkset.common.poolman.management; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.log4j.Logger; import org.frameworkset.spi.assemble.PropertiesContainer; import org.xml.sax.Attributes; import org.xml.sax.helpers.DefaultHandler; import com.frameworkset.common.poolman.PoolManConstants; import com.frameworkset.util.SimpleStringUtil; /** * SAXParser used by Configurator to parse the * poolman.xml file. It returns Collections of * generic pool properties, JDBC pool properties, * and admin-agent properties. */ public class ConfigParser extends DefaultHandler{ private static Logger log = Logger.getLogger(ConfigParser.class) ; private ArrayList dbProps; private ArrayList genericProps; private Properties adminProps; private boolean jmxManagement = PoolManConstants.DEFAULT_USE_JMX; private String currentSet; private String currentName; private StringBuilder currentValue = new StringBuilder(); private String file; private String[] filterdbname = null; private String interceptor = "com.frameworkset.common.poolman.interceptor.DummyInterceptor"; private String currentdbtype ; private String dbnamespace; protected PropertiesContainer configPropertiesFile; /** * 用户自定义的适配器 */ private Map<String,String> adaptors = new HashMap<String,String>(); public ConfigParser(String file,String dbnamespace,String[] filterdbname) { this.dbProps = new ArrayList(); this.genericProps = new ArrayList(); this.file = file; this.filterdbname = filterdbname; this.dbnamespace = dbnamespace; } public ArrayList getDataSourceProperties() { if(this.filterdbname != null && filterdbname.length > 0) { this.dbProps.clear(); if(this.filterpros != null && this.filterpros.size() > 0) this.dbProps.addAll(this.filterpros); } return this.dbProps; } public ArrayList getGenericProperties() { return this.genericProps; } public Properties getAdminProps() { return this.adminProps; } public boolean isManagementJMX() { return this.jmxManagement; } public void startElement(String s1, String s2,String name,Attributes attributes) { currentValue.delete(0, currentValue.length()); this.currentName = name; if (name.toLowerCase().equals("datasource")) { this.currentSet = "datasource"; Properties properties = new Properties(); String external = SimpleStringUtil.replaceNull(attributes.getValue("external"),"false"); properties.put("external",external); dbProps.add(properties); } else if(name.equals("config")) { if(this.configPropertiesFile == null) configPropertiesFile = new PropertiesContainer(); String file = attributes.getValue("file"); if(file != null) this.configPropertiesFile.addConfigPropertiesFile(file); } else if (name.toLowerCase().equals("objectpool")) { this.currentSet = "generic"; genericProps.add(new Properties()); } else if (name.toLowerCase().equals("admin-agent")) { this.currentSet = "admin-agent"; this.adminProps = new Properties(); } else if (name.toLowerCase().equals("management-mode")) { this.currentSet = "management-mode"; } else if (name.equals("poolman") || name.equals("MLET")) { this.currentSet = "ignorable"; } else if (name.toLowerCase().equals("jndi_principal")) { this.currentSet = "jndi_principal"; } else if (name.equals("jndi_credentials") ) { this.currentSet = "jndi_credentials"; } else if (name.toLowerCase().equals("adaptor")) { this.currentSet = "adaptor"; this.currentdbtype = attributes.getValue("dbtype"); } else if(!name.equals("dbname") && !name.equals("loadmetadata") && !name.equals("jndiName") && !name.equals("driver") && !name.equals("url") && !name.equals("username") && !name.equals("password") && !name.equals("txIsolationLevel") && !name.equals("nativeResults") && !name.equals("poolPreparedStatements") && !name.equals("initialConnections") && !name.equals("minimumSize") && !name.equals("maximumSize") && !name.equals("maximumSoft") && !name.equals("removeAbandoned") && !name.equals("userTimeout") && !name.equals("logAbandoned") && !name.equals("readOnly") && !name.equals("skimmerFrequency") && !name.equals("connectionTimeout") && !name.equals("shrinkBy") && !name.equals("testWhileidle") && !name.equals("keygenerate") && !name.equals("maxWait") && !name.equals("validationQuery")&& !name.equals("autoprimarykey")&& !name.equals("cachequerymetadata")&& !name.equals("showsql") && !name.equals("externaljndiName")&& !name.equals("enablejta") && !name.equals("usepool") && !name.equals("encryptdbinfo") && !name.equals("datasourceFile") && !name.equals("queryfetchsize")&&!name.equals("config")) { if(log.isDebugEnabled()) log.debug("解析文件时[" + this.file + "]遇到元素[" + name + "],忽略处理。"); } } public void characters(char[] ch, int start, int length) { currentValue.append(ch, start, length); } private List<Properties> filterpros = null; private boolean contain(String newdbname) { if(filterpros == null || filterpros.size() == 0) return false; for(Properties p:filterpros) { String dbname = (String)p.get("dbname"); if(dbname.equals(newdbname)) return true; } return false; } public void endElement(String s1,String s2,String name) { if (this.currentSet.equals("datasource")) { Properties p = (Properties) dbProps.get(dbProps.size() - 1); if(name.toLowerCase().equals("dbname")) { String dbname = currentValue.toString().trim(); String temp = dbname; if(this.dbnamespace != null && !this.dbnamespace.equals("")) { dbname = dbnamespace + ":" + currentValue.toString().trim(); } p.put(name.toLowerCase(), dbname); if(this.filterdbname !=null && this.filterdbname.length > 0) { for(String _dbname:filterdbname) { if(temp.equals(_dbname) ) { if(filterpros == null) filterpros = new ArrayList<Properties>(); filterpros.add(p); break; } } } } else { String value = null; if(configPropertiesFile != null) value = this.configPropertiesFile.evalValue(currentValue.toString().trim(),null); else { value = currentValue.toString().trim(); } if(!name.equals("password")) p.put(name.toLowerCase(), value.trim()); else p.put(name.toLowerCase(), value); } } else if (this.currentSet.equals("generic")) { Properties p = (Properties) genericProps.get(genericProps.size() - 1); p.put(name.toLowerCase(), currentValue.toString().trim()); } else if (this.currentSet.equals("admin-agent")) { adminProps.setProperty(name.toLowerCase(), currentValue.toString().trim()); } else if (this.currentSet.equals("management-mode")) { if (currentValue.toString().toLowerCase().trim().equals("jmx")) this.jmxManagement = true; } else if (this.currentSet.equals("jndi_principal")) { if (currentValue.toString().trim().length() > 0) PoolManConfiguration.jndi_principal = currentValue.toString(); } else if (this.currentSet.equals("jndi_credentials")) { if (currentValue.toString().trim().length() > 0) PoolManConfiguration.jndi_credentials = currentValue.toString(); } else if (this.currentSet.equals("adaptor")) { if (currentValue.toString().trim().length() > 0) { if(currentdbtype == null || currentdbtype.equals("")) { System.out.println("ignoe adaptor["+currentValue+"],没有指定dbtype。"); } else { this.adaptors.put(this.currentdbtype, currentValue.toString().trim()); currentdbtype = null; } } } this.currentValue.delete(0, this.currentValue.length()); } /** * @return the adaptors */ public Map<String, String> getAdaptors() { return adaptors; } /** * @param adaptors the adaptors to set */ public void setAdaptors(Map<String, String> adaptors) { this.adaptors = adaptors; } /** * @return the interceptor */ public String getInterceptor() { return interceptor; } /** * @param interceptor the interceptor to set */ public void setInterceptor(String interceptor) { this.interceptor = interceptor; } }