Merge branch 'release/4.6.0'
[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<>();
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 }