2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
11 package eu
.etaxonomy
.taxeditor
.datasource
;
14 import java
.io
.FileNotFoundException
;
15 import java
.util
.ArrayList
;
16 import java
.util
.List
;
18 import org
.eclipse
.core
.runtime
.IPath
;
19 import org
.eclipse
.ui
.IMemento
;
20 import org
.eclipse
.ui
.XMLMemento
;
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
;
38 public class CdmDataSourceRepository
{
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";
46 private static final String DEFAULT_DATASOURCE_NAME
= "cdm";
47 private static final String DEFAULT_DATASOURCE_POSTFIX
= CdmPersistentDataSource
.DATASOURCE_BEAN_POSTFIX
;
49 private static ICdmSource currentCdmSource
;
50 private static IMemento memento
;
52 private static String lastUsedCdmSourceName
;
53 private static String lastUsedCdmSourcePostFix
;
56 * <p>Getter for the field <code>lastUsedDataSourceName</code>.</p>
58 * @return a {@link java.lang.String} object.
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
;
71 * @param dataSource a {@link eu.etaxonomy.cdm.database.CdmPersistentDataSource} object.
74 public static boolean delete(ICdmPersistentSource cdmPersistentSource
) {
75 CdmPersistentSourceUtils
.delete(cdmPersistentSource
);
82 * @return a {@link java.util.List} object.
84 public static List
<ICdmSource
> getAll() {
85 List
<ICdmSource
> remoteSources
= new ArrayList
<>();
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);
93 for(ICdmDataSource dataSource
: CdmPersistentDataSource
.getAllDataSources()){
95 remoteSources
.add(CdmPersistentDataSource
.NewInstance(dataSource
.getName()));
96 } catch (DataSourceNotFoundException e
) {
97 MessagingUtils
.error(CdmDataSourceRepository
.class, "Could not find dataSource", e
);
102 for(ICdmRemoteSource remoteSource
: CdmPersistentRemoteSource
.getAllRemoteSources()){
103 remoteSources
.add(remoteSource
);
105 } catch (CdmRemoteSourceException e
) {
106 MessagingUtils
.error(CdmDataSourceRepository
.class, "Error retrieving remote sources", e
);
109 // TODO sort by database name
111 return remoteSources
;
115 * <p>getDataSource</p>
117 * @param name a {@link java.lang.String} object.
118 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
120 public static ICdmDataSource
getDataSource(String name
){
122 for(ICdmDataSource dataSource
: CdmPersistentDataSource
.getAllDataSources()){
124 if(dataSource
.getName().equals(name
)){
125 return CdmPersistentDataSource
.NewInstance(dataSource
.getName());
127 } catch (DataSourceNotFoundException e
) {
128 MessagingUtils
.error(CdmDataSourceRepository
.class, "Could not find dataSource", e
);
136 * <p>Getter for the field <code>currentDataSource</code>.</p>
138 * @return a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
139 * @throws CdmRemoteSourceException
141 public static ICdmSource
getCurrentCdmSource() throws CdmRemoteSourceException
{
143 if (currentCdmSource
== null) {
144 updateLastUsedDataSource();
146 if(lastUsedCdmSourceName
== null) {
149 // for post fix = null , source is by default a data source
150 if(lastUsedCdmSourcePostFix
== null || lastUsedCdmSourcePostFix
.equals(CdmPersistentDataSource
.DATASOURCE_BEAN_POSTFIX
)) {
152 currentCdmSource
= CdmPersistentDataSource
.NewInstance(lastUsedCdmSourceName
);
153 } catch (DataSourceNotFoundException e
) {
154 // fallback creates a new default
155 setCurrentCdmSource(createDefaultH2DataSource());
157 } else if (lastUsedCdmSourcePostFix
.equals(CdmPersistentRemoteSource
.REMOTESOURCE_BEAN_POSTFIX
)) {
158 currentCdmSource
= CdmPersistentRemoteSource
.NewInstance(lastUsedCdmSourceName
);
160 throw new CdmRemoteSourceException("Unkown Cdm Source Type");
163 return currentCdmSource
;
167 * Creates a default H2 CDM Data Source
169 * @return the newly created data source
171 public static ICdmDataSource
createDefaultH2DataSource() {
172 ICdmDataSource h2DataSource
= CdmDataSource
.NewH2EmbeddedInstance(
173 DEFAULT_DATASOURCE_NAME
, "sa", "");
174 save(h2DataSource
.getName(), h2DataSource
);
179 * <p>Setter for the field <code>currentDataSource</code>.</p>
181 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
184 public static boolean setCurrentCdmSource(ICdmSource cdmSource
) {
185 currentCdmSource
= cdmSource
;
190 * <p>changeDataSource</p>
192 * @param dataSource a {@link eu.etaxonomy.cdm.database.ICdmDataSource} object.
195 public static boolean changeDataSource(final ICdmSource cdmSource
) {
196 saveAsCurrentDatabaseToMemento(cdmSource
);
197 CdmStore
.connect(cdmSource
);
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
210 // public static ICdmPersistentSource save(String strCdmSourceName, ICdmRemoteSource cdmSource) throws CdmRemoteSourceException {
211 // return CdmPersistentRemoteSource.save(strCdmSourceName, cdmSource);
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
222 public static ICdmPersistentSource
save(String strCdmSourceName
, ICdmDataSource cdmSource
) {
223 return CdmPersistentDataSource
.save(strCdmSourceName
, cdmSource
);
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.
233 public static ICdmPersistentSource
update(String strCdmSourceName
, ICdmDataSource cdmSource
){
235 return CdmPersistentDataSource
.update(strCdmSourceName
, cdmSource
);
236 } catch (Exception e
) {
237 MessagingUtils
.error(CdmDataSourceRepository
.class, "Error updating CDM Source", e
);
242 public static ICdmPersistentSource
replace(String strCdmSourceName
, ICdmDataSource cdmSource
){
244 return CdmPersistentDataSource
.replace(strCdmSourceName
, cdmSource
);
245 } catch (Exception e
) {
246 MessagingUtils
.error(CdmDataSourceRepository
.class, "Error updating CDM Source", e
);
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.
258 public static ICdmPersistentSource
update(String strCdmSourceName
, CdmRemoteSource cdmSource
){
260 return CdmPersistentRemoteSource
.update(strCdmSourceName
, cdmSource
);
261 } catch (Exception e
) {
262 MessagingUtils
.error(CdmDataSourceRepository
.class, "Error updating CDM Source", e
);
268 /*********************************************************
270 *********************************************************/
272 private static void saveAsCurrentDatabaseToMemento(ICdmSource cdmSource
){
273 if(memento
== null) {
274 memento
= readMemento();
276 memento
.putString(CURRENT_DATASOURCE
, cdmSource
.getName());
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
);
282 memento
.putString(CURRENT_DATASOURCE_POSTFIX
, CdmPersistentDataSource
.DATASOURCE_BEAN_POSTFIX
);
286 saveMementoToFile(memento
);
290 * Answer the workbench state file.
292 private static File
getCdmSourceStateFile() {
293 IPath path
= TaxeditorStorePlugin
.getDefault().getStateLocation();
297 path
= path
.append(DEFAULT_DATASOURCE_STATE_FILENAME
);
298 return path
.toFile();
301 private static IMemento
readMemento(){
303 return MementoHelper
.readMementoFromFile(getCdmSourceStateFile());
304 } catch (FileNotFoundException e
) {
305 return initializeMemento();
309 private static IMemento
initializeMemento() {
311 XMLMemento memento
= XMLMemento
.createWriteRoot(TAG_DATASOURCE
);
312 memento
.putString(CURRENT_DATASOURCE
, DEFAULT_DATASOURCE_NAME
);
313 saveMementoToFile(memento
);
315 return readMemento();
319 * Save the workbench UI in a persistence file.
321 private static IMemento
saveMementoToFile(IMemento memento
) {
322 return MementoHelper
.saveMementoToFile(memento
, getCdmSourceStateFile());