001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019 020 021 package org.apache.geronimo.system.util; 022 023 import java.sql.Driver; 024 import java.lang.reflect.Method; 025 import java.lang.reflect.InvocationTargetException; 026 027 import org.apache.geronimo.gbean.GBeanLifecycle; 028 import org.apache.geronimo.gbean.GBeanInfo; 029 import org.apache.geronimo.gbean.GBeanInfoBuilder; 030 031 /** 032 * @version $Rev: 533154 $ $Date: 2007-04-27 12:06:53 -0400 (Fri, 27 Apr 2007) $ 033 */ 034 public class JDBCDriverRegistrationGBean implements GBeanLifecycle { 035 036 private final Class ddClass; 037 private final Driver instance; 038 039 public JDBCDriverRegistrationGBean(String className, ClassLoader classLoader) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { 040 ddClass = classLoader.loadClass("org.apache.geronimo.jdbc.DelegatingDriver"); 041 Method m = ddClass.getDeclaredMethod("registerDriver", new Class[] {Driver.class}); 042 Class clazz = classLoader.loadClass(className); 043 instance = (Driver) clazz.newInstance(); 044 //This is definitely enough to make the dd register itself with DriverManager 045 m.invoke(null, new Object[] {instance}); 046 } 047 048 public void doStart() throws Exception { 049 } 050 051 public void doStop() throws Exception { 052 Method m = ddClass.getDeclaredMethod("unregisterDriver", new Class[] {Driver.class}); 053 m.invoke(null, new Object[] {instance}); 054 } 055 056 public void doFail() { 057 try { 058 doStop(); 059 } catch (Exception e) { 060 //ignore 061 } 062 } 063 public static final GBeanInfo GBEAN_INFO; 064 065 static { 066 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(JDBCDriverRegistrationGBean.class, "GBean"); 067 infoBuilder.addAttribute("driverClassName", String.class, true); 068 infoBuilder.addAttribute("classLoader", ClassLoader.class, false); 069 070 infoBuilder.setConstructor(new String[]{"driverClassName", "classLoader"}); 071 072 GBEAN_INFO = infoBuilder.getBeanInfo(); 073 } 074 075 public static GBeanInfo getGBeanInfo() { 076 return GBEAN_INFO; 077 } 078 079 }