View Javadoc
1   /***
2    * License Agreement.
3    * 
4    * JSPA (POJO-SP)
5    * 
6    * Copyright (C) 2009 HRX Pty Ltd
7    * 
8    * This file is part of JSPA.
9    * 
10   * JSPA is free software: you can redistribute it and/or modify it under the
11   * terms of the GNU Lesser General Public License version 3 as published by the
12   * Free Software Foundation.
13   * 
14   * JSPA is distributed in the hope that it will be useful, but WITHOUT ANY
15   * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
16   * A PARTICULAR PURPOSE. See the Lesser General Public License for more details.
17   * 
18   * You should have received a copy of the GNU Lesser General Public License
19   * along with JSPA. If not, see <http://www.gnu.org/licenses/>.
20   */
21  package com.hrx.rasp.util.dao.jdbc;
22  
23  import java.io.PrintWriter;
24  import java.sql.Connection;
25  import java.sql.SQLException;
26  
27  import javax.naming.InitialContext;
28  import javax.naming.NamingException;
29  import javax.sql.DataSource;
30  
31  import org.apache.log4j.Logger;
32  
33  /***
34   * @author dan.stoica <dan.stoica@acslink.net.au>
35   * 
36   */
37  public class WrapperDataSource implements DataSource
38  {
39  
40  	private Logger log = Logger.getLogger(getClass());
41  
42  	private DataSource ds;
43  	private String jndiName;
44  	private static final int DEFAULT_RETRY = 3;
45  
46  	private final int retry;
47  
48  	public WrapperDataSource(String jndiName, DataSource ds)
49  	{
50  		this(jndiName, ds, DEFAULT_RETRY);
51  	}
52  
53  	public WrapperDataSource(String jndiName, DataSource ds, int retry)
54  	{
55  		this.ds = ds;
56  		this.jndiName = jndiName;
57  		this.retry = retry;
58  	}
59  
60  	public Connection getConnection() throws SQLException
61  	{
62  		Connection conn = getConnection(this.retry);
63  		return conn;
64  	}
65  
66  	public int findDataSource(int retry, String name) throws NamingException
67  	{
68  		try
69  		{
70  			log.warn("Data Source resource not found; try to lookup a new data source .");
71  			ds = (DataSource) InitialContext.doLookup(name);
72  		}
73  		catch (NamingException e)
74  		{
75  			if (retry == 0)
76  			{
77  				log.fatal("Data source Not available.", e);
78  				throw e;
79  			}
80  			log.warn("No Data Source found. Retry.", e);
81  			retry = findDataSource(retry - 1, name);
82  		}
83  		return retry;
84  	}
85  
86  	private Connection getConnection(int retry) throws SQLException
87  	{
88  		Connection conn = null;
89  		try
90  		{
91  			conn = ds.getConnection();
92  		}
93  		catch (SQLException e)
94  		{
95  			if (retry == 0)
96  			{
97  				throw e;
98  			}
99  			try
100 			{
101 				retry = findDataSource(retry, this.jndiName);
102 				conn = getConnection(retry);
103 			}
104 			catch (NamingException e1)
105 			{
106 				throw new SQLException(e1);
107 			}
108 		}
109 		return conn;
110 	}
111 
112 	public Connection getConnection(String username, String password) throws SQLException
113 	{
114 		return ds.getConnection(username, password);
115 	}
116 
117 	public int getLoginTimeout() throws SQLException
118 	{
119 		return ds.getLoginTimeout();
120 	}
121 
122 	public PrintWriter getLogWriter() throws SQLException
123 	{
124 		return ds.getLogWriter();
125 	}
126 
127 	public void setLoginTimeout(int loginTimeout) throws SQLException
128 	{
129 		ds.setLoginTimeout(loginTimeout);
130 	}
131 
132 	public void setLogWriter(PrintWriter logger) throws SQLException
133 	{
134 		ds.setLogWriter(logger);
135 	}
136 
137 	public boolean isWrapperFor(Class<?> iface) throws SQLException
138 	{
139 		return false;
140 	}
141 
142 	public <T> T unwrap(Class<T> iface) throws SQLException
143 	{
144 		return null;
145 	}
146 }