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
.sql
.SQLFeatureNotSupportedException
;
15 import java
.util
.HashMap
;
17 import java
.util
.logging
.Logger
;
19 import javax
.sql
.DataSource
;
21 import org
.springframework
.jdbc
.datasource
.SimpleDriverDataSource
;
22 import org
.springframework
.jdbc
.datasource
.lookup
.AbstractRoutingDataSource
;
26 * A simple RoutingDataSource.
27 * Bean definitions must set the key of the default datasource to "default"
28 * This String is defined in the contant <code>DEFAULT_DATASOURCE_KEY</code> and will
29 * be used when the RoutingDataSource is beeing updated with a new <code>Map</code>
32 * <b>Example of bean definition:</b>
34 <bean id="dataSource" lazy-init="true" class="eu.etaxonomy.cdm.remote.service.BasepathRoutingDataSource">
35 <property name="targetDataSources">
36 <map key-type="java.lang.String">
37 <entry key="default" value-ref="defaultDataSource"/>
40 <property name="defaultTargetDataSource" ref="defaultDataSource"/>
44 * @author a.kohlbecker
45 * @deprecated<b>NOTICE:</b>
46 * <em>This class is related to the switchable database infrastructure which allows to serve
47 * multiple databases with only a single instance of the cdm-remote-webapp.
48 * This concept however is deprecated due to several problems of which the most severe is the term loading issue.
49 * This class should however not deleted since we once might wish to switch back to this concept when we are
50 * able to deal with the implicated issues.
52 * See http://dev.e-taxonomy.eu/trac/wiki/CdmServerSwitchableDataSources for more information.</em>
55 public class UpdatableRoutingDataSource
extends AbstractRoutingDataSource
{
58 private String defaultDatasourceName
= "default";
61 protected Object
determineCurrentLookupKey() {
62 return NamedContextHolder
.getContextKey();
66 public void afterPropertiesSet() {
68 // super.afterPropertiesSet() is called by updateRoutingDataSource()
71 public void setDefaultDatasourceName(String name
){
72 this.defaultDatasourceName
= name
;
78 public Map
<String
, DataSourceInfo
> updateDataSources() {
80 logger
.info("loading & testing datasources .. ");
81 Map
<String
,SimpleDriverDataSource
> dataSources
= loadDataSources();
82 Map
<String
, DataSourceInfo
> dataSourceInfos
= testDataSources(dataSources
);
84 setTargetDataSources((Map
)dataSources
);
85 DataSource defaultDatasource
= dataSources
.get(defaultDatasourceName
);
86 if(defaultDatasource
== null) {
87 logger
.error("Defaultdatasource '" +defaultDatasourceName
+ "' not found.");
89 setDefaultTargetDataSource(defaultDatasource
);
90 super.afterPropertiesSet();
92 return dataSourceInfos
;
95 protected Map
<String
, SimpleDriverDataSource
> loadDataSources(){
96 return DataSourceBeanLoader
.loadDataSources(SimpleDriverDataSource
.class);
103 protected Map
<String
, DataSourceInfo
> testDataSources(Map
<String
, SimpleDriverDataSource
> dataSources
) {
105 Map
<String
, DataSourceInfo
> dataSourceInfos
= new HashMap
<String
, DataSourceInfo
>();
107 for(String key
: dataSources
.keySet()){
108 SimpleDriverDataSource datasource
= dataSources
.get(key
);
109 DataSourceInfo dsi
= new DataSourceInfo(datasource
);
110 Connection connection
= null;
111 String sqlerror
= null;
113 connection
= datasource
.getConnection();
115 } catch (SQLException e
) {
116 sqlerror
= e
.getMessage() + "["+ e
.getSQLState() + "]";
117 dsi
.getProblems().add(sqlerror
);
118 if(connection
!= null){
119 try {connection
.close();} catch (SQLException e1
) { /* IGNORE */ }
122 logger
.info(" /" + key
+ " => "+ datasource
.getUrl() + "[ "+(sqlerror
== null ?
"OK" : "ERROR: " + sqlerror
) + " ]");
123 dataSourceInfos
.put(key
, dsi
);
126 return dataSourceInfos
;
129 // added for compatibility with Java 7
130 public Logger
getParentLogger() /* throws SQLFeatureNotSupportedException (is not compatibel with parent class in Java 6)*/ {
131 // TODO Auto-generated method stub