Merge branch 'develop' into remoting-4.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.cdm.model.name.NomenclaturalCode;
33
34 import eu.etaxonomy.taxeditor.model.MementoHelper;
35 import eu.etaxonomy.taxeditor.model.MessagingUtils;
36 import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
37 import eu.etaxonomy.taxeditor.remoting.source.CdmPersistentRemoteSource;
38 import eu.etaxonomy.taxeditor.remoting.source.CdmRemoteSourceException;
39 import eu.etaxonomy.taxeditor.remoting.source.ICdmRemoteSource;
40 import eu.etaxonomy.taxeditor.store.CdmStore;
41 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
42 public class CdmDataSourceRepository{
43
44 /** Constant <code>TAG_DATASOURCE="tagDataSource"</code> */
45 public static final String TAG_DATASOURCE = "tagDataSource";
46 private static final String CURRENT_DATASOURCE = "currentDataSource";
47 private static final String CURRENT_DATASOURCE_POSTFIX = "currentDataSourcePostFix";
48 private static final String DEFAULT_DATASOURCE_STATE_FILENAME = "datasource.xml";
49
50 private static final String DEFAULT_DATASOURCE_NAME = "cdm";
51 private static final String DEFAULT_DATASOURCE_POSTFIX = CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX;
52
53 private static ICdmSource currentCdmSource;
54 private static IMemento memento;
55
56 private static String lastUsedCdmSourceName;
57 private static String lastUsedCdmSourcePostFix;
58
59
60
61 /**
62 * <p>Getter for the field <code>lastUsedDataSourceName</code>.</p>
63 *
64 * @return a {@link java.lang.String} object.
65 */
66 public static void updateLastUsedDataSource(){
67 if(lastUsedCdmSourceName == null){
68 memento = readMemento();
69 lastUsedCdmSourceName = memento != null ? memento.getString(CURRENT_DATASOURCE) : DEFAULT_DATASOURCE_NAME;
70 lastUsedCdmSourcePostFix = memento != null ? memento.getString(CURRENT_DATASOURCE_POSTFIX) : DEFAULT_DATASOURCE_POSTFIX;
71
72 }
73
74 }
75
76 /**
77 * <p>delete</p>
78 *
79 * @param dataSource a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
80 * @return a boolean.
81 */
82 public static boolean delete(ICdmPersistentSource cdmPersistentSource) {
83 CdmPersistentSourceUtils.delete(cdmPersistentSource);
84 return true;
85 }
86
87
88 /**
89 * <p>getAll</p>
90 *
91 * @return a {@link java.util.List} object.
92 */
93 public static List<ICdmSource> getAll() {
94 List<ICdmSource> remoteSources = new ArrayList<ICdmSource>();
95
96 for(ICdmDataSource dataSource : CdmPersistentDataSource.getAllDataSources()){
97 try {
98 remoteSources.add(CdmPersistentDataSource.NewInstance(dataSource.getName()));
99 } catch (DataSourceNotFoundException e) {
100 MessagingUtils.error(CdmDataSourceRepository.class, "Could not find dataSource", e);
101 }
102 }
103
104 try {
105 for(ICdmRemoteSource remoteSource : CdmPersistentRemoteSource.getAllRemoteSources()){
106 remoteSources.add(remoteSource);
107 }
108 } catch (CdmRemoteSourceException e) {
109 MessagingUtils.error(CdmDataSourceRepository.class, "Error retrieving remote sources", e);
110 }
111
112 // TODO sort by database name
113
114 return remoteSources;
115 }
116
117 /**
118 * <p>getDataSource</p>
119 *
120 * @param name a {@link java.lang.String} object.
121 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
122 */
123 public static ICdmDataSource getDataSource(String name){
124
125 for(ICdmDataSource dataSource : CdmPersistentDataSource.getAllDataSources()){
126 try {
127 if(dataSource.getName().equals(name)){
128 return CdmPersistentDataSource.NewInstance(dataSource.getName());
129 }
130 } catch (DataSourceNotFoundException e) {
131 MessagingUtils.error(CdmDataSourceRepository.class, "Could not find dataSource", e);
132 }
133 }
134
135 return null;
136 }
137
138
139 /**
140 * <p>Getter for the field <code>currentDataSource</code>.</p>
141 *
142 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
143 * @throws CdmRemoteSourceException
144 */
145 public static ICdmSource getCurrentCdmSource() throws CdmRemoteSourceException {
146
147 if (currentCdmSource == null) {
148 updateLastUsedDataSource();
149
150 if(lastUsedCdmSourceName == null) {
151 return null;
152 }
153 // for post fix = null , source is by default a data source
154 if(lastUsedCdmSourcePostFix == null || lastUsedCdmSourcePostFix.equals(CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX)) {
155 try {
156 currentCdmSource = CdmPersistentDataSource.NewInstance(lastUsedCdmSourceName);
157 } catch (DataSourceNotFoundException e) {
158 // fallback creates a new default
159 setCurrentCdmSource(createDefaultH2DataSource());
160 }
161 } else if (lastUsedCdmSourcePostFix.equals(CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX)) {
162 currentCdmSource = CdmPersistentRemoteSource.NewInstance(lastUsedCdmSourceName);
163 } else {
164 throw new CdmRemoteSourceException("Unkown Cdm Source Type");
165 }
166 }
167 return currentCdmSource;
168 }
169
170 /**
171 * Creates a default H2 CDM Data Source
172 *
173 * @return the newly created data source
174 */
175 public static ICdmDataSource createDefaultH2DataSource() {
176 ICdmDataSource h2DataSource = CdmDataSource.NewH2EmbeddedInstance(
177 DEFAULT_DATASOURCE_NAME, "sa", "", PreferencesUtil.getPreferredNomenclaturalCode());
178 save(h2DataSource.getName(), h2DataSource);
179 return h2DataSource;
180 }
181
182 /**
183 * <p>Setter for the field <code>currentDataSource</code>.</p>
184 *
185 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
186 * @return a boolean.
187 */
188 public static boolean setCurrentCdmSource(ICdmSource cdmSource) {
189 currentCdmSource = cdmSource;
190 NomenclaturalCode dataSourceNomenclaturalCode = cdmSource.getNomenclaturalCode();
191 NomenclaturalCode applicationNomenclaturalCode = PreferencesUtil.getPreferredNomenclaturalCode();
192
193 if( dataSourceNomenclaturalCode != null && ! dataSourceNomenclaturalCode.equals(applicationNomenclaturalCode)){
194 PreferencesUtil.setPreferredNomenclaturalCode(dataSourceNomenclaturalCode);
195 MessagingUtils.informationDialog("Nomenclatural Code Change", "The Datasource that was just " +
196 "loaded has a different nomenclatural code than the one stored in Preferences. " +
197 "The nomenclatural code was changed in the application.");
198 }
199 return true;
200 }
201
202 /**
203 * <p>changeDataSource</p>
204 *
205 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
206 * @return a boolean.
207 */
208 public static boolean changeDataSource(final ICdmSource cdmSource) {
209 saveAsCurrentDatabaseToMemento(cdmSource);
210 CdmStore.connect(cdmSource);
211
212 return true;
213 }
214
215 /**
216 * <p>save</p>
217 *
218 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
219 * @param strDataSourceName a {@link java.lang.String} object.
220 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
221 * @throws CdmRemoteSourceException
222 */
223 public static ICdmPersistentSource save(String strCdmSourceName, ICdmRemoteSource cdmSource) throws CdmRemoteSourceException {
224 return CdmPersistentRemoteSource.save(strCdmSourceName, cdmSource);
225 }
226
227 /**
228 * <p>save</p>
229 *
230 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
231 * @param strDataSourceName a {@link java.lang.String} object.
232 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
233 * @throws CdmRemoteSourceException
234 */
235 public static ICdmPersistentSource save(String strCdmSourceName, ICdmDataSource cdmSource) {
236 return CdmPersistentDataSource.save(strCdmSourceName, cdmSource);
237 }
238
239 /**
240 * <p>update</p>
241 *
242 * @param strDataSourceName a {@link java.lang.String} object.
243 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
244 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
245 */
246 public static ICdmPersistentSource update(String strCdmSourceName, ICdmDataSource cdmSource){
247 try {
248 return CdmPersistentDataSource.update(strCdmSourceName, cdmSource);
249 } catch (Exception e) {
250 MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
251 }
252 return null;
253 }
254
255 public static ICdmPersistentSource replace(String strCdmSourceName, ICdmDataSource cdmSource){
256 try {
257 return CdmPersistentDataSource.replace(strCdmSourceName, cdmSource);
258 } catch (Exception e) {
259 MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
260 }
261 return null;
262 }
263
264 /**
265 * <p>update</p>
266 *
267 * @param strDataSourceName a {@link java.lang.String} object.
268 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
269 * @return a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
270 */
271 public static ICdmPersistentSource update(String strCdmSourceName, ICdmRemoteSource cdmSource){
272 try {
273 return CdmPersistentRemoteSource.update(strCdmSourceName, cdmSource);
274 } catch (Exception e) {
275 MessagingUtils.error(CdmDataSourceRepository.class, "Error updating CDM Source", e);
276
277 }
278 return null;
279 }
280
281 /*********************************************************
282 * Memento Handling *
283 *********************************************************/
284
285 private static void saveAsCurrentDatabaseToMemento(ICdmSource cdmSource){
286 if(memento == null) {
287 memento = readMemento();
288 }
289 memento.putString(CURRENT_DATASOURCE, cdmSource.getName());
290
291 // Set postfix to distinguish between data and remote sources
292 if(cdmSource instanceof CdmPersistentRemoteSource) {
293 memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentRemoteSource.REMOTESOURCE_BEAN_POSTFIX);
294 } else {
295 memento.putString(CURRENT_DATASOURCE_POSTFIX, CdmPersistentDataSource.DATASOURCE_BEAN_POSTFIX);
296 }
297
298
299 saveMementoToFile(memento);
300 }
301
302 /*
303 * Answer the workbench state file.
304 */
305 private static File getCdmSourceStateFile() {
306 IPath path = TaxeditorStorePlugin.getDefault().getStateLocation();
307 if (path == null) {
308 return null;
309 }
310 path = path.append(DEFAULT_DATASOURCE_STATE_FILENAME);
311 return path.toFile();
312 }
313
314 private static IMemento readMemento(){
315 try {
316 return MementoHelper.readMementoFromFile(getCdmSourceStateFile());
317 } catch (FileNotFoundException e) {
318 return initializeMemento();
319 }
320 }
321
322
323 private static IMemento initializeMemento() {
324
325 XMLMemento memento = XMLMemento.createWriteRoot(TAG_DATASOURCE);
326 memento.putString(CURRENT_DATASOURCE, DEFAULT_DATASOURCE_NAME);
327 saveMementoToFile(memento);
328
329 return readMemento();
330 }
331
332 /*
333 * Save the workbench UI in a persistence file.
334 */
335 private static IMemento saveMementoToFile(IMemento memento) {
336 return MementoHelper.saveMementoToFile(memento, getCdmSourceStateFile());
337 }
338 }