/* * 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; // PoolMan Classes import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.beans.PropertyEditor; import java.beans.PropertyEditorManager; import java.io.Serializable; import java.util.ArrayList; import java.util.Iterator; import java.util.Map; import java.util.Properties; import org.frameworkset.spi.BaseApplicationContext; import com.frameworkset.common.poolman.util.JDBCPool; import com.frameworkset.common.poolman.util.JDBCPoolMetaData; import com.frameworkset.common.poolman.util.SQLManager; public class LocalPoolDeployer extends BaseTableManager implements PoolManDeployer,Serializable { public static boolean addShutdownHook = false; public static void shutdownHandle() { if(addShutdownHook) return; // add VM shutdown event handler try { // use reflection and catch the Exception to allow PoolMan to work with 1.2 VM's BaseApplicationContext.addShutdownHook(new Runnable(){ public void run() { try { updateTableInfo(); SQLManager.destroy(); // GenericPoolManager.getInstance().destroyPools(); } catch (Exception e) { System.out.println("Unable to properly shutdown: " + e); } } },1000); addShutdownHook = true; } catch (Exception e) { addShutdownHook = true; } } public void deployConfiguration(PoolManConfiguration config) throws Exception { startDataSources(config.getDataSources()); // startGenericPools(config.getGenericPools()); // Note: there is no admin for the non-JMX PoolMan // add VM shutdown event handler shutdownHandle(); } public void deployConfiguration(PoolManConfiguration config,String dbname) throws Exception { startDataSources(config.getDataSources()); // startGenericPools(config.getGenericPools()); } public void deployConfiguration(PoolManConfiguration config, Map values) throws Exception { // TODO Auto-generated method stub startDataSource(config.getDataSources(),values); shutdownHandle(); } // public void run() { // try { // // get SQLManager and closeAllResources // // SQLManager.destroy(); // // GenericPoolManager.getInstance().destroyPools(); // } catch (Exception e) { // System.out.println("Unable to properly shutdown: " + e); // } // } private void startDataSources(ArrayList datasources) throws Exception { if (datasources == null) return; for (Iterator iter = datasources.iterator(); iter.hasNext();) { // Get each set of datasource entries Properties dbprops = (Properties) iter.next(); // create the metadata object JDBCPoolMetaData metadata = new JDBCPoolMetaData(); BeanInfo beanInfo = Introspector.getBeanInfo(metadata.getClass()); // set attributes based on properties PropertyDescriptor[] attributes = beanInfo.getPropertyDescriptors(); for (int n = 0; n < attributes.length; n++) { // get bean attribute name String attrName = attributes[n].getName(); if (dbprops.containsKey(attrName.toLowerCase())) { // get value in props String propsVal = dbprops.getProperty(attrName.toLowerCase()); Class type = attributes[n].getPropertyType(); // System.out.println("props: " + attrName); // System.out.println("propsVal: " + propsVal); // create attribute value of correct type if(type == java.lang.Boolean.class) type = boolean.class; PropertyEditor editor = PropertyEditorManager.findEditor(type); editor.setAsText(propsVal); Object value = editor.getValue(); // set attribute value on bean attributes[n].getWriteMethod().invoke(metadata, new Object[]{value}); } } metadata.initDatasourceParameters(); SQLManager.getInstance().createPool(metadata); //jpool.log("PoolMan Local Pool Deployer: Created JDBC Connection Pool named: " + metadata.getDbname()); } } private void startDataSource(ArrayList datasources,Map<String,String> values) throws Exception { if (datasources == null ) return; Properties dbprops = null; for (Iterator iter = datasources.iterator(); iter.hasNext();) { dbprops = (Properties) iter.next(); boolean useTemplate = false; // Get each set of datasource entries if(values != null && values.size() > 0) { String dbname = (String)values.get("dbname"); String temp = (String)dbprops.get("dbname"); if(temp != null && dbname != null && (temp.equals(dbname)|| temp.equals("${dbname}")) ) { useTemplate = true; } } // create the metadata object JDBCPoolMetaData metadata = new JDBCPoolMetaData(); BeanInfo beanInfo = Introspector.getBeanInfo(metadata.getClass()); // set attributes based on properties PropertyDescriptor[] attributes = beanInfo.getPropertyDescriptors(); for (int n = 0; n < attributes.length; n++) { // get bean attribute name String attrName = attributes[n].getName(); if (dbprops.containsKey(attrName.toLowerCase())) { // get value in props String propsVal = null; if(!useTemplate) { propsVal = dbprops.getProperty(attrName.toLowerCase()); } else { propsVal = values.get(attrName.toLowerCase()); if(propsVal == null) propsVal = dbprops.getProperty(attrName.toLowerCase()); } Class type = attributes[n].getPropertyType(); // System.out.println("props: " + attrName); // System.out.println("propsVal: " + propsVal); // create attribute value of correct type PropertyEditor editor = PropertyEditorManager.findEditor(type); Object value = null; if(type.isAssignableFrom(Boolean.class)) { if(propsVal == null || propsVal.trim().equals("")) { } else { editor.setAsText(propsVal); value = editor.getValue(); } } else { editor.setAsText(propsVal); value = editor.getValue(); } // set attribute value on bean attributes[n].getWriteMethod().invoke(metadata, new Object[]{value}); } } metadata.initDatasourceParameters(); JDBCPool jpool = SQLManager.getInstance().createPool(metadata); //jpool.log("PoolMan Local Pool Deployer: Created JDBC Connection Pool named: " + metadata.getDbname()); } } // private void startGenericPools(ArrayList genericObjects) throws Exception { // // if (genericObjects == null) // return; // // for (Iterator iter = genericObjects.iterator(); iter.hasNext();) { // // // Get each set of pool entries // Properties props = (Properties) iter.next(); // // GenericPoolMetaData metadata = new GenericPoolMetaData(); // // // set attributes based on properties // // BeanInfo beanInfo = Introspector.getBeanInfo(metadata.getClass()); // // // set attributes based on properties // // PropertyDescriptor[] attributes = beanInfo.getPropertyDescriptors(); // for (int n = 0; n < attributes.length; n++) { // // // get attribute name // String attrName = attributes[n].getName(); // // if (props.containsKey(attrName.toLowerCase())) { // // // get value in props // String propsVal = props.getProperty(attrName.toLowerCase()); // // Class type = attributes[n].getPropertyType(); // // create attribute value of correct type // PropertyEditor editor = PropertyEditorManager.findEditor(type); // editor.setAsText(propsVal); // Object value = editor.getValue(); // // attributes[n].getWriteMethod().invoke(metadata, new Object[]{value}); // } // } // // GenericPool gpool = GenericPoolManager.getInstance().createPool(metadata); // gpool.log("PoolMan Local Pool Deployer: Created Object Pool Named: " + metadata.getName()); // } // } }