data sources update and tests
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / database / CdmDataSource.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
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.
8 */
9
10 package eu.etaxonomy.cdm.database;
11
12 import java.util.Enumeration;
13 import java.util.Properties;
14
15 import org.apache.log4j.Logger;
16 import org.hibernate.cache.CacheProvider;
17 import org.hibernate.cache.NoCacheProvider;
18 import org.springframework.beans.MutablePropertyValues;
19 import org.springframework.beans.factory.config.BeanDefinition;
20 import org.springframework.beans.factory.config.PropertiesFactoryBean;
21 import org.springframework.beans.factory.support.AbstractBeanDefinition;
22 import org.springframework.beans.factory.support.RootBeanDefinition;
23
24 import eu.etaxonomy.cdm.common.CdmUtils;
25 import eu.etaxonomy.cdm.database.DatabaseTypeEnum;
26 import eu.etaxonomy.cdm.database.DbSchemaValidation;
27
28 /**
29 * @author a.mueller
30 *
31 */
32 public class CdmDataSource extends CdmDataSourceBase {
33 @SuppressWarnings("unused")
34 private static final Logger logger = Logger.getLogger(CdmDataSource.class);
35
36 private DatabaseTypeEnum dbType;
37 private String server;
38 private String database;
39 private int port = -1;
40 private String username;
41 private String password;
42
43 private String filePath;
44 private H2Mode mode;
45
46 private boolean isLazy = true;
47 private String initMethodName = null;
48 private String destroyMethodName = null;
49 private DbSchemaValidation hbm2dll = DbSchemaValidation.VALIDATE;
50 private boolean showSql = false;
51 private boolean formatSql = false;
52 private Class<? extends CacheProvider> cacheProviderClass = NoCacheProvider.class;;
53
54 static public CdmDataSource NewMySqlInstance(String server, String database, String username, String password){
55 return new CdmDataSource(DatabaseTypeEnum.MySQL, server, database, -1, username, password, null, null);
56 }
57
58 static public CdmDataSource NewMySqlInstance(String server, String database, int port, String username, String password){
59 return new CdmDataSource(DatabaseTypeEnum.MySQL, server, database, port, username, password, null, null);
60 }
61
62 static public CdmDataSource NewSqlServer2005Instance(String server, String database, String username, String password){
63 return new CdmDataSource(DatabaseTypeEnum.SqlServer2005, server, database, -1, username, password, null, null);
64 }
65
66 static public CdmDataSource NewSqlServer2005Instance(String server, String database, int port, String username, String password){
67 return new CdmDataSource(DatabaseTypeEnum.SqlServer2005, server, database, port, username, password, null, null);
68 }
69
70 /** in work */
71 static public CdmDataSource NewH2EmbeddedInstance(String database, String username, String password){
72 //FIXME in work
73 int port = -1;
74 H2Mode mode = H2Mode.EMBEDDED;
75 CdmDataSource dataSource = new CdmDataSource(DatabaseTypeEnum.H2, null, database, port, username, password, null, mode);
76 return dataSource;
77 }
78
79 /** in work */
80 static public CdmDataSource NewH2InMemoryInstance(){
81 //FIXME in work
82 int port = -1;
83 H2Mode mode = H2Mode.IN_MEMORY;
84 String username = "sa";
85 String password = "";
86 CdmDataSource dataSource = new CdmDataSource(DatabaseTypeEnum.H2, null, null, port, username, password, null, mode);
87 return dataSource;
88 }
89
90
91 /**
92 * @param server
93 * @param database
94 * @param port
95 */
96 protected CdmDataSource(DatabaseTypeEnum dbType, String server, String database, int port, String username, String password, String filePath, H2Mode mode) {
97 super();
98 this.dbType = dbType;
99 this.server = server;
100 this.database = database;
101 this.port = port;
102 this.username = username;
103 this.password = password;
104 this.initMethodName = dbType.getInitMethod();
105 this.destroyMethodName = dbType.getDestroyMethod();
106 this.filePath = filePath;
107 this.mode = mode;
108 }
109
110
111 /* (non-Javadoc)
112 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getName()
113 * A CdmDataSource does not have a name representation therefor the database name is returned
114 */
115 public String getName() {
116 return database;
117 }
118
119 /* (non-Javadoc)
120 * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getDatasourceBean()
121 */
122 @SuppressWarnings("unchecked")
123 public BeanDefinition getDatasourceBean(){
124 AbstractBeanDefinition bd = new RootBeanDefinition(dbType.getDriverManagerDataSourceClass());
125 //attributes
126 bd.setLazyInit(isLazy);
127 if (! CdmUtils.Nz(initMethodName).trim().equals("") ){
128 bd.setInitMethodName(initMethodName);
129 }
130 if (! CdmUtils.Nz(destroyMethodName).trim().equals("") ){
131 bd.setInitMethodName(destroyMethodName);
132 }
133
134 //properties
135 MutablePropertyValues props = new MutablePropertyValues();
136 Properties persistentProperties = getDatasourceProperties();
137 Enumeration<String> keys = (Enumeration)persistentProperties.keys();
138 while (keys.hasMoreElements()){
139 String key = (String)keys.nextElement();
140 props.addPropertyValue(key, persistentProperties.getProperty(key));
141 }
142
143 bd.setPropertyValues(props);
144 return bd;
145 }
146
147 /**
148 * Returns the list of properties that are defined in the datasource
149 * @return
150 */
151 private Properties getDatasourceProperties(){
152 Properties result = new Properties();
153 result.put("driverClassName", dbType.getDriverClassName());
154 String connectionString = dbType.getConnectionString(this);
155 result.put("url", connectionString);
156 result.put("username", username);
157 result.put("password", password);
158 return result;
159 }
160
161
162 /* (non-Javadoc)
163 * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getHibernatePropertiesBean(eu.etaxonomy.cdm.database.CdmPersistentDataSource.HBM2DDL)
164 */
165 public BeanDefinition getHibernatePropertiesBean(DbSchemaValidation hbm2dll){
166 boolean showSql = false;
167 boolean formatSql = false;
168 Class<? extends CacheProvider> cacheProviderClass = NoCacheProvider.class;
169 return getHibernatePropertiesBean(hbm2dll, showSql, formatSql, cacheProviderClass);
170 }
171
172 /* (non-Javadoc)
173 * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getHibernatePropertiesBean(eu.etaxonomy.cdm.database.CdmPersistentDataSource.HBM2DDL, java.lang.Boolean, java.lang.Boolean, java.lang.Class)
174 */
175 public BeanDefinition getHibernatePropertiesBean(DbSchemaValidation hbm2dll, Boolean showSql, Boolean formatSql, Class<? extends CacheProvider> cacheProviderClass){
176 //Hibernate default values
177 if (hbm2dll == null){
178 hbm2dll = this.hbm2dll;
179 }
180 if (showSql == null){
181 showSql = this.showSql;
182 }
183 if (formatSql == null){
184 formatSql = this.formatSql;
185 }
186 if (cacheProviderClass == null){
187 cacheProviderClass = this.cacheProviderClass;
188 }
189
190 DatabaseTypeEnum dbtype = dbType;
191 AbstractBeanDefinition bd = new RootBeanDefinition(PropertiesFactoryBean.class);
192 MutablePropertyValues hibernateProps = new MutablePropertyValues();
193
194 Properties props = new Properties();
195 props.setProperty("hibernate.hbm2ddl.auto", hbm2dll.toString());
196 props.setProperty("hibernate.dialect", dbtype.getHibernateDialect());
197 props.setProperty("hibernate.cache.provider_class", cacheProviderClass.getName());
198 props.setProperty("hibernate.show_sql", String.valueOf(showSql));
199 props.setProperty("hibernate.format_sql", String.valueOf(formatSql));
200
201 hibernateProps.addPropertyValue("properties",props);
202 bd.setPropertyValues(hibernateProps);
203 return bd;
204 }
205
206 public String getInitMethodName() {
207 return initMethodName;
208 }
209
210 public void setInitMethodName(String initMethodName) {
211 this.initMethodName = initMethodName;
212 }
213
214 public String getDestroyMethodName() {
215 return destroyMethodName;
216 }
217
218 public void setDestroyMethodName(String destroyMethodName) {
219 this.destroyMethodName = destroyMethodName;
220 }
221
222 public String getDatabase() {
223 return database;
224 }
225
226 public DatabaseTypeEnum getDatabaseType() {
227 return dbType;
228 }
229
230 public String getFilePath() {
231 return filePath;
232 }
233
234
235 public int getPort() {
236 return port;
237 }
238
239 public String getServer() {
240 return server;
241 }
242
243 public H2Mode getMode() {
244 return mode;
245 }
246
247 /* (non-Javadoc)
248 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getPassword()
249 */
250 public String getPassword() {
251 return password;
252 }
253
254 /* (non-Javadoc)
255 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getUserName()
256 */
257 public String getUsername() {
258 return username;
259 }
260
261
262
263
264 }
265