001 /*
002 @license.text@
003 */
004 package biz.hammurapi.ant;
005
006 import java.io.IOException;
007 import java.sql.Connection;
008 import java.sql.DriverManager;
009 import java.sql.SQLException;
010 import java.util.ArrayList;
011 import java.util.Collection;
012 import java.util.Iterator;
013
014 import org.apache.tools.ant.BuildException;
015
016 import biz.hammurapi.config.Context;
017 import biz.hammurapi.sql.ConnectionPerThreadDataSource;
018 import biz.hammurapi.sql.SQLProcessor;
019
020
021 /**
022 * Defines database connection.
023 * @ant.element name="Database connection"
024 * @author Pavel Vlasov
025 * @version $Revision: 1.8 $
026 */
027 public class ConnectionEntry {
028 private String driverClass;
029 private String url;
030 private String user;
031 private String password;
032 private Collection onConnects=new ArrayList();
033
034 /**
035 * Driver class.
036 * @ant.required
037 */
038 public void setDriverClass(String driverClass) {
039 this.driverClass = driverClass;
040 }
041
042 /**
043 * Database password.
044 * @ant.non-required
045 * @param password
046 */
047 public void setPassword(String password) {
048 this.password = password;
049 }
050
051 /**
052 * Connection url
053 * @ant.required
054 * @param url
055 */
056 public void setUrl(String url) {
057 this.url = url;
058 }
059
060 /**
061 * Database user
062 * @ant.non-required
063 * @param user
064 */
065 public void setUser(String user) {
066 this.user = user;
067 }
068
069 public SQLProcessor getProcessor(Context nameMap) {
070 SQLProcessor ret = new SQLProcessor(getDataSource(), nameMap);
071 processOnConnects(ret);
072 return ret;
073 }
074
075 /**
076 * @param ret
077 */
078 private void processOnConnects(SQLProcessor ret) {
079 Iterator it=onConnects.iterator();
080 while (it.hasNext()) {
081 try {
082 ((Script) it.next()).execute(ret);
083 } catch (IOException e) {
084 throw new BuildException(e);
085 } catch (SQLException e) {
086 throw new BuildException(e);
087 }
088 }
089 }
090
091 private Collection dataSources=new ArrayList();
092
093 /**
094 * @return
095 * @throws ClassNotFoundException
096 */
097 public ConnectionPerThreadDataSource getDataSource() {
098 try {
099 ConnectionPerThreadDataSource ds = new ConnectionPerThreadDataSource(driverClass, url, user, password, null);
100 dataSources.add(ds);
101 return ds;
102 } catch (ClassNotFoundException e) {
103 throw new BuildException("Cannot load driver class", e);
104 }
105 }
106
107 public Connection getConnection() throws SQLException, ClassNotFoundException {
108 Class.forName(driverClass);
109 return DriverManager.getConnection(url, user, password);
110
111 }
112
113 public Script createOnConnect() {
114 Script ret = new Script();
115 onConnects.add(ret);
116 return ret;
117 }
118
119 public void shutdown() {
120 Iterator it=dataSources.iterator();
121 while (it.hasNext()) {
122 ((ConnectionPerThreadDataSource) it.next()).shutdown();
123 }
124 }
125 }