001 /** 002 * Copyright 2004-2012 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.apache.torque.util; 017 018 import static org.apache.commons.lang.StringUtils.isBlank; 019 import static org.apache.commons.lang.StringUtils.isEmpty; 020 021 import java.util.Map; 022 023 import org.apache.commons.beanutils.BeanUtils; 024 import org.kuali.core.db.torque.PropertyHandlingException; 025 import org.kuali.db.DatabaseType; 026 import org.kuali.db.JDBCConfiguration; 027 import org.kuali.db.JDBCUtils; 028 029 public class JdbcConfigurer { 030 JDBCUtils jdbcUtils = new JDBCUtils(); 031 032 @SuppressWarnings("unchecked") 033 protected boolean hasProperty(String name, Object bean) throws PropertyHandlingException { 034 try { 035 Map<String, Object> description = BeanUtils.describe(bean); 036 return description.containsKey(name); 037 } catch (Exception e) { 038 throw new PropertyHandlingException(e); 039 } 040 041 } 042 043 @SuppressWarnings("unchecked") 044 protected <T> T getProperty(String name, Object bean) { 045 try { 046 if (hasProperty(name, bean)) { 047 return (T) BeanUtils.getProperty(bean, name); 048 } else { 049 return null; 050 } 051 } catch (Exception e) { 052 throw new RuntimeException(e); 053 } 054 } 055 056 protected void setProperty(Object bean, String name, Object value) throws PropertyHandlingException { 057 try { 058 BeanUtils.copyProperty(bean, name, value); 059 } catch (Exception e) { 060 throw new PropertyHandlingException(e); 061 } 062 } 063 064 public void updateConfiguration(Object bean) throws PropertyHandlingException { 065 String url = getProperty("url", bean); 066 if (isEmpty(url)) { 067 // If the url is empty, there is nothing to do 068 return; 069 } 070 071 JDBCConfiguration config = jdbcUtils.getDatabaseConfiguration(url); 072 if (config.equals(JDBCConfiguration.UNKNOWN_CONFIG)) { 073 return; 074 } 075 076 String driver = getProperty("driver", bean); 077 if (isBlank(driver)) { 078 setProperty(bean, "driver", config.getDriver()); 079 } 080 081 String targetDatabase = getProperty("targetDatabase", bean); 082 if (isBlank(targetDatabase)) { 083 setProperty(bean, "targetDatabase", config.getType().toString().toLowerCase()); 084 } 085 } 086 087 public void validateConfiguration(Object bean) { 088 String driver = getProperty("driver", bean); 089 if (isBlank(driver)) { 090 throw new IllegalArgumentException("No database driver. Specify one in the plugin configuration."); 091 } 092 093 String url = getProperty("url", bean); 094 if (isBlank(url)) { 095 throw new IllegalArgumentException(getEmptyURLErrorMessage()); 096 } 097 098 String targetDatabase = getProperty("targetDatabase", bean); 099 try { 100 DatabaseType.valueOf(targetDatabase.toUpperCase()); 101 } catch (IllegalArgumentException e) { 102 throw new IllegalArgumentException("Database type of '" + targetDatabase + "' is invalid. Valid values: " + org.springframework.util.StringUtils.arrayToCommaDelimitedString(DatabaseType.values())); 103 } 104 105 try { 106 Class.forName(driver); 107 } catch (ClassNotFoundException e) { 108 throw new IllegalArgumentException("Can't load driver class " + driver + ". Be sure to include it as a plugin dependency."); 109 } 110 } 111 112 protected String getEmptyURLErrorMessage() { 113 StringBuffer sb = new StringBuffer(); 114 sb.append("\n\n"); 115 sb.append("No url was supplied.\n"); 116 sb.append("You can specify a url in the plugin configuration or provide it as a system property.\n\n"); 117 sb.append("For example:\n\n"); 118 sb.append("-Durl=jdbc:oracle:thin:@localhost:1521:XE (oracle)\n"); 119 sb.append("-Durl=jdbc:mysql://localhost:3306/<database> (mysql)\n"); 120 sb.append("\n."); 121 return sb.toString(); 122 } 123 }