Project

General

Profile

Download (10.8 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.cdm.remote.CdmPersistentRemoteSource;
34
import eu.etaxonomy.cdm.remote.CdmRemoteSourceException;
35
import eu.etaxonomy.cdm.remote.ICdmRemoteSource;
36
import eu.etaxonomy.taxeditor.model.MementoHelper;
37
import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
38
import eu.etaxonomy.taxeditor.store.CdmStore;
39
import eu.etaxonomy.taxeditor.store.StoreUtil;
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
				StoreUtil.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
			StoreUtil.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
				StoreUtil.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
					ICdmDataSource h2DataSource = CdmDataSource.NewH2EmbeddedInstance(
159
							DEFAULT_DATASOURCE_NAME, "sa", "", PreferencesUtil.getPreferredNomenclaturalCode());
160
					save(h2DataSource.getName(), h2DataSource);
161
					setCurrentCdmSource(h2DataSource);
162
				}
163
			} else if (lastUsedCdmSourcePostFix.equals(CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX)) {				
164
				currentCdmSource = CdmPersistentRemoteSource.NewInstance(lastUsedCdmSourceName);
165
			} else {
166
				throw new CdmRemoteSourceException("Unkown Cdm Source Type");
167
			}
168
		}
169
		return currentCdmSource;
170
	}
171
	
172
	/**
173
	 * <p>Setter for the field <code>currentDataSource</code>.</p>
174
	 *
175
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
176
	 * @return a boolean.
177
	 */
178
	public static boolean setCurrentCdmSource(ICdmSource cdmSource) {
179
		currentCdmSource = cdmSource;
180
		NomenclaturalCode dataSourceNomenclaturalCode = cdmSource.getNomenclaturalCode();
181
		NomenclaturalCode applicationNomenclaturalCode = PreferencesUtil.getPreferredNomenclaturalCode();
182
		
183
		if( dataSourceNomenclaturalCode != null && ! dataSourceNomenclaturalCode.equals(applicationNomenclaturalCode)){
184
			PreferencesUtil.setPreferredNomenclaturalCode(dataSourceNomenclaturalCode);
185
			StoreUtil.informationDialog("Nomenclatural Code Change", "The Datasource that was just " +
186
					"loaded has a different nomenclatural code than the one stored in Preferences. " +
187
					"The nomenclatural code was changed in the application.");
188
		}
189
		return true;
190
	}	
191
		
192
	/**
193
	 * <p>changeDataSource</p>
194
	 *
195
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
196
	 * @return a boolean.
197
	 */
198
	public static boolean changeDataSource(final ICdmSource cdmSource) {
199
		saveAsCurrentDatabaseToMemento(cdmSource);		
200
		CdmStore.connect(cdmSource);
201
		
202
		return true;
203
	}
204

    
205
	/**
206
	 * <p>save</p>
207
	 *
208
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
209
	 * @param strDataSourceName a {@link java.lang.String} object.
210
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
211
	 * @throws CdmRemoteSourceException 
212
	 */
213
	public static ICdmPersistentSource save(String strCdmSourceName, ICdmRemoteSource cdmSource) throws CdmRemoteSourceException {
214
		return CdmPersistentRemoteSource.save(strCdmSourceName, cdmSource);		
215
	}
216
	
217
	/**
218
	 * <p>save</p>
219
	 *
220
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
221
	 * @param strDataSourceName a {@link java.lang.String} object.
222
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
223
	 * @throws CdmRemoteSourceException 
224
	 */
225
	public static ICdmPersistentSource save(String strCdmSourceName, ICdmDataSource cdmSource)  {		
226
		return CdmPersistentDataSource.save(strCdmSourceName, cdmSource);				
227
	}
228
	
229
	/**
230
	 * <p>update</p>
231
	 *
232
	 * @param strDataSourceName a {@link java.lang.String} object.
233
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
234
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
235
	 */
236
	public static ICdmPersistentSource update(String strCdmSourceName, ICdmDataSource cdmSource){
237
		try {
238
			return CdmPersistentDataSource.update(strCdmSourceName, cdmSource);
239
		} catch (Exception e) {
240
			StoreUtil.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
241
		}
242
		return null;
243
	}
244
	
245
	public static ICdmPersistentSource replace(String strCdmSourceName, ICdmDataSource cdmSource){
246
		try {
247
			return CdmPersistentDataSource.replace(strCdmSourceName, cdmSource);
248
		} catch (Exception e) {
249
			StoreUtil.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
250
		}
251
		return null;
252
	}
253
	
254
	/**
255
	 * <p>update</p>
256
	 *
257
	 * @param strDataSourceName a {@link java.lang.String} object.
258
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
259
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
260
	 */
261
	public static ICdmPersistentSource update(String strCdmSourceName, ICdmRemoteSource cdmSource){
262
		try {
263
			return CdmPersistentRemoteSource.update(strCdmSourceName, cdmSource);	
264
		} catch (Exception e) {
265
			StoreUtil.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
266
			
267
		}
268
		return null;
269
	}
270
	
271
	/*********************************************************
272
	 * Memento Handling										 *
273
	 *********************************************************/
274
	
275
	private static void saveAsCurrentDatabaseToMemento(ICdmSource cdmSource){
276
		if(memento == null) {
277
			memento = readMemento();
278
		}
279
		memento.putString(CURRENT_DATASOURCE, cdmSource.getName());
280
		
281
		// Set postfix to distinguish between data and remote sources
282
		if(cdmSource instanceof CdmPersistentRemoteSource) {
283
			memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX);
284
		} else {
285
			memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX);
286
		}
287
		
288
		
289
		saveMementoToFile(memento);
290
	}
291
	
292
	/*
293
	 * Answer the workbench state file.
294
	 */
295
	private static File getCdmSourceStateFile() {
296
		IPath path = TaxeditorStorePlugin.getDefault().getStateLocation();
297
		if (path == null) {
298
			return null;
299
		}
300
		path = path.append(DEFAULT_DATASOURCE_STATE_FILENAME);
301
		return path.toFile();
302
	}
303
	
304
	private static IMemento readMemento(){
305
		try {
306
			return MementoHelper.readMementoFromFile(getCdmSourceStateFile());
307
		} catch (FileNotFoundException e) {
308
			return initializeMemento();
309
		}
310
	}
311
	
312

    
313
	private static IMemento initializeMemento() {
314
		
315
		XMLMemento memento = XMLMemento.createWriteRoot(TAG_DATASOURCE);
316
		memento.putString(CURRENT_DATASOURCE, DEFAULT_DATASOURCE_NAME);
317
		saveMementoToFile(memento);
318
		
319
		return readMemento();
320
	}
321

    
322
	/*
323
	 * Save the workbench UI in a persistence file.
324
	 */
325
	private static IMemento saveMementoToFile(IMemento memento) {
326
		return MementoHelper.saveMementoToFile(memento, getCdmSourceStateFile());
327
	}	
328
}
    (1-1/1)