81ba19af39e3aca1d78c05140a68e652cba14968
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / preference / PreferencesUtil.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
10 package eu.etaxonomy.taxeditor.preference;
11
12 import java.util.Arrays;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16 import java.util.Set;
17 import java.util.UUID;
18
19 import org.eclipse.jface.dialogs.Dialog;
20 import org.eclipse.jface.dialogs.MessageDialog;
21 import org.eclipse.jface.preference.IPreferenceStore;
22 import org.eclipse.swt.widgets.Shell;
23
24 import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeConfigurator;
25 import eu.etaxonomy.cdm.api.service.IFeatureTreeService;
26 import eu.etaxonomy.cdm.api.service.ITermService;
27 import eu.etaxonomy.cdm.api.service.config.FindTaxaAndNamesConfiguratorImpl;
28 import eu.etaxonomy.cdm.api.service.config.IFindTaxaAndNamesConfigurator;
29 import eu.etaxonomy.cdm.common.CdmUtils;
30 import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
31 import eu.etaxonomy.cdm.model.common.ICdmBase;
32 import eu.etaxonomy.cdm.model.common.IDefinedTerm;
33 import eu.etaxonomy.cdm.model.common.ISimpleTerm;
34 import eu.etaxonomy.cdm.model.common.Language;
35 import eu.etaxonomy.cdm.model.common.MarkerType;
36 import eu.etaxonomy.cdm.model.common.TermBase;
37 import eu.etaxonomy.cdm.model.description.FeatureTree;
38 import eu.etaxonomy.cdm.model.name.NomenclaturalCode;
39 import eu.etaxonomy.cdm.strategy.match.DefaultMatchStrategy;
40 import eu.etaxonomy.cdm.strategy.match.IMatchStrategy;
41 import eu.etaxonomy.cdm.strategy.match.MatchException;
42 import eu.etaxonomy.cdm.strategy.match.MatchMode;
43 import eu.etaxonomy.taxeditor.model.NomenclaturalCodeHelper;
44 import eu.etaxonomy.taxeditor.store.CdmStore;
45 import eu.etaxonomy.taxeditor.store.StoreUtil;
46 import eu.etaxonomy.taxeditor.store.internal.TaxeditorStorePlugin;
47
48 /**
49 * <p>
50 * PreferencesUtil class.
51 * </p>
52 *
53 * @author p.ciardelli
54 * @author n.hoffmann
55 * @created 05.12.2008
56 * @version 1.0
57 */
58 public class PreferencesUtil implements IPreferenceKeys {
59
60 /**
61 *
62 */
63 public static final String PREFERRED_TERMS_CHANGE = "preferred_terms";
64
65 /**
66 * <p>
67 * getPreferenceStore
68 * </p>
69 *
70 * @return a {@link org.eclipse.jface.preference.IPreferenceStore} object.
71 */
72 public static IPreferenceStore getPreferenceStore() {
73 return TaxeditorStorePlugin.getDefault().getPreferenceStore();
74 }
75
76 /**
77 * <p>
78 * setPreferredNomenclaturalCode
79 * </p>
80 *
81 * @param preferredCode
82 * a {@link eu.etaxonomy.cdm.model.name.NomenclaturalCode}
83 * object.
84 */
85 public static void setPreferredNomenclaturalCode(
86 NomenclaturalCode preferredCode) {
87 getPreferenceStore().setValue(PREFERRED_NOMENCLATURAL_CODE_KEY,
88 getPreferenceKey(preferredCode));
89 }
90
91 /**
92 * <p>
93 * getPreferredNomenclaturalCode
94 * </p>
95 *
96 * @return a {@link eu.etaxonomy.cdm.model.name.NomenclaturalCode} object.
97 */
98 public static NomenclaturalCode getPreferredNomenclaturalCode() {
99
100 for (NomenclaturalCode code : NomenclaturalCodeHelper.getAllCodes()) {
101 String preferredCode = getPreferenceStore().getString(
102 PREFERRED_NOMENCLATURAL_CODE_KEY);
103 if (getPreferenceKey(code).equals(preferredCode)) {
104 return code;
105 }
106 }
107 return null;
108 }
109
110 /**
111 * Get the match strategy for the given class that was stored in preferences
112 * or the default strategy if it was not stored in preferences
113 *
114 * @param clazz
115 * a {@link java.lang.Class} object.
116 * @return a {@link eu.etaxonomy.cdm.strategy.match.IMatchStrategy} object.
117 */
118 public static IMatchStrategy getMatchStrategy(Class clazz) {
119 String className = clazz.getName();
120 if (getPreferenceStore().getBoolean(MATCH_STRATEGY_PREFIX + className)) {
121 IMatchStrategy matchStrategy = getDefaultMatchStrategy(clazz);
122
123 for (String fieldName : matchStrategy.getMatchFieldPropertyNames()) {
124 String matchModeName = getPreferenceStore().getString(
125 getMatchStrategyFieldName(className, fieldName));
126 MatchMode matchMode = MatchMode.valueOf(matchModeName);
127 try {
128 matchStrategy.setMatchMode(fieldName, matchMode);
129 } catch (MatchException e) {
130 StoreUtil.error(PreferencesUtil.class, e);
131 throw new RuntimeException(e);
132 }
133 }
134
135 return matchStrategy;
136 }
137 return getDefaultMatchStrategy(clazz);
138 }
139
140 /**
141 * Stores a matchStrategy into the preference store.
142 *
143 * @param matchStrategy
144 * a {@link eu.etaxonomy.cdm.strategy.match.IMatchStrategy}
145 * object.
146 */
147 public static void setMatchStrategy(IMatchStrategy matchStrategy) {
148 String className = matchStrategy.getMatchClass().getName();
149 getPreferenceStore().setValue(MATCH_STRATEGY_PREFIX + className, true);
150
151 Set<String> matchFields = matchStrategy.getMatchFieldPropertyNames();
152
153 for (String fieldName : matchFields) {
154 getPreferenceStore().setValue(
155 getMatchStrategyFieldName(className, fieldName),
156 matchStrategy.getMatchMode(fieldName).name());
157 }
158 }
159
160 /**
161 * Helper method to create the preference property for a match field.
162 *
163 * @param className
164 * @param fieldName
165 * @return
166 */
167 private static String getMatchStrategyFieldName(String className,
168 String fieldName) {
169 return MATCH_STRATEGY_PREFIX + className + "." + fieldName;
170 }
171
172 /**
173 * Returns the default match strategy for a given class.
174 *
175 * @param clazz
176 * a {@link java.lang.Class} object.
177 * @return a {@link eu.etaxonomy.cdm.strategy.match.IMatchStrategy} object.
178 */
179 public static IMatchStrategy getDefaultMatchStrategy(Class clazz) {
180 return DefaultMatchStrategy.NewInstance(clazz);
181 }
182
183 /**
184 * <p>
185 * getDateFormatPattern
186 * </p>
187 *
188 * @return a {@link java.lang.String} object.
189 */
190 public static String getDateFormatPattern() {
191 // TODO make this configurable in properties
192 String pattern = "Y-M-d H:m";
193 return pattern;
194 }
195
196 /**
197 * <p>
198 * addTermToPreferredTerms
199 * </p>
200 *
201 * @param term
202 * a T object.
203 * @param <T>
204 * a T object.
205 */
206 public static <T extends TermBase> void addTermToPreferredTerms(T term) {
207
208 // VocabularyEnum vocabulary =
209 // VocabularyEnum.getVocabularyEnum(term.getClass());
210 //
211 // getPreferenceStore().setValue(getPreferenceKey(term),
212 // VocabularyStore.getTermVocabulary(vocabulary).getTerms().contains(term));
213 //
214 // firePreferencesChanged(term.getClass());
215 }
216
217 /**
218 * Construct a unique key using the CdmBase object's uuid
219 *
220 * @param cdmBase
221 * @return
222 */
223 private static String getPreferenceKey(ICdmBase cdmBase) {
224 cdmBase = (ICdmBase) HibernateProxyHelper.deproxy(cdmBase);
225
226 String key = cdmBase.getClass().getName().concat(".")
227 .concat(cdmBase.getUuid().toString());
228 if (key.contains("javassist")) {
229 StoreUtil.info("proxy");
230 }
231 return key;
232 }
233
234 /**
235 * Construct a unique key using the CdmBase object's uuid
236 *
237 * @param cdmBase
238 * @return
239 */
240 public static String getPreferenceKey(ISimpleTerm simpleTerm) {
241 simpleTerm = (ISimpleTerm) HibernateProxyHelper.deproxy(simpleTerm);
242 String key = simpleTerm.getClass().getName().concat(".")
243 .concat(simpleTerm.getUuid().toString());
244 if (key.contains("javassist")) {
245 StoreUtil.warn(PreferencesUtil.class,
246 "Trying to persist a preference based on a proxy class.");
247 }
248 return key;
249 }
250
251
252
253 /**
254 * Construct a unique key using the CdmBase object's uuid
255 *
256 * @param cdmBase
257 * @return
258 */
259 public static String getPreferenceKey(IDefinedTerm definedTerm) {
260 definedTerm = (IDefinedTerm) HibernateProxyHelper.deproxy(definedTerm);
261 String key = definedTerm.getClass().getName().concat(".")
262 .concat(definedTerm.getUuid().toString());
263 if (key.contains("javassist")) {
264 StoreUtil.warn(PreferencesUtil.class,
265 "Trying to persist a preference based on a proxy class.");
266 }
267 return key;
268 }
269
270 /**
271 * Retrieves search preferences from the preference store
272 *
273 * @return an {@link ITaxonServiceConfigurator} to pass to search methods
274 */
275 public static IFindTaxaAndNamesConfigurator getSearchConfigurator() {
276 IFindTaxaAndNamesConfigurator configurator = initializeSearchConfigurator();
277
278 configurator.setDoTaxa(getPreferenceStore().getBoolean(
279 TAXON_SERVICE_CONFIGURATOR_TAXA));
280 configurator.setDoSynonyms(getPreferenceStore().getBoolean(
281 TAXON_SERVICE_CONFIGURATOR_SYNONYMS));
282 configurator.setDoNamesWithoutTaxa(getPreferenceStore().getBoolean(
283 TAXON_SERVICE_CONFIGURATOR_NAMES));
284 configurator.setDoTaxaByCommonNames(getPreferenceStore().getBoolean(
285 TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES));
286
287 return configurator;
288 }
289
290 /**
291 * create new preferences, setting all search options to true
292 *
293 * @return a
294 * {@link eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator}
295 * object.
296 */
297 public static IFindTaxaAndNamesConfigurator initializeSearchConfigurator() {
298 IFindTaxaAndNamesConfigurator configurator = new FindTaxaAndNamesConfiguratorImpl();
299
300 configurator.setDoTaxa(true);
301 configurator.setDoSynonyms(true);
302 configurator.setDoNamesWithoutTaxa(true);
303 configurator.setDoTaxaByCommonNames(true);
304
305 configurator.setTaxonPropertyPath(Arrays.asList("$", "titleCache",
306 "name", "name.$", "relationsFromThisTaxon.$"));
307
308 configurator.setSynonymPropertyPath(Arrays.asList("$", "titleCache",
309 "name", "name.$", "synonymRelations.relatedTo.*"));
310
311 // DEFAULT VALUES
312 // match mode is a simple like, actually all other match modes are kind
313 // of bogus
314 configurator
315 .setMatchMode(eu.etaxonomy.cdm.persistence.query.MatchMode.ANYWHERE);
316 // we set page number and size here as this should always be unlimited
317 configurator.setPageNumber(0);
318 // TODO currently limit results to 10000
319 configurator.setPageSize(10000);
320
321 return configurator;
322 }
323
324 /**
325 * Store search preferences
326 *
327 * @param configurator
328 * a
329 * {@link eu.etaxonomy.cdm.api.service.config.ITaxonServiceConfigurator}
330 * object.
331 */
332 public static void setSearchConfigurator(
333 IFindTaxaAndNamesConfigurator configurator) {
334 getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_TAXA,
335 configurator.isDoTaxa());
336 getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_SYNONYMS,
337 configurator.isDoSynonyms());
338 getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_NAMES,
339 configurator.isDoNamesWithoutTaxa());
340 getPreferenceStore().setValue(TAXON_SERVICE_CONFIGURATOR_COMMON_NAMES,
341 configurator.isDoTaxaByCommonNames());
342 }
343
344 /**
345 * <p>
346 * firePreferencesChanged
347 * </p>
348 *
349 * @param clazz
350 * a {@link java.lang.Class} object.
351 */
352 public static void firePreferencesChanged(Class clazz) {
353 getPreferenceStore().firePropertyChangeEvent(PREFERRED_TERMS_CHANGE,
354 null, clazz);
355 }
356
357 /**
358 * Set default values for preferences
359 */
360 public static void setDefaults() {
361 getPreferenceStore().setDefault(TAXON_SERVICE_CONFIGURATOR_TAXA, true);
362 getPreferenceStore().setDefault(TAXON_SERVICE_CONFIGURATOR_SYNONYMS,
363 true);
364 getPreferenceStore().setDefault(EDIT_MAP_SERVICE_ACCES_POINT,
365 "http://edit.br.fgov.be/edit_wp5/v1/areas.php");
366 getPreferenceStore().setDefault(SHOULD_CONNECT_AT_STARTUP, true);
367 getPreferenceStore().setDefault(OPENURL_ACCESS_POINT,
368 "http://www.biodiversitylibrary.org/openurl");
369 getPreferenceStore().setDefault(OPENURL_IMAGE_MAX_WIDTH, "1000");
370 getPreferenceStore().setDefault(OPENURL_IMAGE_MAX_HEIGHT, "1000");
371 }
372
373 /**
374 * <p>
375 * checkNomenclaturalCode
376 * </p>
377 */
378 public static void checkNomenclaturalCode() {
379 // First time Editor is opened, no nomenclatural code has been set
380 if (PreferencesUtil.getPreferredNomenclaturalCode() == null) {
381
382 StoreUtil.info("No nomencatural code set.");
383
384 Shell shell = StoreUtil.getShell();
385
386 // Query user re: preferred nom. code
387 Dialog dialog = new InitNomenclaturalCodePrefDialog(shell);
388 dialog.open();
389
390 // Short message confirming user's choice
391 NomenclaturalCode code = PreferencesUtil
392 .getPreferredNomenclaturalCode();
393 MessageDialog
394 .openInformation(
395 shell,
396 "Nomenclatural code set",
397 "The following has been set as your preferred nomenclatural code:\n\n\t"
398 + NomenclaturalCodeHelper
399 .getDescription(code)
400 + "\n\nYou can change the nomenclatural code at any time in the \"Preferences\" menu.");
401 }
402 }
403
404 /**
405 * <p>
406 * getMapServiceAccessPoint
407 * </p>
408 *
409 * @return a {@link java.lang.String} object.
410 */
411 public static String getMapServiceAccessPoint() {
412 return getPreferenceStore().getString(EDIT_MAP_SERVICE_ACCES_POINT);
413 }
414
415 /**
416 * <p>
417 * shouldConnectAtStartUp
418 * </p>
419 *
420 * @return a boolean.
421 */
422 public static boolean shouldConnectAtStartUp() {
423 return getPreferenceStore().getBoolean(SHOULD_CONNECT_AT_STARTUP);
424 }
425
426 /**
427 * <p>
428 * getDefaultFeatureTreeForTextualDescription
429 * </p>
430 *
431 * @return a {@link eu.etaxonomy.cdm.model.description.FeatureTree} object.
432 */
433 public static FeatureTree getDefaultFeatureTreeForTextualDescription() {
434 String uuidString = getPreferenceStore().getString(
435 FEATURE_TREE_DEFAULT_TEXT);
436 return CdmUtils.isEmpty(uuidString) ? null : CdmStore.getService(
437 IFeatureTreeService.class).load(UUID.fromString(uuidString));
438 }
439
440 /**
441 * <p>
442 * getDefaultFeatureTreeForStructuredDescription
443 * </p>
444 *
445 * @return a {@link eu.etaxonomy.cdm.model.description.FeatureTree} object.
446 */
447 public static FeatureTree getDefaultFeatureTreeForStructuredDescription() {
448 String uuidString = getPreferenceStore().getString(
449 FEATURE_TREE_DEFAULT_STRUCTURE);
450 return CdmUtils.isEmpty(uuidString) ? null : CdmStore.getService(
451 IFeatureTreeService.class).load(UUID.fromString(uuidString));
452 }
453
454 /**
455 * <p>
456 * setSortRanksHierarchichally
457 * </p>
458 *
459 * @param selection
460 * a boolean.
461 */
462 public static void setSortRanksHierarchichally(boolean selection) {
463 getPreferenceStore().setValue(SORT_RANKS_HIERARCHICHALLY, selection);
464 }
465
466 /**
467 * <p>
468 * getSortRanksHierarchichally
469 * </p>
470 *
471 * @return a boolean.
472 */
473 public static boolean getSortRanksHierarchichally() {
474 return getPreferenceStore().getBoolean(SORT_RANKS_HIERARCHICHALLY);
475 }
476
477 public static boolean isMultilanguageTextEditingCapability() {
478 return getPreferenceStore().getBoolean(
479 MULTILANGUAGE_TEXT_EDITING_CAPABILITY);
480 }
481
482 public static Language getGlobalLanguage() {
483 String languageUuidString = getPreferenceStore().getString(
484 GLOBAL_LANGUAGE_UUID);
485
486 if (CdmUtils.isEmpty(languageUuidString)) {
487 return Language.DEFAULT();
488 }
489
490 UUID languageUuid = UUID.fromString(languageUuidString);
491 return (Language) CdmStore.getService(ITermService.class).load(
492 languageUuid);
493 }
494
495 public static void setGlobalLanguage(Language language) {
496 getPreferenceStore().setValue(GLOBAL_LANGUAGE_UUID,
497 language.getUuid().toString());
498 CdmStore.setDefaultLanguage(language);
499 }
500
501 /**
502 * @return
503 */
504 public static Map<MarkerType, Boolean> getEditMarkerTypePreferences() {
505 List<MarkerType> markerTypes = CdmStore.getTermManager()
506 .getPreferredTerms(MarkerType.class);
507
508 Map<MarkerType, Boolean> result = new HashMap<MarkerType, Boolean>();
509
510 for (MarkerType markerType : markerTypes) {
511 String name = getMarkerTypeEditingPreferenceKey(markerType);
512 Boolean value = getPreferenceStore().getBoolean(name);
513
514 result.put(markerType, value);
515 }
516
517 return result;
518 }
519
520 /**
521 * @param markerTypeEditingMap
522 */
523 public static void setEditMarkerTypePreferences(
524 Map<MarkerType, Boolean> markerTypeEditingMap) {
525 for (MarkerType markerType : markerTypeEditingMap.keySet()) {
526 String name = getMarkerTypeEditingPreferenceKey(markerType);
527 getPreferenceStore().setValue(name,
528 markerTypeEditingMap.get(markerType));
529 }
530
531 }
532
533 private static String getMarkerTypeEditingPreferenceKey(
534 MarkerType markerType) {
535 markerType = (MarkerType) HibernateProxyHelper.deproxy(markerType);
536 return markerType.getClass().getName() + EDIT_MARKER_TYPE_PREFIX;
537 }
538
539 /**
540 * <p>
541 * setEditMarkerTypePreference
542 * </p>
543 *
544 * @param input
545 * a {@link org.eclipse.ui.IEditorInput} object.
546 * @param markerType
547 * a {@link eu.etaxonomy.cdm.model.common.MarkerType} object.
548 * @param edit
549 * a boolean.
550 */
551 public static void setEditMarkerTypePreference(MarkerType markerType,
552 boolean edit) {
553 getPreferenceStore().setValue(
554 getMarkerTypeEditingPreferenceKey(markerType), edit);
555 }
556
557 /**
558 * @return
559 */
560 public static DerivedUnitFacadeConfigurator getDerivedUnitConfigurator() {
561 DerivedUnitFacadeConfigurator configurator = DerivedUnitFacadeConfigurator
562 .NewInstance();
563 configurator.setMoveDerivedUnitMediaToGallery(true);
564 configurator.setMoveFieldObjectMediaToGallery(true);
565 return configurator;
566 }
567
568 }