minor
[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.model.name.NomenclaturalCode;
26
27 /**
28 * @author a.mueller
29 *
30 */
31 public class CdmDataSource extends CdmDataSourceBase {
32 @SuppressWarnings("unused")
33 private static final Logger logger = Logger.getLogger(CdmDataSource.class);
34
35 private DatabaseTypeEnum dbType;
36 private String server;
37 private String database;
38 private int port = -1;
39 private String username;
40 private String password;
41 private NomenclaturalCode nomenclaturalCode;
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 boolean registerSearchListener = false;
53 private Class<? extends CacheProvider> cacheProviderClass = NoCacheProvider.class;
54
55 static NomenclaturalCode code = null;
56
57 public static CdmDataSource NewInstance(DatabaseTypeEnum dbType, String server, String database, String username, String password){
58 return new CdmDataSource(dbType, server, database, -1, username, password, null, null, null);
59 }
60
61 public static CdmDataSource NewInstance(DatabaseTypeEnum dbType, String server, String database, int port, String username, String password){
62 return new CdmDataSource(dbType, server, database, port, username, password, null, null, null);
63 }
64
65 public static CdmDataSource NewInstance(DatabaseTypeEnum dbType, String server, String database, String username, String password , NomenclaturalCode code){
66 return new CdmDataSource(dbType, server, database, -1, username, password, null, null, code);
67 }
68
69 public static CdmDataSource NewInstance(DatabaseTypeEnum dbType, String server, String database, int port, String username, String password , NomenclaturalCode code){
70 return new CdmDataSource(dbType, server, database, port, username, password, null, null, code);
71 }
72
73
74 static public CdmDataSource NewMySqlInstance(String server, String database, String username, String password ){
75 return new CdmDataSource(DatabaseTypeEnum.MySQL, server, database, -1, username, password, null, null, null);
76 }
77
78 static public CdmDataSource NewMySqlInstance(String server, String database, String username, String password , NomenclaturalCode code){
79 return new CdmDataSource(DatabaseTypeEnum.MySQL, server, database, -1, username, password, null, null, code);
80 }
81
82 static public CdmDataSource NewMySqlInstance(String server, String database, int port, String username, String password, NomenclaturalCode code){
83 return new CdmDataSource(DatabaseTypeEnum.MySQL, server, database, port, username, password, null, null, code);
84 }
85
86 static public CdmDataSource NewSqlServer2005Instance(String server, String database, String username, String password, NomenclaturalCode code){
87 return new CdmDataSource(DatabaseTypeEnum.SqlServer2005, server, database, -1, username, password, null, null, code);
88 }
89
90 static public CdmDataSource NewSqlServer2005Instance(String server, String database, int port, String username, String password /*, NomenclaturalCode code*/){
91 return new CdmDataSource(DatabaseTypeEnum.SqlServer2005, server, database, port, username, password, null, null, code);
92 }
93
94
95 /** in work
96 * @param code TODO*/
97 static public CdmDataSource NewH2EmbeddedInstance(String database, String username, String password){
98 return NewH2EmbeddedInstance(database, username, password, null, null);
99 }
100
101 /** in work
102 * @param code TODO*/
103 static public CdmDataSource NewH2EmbeddedInstance(String database, String username, String password, NomenclaturalCode code){
104 return NewH2EmbeddedInstance(database, username, password, null, code);
105 }
106
107 /** in work
108 * @param code TODO*/
109 static public CdmDataSource NewH2EmbeddedInstance(String database, String username, String password, String filePath, NomenclaturalCode code){
110 //FIXME in work
111 int port = -1;
112 H2Mode mode = H2Mode.EMBEDDED;
113 CdmDataSource dataSource = new CdmDataSource(DatabaseTypeEnum.H2, null, database, port, username, password, null, mode, code);
114 return dataSource;
115 }
116
117 /** in work */
118 static public CdmDataSource NewH2InMemoryInstance(){
119 //FIXME in work
120 int port = -1;
121 H2Mode mode = H2Mode.IN_MEMORY;
122 String username = "sa";
123 String password = "";
124 CdmDataSource dataSource = new CdmDataSource(DatabaseTypeEnum.H2, null, null, port, username, password, null, mode, null);
125 return dataSource;
126 }
127
128
129 /**
130 * @param server
131 * @param database
132 * @param port
133 */
134 protected CdmDataSource(DatabaseTypeEnum dbType, String server, String database, int port, String username, String password, String filePath, H2Mode mode, NomenclaturalCode code) {
135 super();
136 this.dbType = dbType;
137 this.server = server;
138 this.database = database;
139 this.port = port;
140 this.username = username;
141 this.password = password;
142 this.initMethodName = dbType.getInitMethod();
143 this.destroyMethodName = dbType.getDestroyMethod();
144 this.filePath = filePath;
145 this.mode = mode;
146 this.nomenclaturalCode = code;
147 }
148
149
150 /* (non-Javadoc)
151 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getName()
152 * A CdmDataSource does not have a name representation therefor the database name is returned
153 */
154 public String getName() {
155 return database;
156 }
157
158 /* (non-Javadoc)
159 * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getDatasourceBean()
160 */
161 @SuppressWarnings("unchecked")
162 public BeanDefinition getDatasourceBean(){
163 AbstractBeanDefinition bd = new RootBeanDefinition(dbType.getDriverManagerDataSourceClass());
164 //attributes
165 bd.setLazyInit(isLazy);
166 if (! CdmUtils.Nz(initMethodName).trim().equals("") ){
167 bd.setInitMethodName(initMethodName);
168 }
169 if (! CdmUtils.Nz(destroyMethodName).trim().equals("") ){
170 bd.setInitMethodName(destroyMethodName);
171 }
172
173 //properties
174 MutablePropertyValues props = new MutablePropertyValues();
175 Properties persistentProperties = getDatasourceProperties();
176 Enumeration<String> keys = (Enumeration)persistentProperties.keys();
177 while (keys.hasMoreElements()){
178 String key = (String)keys.nextElement();
179 props.addPropertyValue(key, persistentProperties.getProperty(key));
180 }
181
182 bd.setPropertyValues(props);
183 return bd;
184 }
185
186 /**
187 * Returns the list of properties that are defined in the datasource
188 * @return
189 */
190 private Properties getDatasourceProperties(){
191 Properties result = new Properties();
192 result.put("driverClassName", dbType.getDriverClassName());
193 String connectionString = dbType.getConnectionString(this);
194 result.put("url", connectionString);
195 result.put("username", username);
196 result.put("password", password);
197 return result;
198 }
199
200
201 /* (non-Javadoc)
202 * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getHibernatePropertiesBean(eu.etaxonomy.cdm.database.CdmPersistentDataSource.HBM2DDL)
203 */
204 public BeanDefinition getHibernatePropertiesBean(DbSchemaValidation hbm2dll){
205 boolean showSql = false;
206 boolean formatSql = false;
207 boolean registerSearchListener = false;
208 Class<? extends CacheProvider> cacheProviderClass = NoCacheProvider.class;
209 return getHibernatePropertiesBean(hbm2dll, showSql, formatSql, registerSearchListener, cacheProviderClass);
210 }
211
212 /* (non-Javadoc)
213 * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getHibernatePropertiesBean(eu.etaxonomy.cdm.database.CdmPersistentDataSource.HBM2DDL, java.lang.Boolean, java.lang.Boolean, java.lang.Class)
214 */
215 public BeanDefinition getHibernatePropertiesBean(DbSchemaValidation hbm2dll, Boolean showSql, Boolean formatSql, Boolean registerSearchListener, Class<? extends CacheProvider> cacheProviderClass){
216 //Hibernate default values
217 if (hbm2dll == null){
218 hbm2dll = this.hbm2dll;
219 }
220 if (showSql == null){
221 showSql = this.showSql;
222 }
223 if (formatSql == null){
224 formatSql = this.formatSql;
225 }
226 if (cacheProviderClass == null){
227 cacheProviderClass = this.cacheProviderClass;
228 }
229 if(registerSearchListener == null){
230 registerSearchListener = this.registerSearchListener;
231 }
232
233 DatabaseTypeEnum dbtype = dbType;
234 AbstractBeanDefinition bd = new RootBeanDefinition(PropertiesFactoryBean.class);
235 MutablePropertyValues hibernateProps = new MutablePropertyValues();
236
237 Properties props = new Properties();
238 props.setProperty("hibernate.hbm2ddl.auto", hbm2dll.toString());
239 props.setProperty("hibernate.dialect", dbtype.getHibernateDialect());
240 props.setProperty("hibernate.cache.provider_class", cacheProviderClass.getName());
241 props.setProperty("hibernate.show_sql", String.valueOf(showSql));
242 props.setProperty("hibernate.format_sql", String.valueOf(formatSql));
243 props.setProperty("hibernate.search.autoregister_listeners", String.valueOf(registerSearchListener));
244
245 hibernateProps.addPropertyValue("properties",props);
246 bd.setPropertyValues(hibernateProps);
247 return bd;
248 }
249
250 public String getInitMethodName() {
251 return initMethodName;
252 }
253
254 public void setInitMethodName(String initMethodName) {
255 this.initMethodName = initMethodName;
256 }
257
258 public String getDestroyMethodName() {
259 return destroyMethodName;
260 }
261
262 public void setDestroyMethodName(String destroyMethodName) {
263 this.destroyMethodName = destroyMethodName;
264 }
265
266 public String getDatabase() {
267 return database;
268 }
269
270 public DatabaseTypeEnum getDatabaseType() {
271 return dbType;
272 }
273
274 public String getFilePath() {
275 return filePath;
276 }
277
278
279 public int getPort() {
280 return port;
281 }
282
283 public String getServer() {
284 return server;
285 }
286
287 public H2Mode getMode() {
288 return mode;
289 }
290
291 /* (non-Javadoc)
292 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getPassword()
293 */
294 public String getPassword() {
295 return password;
296 }
297
298 /* (non-Javadoc)
299 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getUserName()
300 */
301 public String getUsername() {
302 return username;
303 }
304
305 /* (non-Javadoc)
306 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getNomenclaturalCode()
307 */
308 public NomenclaturalCode getNomenclaturalCode() {
309 return nomenclaturalCode;
310 }
311 }
312