Project

General

Profile

Download (10 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 DEFAULT_DATASOURCE_STATE_FILENAME = "datasource.xml";
47
	private static final String DEFAULT_DATASOURCE_NAME = "cdm";
48
	
49
	private static ICdmSource currentCdmSource;
50
	private static IMemento memento;
51
	private static String lastUsedDataSourceName;
52
	
53
	/**
54
	 * <p>Getter for the field <code>lastUsedDataSourceName</code>.</p>
55
	 *
56
	 * @return a {@link java.lang.String} object.
57
	 */
58
	public static String getLastUsedDataSourceName(){
59
		if(lastUsedDataSourceName == null){
60
			memento = readMemento();		
61
			lastUsedDataSourceName = memento != null ? memento.getString(CURRENT_DATASOURCE) : DEFAULT_DATASOURCE_NAME;
62
		}
63
		return lastUsedDataSourceName;
64
	}
65

    
66
	/**
67
	 * <p>delete</p>
68
	 *
69
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
70
	 * @return a boolean.
71
	 */
72
	public static boolean delete(ICdmPersistentSource cdmPersistentSource) {
73
		CdmPersistentSourceUtils.delete(cdmPersistentSource);
74
		return true;
75
	}
76

    
77
	
78
	/**
79
	 * <p>getAll</p>
80
	 *
81
	 * @return a {@link java.util.List} object.
82
	 */
83
	public static List<ICdmSource> getAll() {
84
		List<ICdmSource> remoteSources = new ArrayList<ICdmSource>();
85
		
86
		for(ICdmDataSource dataSource : CdmPersistentDataSource.getAllDataSources()){
87
			try {
88
				remoteSources.add(CdmPersistentDataSource.NewInstance(dataSource.getName()));
89
			} catch (DataSourceNotFoundException e) {
90
				StoreUtil.error(CdmDataSourceRepository.class, "Could not find dataSource", e);
91
			}
92
		}
93
		
94
		try {
95
			for(ICdmRemoteSource remoteSource : CdmPersistentRemoteSource.getAllRemoteSources()){			
96
				remoteSources.add(remoteSource);
97
			}
98
		} catch (CdmRemoteSourceException e) {
99
			StoreUtil.error(CdmDataSourceRepository.class, "Error retrieving remote sources", e);
100
		}
101
		
102
		// TODO sort by database name
103
		
104
		return remoteSources;
105
	}
106
	
107
	/**
108
	 * <p>getDataSource</p>
109
	 *
110
	 * @param name a {@link java.lang.String} object.
111
	 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
112
	 */
113
	public static ICdmDataSource getDataSource(String name){
114
		
115
		for(ICdmDataSource dataSource : CdmPersistentDataSource.getAllDataSources()){
116
			try {
117
				if(dataSource.getName().equals(name)){
118
					return CdmPersistentDataSource.NewInstance(dataSource.getName());
119
				}
120
			} catch (DataSourceNotFoundException e) {
121
				StoreUtil.error(CdmDataSourceRepository.class, "Could not find dataSource", e);
122
			}
123
		}
124
		
125
		return null;
126
	}
127
	
128
		
129
	/**
130
	 * <p>Getter for the field <code>currentDataSource</code>.</p>
131
	 *
132
	 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
133
	 * @throws CdmRemoteSourceException 
134
	 */
135
	public static ICdmSource getCurrentCdmSource() throws CdmRemoteSourceException {
136
		
137
		if (currentCdmSource == null) {
138
			String lastUsedCdmSourceName = getLastUsedDataSourceName();
139
			if(lastUsedCdmSourceName.endsWith(CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX)) {
140
				try {
141
					currentCdmSource = CdmPersistentDataSource.NewInstance(lastUsedCdmSourceName);
142
				} catch (DataSourceNotFoundException e) {
143
					// fallback creates a new default
144
					ICdmDataSource h2DataSource = CdmDataSource.NewH2EmbeddedInstance(
145
							DEFAULT_DATASOURCE_NAME, "sa", "", PreferencesUtil.getPreferredNomenclaturalCode());
146
					save(h2DataSource.getName(), h2DataSource);
147
					setCurrentCdmSource(h2DataSource);
148
				}
149
			} else if (lastUsedCdmSourceName.endsWith(CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX)) {				
150
				currentCdmSource = CdmPersistentRemoteSource.NewInstance(lastUsedCdmSourceName);
151
			} else {
152
				throw new CdmRemoteSourceException("Unkown Cdm Source Type");
153
			}
154
		}
155
		return currentCdmSource;
156
	}
157
	
158
	/**
159
	 * <p>Setter for the field <code>currentDataSource</code>.</p>
160
	 *
161
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
162
	 * @return a boolean.
163
	 */
164
	public static boolean setCurrentCdmSource(ICdmSource cdmSource) {
165
		currentCdmSource = cdmSource;
166
		NomenclaturalCode dataSourceNomenclaturalCode = cdmSource.getNomenclaturalCode();
167
		NomenclaturalCode applicationNomenclaturalCode = PreferencesUtil.getPreferredNomenclaturalCode();
168
		
169
		if( dataSourceNomenclaturalCode != null && ! dataSourceNomenclaturalCode.equals(applicationNomenclaturalCode)){
170
			PreferencesUtil.setPreferredNomenclaturalCode(dataSourceNomenclaturalCode);
171
			StoreUtil.informationDialog("Nomenclatural Code Change", "The Datasource that was just " +
172
					"loaded has a different nomenclatural code than the one stored in Preferences. " +
173
					"The nomenclatural code was changed in the application.");
174
		}
175
		return true;
176
	}	
177
		
178
	/**
179
	 * <p>changeDataSource</p>
180
	 *
181
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
182
	 * @return a boolean.
183
	 */
184
	public static boolean changeDataSource(final ICdmSource cdmSource) {
185
		saveAsCurrentDatabaseToMemento(cdmSource);		
186
		CdmStore.connect(cdmSource);
187
		
188
		return true;
189
	}
190

    
191
	/**
192
	 * <p>save</p>
193
	 *
194
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
195
	 * @param strDataSourceName a {@link java.lang.String} object.
196
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
197
	 * @throws CdmRemoteSourceException 
198
	 */
199
	public static ICdmPersistentSource save(String strCdmSourceName, ICdmRemoteSource cdmSource) throws CdmRemoteSourceException {
200
		return CdmPersistentRemoteSource.save(strCdmSourceName, cdmSource);		
201
	}
202
	
203
	/**
204
	 * <p>save</p>
205
	 *
206
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
207
	 * @param strDataSourceName a {@link java.lang.String} object.
208
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
209
	 * @throws CdmRemoteSourceException 
210
	 */
211
	public static ICdmPersistentSource save(String strCdmSourceName, ICdmDataSource cdmSource)  {		
212
		return CdmPersistentDataSource.save(strCdmSourceName, cdmSource);				
213
	}
214
	
215
	/**
216
	 * <p>update</p>
217
	 *
218
	 * @param strDataSourceName a {@link java.lang.String} object.
219
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
220
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
221
	 */
222
	public static ICdmPersistentSource update(String strCdmSourceName, ICdmDataSource cdmSource){
223
		try {
224
			return CdmPersistentDataSource.update(strCdmSourceName, cdmSource);
225
		} catch (Exception e) {
226
			StoreUtil.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
227
		}
228
		return null;
229
	}
230
	
231
	public static ICdmPersistentSource replace(String strCdmSourceName, ICdmDataSource cdmSource){
232
		try {
233
			return CdmPersistentDataSource.replace(strCdmSourceName, cdmSource);
234
		} catch (Exception e) {
235
			StoreUtil.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
236
		}
237
		return null;
238
	}
239
	
240
	/**
241
	 * <p>update</p>
242
	 *
243
	 * @param strDataSourceName a {@link java.lang.String} object.
244
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
245
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
246
	 */
247
	public static ICdmPersistentSource update(String strCdmSourceName, ICdmRemoteSource cdmSource){
248
		try {
249
			return CdmPersistentRemoteSource.update(strCdmSourceName, cdmSource);	
250
		} catch (Exception e) {
251
			StoreUtil.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
252
			
253
		}
254
		return null;
255
	}
256
	
257
	/*********************************************************
258
	 * Memento Handling										 *
259
	 *********************************************************/
260
	
261
	private static void saveAsCurrentDatabaseToMemento(ICdmSource cdmSource){
262
		if(memento == null)
263
			memento = readMemento();
264
		memento.putString(CURRENT_DATASOURCE, cdmSource.getName());
265
		saveMementoToFile(memento);
266
	}
267
	
268
	/*
269
	 * Answer the workbench state file.
270
	 */
271
	private static File getCdmSourceStateFile() {
272
		IPath path = TaxeditorStorePlugin.getDefault().getStateLocation();
273
		if (path == null) {
274
			return null;
275
		}
276
		path = path.append(DEFAULT_DATASOURCE_STATE_FILENAME);
277
		return path.toFile();
278
	}
279
	
280
	private static IMemento readMemento(){
281
		try {
282
			return MementoHelper.readMementoFromFile(getCdmSourceStateFile());
283
		} catch (FileNotFoundException e) {
284
			return initializeMemento();
285
		}
286
	}
287
	
288

    
289
	private static IMemento initializeMemento() {
290
		
291
		XMLMemento memento = XMLMemento.createWriteRoot(TAG_DATASOURCE);
292
		memento.putString(CURRENT_DATASOURCE, DEFAULT_DATASOURCE_NAME);
293
		saveMementoToFile(memento);
294
		
295
		return readMemento();
296
	}
297

    
298
	/*
299
	 * Save the workbench UI in a persistence file.
300
	 */
301
	private static IMemento saveMementoToFile(IMemento memento) {
302
		return MementoHelper.saveMementoToFile(memento, getCdmSourceStateFile());
303
	}	
304
}
    (1-1/1)