Merge branch 'release/5.17.0'
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / datasource / CdmDataSourceRepository.java
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 }