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
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
}
    (1-1/1)