ref #3658 remove nomenclatural code from datasources
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / datasource / CdmDataSourceRepository.java
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<ICdmSource>();
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 /**
137 * <p>Getter for the field <code>currentDataSource</code>.</p>
138 *
139 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
140 * @throws CdmRemoteSourceException
141 */
142 public static ICdmSource getCurrentCdmSource() throws CdmRemoteSourceException {
143
144 if (currentCdmSource == null) {
145 updateLastUsedDataSource();
146
147 if(lastUsedCdmSourceName == null) {
148 return null;
149 }
150 // for post fix = null , source is by default a data source
151 if(lastUsedCdmSourcePostFix == null || lastUsedCdmSourcePostFix.equals(CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX)) {
152 try {
153 currentCdmSource = CdmPersistentDataSource.NewInstance(lastUsedCdmSourceName);
154 } catch (DataSourceNotFoundException e) {
155 // fallback creates a new default
156 setCurrentCdmSource(createDefaultH2DataSource());
157 }
158 } else if (lastUsedCdmSourcePostFix.equals(CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX)) {
159 currentCdmSource = CdmPersistentRemoteSource.NewInstance(lastUsedCdmSourceName);
160 } else {
161 throw new CdmRemoteSourceException("Unkown Cdm Source Type");
162 }
163 }
164 return currentCdmSource;
165 }
166
167 /**
168 * Creates a default H2 CDM Data Source
169 *
170 * @return the newly created data source
171 */
172 public static ICdmDataSource createDefaultH2DataSource() {
173 ICdmDataSource h2DataSource = CdmDataSource.NewH2EmbeddedInstance(
174 DEFAULT_DATASOURCE_NAME, "sa", "");
175 save(h2DataSource.getName(), h2DataSource);
176 return h2DataSource;
177 }
178
179 /**
180 * <p>Setter for the field <code>currentDataSource</code>.</p>
181 *
182 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
183 * @return a boolean.
184 */
185 public static boolean setCurrentCdmSource(ICdmSource cdmSource) {
186 currentCdmSource = cdmSource;
187 // NomenclaturalCode dataSourceNomenclaturalCode = cdmSource.getNomenclaturalCode();
188 // NomenclaturalCode applicationNomenclaturalCode = PreferencesUtil.getPreferredNomenclaturalCode(true);
189 //
190 // if( dataSourceNomenclaturalCode != null && ! dataSourceNomenclaturalCode.equals(applicationNomenclaturalCode)){
191 // PreferencesUtil.setPreferredNomenclaturalCode(dataSourceNomenclaturalCode, true);
192 // MessagingUtils.informationDialog("Nomenclatural Code Change", "The Datasource that was just " +
193 // "loaded has a different nomenclatural code than the one stored in Preferences. " +
194 // "The nomenclatural code was changed in the application.");
195 // }
196 return true;
197 }
198
199 /**
200 * <p>changeDataSource</p>
201 *
202 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
203 * @return a boolean.
204 */
205 public static boolean changeDataSource(final ICdmSource cdmSource) {
206 saveAsCurrentDatabaseToMemento(cdmSource);
207 CdmStore.connect(cdmSource);
208
209 return true;
210 }
211
212 /**
213 * <p>save</p>
214 *
215 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
216 * @param strDataSourceName a {@link java.lang.String} object.
217 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
218 * @throws CdmRemoteSourceException
219 */
220 public static ICdmPersistentSource save(String strCdmSourceName, ICdmRemoteSource cdmSource) throws CdmRemoteSourceException {
221 return CdmPersistentRemoteSource.save(strCdmSourceName, cdmSource);
222 }
223
224 /**
225 * <p>save</p>
226 *
227 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
228 * @param strDataSourceName a {@link java.lang.String} object.
229 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
230 * @throws CdmRemoteSourceException
231 */
232 public static ICdmPersistentSource save(String strCdmSourceName, ICdmDataSource cdmSource) {
233 return CdmPersistentDataSource.save(strCdmSourceName, cdmSource);
234 }
235
236 /**
237 * <p>update</p>
238 *
239 * @param strDataSourceName a {@link java.lang.String} object.
240 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
241 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
242 */
243 public static ICdmPersistentSource update(String strCdmSourceName, ICdmDataSource cdmSource){
244 try {
245 return CdmPersistentDataSource.update(strCdmSourceName, cdmSource);
246 } catch (Exception e) {
247 MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
248 }
249 return null;
250 }
251
252 public static ICdmPersistentSource replace(String strCdmSourceName, ICdmDataSource cdmSource){
253 try {
254 return CdmPersistentDataSource.replace(strCdmSourceName, cdmSource);
255 } catch (Exception e) {
256 MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
257 }
258 return null;
259 }
260
261 /**
262 * <p>update</p>
263 *
264 * @param strDataSourceName a {@link java.lang.String} object.
265 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
266 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
267 */
268 public static ICdmPersistentSource update(String strCdmSourceName, ICdmRemoteSource cdmSource){
269 try {
270 return CdmPersistentRemoteSource.update(strCdmSourceName, cdmSource);
271 } catch (Exception e) {
272 MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
273
274 }
275 return null;
276 }
277
278 /*********************************************************
279 * Memento Handling *
280 *********************************************************/
281
282 private static void saveAsCurrentDatabaseToMemento(ICdmSource cdmSource){
283 if(memento == null) {
284 memento = readMemento();
285 }
286 memento.putString(CURRENT_DATASOURCE, cdmSource.getName());
287
288 // Set postfix to distinguish between data and remote sources
289 if(cdmSource instanceof CdmPersistentRemoteSource) {
290 memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX);
291 } else {
292 memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX);
293 }
294
295
296 saveMementoToFile(memento);
297 }
298
299 /*
300 * Answer the workbench state file.
301 */
302 private static File getCdmSourceStateFile() {
303 IPath path = TaxeditorStorePlugin.getDefault().getStateLocation();
304 if (path == null) {
305 return null;
306 }
307 path = path.append(DEFAULT_DATASOURCE_STATE_FILENAME);
308 return path.toFile();
309 }
310
311 private static IMemento readMemento(){
312 try {
313 return MementoHelper.readMementoFromFile(getCdmSourceStateFile());
314 } catch (FileNotFoundException e) {
315 return initializeMemento();
316 }
317 }
318
319
320 private static IMemento initializeMemento() {
321
322 XMLMemento memento = XMLMemento.createWriteRoot(TAG_DATASOURCE);
323 memento.putString(CURRENT_DATASOURCE, DEFAULT_DATASOURCE_NAME);
324 saveMementoToFile(memento);
325
326 return readMemento();
327 }
328
329 /*
330 * Save the workbench UI in a persistence file.
331 */
332 private static IMemento saveMementoToFile(IMemento memento) {
333 return MementoHelper.saveMementoToFile(memento, getCdmSourceStateFile());
334 }
335 }