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    }