001 /* 002 @license.text@ 003 */ 004 package biz.hammurapi.sql; 005 006 import java.io.StringReader; 007 import java.lang.reflect.Constructor; 008 import java.sql.ResultSet; 009 import java.sql.SQLException; 010 011 import biz.hammurapi.config.DomConfigurable; 012 import biz.hammurapi.config.GenericContainer; 013 import biz.hammurapi.convert.ConvertingService; 014 import biz.hammurapi.xml.dom.DOMUtils; 015 016 017 /** 018 * Container, which reads component definitions from rowset. 019 * @author Pavel Vlasov 020 * @revision $Revision$ 021 */ 022 public class RowsetConfigurableContainer extends GenericContainer implements RowProcessor { 023 private ClassLoader classLoader; 024 025 public RowsetConfigurableContainer() { 026 // Default constructor 027 } 028 029 public RowsetConfigurableContainer(ClassLoader classLoader) { 030 super(); 031 this.classLoader = classLoader; 032 } 033 034 035 036 public boolean process(ResultSet rs) throws SQLException { 037 String value=rs.getString("PARAMETER_VALUE"); 038 String componentName = rs.getString("NAME"); 039 String componentClass = rs.getString("CLASS_NAME"); 040 try { 041 // Default class is String 042 if (componentClass==null || componentClass.trim().length()==0) { 043 addComponent(componentName, value); 044 } else { 045 Class clazz = Class.forName(componentClass); 046 if (value==null || value.trim().length()==0) { 047 addComponent(componentName, clazz.newInstance()); 048 } else { 049 // Attempt to construct class from value 050 Constructor[] constructors=clazz.getConstructors(); 051 for (int i=0; i<constructors.length; i++) { 052 if (constructors[i].getParameterTypes().length==1 && constructors[i].getParameterTypes()[0].equals(String.class)) { 053 addComponent(componentName, constructors[i].newInstance(new Object[] {value})); 054 return true; 055 } 056 } 057 058 Object instance = clazz.newInstance(); 059 060 if (DomConfigurable.class.isAssignableFrom(clazz)) { 061 ((DomConfigurable) instance).configure(DOMUtils.parse(new StringReader(value)).getDocumentElement(), this, classLoader); 062 } else { 063 instance = ConvertingService.convert(instance, clazz); 064 } 065 addComponent(componentName, instance); 066 } 067 } 068 } catch (Exception e) { 069 throw new SQLExceptionEx("Cannot instantiate parameter '"+componentName+"' -> "+componentClass, e); 070 } 071 return true; 072 } 073 }