update factory methods for original sources #1549
[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.commons.lang.StringUtils;
16 import org.apache.log4j.Logger;
17 import org.hibernate.cache.internal.NoCachingRegionFactory;
18 import org.hibernate.cache.spi.RegionFactory;
19 import org.hibernate.cfg.Environment;
20 import org.springframework.beans.MutablePropertyValues;
21 import org.springframework.beans.factory.config.BeanDefinition;
22 import org.springframework.beans.factory.config.PropertiesFactoryBean;
23 import org.springframework.beans.factory.support.AbstractBeanDefinition;
24 import org.springframework.beans.factory.support.RootBeanDefinition;
25
26 import eu.etaxonomy.cdm.common.CdmUtils;
27 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
28
29 /**
30 * @author a.mueller
31 *
32 */
33 public class CdmDataSource extends CdmDataSourceBase {
34 @SuppressWarnings("unused")
35 private static final Logger logger = Logger.getLogger(CdmDataSource.class);
36
37 private DatabaseTypeEnum dbType;
38 private String server;
39 private String database;
40 private int port = -1;
41 private String username;
42 private String password;
43 private NomenclaturalCode nomenclaturalCode;
44
45 private String filePath;
46 private H2Mode mode;
47
48 private boolean isLazy = true;
49 private String initMethodName = null;
50 private String destroyMethodName = null;
51 private DbSchemaValidation hbm2dll = DbSchemaValidation.VALIDATE;
52 private boolean showSql = false;
53 private boolean formatSql = false;
54 private boolean registerSearchListener = false;
55 private Class<? extends RegionFactory> cacheProviderClass = NoCachingRegionFactory.class;
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 NewPostgreSQLInstance(String server, String database, int port, String username, String password, NomenclaturalCode code){
87 return new CdmDataSource(DatabaseTypeEnum.PostgreSQL, server, database, port, 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 static public CdmDataSource NewSqlServer2005Instance(String server, String database, int port, String username, String password /*, NomenclaturalCode code*/){
95 return new CdmDataSource(DatabaseTypeEnum.SqlServer2005, server, database, port, username, password, null, null, null);
96 }
97
98
99 /** in work
100 * @param code TODO*/
101 static public CdmDataSource NewH2EmbeddedInstance(String database, String username, String password){
102 return NewH2EmbeddedInstance(database, username, password, null, null);
103 }
104
105 /** in work
106 * @param code TODO*/
107 static public CdmDataSource NewH2EmbeddedInstance(String database, String username, String password, NomenclaturalCode code){
108 return NewH2EmbeddedInstance(database, username, password, null, code);
109 }
110
111 /** in work
112 * @param code TODO*/
113 static public CdmDataSource NewH2EmbeddedInstance(String database, String username, String password, String filePath, NomenclaturalCode code){
114 //FIXME in work
115 int port = -1;
116 H2Mode mode = H2Mode.EMBEDDED;
117 CdmDataSource dataSource = new CdmDataSource(DatabaseTypeEnum.H2, null, database, port, username, password, null, mode, code);
118 return dataSource;
119 }
120
121 /** in work */
122 static public CdmDataSource NewH2InMemoryInstance(){
123 //FIXME in work
124 int port = -1;
125 H2Mode mode = H2Mode.IN_MEMORY;
126 String username = "sa";
127 String password = "";
128 CdmDataSource dataSource = new CdmDataSource(DatabaseTypeEnum.H2, null, null, port, username, password, null, mode, null);
129 return dataSource;
130 }
131
132
133 /**
134 * @param server
135 * @param database
136 * @param port
137 */
138 protected CdmDataSource(DatabaseTypeEnum dbType, String server, String database, int port, String username, String password, String filePath, H2Mode mode, NomenclaturalCode code) {
139 super();
140 this.dbType = dbType;
141 this.server = server;
142 this.database = database;
143 this.port = port;
144 this.username = username;
145 this.password = password;
146 this.initMethodName = dbType.getInitMethod();
147 this.destroyMethodName = dbType.getDestroyMethod();
148 this.filePath = filePath;
149 this.mode = mode;
150 this.nomenclaturalCode = code;
151 }
152
153
154 /* (non-Javadoc)
155 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getName()
156 * A CdmDataSource does not have a name representation therefor the database name is returned
157 */
158 public String getName() {
159 return database;
160 }
161
162 /* (non-Javadoc)
163 * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getDatasourceBean()
164 */
165 public BeanDefinition getDatasourceBean(){
166 AbstractBeanDefinition bd = new RootBeanDefinition(dbType.getDataSourceClass());
167 //attributes
168 bd.setLazyInit(isLazy);
169 if (! CdmUtils.Nz(initMethodName).trim().equals("") ){
170 bd.setInitMethodName(initMethodName);
171 }
172 if (! CdmUtils.Nz(destroyMethodName).trim().equals("") ){
173 bd.setInitMethodName(destroyMethodName);
174 }
175
176 //properties
177 MutablePropertyValues props = new MutablePropertyValues();
178 Properties persistentProperties = getDatasourceProperties();
179 Enumeration<Object> keys = (Enumeration<Object>)persistentProperties.keys();
180 while (keys.hasMoreElements()){
181 String key = (String)keys.nextElement();
182 props.addPropertyValue(key, persistentProperties.getProperty(key));
183 Properties a = Environment.getProperties();
184 }
185
186 bd.setPropertyValues(props);
187 return bd;
188 }
189
190 /**
191 * Returns the list of properties that are defined in the datasource
192 * @return
193 */
194 private Properties getDatasourceProperties(){
195 Properties result = new Properties();
196 result.put("driverClassName", dbType.getDriverClassName());
197 String connectionString = dbType.getConnectionString(this);
198 result.put("url", connectionString);
199 result.put("username", username);
200 result.put("password", password);
201 return result;
202 }
203
204
205 /* (non-Javadoc)
206 * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getHibernatePropertiesBean(eu.etaxonomy.cdm.database.CdmPersistentDataSource.HBM2DDL)
207 */
208 public BeanDefinition getHibernatePropertiesBean(DbSchemaValidation hbm2dll){
209 boolean showSql = false;
210 boolean formatSql = false;
211 boolean registerSearchListener = false;
212 Class<? extends RegionFactory> cacheProviderClass = NoCachingRegionFactory.class;
213 return getHibernatePropertiesBean(hbm2dll, showSql, formatSql, registerSearchListener, cacheProviderClass);
214 }
215
216 /* (non-Javadoc)
217 * @see eu.etaxonomy.cdm.api.application.ICdmDataSource#getHibernatePropertiesBean(eu.etaxonomy.cdm.database.CdmPersistentDataSource.HBM2DDL, java.lang.Boolean, java.lang.Boolean, java.lang.Class)
218 */
219 public BeanDefinition getHibernatePropertiesBean(DbSchemaValidation hbm2dll, Boolean showSql, Boolean formatSql, Boolean registerSearchListener, Class<? extends RegionFactory> cacheProviderClass){
220 //Hibernate default values
221 if (hbm2dll == null){
222 hbm2dll = this.hbm2dll;
223 }
224 if (showSql == null){
225 showSql = this.showSql;
226 }
227 if (formatSql == null){
228 formatSql = this.formatSql;
229 }
230 if (cacheProviderClass == null){
231 cacheProviderClass = this.cacheProviderClass;
232 }
233 if(registerSearchListener == null){
234 registerSearchListener = this.registerSearchListener;
235 }
236
237 DatabaseTypeEnum dbtype = dbType;
238 AbstractBeanDefinition bd = new RootBeanDefinition(PropertiesFactoryBean.class);
239 MutablePropertyValues hibernateProps = new MutablePropertyValues();
240
241 Properties props = new Properties();
242 props.setProperty("hibernate.hbm2ddl.auto", hbm2dll.toString());
243 props.setProperty("hibernate.dialect", dbtype.getHibernateDialect());
244 // OLD:props.setProperty("hibernate.cache.provider_class", cacheProviderClass.getName());
245 props.setProperty("hibernate.cache.region.factory_class", cacheProviderClass.getName());
246 props.setProperty("hibernate.show_sql", String.valueOf(showSql));
247 props.setProperty("hibernate.format_sql", String.valueOf(formatSql));
248 props.setProperty("hibernate.search.autoregister_listeners", String.valueOf(registerSearchListener));
249
250 hibernateProps.addPropertyValue("properties",props);
251 bd.setPropertyValues(hibernateProps);
252 return bd;
253 }
254
255 public String getInitMethodName() {
256 return initMethodName;
257 }
258
259 public void setInitMethodName(String initMethodName) {
260 this.initMethodName = initMethodName;
261 }
262
263 public String getDestroyMethodName() {
264 return destroyMethodName;
265 }
266
267 public void setDestroyMethodName(String destroyMethodName) {
268 this.destroyMethodName = destroyMethodName;
269 }
270
271 public String getDatabase() {
272 return database;
273 }
274
275 public DatabaseTypeEnum getDatabaseType() {
276 return dbType;
277 }
278
279 public String getFilePath() {
280 return filePath;
281 }
282
283
284 public int getPort() {
285 return port;
286 }
287
288 public String getServer() {
289 return server;
290 }
291
292 public H2Mode getMode() {
293 return mode;
294 }
295
296 /* (non-Javadoc)
297 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getPassword()
298 */
299 public String getPassword() {
300 return password;
301 }
302
303 /* (non-Javadoc)
304 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getUserName()
305 */
306 public String getUsername() {
307 return username;
308 }
309
310 /* (non-Javadoc)
311 * @see eu.etaxonomy.cdm.database.ICdmDataSource#getNomenclaturalCode()
312 */
313 public NomenclaturalCode getNomenclaturalCode() {
314 return nomenclaturalCode;
315 }
316
317 @Override
318 public String toString() {
319 if (StringUtils.isBlank(this.database)){
320 return super.toString();
321 }else{
322 String result = "DataSource<" + dbType.getConnectionString(this).replace(CdmUtils.Nz(password), "") + ">";
323 return result;
324 }
325 }
326
327
328
329 }
330