Project

General

Profile

Download (11 KB) Statistics
| Branch: | Tag: | Revision:
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

    
34
import eu.etaxonomy.taxeditor.model.MementoHelper;
35
import eu.etaxonomy.taxeditor.model.MessagingUtils;
36
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
37
import eu.etaxonomy.taxeditor.remoting.source.CdmPersistentRemoteSource;
38
import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSourceException;
39
import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
40
import eu.etaxonomy.taxeditor.store.CdmStore;
41
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
42
public class CdmDataSourceRepository{
43

    
44
	/** Constant <code>TAG_DATASOURCE="tagDataSource"</code> */
45
	public static final String TAG_DATASOURCE = "tagDataSource";
46
	private static final String CURRENT_DATASOURCE = "currentDataSource";
47
	private static final String CURRENT_DATASOURCE_POSTFIX = "currentDataSourcePostFix";
48
	private static final String DEFAULT_DATASOURCE_STATE_FILENAME = "datasource.xml";
49

    
50
	private static final String DEFAULT_DATASOURCE_NAME = "cdm";
51
	private static final String DEFAULT_DATASOURCE_POSTFIX = CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX;
52

    
53
	private static ICdmSource currentCdmSource;
54
	private static IMemento memento;
55

    
56
	private static String lastUsedCdmSourceName;
57
	private static String lastUsedCdmSourcePostFix;
58

    
59

    
60

    
61
	/**
62
	 * <p>Getter for the field <code>lastUsedDataSourceName</code>.</p>
63
	 *
64
	 * @return a {@link java.lang.String} object.
65
	 */
66
	public static void updateLastUsedDataSource(){
67
		if(lastUsedCdmSourceName == null){
68
			memento = readMemento();
69
			lastUsedCdmSourceName = memento != null ? memento.getString(CURRENT_DATASOURCE) : DEFAULT_DATASOURCE_NAME;
70
			lastUsedCdmSourcePostFix = memento != null ? memento.getString(CURRENT_DATASOURCE_POSTFIX) : DEFAULT_DATASOURCE_POSTFIX;
71

    
72
		}
73

    
74
	}
75

    
76
	/**
77
	 * <p>delete</p>
78
	 *
79
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
80
	 * @return a boolean.
81
	 */
82
	public static boolean delete(ICdmPersistentSource cdmPersistentSource) {
83
		CdmPersistentSourceUtils.delete(cdmPersistentSource);
84
		return true;
85
	}
86

    
87

    
88
	/**
89
	 * <p>getAll</p>
90
	 *
91
	 * @return a {@link java.util.List} object.
92
	 */
93
	public static List<ICdmSource> getAll() {
94
		List<ICdmSource> remoteSources = new ArrayList<ICdmSource>();
95

    
96
		for(ICdmDataSource dataSource : CdmPersistentDataSource.getAllDataSources()){
97
			try {
98
				remoteSources.add(CdmPersistentDataSource.NewInstance(dataSource.getName()));
99
			} catch (DataSourceNotFoundException e) {
100
				MessagingUtils.error(CdmDataSourceRepository.class, "Could not find dataSource", e);
101
			}
102
		}
103

    
104
		try {
105
			for(ICdmRemoteSource remoteSource : CdmPersistentRemoteSource.getAllRemoteSources()){
106
				remoteSources.add(remoteSource);
107
			}
108
		} catch (CdmRemoteSourceException e) {
109
			MessagingUtils.error(CdmDataSourceRepository.class, "Error retrieving remote sources", e);
110
		}
111

    
112
		// TODO sort by database name
113

    
114
		return remoteSources;
115
	}
116

    
117
	/**
118
	 * <p>getDataSource</p>
119
	 *
120
	 * @param name a {@link java.lang.String} object.
121
	 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
122
	 */
123
	public static ICdmDataSource getDataSource(String name){
124

    
125
		for(ICdmDataSource dataSource : CdmPersistentDataSource.getAllDataSources()){
126
			try {
127
				if(dataSource.getName().equals(name)){
128
					return CdmPersistentDataSource.NewInstance(dataSource.getName());
129
				}
130
			} catch (DataSourceNotFoundException e) {
131
				MessagingUtils.error(CdmDataSourceRepository.class, "Could not find dataSource", e);
132
			}
133
		}
134

    
135
		return null;
136
	}
137

    
138

    
139
	/**
140
	 * <p>Getter for the field <code>currentDataSource</code>.</p>
141
	 *
142
	 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
143
	 * @throws CdmRemoteSourceException
144
	 */
145
	public static ICdmSource getCurrentCdmSource() throws CdmRemoteSourceException {
146

    
147
		if (currentCdmSource == null) {
148
			updateLastUsedDataSource();
149

    
150
			if(lastUsedCdmSourceName == null) {
151
				return null;
152
			}
153
			// for post fix = null , source is by default a data source
154
			if(lastUsedCdmSourcePostFix == null || lastUsedCdmSourcePostFix.equals(CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX)) {
155
				try {
156
					currentCdmSource = CdmPersistentDataSource.NewInstance(lastUsedCdmSourceName);
157
				} catch (DataSourceNotFoundException e) {
158
					// fallback creates a new default
159
					setCurrentCdmSource(createDefaultH2DataSource());
160
				}
161
			} else if (lastUsedCdmSourcePostFix.equals(CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX)) {
162
				currentCdmSource = CdmPersistentRemoteSource.NewInstance(lastUsedCdmSourceName);
163
			} else {
164
				throw new CdmRemoteSourceException("Unkown Cdm Source Type");
165
			}
166
		}
167
		return currentCdmSource;
168
	}
169

    
170
	/**
171
	 * Creates a default H2 CDM Data Source
172
	 *
173
	 * @return the newly created data source
174
	 */
175
	public static ICdmDataSource createDefaultH2DataSource() {
176
	    ICdmDataSource h2DataSource = CdmDataSource.NewH2EmbeddedInstance(
177
                DEFAULT_DATASOURCE_NAME, "sa", "", PreferencesUtil.getPreferredNomenclaturalCode());
178
        save(h2DataSource.getName(), h2DataSource);
179
        return h2DataSource;
180
	}
181

    
182
	/**
183
	 * <p>Setter for the field <code>currentDataSource</code>.</p>
184
	 *
185
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
186
	 * @return a boolean.
187
	 */
188
	public static boolean setCurrentCdmSource(ICdmSource cdmSource) {
189
		currentCdmSource = cdmSource;
190
		NomenclaturalCode dataSourceNomenclaturalCode = cdmSource.getNomenclaturalCode();
191
		NomenclaturalCode applicationNomenclaturalCode = PreferencesUtil.getPreferredNomenclaturalCode();
192

    
193
		if( dataSourceNomenclaturalCode != null && ! dataSourceNomenclaturalCode.equals(applicationNomenclaturalCode)){
194
			PreferencesUtil.setPreferredNomenclaturalCode(dataSourceNomenclaturalCode);
195
			MessagingUtils.informationDialog("Nomenclatural Code Change", "The Datasource that was just " +
196
					"loaded has a different nomenclatural code than the one stored in Preferences. " +
197
					"The nomenclatural code was changed in the application.");
198
		}
199
		return true;
200
	}
201

    
202
	/**
203
	 * <p>changeDataSource</p>
204
	 *
205
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
206
	 * @return a boolean.
207
	 */
208
	public static boolean changeDataSource(final ICdmSource cdmSource) {
209
		saveAsCurrentDatabaseToMemento(cdmSource);
210
		CdmStore.connect(cdmSource);
211

    
212
		return true;
213
	}
214

    
215
	/**
216
	 * <p>save</p>
217
	 *
218
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
219
	 * @param strDataSourceName a {@link java.lang.String} object.
220
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
221
	 * @throws CdmRemoteSourceException
222
	 */
223
	public static ICdmPersistentSource save(String strCdmSourceName, ICdmRemoteSource cdmSource) throws CdmRemoteSourceException {
224
		return CdmPersistentRemoteSource.save(strCdmSourceName, cdmSource);
225
	}
226

    
227
	/**
228
	 * <p>save</p>
229
	 *
230
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
231
	 * @param strDataSourceName a {@link java.lang.String} object.
232
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
233
	 * @throws CdmRemoteSourceException
234
	 */
235
	public static ICdmPersistentSource save(String strCdmSourceName, ICdmDataSource cdmSource)  {
236
		return CdmPersistentDataSource.save(strCdmSourceName, cdmSource);
237
	}
238

    
239
	/**
240
	 * <p>update</p>
241
	 *
242
	 * @param strDataSourceName a {@link java.lang.String} object.
243
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
244
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
245
	 */
246
	public static ICdmPersistentSource update(String strCdmSourceName, ICdmDataSource cdmSource){
247
		try {
248
			return CdmPersistentDataSource.update(strCdmSourceName, cdmSource);
249
		} catch (Exception e) {
250
			MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
251
		}
252
		return null;
253
	}
254

    
255
	public static ICdmPersistentSource replace(String strCdmSourceName, ICdmDataSource cdmSource){
256
		try {
257
			return CdmPersistentDataSource.replace(strCdmSourceName, cdmSource);
258
		} catch (Exception e) {
259
			MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
260
		}
261
		return null;
262
	}
263

    
264
	/**
265
	 * <p>update</p>
266
	 *
267
	 * @param strDataSourceName a {@link java.lang.String} object.
268
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
269
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
270
	 */
271
	public static ICdmPersistentSource update(String strCdmSourceName, ICdmRemoteSource cdmSource){
272
		try {
273
			return CdmPersistentRemoteSource.update(strCdmSourceName, cdmSource);
274
		} catch (Exception e) {
275
			MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
276

    
277
		}
278
		return null;
279
	}
280

    
281
	/*********************************************************
282
	 * Memento Handling										 *
283
	 *********************************************************/
284

    
285
	private static void saveAsCurrentDatabaseToMemento(ICdmSource cdmSource){
286
		if(memento == null) {
287
			memento = readMemento();
288
		}
289
		memento.putString(CURRENT_DATASOURCE, cdmSource.getName());
290

    
291
		// Set postfix to distinguish between data and remote sources
292
		if(cdmSource instanceof CdmPersistentRemoteSource) {
293
			memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX);
294
		} else {
295
			memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX);
296
		}
