merge-update from trunk
[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.africamuseum.be/edit_wp5/v1.2/rest_gen.php");
366 //FIXME : changed default for SHOULD_CONNECT_AT_STARTUP to false (ticket 3828) until resolution
367 getPreferenceStore().setDefault(SHOULD_CONNECT_AT_STARTUP, false);
368 getPreferenceStore().setDefault(OPENURL_ACCESS_POINT,
369 "http://www.biodiversitylibrary.org/openurl");
370 getPreferenceStore().setDefault(OPENURL_IMAGE_MAX_WIDTH, "1000");
371 getPreferenceStore().setDefault(OPENURL_IMAGE_MAX_HEIGHT, "1000");
372 }
373
374 /**
375 * <p>
376 * checkNomenclaturalCode
377 * </p>
378 */
379 public static void checkNomenclaturalCode() {
380 // First time Editor is opened, no nomenclatural code has been set
381 if (PreferencesUtil.getPreferredNomenclaturalCode() == null) {
382
383 StoreUtil.info("No nomencatural code set.");
384
385 Shell shell = StoreUtil.getShell();
386
387 // Query user re: preferred nom. code
388 Dialog dialog = new InitNomenclaturalCodePrefDialog(shell);
389 dialog.open();
390
391 // Short message confirming user's choice
392 NomenclaturalCode code = PreferencesUtil
393 .getPreferredNomenclaturalCode();
394 MessageDialog
395 .openInformation(
396 shell,
397 "Nomenclatural code set",
398 "The following has been set as your preferred nomenclatural code:\n\n\t"
399 + NomenclaturalCodeHelper
400 .getDescription(code)
401 + "\n\nYou can change the nomenclatural code at any time in the \"Preferences\" menu.");
402 }
403 }
404
405 /**
406 * <p>
407 * getMapServiceAccessPoint
408 * </p>
409 *
410 * @return a {@link java.lang.String} object.
411 */
412 public static String getMapServiceAccessPoint() {
413 return getPreferenceStore().getString(EDIT_MAP_SERVICE_ACCES_POINT);
414 }
415
416 /**
417 * <p>
418 * shouldConnectAtStartUp
419 * </p>
420 *
421 * @return a boolean.
422 */
423 public static boolean shouldConnectAtStartUp() {
424 return getPreferenceStore().getBoolean(SHOULD_CONNECT_AT_STARTUP);
425 }
426
427 /**
428 * <p>
429 * getDefaultFeatureTreeForTextualDescription
430 * </p>
431 *
432 * @return a {@link eu.etaxonomy.cdm.model.description.FeatureTree} object.
433 */
434 public static FeatureTree getDefaultFeatureTreeForTextualDescription() {
435 String uuidString = getPreferenceStore().getString(
436 FEATURE_TREE_DEFAULT_TEXT);
437 return CdmUtils.isEmpty(uuidString) ? null : CdmStore.getService(
438 IFeatureTreeService.class).load(UUID.fromString(uuidString));
439 }
440
441 /**
442 * <p>
443 * getDefaultFeatureTreeForStructuredDescription
444 * </p>
445 *
446 * @return a {@link eu.etaxonomy.cdm.model.description.FeatureTree} object.
447 */
448 public static FeatureTree getDefaultFeatureTreeForStructuredDescription() {
449 String uuidString = getPreferenceStore().getString(
450 FEATURE_TREE_DEFAULT_STRUCTURE);
451 return CdmUtils.isEmpty(uuidString) ? null : CdmStore.getService(
452 IFeatureTreeService.class).load(UUID.fromString(uuidString));
453 }
454
455 /**
456 * <p>
457 * setSortRanksHierarchichally
458 * </p>
459 *
460 * @param selection
461 * a boolean.
462 */
463 public static void setSortRanksHierarchichally(boolean selection) {
464 getPreferenceStore().setValue(SORT_RANKS_HIERARCHICHALLY, selection);
465 }
466
467 /**
468 * <p>
469 * getSortRanksHierarchichally
470 * </p>
471 *
472 * @return a boolean.
473 */
474 public static boolean getSortRanksHierarchichally() {
475 return getPreferenceStore().getBoolean(SORT_RANKS_HIERARCHICHALLY);
476 }
477
478 public static boolean isMultilanguageTextEditingCapability() {
479 return getPreferenceStore().getBoolean(
480 MULTILANGUAGE_TEXT_EDITING_CAPABILITY);
481 }
482
483 public static Language getGlobalLanguage() {
484 String languageUuidString = getPreferenceStore().getString(
485 GLOBAL_LANGUAGE_UUID);
486
487 if (CdmUtils.isEmpty(languageUuidString)) {
488 return Language.DEFAULT();
489 }
490
491 UUID languageUuid = UUID.fromString(languageUuidString);
492 return (Language) CdmStore.getService(ITermService.class).load(
493 languageUuid);
494 }
495
496 public static void setGlobalLanguage(Language language) {
497 getPreferenceStore().setValue(GLOBAL_LANGUAGE_UUID,
498 language.getUuid().toString());
499 CdmStore.setDefaultLanguage(language);
500 }
501
502 /**
503 * @return
504 */
505 public static Map<MarkerType, Boolean> getEditMarkerTypePreferences() {
506 List<MarkerType> markerTypes = CdmStore.getTermManager()
507 .getPreferredTerms(MarkerType.class);
508
509 Map<MarkerType, Boolean> result = new HashMap<MarkerType, Boolean>();
510
511 for (MarkerType markerType : markerTypes) {
512 String name = getMarkerTypeEditingPreferenceKey(markerType);
513 Boolean value = getPreferenceStore().getBoolean(name);
514
515 result.put(markerType, value);
516 }
517
518 return result;
519 }
520
521 /**
522 * @param markerTypeEditingMap
523 */
524 public static void setEditMarkerTypePreferences(
525 Map<MarkerType, Boolean> markerTypeEditingMap) {
526 for (MarkerType markerType : markerTypeEditingMap.keySet()) {
527 String name = getMarkerTypeEditingPreferenceKey(markerType);
528 getPreferenceStore().setValue(name,
529 markerTypeEditingMap.get(markerType));
530 }
531
532 }
533
534 private static String getMarkerTypeEditingPreferenceKey(
535 MarkerType markerType) {
536 markerType = (MarkerType) HibernateProxyHelper.deproxy(markerType);
537 return markerType.getClass().getName() + EDIT_MARKER_TYPE_PREFIX;
538 }
539
540 /**
541 * <p>
542 * setEditMarkerTypePreference
543 * </p>
544 *
545 * @param input
546 * a {@link org.eclipse.ui.IEditorInput} object.
547 * @param markerType
548 * a {@link eu.etaxonomy.cdm.model.common.MarkerType} object.
549 * @param edit
550 * a boolean.
551 */
552 public static void setEditMarkerTypePreference(MarkerType markerType,
553 boolean edit) {
554 getPreferenceStore().setValue(
555 getMarkerTypeEditingPreferenceKey(markerType), edit);
556 }
557
558 /**
559 * @return
560 */
561 public static DerivedUnitFacadeConfigurator getDerivedUnitConfigurator() {
562 DerivedUnitFacadeConfigurator configurator = DerivedUnitFacadeConfigurator
563 .NewInstance();
564 configurator.setMoveDerivedUnitMediaToGallery(true);
565 configurator.setMoveFieldObjectMediaToGallery(true);
566 return configurator;
567 }
568
569 }