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
43 * @deprecated<b>NOTICE:</b>
44 * <em>This class is related to the switchable database infrastructure which allows to serve
45 * multiple databases with only a single instance of the cdm-remote-webapp.
46 * This concept however is deprecated due to several problems of which the most severe is the term loading issue.
47 * This class should however not deleted since we once might wish to switch back to this concept when we are
48 * able to deal with the implicated issues.
50 * See http://dev.e-taxonomy.eu/trac/wiki/CdmServerSwitchableDataSources for more information.</em>
53 public class UpdatableRoutingDataSource
extends AbstractRoutingDataSource
{
56 private String defaultDatasourceName
= "default";
59 protected Object
determineCurrentLookupKey() {
60 return NamedContextHolder
.getContextKey();
64 public void afterPropertiesSet() {
66 // super.afterPropertiesSet() is called by updateRoutingDataSource()
69 public void setDefaultDatasourceName(String name
){
70 this.defaultDatasourceName
= name
;
76 public Map
<String
, DataSourceInfo
> updateDataSources() {
78 logger
.info("loading & testing datasources .. ");
79 Map
<String
,SimpleDriverDataSource
> dataSources
= loadDataSources();
80 Map
<String
, DataSourceInfo
> dataSourceInfos
= testDataSources(dataSources
);
82 setTargetDataSources((Map
)dataSources
);
83 DataSource defaultDatasource
= dataSources
.get(defaultDatasourceName
);
84 if(defaultDatasource
== null) {
85 logger
.error("Defaultdatasource '" +defaultDatasourceName
+ "' not found.");
87 setDefaultTargetDataSource(defaultDatasource
);
88 super.afterPropertiesSet();
90 return dataSourceInfos
;
93 protected Map
<String
, SimpleDriverDataSource
> loadDataSources(){
94 return DataSourceBeanLoader
.loadDataSources(SimpleDriverDataSource
.class);
101 protected Map
<String
, DataSourceInfo
> testDataSources(Map
<String
, SimpleDriverDataSource
> dataSources
) {
103 Map
<String
, DataSourceInfo
> dataSourceInfos
= new HashMap
<String
, DataSourceInfo
>();
105 for(String key
: dataSources
.keySet()){
106 SimpleDriverDataSource datasource
= dataSources
.get(key
);
107 DataSourceInfo dsi
= new DataSourceInfo(datasource
);
108 Connection connection
= null;
109 String sqlerror
= null;
111 connection
= datasource
.getConnection();
113 } catch (SQLException e
) {
114 sqlerror
= e
.getMessage() + "["+ e
.getSQLState() + "]";
115 dsi
.getProblems().add(sqlerror
);
116 if(connection
!= null){
117 try {connection
.close();} catch (SQLException e1
) { /* IGNORE */ }
120 logger
.info(" /" + key
+ " => "+ datasource
.getUrl() + "[ "+(sqlerror
== null ?
"OK" : "ERROR: " + sqlerror
) + " ]");
121 dataSourceInfos
.put(key
, dsi
);
124 return dataSourceInfos
;