297

    
298

    
299
		saveMementoToFile(memento);
300
	}
301

    
302
	/*
303
	 * Answer the workbench state file.
304
	 */
305
	private static File getCdmSourceStateFile() {
306
		IPath path = TaxeditorStorePlugin.getDefault().getStateLocation();
307
		if (path == null) {
308
			return null;
309
		}
310
		path = path.append(DEFAULT_DATASOURCE_STATE_FILENAME);
311
		return path.toFile();
312
	}
313

    
314
	private static IMemento readMemento(){
315
		try {
316
			return MementoHelper.readMementoFromFile(getCdmSourceStateFile());
317
		} catch (FileNotFoundException e) {
318
			return initializeMemento();
319
		}
320
	}
321

    
322

    
323
	private static IMemento initializeMemento() {
324

    
325
		XMLMemento memento = XMLMemento.createWriteRoot(TAG_DATASOURCE);
326
		memento.putString(CURRENT_DATASOURCE, DEFAULT_DATASOURCE_NAME);
327
		saveMementoToFile(memento);
328

    
329
		return readMemento();
330
	}
331

    
332
	/*
333
	 * Save the workbench UI in a persistence file.
334
	 */
335
	private static IMemento saveMementoToFile(IMemento memento) {
336
		return MementoHelper.saveMementoToFile(memento, getCdmSourceStateFile());
337
	}
338
}
    (1-1/1)