001 /* 002 @license.text@ 003 */ 004 package biz.hammurapi.sql; 005 006 import java.sql.SQLException; 007 import java.util.ArrayList; 008 import java.util.Collection; 009 import java.util.Iterator; 010 011 import javax.xml.transform.TransformerException; 012 013 import org.apache.xpath.XPathAPI; 014 import org.w3c.dom.Element; 015 import org.w3c.dom.Node; 016 import org.w3c.dom.traversal.NodeIterator; 017 018 import biz.hammurapi.config.Component; 019 import biz.hammurapi.config.ConfigurationException; 020 import biz.hammurapi.config.Context; 021 import biz.hammurapi.config.DomConfigurable; 022 import biz.hammurapi.config.Wrapper; 023 import biz.hammurapi.xml.dom.DOMUtils; 024 025 026 public class ConnectionPerThreadDataSourceComponent implements Wrapper, DomConfigurable, Component { 027 028 private ConnectionPerThreadDataSource master; 029 private String driverClass; 030 private String dbUrl; 031 private String user; 032 private String password; 033 034 public ConnectionPerThreadDataSourceComponent() { 035 super(); 036 } 037 038 public Object getMaster() { 039 if (master==null) { 040 throw new IllegalStateException("Not yet started"); 041 } 042 return master; 043 } 044 045 private Collection initStatements=new ArrayList(); 046 047 public void configure(Node configNode, Context context) throws ConfigurationException { 048 try { 049 driverClass=DOMUtils.getSingleElementText((Element) configNode, "driver-class"); 050 dbUrl=DOMUtils.getSingleElementText((Element) configNode, "connection-url"); 051 user=DOMUtils.getSingleElementText((Element) configNode, "user"); 052 password=DOMUtils.getSingleElementText((Element) configNode, "password"); 053 NodeIterator nit=XPathAPI.selectNodeIterator(configNode, "init-connection"); 054 Element el; 055 while ((el=(Element) nit.nextNode())!=null) { 056 initStatements.add(DOMUtils.getElementText(el)); 057 } 058 } catch (TransformerException e) { 059 throw new ConfigurationException("Cannot read parameters", e); 060 } 061 062 } 063 064 public void start() throws ConfigurationException { 065 try { 066 master=new ConnectionPerThreadDataSource( 067 driverClass, 068 dbUrl, 069 user, 070 password, 071 new Transaction() { 072 073 public boolean execute(SQLProcessor processor) throws SQLException { 074 Iterator it=initStatements.iterator(); 075 while (it.hasNext()) { 076 processor.processUpdate((String) it.next(), null); 077 } 078 return true; 079 } 080 081 }); 082 } catch (ClassNotFoundException e) { 083 throw new ConfigurationException("Driver class not found", e); 084 } 085 } 086 087 public void stop() throws ConfigurationException { 088 if (master!=null) { 089 master.shutdown(); 090 } 091 092 } 093 094 public void setOwner(Object owner) { 095 // Nothing 096 } 097 }