2 * Copyright (C) 2009 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
10 package eu
.etaxonomy
.cdm
.database
;
12 import java
.sql
.Connection
;
13 import java
.sql
.SQLException
;
14 import java
.util
.HashMap
;
17 import javax
.sql
.DataSource
;
19 import org
.springframework
.jdbc
.datasource
.SimpleDriverDataSource
;
20 import org
.springframework
.jdbc
.datasource
.lookup
.AbstractRoutingDataSource
;
24 * A simple RoutingDataSource.
25 * Bean definitions must set the key of the default datasource to "default"
26 * This String is defined in the contant <code>DEFAULT_DATASOURCE_KEY</code> and will
27 * be used when the RoutingDataSource is beeing updated with a new <code>Map</code>
30 * <b>Example of bean definition:</b>
32 <bean id="dataSource" lazy-init="true" class="eu.etaxonomy.cdm.remote.service.BasepathRoutingDataSource">
33 <property name="targetDataSources">
34 <map key-type="java.lang.String">
35 <entry key="default" value-ref="defaultDataSource"/>
38 <property name="defaultTargetDataSource" ref="defaultDataSource"/>
42 * @author a.kohlbecker
45 public class UpdatableRoutingDataSource
extends AbstractRoutingDataSource
{
48 private String defaultDatasourceName
= "default";
51 protected Object
determineCurrentLookupKey() {
52 return NamedContextHolder
.getContextKey();
56 public void afterPropertiesSet() {
58 // super.afterPropertiesSet() is called by updateRoutingDataSource()
61 public void setDefaultDatasourceName(String name
){
62 this.defaultDatasourceName
= name
;
68 public Map
<String
, DataSourceInfo
> updateDataSources() {
70 logger
.info("loading & testing datasources .. ");
71 Map
<String
,SimpleDriverDataSource
> dataSources
= loadDataSources();
72 Map
<String
, DataSourceInfo
> dataSourceInfos
= testDataSources(dataSources
);
74 setTargetDataSources((Map
)dataSources
);
75 DataSource defaultDatasource
= dataSources
.get(defaultDatasourceName
);
76 if(defaultDatasource
== null) {
77 logger
.error("Defaultdatasource '" +defaultDatasourceName
+ "' not found.");
79 setDefaultTargetDataSource(defaultDatasource
);
80 super.afterPropertiesSet();
82 return dataSourceInfos
;
85 protected Map
<String
, SimpleDriverDataSource
> loadDataSources(){
86 return DataSourceBeanLoader
.loadDataSources(SimpleDriverDataSource
.class);
93 protected Map
<String
, DataSourceInfo
> testDataSources(Map
<String
, SimpleDriverDataSource
> dataSources
) {
95 Map
<String
, DataSourceInfo
> dataSourceInfos
= new HashMap
<String
, DataSourceInfo
>();
97 for(String key
: dataSources
.keySet()){
98 SimpleDriverDataSource datasource
= dataSources
.get(key
);
99 DataSourceInfo dsi
= new DataSourceInfo(datasource
);
100 Connection connection
= null;
101 String sqlerror
= null;
103 connection
= datasource
.getConnection();
105 } catch (SQLException e
) {
106 sqlerror
= e
.getMessage() + "["+ e
.getSQLState() + "]";
107 dsi
.getProblems().add(sqlerror
);
108 if(connection
!= null){
109 try {connection
.close();} catch (SQLException e1
) { /* IGNORE */ }
112 logger
.info(" /" + key
+ " => "+ datasource
.getUrl() + "[ "+(sqlerror
== null ?
"OK" : "ERROR: " + sqlerror
) + " ]");
113 dataSourceInfos
.put(key
, dsi
);
116 return dataSourceInfos
;