3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
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.
14 package eu
.etaxonomy
.taxeditor
.datasource
;
17 import java
.io
.FileNotFoundException
;
18 import java
.util
.ArrayList
;
19 import java
.util
.List
;
21 import org
.eclipse
.core
.runtime
.IPath
;
22 import org
.eclipse
.ui
.IMemento
;
23 import org
.eclipse
.ui
.XMLMemento
;
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
{
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";
47 private static final String DEFAULT_DATASOURCE_NAME
= "cdm";
48 private static final String DEFAULT_DATASOURCE_POSTFIX
= CdmPersistentDataSource
.DATASOURCE_BEAN_POSTFIX
;
50 private static ICdmSource currentCdmSource
;
51 private static IMemento memento
;
53 private static String lastUsedCdmSourceName
;
54 private static String lastUsedCdmSourcePostFix
;
59 * <p>Getter for the field <code>lastUsedDataSourceName</code>.</p>
61 * @return a {@link java.lang.String} object.
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
;
76 * @param dataSource a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
79 public static boolean delete(ICdmPersistentSource cdmPersistentSource
) {
80 CdmPersistentSourceUtils
.delete(cdmPersistentSource
);
88 * @return a {@link java.util.List} object.
90 public static List
<ICdmSource
> getAll() {
91 List
<ICdmSource
> remoteSources
= new ArrayList
<>();
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);
99 for(ICdmDataSource dataSource
: CdmPersistentDataSource
.getAllDataSources()){
101 remoteSources
.add(CdmPersistentDataSource
.NewInstance(dataSource
.getName()));
102 } catch (DataSourceNotFoundException e
) {
103 MessagingUtils
.error(CdmDataSourceRepository
.class, "Could not find dataSource", e
);
108 for(ICdmRemoteSource remoteSource
: CdmPersistentRemoteSource
.getAllRemoteSources()){
109 remoteSources
.add(remoteSource
);
111 } catch (CdmRemoteSourceException e
) {
112 MessagingUtils
.error(CdmDataSourceRepository
.class, "Error retrieving remote sources", e
);
115 // TODO sort by database name
117 return remoteSources
;
121 * <p>getDataSource</p>
123 * @param name a {@link java.lang.String} object.
124 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
126 public static ICdmDataSource
getDataSource(String name
){
128 for(ICdmDataSource dataSource
: CdmPersistentDataSource
.getAllDataSources()){
130 if(dataSource
.getName().equals(name
)){
131 return CdmPersistentDataSource
.NewInstance(dataSource
.getName());
133 } catch (DataSourceNotFoundException e
) {
134 MessagingUtils
.error(CdmDataSourceRepository
.class, "Could not find dataSource", e
);
143 * <p>Getter for the field <code>currentDataSource</code>.</p>
145 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
146 * @throws CdmRemoteSourceException
148 public static ICdmSource
getCurrentCdmSource() throws CdmRemoteSourceException
{
150 if (currentCdmSource
== null) {
151 updateLastUsedDataSource();
153 if(lastUsedCdmSourceName
== null) {
156 // for post fix = null , source is by default a data source
157 if(lastUsedCdmSourcePostFix
== null || lastUsedCdmSourcePostFix
.equals(CdmPersistentDataSource
.DATASOURCE_BEAN_POSTFIX
)) {
159 currentCdmSource
= CdmPersistentDataSource
.NewInstance(lastUsedCdmSourceName
);
160 } catch (DataSourceNotFoundException e
) {
161 // fallback creates a new default
162 setCurrentCdmSource(createDefaultH2DataSource());
164 } else if (lastUsedCdmSourcePostFix
.equals(CdmPersistentRemoteSource
.REMOTESOURCE_BEAN_POSTFIX
)) {
165 currentCdmSource
= CdmPersistentRemoteSource
.NewInstance(lastUsedCdmSourceName
);
167 throw new CdmRemoteSourceException("Unkown Cdm Source Type");
170 return currentCdmSource
;
174 * Creates a default H2 CDM Data Source
176 * @return the newly created data source
178 public static ICdmDataSource
createDefaultH2DataSource() {
179 ICdmDataSource h2DataSource
= CdmDataSource
.NewH2EmbeddedInstance(
180 DEFAULT_DATASOURCE_NAME
, "sa", "");
181 save(h2DataSource
.getName(), h2DataSource
);
186 * <p>Setter for the field <code>currentDataSource</code>.</p>
188 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
191 public static boolean setCurrentCdmSource(ICdmSource cdmSource
) {
192 currentCdmSource
= cdmSource
;
193 // NomenclaturalCode dataSourceNomenclaturalCode = cdmSource.getNomenclaturalCode();
194 // NomenclaturalCode applicationNomenclaturalCode = PreferencesUtil.getPreferredNomenclaturalCode(true);
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.");
206 * <p>changeDataSource</p>
208 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
211 public static boolean changeDataSource(final ICdmSource cdmSource
) {
212 saveAsCurrentDatabaseToMemento(cdmSource
);
213 CdmStore
.connect(cdmSource
);
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
226 public static ICdmPersistentSource
save(String strCdmSourceName
, ICdmRemoteSource cdmSource
) throws CdmRemoteSourceException
{
227 return CdmPersistentRemoteSource
.save(strCdmSourceName
, cdmSource
);
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
238 public static ICdmPersistentSource
save(String strCdmSourceName
, ICdmDataSource cdmSource
) {
239 return CdmPersistentDataSource
.save(strCdmSourceName
, cdmSource
);
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.
249 public static ICdmPersistentSource
update(String strCdmSourceName
, ICdmDataSource cdmSource
){
251 return CdmPersistentDataSource
.update(strCdmSourceName
, cdmSource
);
252 } catch (Exception e
) {
253 MessagingUtils
.error(CdmDataSourceRepository
.class, "Error updating CDM Source", e
);
258 public static ICdmPersistentSource
replace(String strCdmSourceName
, ICdmDataSource cdmSource
){
260 return CdmPersistentDataSource
.replace(strCdmSourceName
, cdmSource
);
261 } catch (Exception e
) {
262 MessagingUtils
.error(CdmDataSourceRepository
.class, "Error updating CDM Source", e
);
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.
274 public static ICdmPersistentSource
update(String strCdmSourceName
, ICdmRemoteSource cdmSource
){
276 return CdmPersistentRemoteSource
.update(strCdmSourceName
, cdmSource
);
277 } catch (Exception e
) {
278 MessagingUtils
.error(CdmDataSourceRepository
.class, "Error updating CDM Source", e
);
284 /*********************************************************
286 *********************************************************/
288 private static void saveAsCurrentDatabaseToMemento(ICdmSource cdmSource
){
289 if(memento
== null) {
290 memento
= readMemento();
292 memento
.putString(CURRENT_DATASOURCE
, cdmSource
.getName());
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
);
298 memento
.putString(CURRENT_DATASOURCE_POSTFIX
, CdmPersistentDataSource
.DATASOURCE_BEAN_POSTFIX
);
302 saveMementoToFile(memento
);
306 * Answer the workbench state file.
308 private static File
getCdmSourceStateFile() {
309 IPath path
= TaxeditorStorePlugin
.getDefault().getStateLocation();
313 path
= path
.append(DEFAULT_DATASOURCE_STATE_FILENAME
);
314 return path
.toFile();
317 private static IMemento
readMemento(){
319 return MementoHelper
.readMementoFromFile(getCdmSourceStateFile());
320 } catch (FileNotFoundException e
) {
321 return initializeMemento();
326 private static IMemento
initializeMemento() {
328 XMLMemento memento
= XMLMemento
.createWriteRoot(TAG_DATASOURCE
);
329 memento
.putString(CURRENT_DATASOURCE
, DEFAULT_DATASOURCE_NAME
);
330 saveMementoToFile(memento
);
332 return readMemento();
336 * Save the workbench UI in a persistence file.
338 private static IMemento
saveMementoToFile(IMemento memento
) {
339 return MementoHelper
.saveMementoToFile(memento
, getCdmSourceStateFile());