Project

General

Profile

Download (10.6 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2007 EDIT
3
 * European Distributed Institute of Taxonomy
4
 * http://www.e-taxonomy.eu
5
 *
6
 * The contents of this file are subject to the Mozilla Public License Version 1.1
7
 * See LICENSE.TXT at the top of this package for the full license terms.
8
 *
9
 * @author n.hoffmann
10
 */
11
package eu.etaxonomy.taxeditor.datasource;
12

    
13
import java.io.File;
14
import java.io.FileNotFoundException;
15
import java.util.ArrayList;
16
import java.util.List;
17

    
18
import org.eclipse.core.runtime.IPath;
19
import org.eclipse.ui.IMemento;
20
import org.eclipse.ui.XMLMemento;
21

    
22
import eu.etaxonomy.cdm.config.CdmPersistentSourceUtils;
23
import eu.etaxonomy.cdm.config.ICdmPersistentSource;
24
import eu.etaxonomy.cdm.config.ICdmSource;
25
import eu.etaxonomy.cdm.database.CdmDataSource;
26
import eu.etaxonomy.cdm.database.CdmPersistentDataSource;
27
import eu.etaxonomy.cdm.database.DataSourceNotFoundException;
28
import eu.etaxonomy.cdm.database.ICdmDataSource;
29
import eu.etaxonomy.taxeditor.model.MementoHelper;
30
import eu.etaxonomy.taxeditor.model.MessagingUtils;
31
import eu.etaxonomy.taxeditor.remoting.source.CdmPersistentRemoteSource;
32
import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSource;
33
import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSourceException;
34
import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
35
import eu.etaxonomy.taxeditor.store.CdmStore;
36
import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
37

    
38
public class CdmDataSourceRepository{
39

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

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

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

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

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

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

    
79
	/**
80
	 * <p>getAll</p>
81
	 *
82
	 * @return a {@link java.util.List} object.
83
	 */
84
	public static List<ICdmSource> getAll() {
85
		List<ICdmSource> remoteSources = new ArrayList<>();
86

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

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

    
109
		// TODO sort by database name
110

    
111
		return remoteSources;
112
	}
113

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

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

    
132
		return null;
133
	}
134

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

    
143
		if (currentCdmSource == null) {
144
			updateLastUsedDataSource();
145

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

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

    
178
	/**
179
	 * <p>Setter for the field <code>currentDataSource</code>.</p>
180
	 *
181
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
182
	 * @return a boolean.
183
	 */
184
	public static boolean setCurrentCdmSource(ICdmSource cdmSource) {
185
		currentCdmSource = cdmSource;
186
		return true;
187
	}
188

    
189
	/**
190
	 * <p>changeDataSource</p>
191
	 *
192
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
193
	 * @return a boolean.
194
	 */
195
	public static boolean changeDataSource(final ICdmSource cdmSource) {
196
		saveAsCurrentDatabaseToMemento(cdmSource);
197
		CdmStore.connect(cdmSource);
198

    
199
		return true;
200
	}
201
//
202
//	/**
203
//	 * <p>save</p>
204
//	 *
205
//	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
206
//	 * @param strDataSourceName a {@link java.lang.String} object.
207
//	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
208
//	 * @throws CdmRemoteSourceException
209
//	 */
210
//	public static ICdmPersistentSource save(String strCdmSourceName, ICdmRemoteSource cdmSource) throws CdmRemoteSourceException {
211
//		return CdmPersistentRemoteSource.save(strCdmSourceName, cdmSource);
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, ICdmDataSource cdmSource)  {
223
		return CdmPersistentDataSource.save(strCdmSourceName, cdmSource);
224
	}
225

    
226
	/**
227
	 * <p>update</p>
228
	 *
229
	 * @param strDataSourceName a {@link java.lang.String} object.
230
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
231
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
232
	 */
233
	public static ICdmPersistentSource update(String strCdmSourceName, ICdmDataSource cdmSource){
234
		try {
235
			return CdmPersistentDataSource.update(strCdmSourceName, cdmSource);
236
		} catch (Exception e) {
237
			MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
238
		}
239
		return null;
240
	}
241

    
242
	public static ICdmPersistentSource replace(String strCdmSourceName, ICdmDataSource cdmSource){
243
		try {
244
			return CdmPersistentDataSource.replace(strCdmSourceName, cdmSource);
245
		} catch (Exception e) {
246
			MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
247
		}
248
		return null;
249
	}
250

    
251
	/**
252
	 * <p>update</p>
253
	 *
254
	 * @param strDataSourceName a {@link java.lang.String} object.
255
	 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
256
	 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
257
	 */
258
	public static ICdmPersistentSource update(String strCdmSourceName, CdmRemoteSource cdmSource){
259
		try {
260
			return CdmPersistentRemoteSource.update(strCdmSourceName, cdmSource);
261
		} catch (Exception e) {
262
			MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
263

    
264
		}
265
		return null;
266
	}
267

    
268
	/*********************************************************
269
	 * Memento Handling										 *
270
	 *********************************************************/
271

    
272
	private static void saveAsCurrentDatabaseToMemento(ICdmSource cdmSource){
273
		if(memento == null) {
274
			memento = readMemento();
275
		}
276
		memento.putString(CURRENT_DATASOURCE, cdmSource.getName());
277

    
278
		// Set postfix to distinguish between data and remote sources
279
		if(cdmSource instanceof CdmPersistentRemoteSource) {
280
			memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX);
281
		} else {
282
			memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX);
283
		}
284

    
285

    
286
		saveMementoToFile(memento);
287
	}
288

    
289
	/*
290
	 * Answer the workbench state file.
291
	 */
292
	private static File getCdmSourceStateFile() {
293
		IPath path = TaxeditorStorePlugin.getDefault().getStateLocation();
294
		if (path == null) {
295
			return null;
296
		}
297
		path = path.append(DEFAULT_DATASOURCE_STATE_FILENAME);
298
		return path.toFile();
299
	}
300

    
301
	private static IMemento readMemento(){
302
		try {
303
			return MementoHelper.readMementoFromFile(getCdmSourceStateFile());
304
		} catch (FileNotFoundException e) {
305
			return initializeMemento();
306
		}
307
	}
308

    
309
	private static IMemento initializeMemento() {
310

    
311
		XMLMemento memento = XMLMemento.createWriteRoot(TAG_DATASOURCE);
312
		memento.putString(CURRENT_DATASOURCE, DEFAULT_DATASOURCE_NAME);
313
		saveMementoToFile(memento);
314

    
315
		return readMemento();
316
	}
317

    
318
	/*
319
	 * Save the workbench UI in a persistence file.
320
	 */
321
	private static IMemento saveMementoToFile(IMemento memento) {
322
		return MementoHelper.saveMementoToFile(memento, getCdmSourceStateFile());
323
	}
324
}
    (1-1/1)