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