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