Refactored service layer to reflect changes in search methods lower down, and moved...
[cdmlib.git] / cdmlib-services / src / main / java / eu / etaxonomy / cdm / api / service / DatabaseServiceHibernateImpl.java
1 // $Id$
2 /**
3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
6 *
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
9 */
10
11 package eu.etaxonomy.cdm.api.service;
12
13 import org.apache.log4j.Logger;
14 import org.hibernate.SessionFactory;
15 import org.springframework.beans.BeansException;
16 import org.springframework.beans.factory.annotation.Autowired;
17 import org.springframework.context.ApplicationContext;
18 import org.springframework.context.ApplicationContextAware;
19 import org.springframework.jdbc.datasource.AbstractDriverBasedDataSource;
20 import org.springframework.orm.hibernate3.SessionFactoryUtils;
21 import org.springframework.stereotype.Service;
22 import org.springframework.transaction.annotation.Propagation;
23 import org.springframework.transaction.annotation.Transactional;
24
25 import eu.etaxonomy.cdm.api.application.CdmApplicationController;
26 import eu.etaxonomy.cdm.database.CdmDataSource;
27 import eu.etaxonomy.cdm.database.CdmPersistentDataSource;
28 import eu.etaxonomy.cdm.database.DataSourceNotFoundException;
29 import eu.etaxonomy.cdm.database.DatabaseTypeEnum;
30 import eu.etaxonomy.cdm.database.H2Mode;
31 import eu.etaxonomy.cdm.database.ICdmDataSource;
32 import eu.etaxonomy.cdm.model.common.init.TermNotFoundException;
33 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
34
35
36
37 /**
38 * @author a.mueller
39 *
40 */
41 @Service
42 @Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
43 public class DatabaseServiceHibernateImpl implements IDatabaseService, ApplicationContextAware {
44 private static final Logger logger = Logger.getLogger(DatabaseServiceHibernateImpl.class);
45
46 private static final String TMP_DATASOURCE = "tmp";
47
48 @Autowired
49 private SessionFactory factory;
50
51 @Autowired
52 protected ApplicationContext appContext;
53
54 private CdmApplicationController application;
55 public void setApplicationController(CdmApplicationController cdmApplicationController){
56 this.application = cdmApplicationController;
57 }
58
59
60 /* (non-Javadoc)
61 * @see eu.etaxonomy.cdm.api.service.IDatabaseService#connectToDatasource(eu.etaxonomy.cdm.database.CdmDataSource)
62 */
63 public boolean connectToDatasource(CdmPersistentDataSource dataSource) throws TermNotFoundException{
64 this.application.changeDataSource(dataSource);
65 logger.debug("DataSource changed to " + dataSource.getName());
66 return true;
67 }
68
69 /* (non-Javadoc)
70 * @see eu.etaxonomy.cdm.api.service.IDatabaseService#connectToDatabase(eu.etaxonomy.cdm.database.DatabaseTypeEnum, java.lang.String, java.lang.String, java.lang.String, java.lang.String, int)
71 */
72 public boolean connectToDatabase(DatabaseTypeEnum databaseTypeEnum, String server,
73 String database, String username, String password, int port, String filePath, H2Mode mode, NomenclaturalCode code) throws TermNotFoundException {
74 ICdmDataSource dataSource = CdmDataSource.NewInstance(databaseTypeEnum, server, database, port, username, password, code);
75 CdmPersistentDataSource tmpDataSource = saveDataSource(TMP_DATASOURCE, dataSource);
76 boolean result = connectToDatasource(tmpDataSource);
77 CdmPersistentDataSource.delete(tmpDataSource);
78 return result;
79 }
80
81
82 /* (non-Javadoc)
83 * @see eu.etaxonomy.cdm.api.service.IDatabaseService#connectToDatabase(eu.etaxonomy.cdm.database.DatabaseTypeEnum, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
84 */
85 public boolean connectToDatabase(DatabaseTypeEnum databaseTypeEnum, String server,
86 String database, String username, String password) throws TermNotFoundException {
87 return connectToDatabase(databaseTypeEnum, server, database, username, password, databaseTypeEnum.getDefaultPort(), null, null, null) ;
88 }
89
90 /* (non-Javadoc)
91 * @see eu.etaxonomy.cdm.api.service.IDatabaseService#saveDataSource(java.lang.String, eu.etaxonomy.cdm.database.ICdmDataSource)
92 */
93 public CdmPersistentDataSource saveDataSource(String strDataSourceName,
94 ICdmDataSource dataSource) {
95 return CdmPersistentDataSource.save(strDataSourceName, dataSource);
96 }
97
98 /* (non-Javadoc)
99 * @see eu.etaxonomy.cdm.api.service.IDatabaseService#updateDataSource(java.lang.String, eu.etaxonomy.cdm.database.CdmPersistentDataSource)
100 */
101 public CdmPersistentDataSource updateDataSource(String strDataSourceName,
102 CdmPersistentDataSource dataSource) throws DataSourceNotFoundException {
103 return CdmPersistentDataSource.update(strDataSourceName, dataSource);
104 }
105
106
107 //TODO removed 04.02.2009 as spring 2.5.6 does not support DriverManagerDataSource.getDriverClassName anymore
108 //Let's see if this is not needed by any other application
109 // /* (non-Javadoc)
110 // * @see eu.etaxonomy.cdm.api.service.IDatabaseService#getDatabaseTypeName()
111 // */
112 // public DatabaseTypeEnum getDatabaseEnum() {
113 // return DatabaseTypeEnum.getDatabaseEnumByDriverClass(getDataSource().getDriverClassName());
114 // }
115 //
116 // /* (non-Javadoc)
117 // * @see eu.etaxonomy.cdm.api.service.IDatabaseService#getDriverClassName()
118 // */
119 // public String getDriverClassName() {
120 // return ( getDataSource()).getDriverClassName();
121 // }
122
123 /* (non-Javadoc)
124 * @see eu.etaxonomy.cdm.api.service.IDatabaseService#getUrl()
125 */
126 public String getUrl() {
127 return getDataSource().getUrl();
128 }
129
130 /* (non-Javadoc)
131 * @see eu.etaxonomy.cdm.api.service.IDatabaseService#getUsername()
132 */
133 public String getUsername() {
134 return getDataSource().getUsername();
135 }
136
137 // returns the AbstractDriverBasedDataSource from hibernate
138 // (generalized in order to also allow using SimpleDriverDataSource)
139 private AbstractDriverBasedDataSource getDataSource(){
140 AbstractDriverBasedDataSource ds = (AbstractDriverBasedDataSource)SessionFactoryUtils.getDataSource(factory);
141 return ds;
142 }
143
144
145 public void setApplicationContext(ApplicationContext applicationContext)
146 throws BeansException {
147 this.appContext = applicationContext;
148 }
149 }