Project

General

Profile

Download (11.2 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.taxeditor.model.MementoHelper;
33
import eu.etaxonomy.taxeditor.model.MessagingUtils;
34
import eu.etaxonomy.taxeditor.remoting.source.CdmPersistentRemoteSource;
35
import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSourceException;
36
import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
37
import eu.etaxonomy.taxeditor.store.CdmStore;
38
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
39
public class CdmDataSourceRepository{
40

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

    
47
	private static final String DEFAULT_DATASOURCE_NAME = "cdm";
48
	private static final String DEFAULT_DATASOURCE_POSTFIX = CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX;
49

    
50
	private static ICdmSource currentCdmSource;
51
	private static IMemento memento;
52

    
53
	private static String lastUsedCdmSourceName;
54
	private static String lastUsedCdmSourcePostFix;
55

    
56

    
57

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

    
69
		}
70

    
71
	}
72

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

    
84

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

    
93
		if (CdmPersistentDataSource.getAllDataSources() == null){
94
			MessagingUtils.errorDialog("Could not read root element", CdmPersistentDataSource.class,
95
					"Could not read element in datasources.xml in .cdmLibrary folder. Maybe your datasources.xml file is broken.", 
96
					TaxeditorStorePlugin.PLUGIN_ID, null, true);
97
			return remoteSources;
98
		}
99
		for(ICdmDataSource dataSource : CdmPersistentDataSource.getAllDataSources()){
100
			try {
101
				remoteSources.add(CdmPersistentDataSource.NewInstance(dataSource.getName()));
102
			} catch (DataSourceNotFoundException e) {
103
				MessagingUtils.error(CdmDataSourceRepository.class, "Could not find dataSource", e);
104
			}
105
		}
106

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

    
115
		// TODO sort by database name
116

    
117
		return remoteSources;
118
	}
119

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

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

    
138
		return null;
139
	}
140

    
141

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

    
150
		if (currentCdmSource == null) {
151
			updateLastUsedDataSource();
152

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

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

    
185
	/**
186
	 * <p>Setter for the field <code>currentDataSource</code>.</p>
187
	 *
188
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
189
	 * @return a boolean.
190
	 */
191
	public static boolean setCurrentCdmSource(ICdmSource cdmSource) {
192
		currentCdmSource = cdmSource;
193
//		NomenclaturalCode dataSourceNomenclaturalCode = cdmSource.getNomenclaturalCode();
194
//		NomenclaturalCode applicationNomenclaturalCode = PreferencesUtil.getPreferredNomenclaturalCode(true);
195
//
196
//		if( dataSourceNomenclaturalCode != null && ! dataSourceNomenclaturalCode.equals(applicationNomenclaturalCode)){
197
//			PreferencesUtil.setPreferredNomenclaturalCode(dataSourceNomenclaturalCode, true);
198
//			MessagingUtils.informationDialog("Nomenclatural Code Change", "The Datasource that was just " +
199
//					"loaded has a different nomenclatural code than the one stored in Preferences. " +
200
//					"The nomenclatural code was changed in the application.");
201
//		}
202
		return true;
203
	}
204

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

    
215
		return true;
216
	}
217

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

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

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

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

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

    
280
		}
281
		return null;
282
	}
283

    
284
	/*********************************************************
285
	 * Memento Handling										 *
286
	 *********************************************************/
287

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

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

    
301

    
302
		saveMementoToFile(memento);
303
	}
304

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

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

    
325

    
326
	private static IMemento initializeMemento() {
327

    
328
		XMLMemento memento = XMLMemento.createWriteRoot(TAG_DATASOURCE);
329
		memento.putString(CURRENT_DATASOURCE, DEFAULT_DATASOURCE_NAME);
330
		saveMementoToFile(memento);
331

    
332
		return readMemento();
333
	}
334

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