53f077581ec4e9189d82ea9e4b8a5b00aef19438
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / datasource / CdmDataSourceRepository.java
1
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 * @author n.hoffmann
11 * @version $Id: $
12 */
13
14 package eu.etaxonomy.taxeditor.datasource;
15
16 import java.io.File;
17 import java.io.FileNotFoundException;
18 import java.util.ArrayList;
19 import java.util.List;
20
21 import org.eclipse.core.runtime.IPath;
22 import org.eclipse.ui.IMemento;
23 import org.eclipse.ui.XMLMemento;
24
25 import eu.etaxonomy.cdm.config.CdmPersistentSourceUtils;
26 import eu.etaxonomy.cdm.config.ICdmPersistentSource;
27 import eu.etaxonomy.cdm.config.ICdmSource;
28 import eu.etaxonomy.cdm.database.CdmDataSource;
29 import eu.etaxonomy.cdm.database.CdmPersistentDataSource;
30 import eu.etaxonomy.cdm.database.DataSourceNotFoundException;
31 import eu.etaxonomy.cdm.database.ICdmDataSource;
32 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
33 import eu.etaxonomy.taxeditor.model.MementoHelper;
34 import eu.etaxonomy.taxeditor.model.MessagingUtils;
35 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
36 import eu.etaxonomy.taxeditor.remoting.source.CdmPersistentRemoteSource;
37 import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSourceException;
38 import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
39 import eu.etaxonomy.taxeditor.store.CdmStore;
40 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
41 public class CdmDataSourceRepository{
42
43 /** Constant <code>TAG_DATASOURCE="tagDataSource"</code> */
44 public static final String TAG_DATASOURCE = "tagDataSource";
45 private static final String CURRENT_DATASOURCE = "currentDataSource";
46 private static final String CURRENT_DATASOURCE_POSTFIX = "currentDataSourcePostFix";
47 private static final String DEFAULT_DATASOURCE_STATE_FILENAME = "datasource.xml";
48
49 private static final String DEFAULT_DATASOURCE_NAME = "cdm";
50 private static final String DEFAULT_DATASOURCE_POSTFIX = CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX;
51
52 private static ICdmSource currentCdmSource;
53 private static IMemento memento;
54
55 private static String lastUsedCdmSourceName;
56 private static String lastUsedCdmSourcePostFix;
57
58
59
60 /**
61 * <p>Getter for the field <code>lastUsedDataSourceName</code>.</p>
62 *
63 * @return a {@link java.lang.String} object.
64 */
65 public static void updateLastUsedDataSource(){
66 if(lastUsedCdmSourceName == null){
67 memento = readMemento();
68 lastUsedCdmSourceName = memento != null ? memento.getString(CURRENT_DATASOURCE) : DEFAULT_DATASOURCE_NAME;
69 lastUsedCdmSourcePostFix = memento != null ? memento.getString(CURRENT_DATASOURCE_POSTFIX) : DEFAULT_DATASOURCE_POSTFIX;
70
71 }
72
73 }
74
75 /**
76 * <p>delete</p>
77 *
78 * @param dataSource a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
79 * @return a boolean.
80 */
81 public static boolean delete(ICdmPersistentSource cdmPersistentSource) {
82 CdmPersistentSourceUtils.delete(cdmPersistentSource);
83 return true;
84 }
85
86
87 /**
88 * <p>getAll</p>
89 *
90 * @return a {@link java.util.List} object.
91 */
92 public static List<ICdmSource> getAll() {
93 List<ICdmSource> remoteSources = new ArrayList<ICdmSource>();
94
95 for(ICdmDataSource dataSource : CdmPersistentDataSource.getAllDataSources()){
96 try {
97 remoteSources.add(CdmPersistentDataSource.NewInstance(dataSource.getName()));
98 } catch (DataSourceNotFoundException e) {
99 MessagingUtils.error(CdmDataSourceRepository.class, "Could not find dataSource", e);
100 }
101 }
102
103 try {
104 for(ICdmRemoteSource remoteSource : CdmPersistentRemoteSource.getAllRemoteSources()){
105 remoteSources.add(remoteSource);
106 }
107 } catch (CdmRemoteSourceException e) {
108 MessagingUtils.error(CdmDataSourceRepository.class, "Error retrieving remote sources", e);
109 }
110
111 // TODO sort by database name
112
113 return remoteSources;
114 }
115
116 /**
117 * <p>getDataSource</p>
118 *
119 * @param name a {@link java.lang.String} object.
120 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
121 */
122 public static ICdmDataSource getDataSource(String name){
123
124 for(ICdmDataSource dataSource : CdmPersistentDataSource.getAllDataSources()){
125 try {
126 if(dataSource.getName().equals(name)){
127 return CdmPersistentDataSource.NewInstance(dataSource.getName());
128 }
129 } catch (DataSourceNotFoundException e) {
130 MessagingUtils.error(CdmDataSourceRepository.class, "Could not find dataSource", e);
131 }
132 }
133
134 return null;
135 }
136
137
138 /**
139 * <p>Getter for the field <code>currentDataSource</code>.</p>
140 *
141 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
142 * @throws CdmRemoteSourceException
143 */
144 public static ICdmSource getCurrentCdmSource() throws CdmRemoteSourceException {
145
146 if (currentCdmSource == null) {
147 updateLastUsedDataSource();
148
149 if(lastUsedCdmSourceName == null) {
150 return null;
151 }
152 // for post fix = null , source is by default a data source
153 if(lastUsedCdmSourcePostFix == null || lastUsedCdmSourcePostFix.equals(CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX)) {
154 try {
155 currentCdmSource = CdmPersistentDataSource.NewInstance(lastUsedCdmSourceName);
156 } catch (DataSourceNotFoundException e) {
157 // fallback creates a new default
158 setCurrentCdmSource(createDefaultH2DataSource());
159 }
160 } else if (lastUsedCdmSourcePostFix.equals(CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX)) {
161 currentCdmSource = CdmPersistentRemoteSource.NewInstance(lastUsedCdmSourceName);
162 } else {
163 throw new CdmRemoteSourceException("Unkown Cdm Source Type");
164 }
165 }
166 return currentCdmSource;
167 }
168
169 /**
170 * Creates a default H2 CDM Data Source
171 *
172 * @return the newly created data source
173 */
174 public static ICdmDataSource createDefaultH2DataSource() {
175 ICdmDataSource h2DataSource = CdmDataSource.NewH2EmbeddedInstance(
176 DEFAULT_DATASOURCE_NAME, "sa", "", PreferencesUtil.getPreferredNomenclaturalCode(true));
177 save(h2DataSource.getName(), h2DataSource);
178 return h2DataSource;
179 }
180
181 /**
182 * <p>Setter for the field <code>currentDataSource</code>.</p>
183 *
184 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
185 * @return a boolean.
186 */
187 public static boolean setCurrentCdmSource(ICdmSource cdmSource) {
188 currentCdmSource = cdmSource;
189 NomenclaturalCode dataSourceNomenclaturalCode = cdmSource.getNomenclaturalCode();
190 NomenclaturalCode applicationNomenclaturalCode = PreferencesUtil.getPreferredNomenclaturalCode(true);
191
192 if( dataSourceNomenclaturalCode != null && ! dataSourceNomenclaturalCode.equals(applicationNomenclaturalCode)){
193 PreferencesUtil.setPreferredNomenclaturalCode(dataSourceNomenclaturalCode, true);
194 MessagingUtils.informationDialog("Nomenclatural Code Change", "The Datasource that was just " +
195 "loaded has a different nomenclatural code than the one stored in Preferences. " +
196 "The nomenclatural code was changed in the application.");
197 }
198 return true;
199 }
200
201 /**
202 * <p>changeDataSource</p>
203 *
204 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
205 * @return a boolean.
206 */
207 public static boolean changeDataSource(final ICdmSource cdmSource) {
208 saveAsCurrentDatabaseToMemento(cdmSource);
209 CdmStore.connect(cdmSource);
210
211 return true;
212 }
213
214 /**
215 * <p>save</p>
216 *
217 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
218 * @param strDataSourceName a {@link java.lang.String} object.
219 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
220 * @throws CdmRemoteSourceException
221 */
222 public static ICdmPersistentSource save(String strCdmSourceName, ICdmRemoteSource cdmSource) throws CdmRemoteSourceException {
223 return CdmPersistentRemoteSource.save(strCdmSourceName, cdmSource);
224 }
225
226 /**
227 * <p>save</p>
228 *
229 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
230 * @param strDataSourceName a {@link java.lang.String} object.
231 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
232 * @throws CdmRemoteSourceException
233 */
234 public static ICdmPersistentSource save(String strCdmSourceName, ICdmDataSource cdmSource) {
235 return CdmPersistentDataSource.save(strCdmSourceName, cdmSource);
236 }
237
238 /**
239 * <p>update</p>
240 *
241 * @param strDataSourceName a {@link java.lang.String} object.
242 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
243 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
244 */
245 public static ICdmPersistentSource update(String strCdmSourceName, ICdmDataSource cdmSource){
246 try {
247 return CdmPersistentDataSource.update(strCdmSourceName, cdmSource);
248 } catch (Exception e) {
249 MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
250 }
251 return null;
252 }
253
254 public static ICdmPersistentSource replace(String strCdmSourceName, ICdmDataSource cdmSource){
255 try {
256 return CdmPersistentDataSource.replace(strCdmSourceName, cdmSource);
257 } catch (Exception e) {
258 MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
259 }
260 return null;
261 }
262
263 /**
264 * <p>update</p>
265 *
266 * @param strDataSourceName a {@link java.lang.String} object.
267 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
268 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
269 */
270 public static ICdmPersistentSource update(String strCdmSourceName, ICdmRemoteSource cdmSource){
271 try {
272 return CdmPersistentRemoteSource.update(strCdmSourceName, cdmSource);
273 } catch (Exception e) {
274 MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
275
276 }
277 return null;
278 }
279
280 /*********************************************************
281 * Memento Handling *
282 *********************************************************/
283
284 private static void saveAsCurrentDatabaseToMemento(ICdmSource cdmSource){
285 if(memento == null) {
286 memento = readMemento();
287 }
288 memento.putString(CURRENT_DATASOURCE, cdmSource.getName());
289
290 // Set postfix to distinguish between data and remote sources
291 if(cdmSource instanceof CdmPersistentRemoteSource) {
292 memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX);
293 } else {
294 memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX);
295 }
296
297
298 saveMementoToFile(memento);
299 }
300
301 /*
302 * Answer the workbench state file.
303 */
304 private static File getCdmSourceStateFile() {
305 IPath path = TaxeditorStorePlugin.getDefault().getStateLocation();
306 if (path == null) {
307 return null;
308 }
309 path = path.append(DEFAULT_DATASOURCE_STATE_FILENAME);
310 return path.toFile();
311 }
312
313 private static IMemento readMemento(){
314 try {
315 return MementoHelper.readMementoFromFile(getCdmSourceStateFile());
316 } catch (FileNotFoundException e) {
317 return initializeMemento();
318 }
319 }
320
321
322 private static IMemento initializeMemento() {
323
324 XMLMemento memento = XMLMemento.createWriteRoot(TAG_DATASOURCE);
325 memento.putString(CURRENT_DATASOURCE, DEFAULT_DATASOURCE_NAME);
326 saveMementoToFile(memento);
327
328 return readMemento();
329 }
330
331 /*
332 * Save the workbench UI in a persistence file.
333 */
334 private static IMemento saveMementoToFile(IMemento memento) {
335 return MementoHelper.saveMementoToFile(memento, getCdmSourceStateFile());
336 }
337 }