2 * Copyright (C) 2018 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.
9 package eu
.etaxonomy
.taxeditor
.preference
;
11 import java
.util
.ArrayList
;
12 import java
.util
.Collection
;
13 import java
.util
.HashMap
;
14 import java
.util
.List
;
16 import java
.util
.UUID
;
18 import org
.apache
.log4j
.Logger
;
20 import eu
.etaxonomy
.cdm
.api
.application
.ICdmRepository
;
21 import eu
.etaxonomy
.cdm
.api
.service
.ITermService
;
22 import eu
.etaxonomy
.cdm
.model
.metadata
.CdmPreference
;
23 import eu
.etaxonomy
.cdm
.model
.metadata
.CdmPreference
.PrefKey
;
24 import eu
.etaxonomy
.cdm
.model
.metadata
.PreferencePredicate
;
25 import eu
.etaxonomy
.cdm
.model
.metadata
.PreferenceResolver
;
26 import eu
.etaxonomy
.cdm
.model
.metadata
.PreferenceSubject
;
27 import eu
.etaxonomy
.cdm
.model
.term
.TermType
;
28 import eu
.etaxonomy
.cdm
.persistence
.dto
.TermDto
;
29 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
35 public class CdmPreferenceCache
{
36 Map
<String
,List
<CdmPreference
>> preferenceCache
= new HashMap
<>();
38 private static CdmPreferenceCache instance
;
40 private final static Logger logger
= Logger
.getLogger(CdmPreferenceCache
.class);
42 public static CdmPreferenceCache
instance(){
44 instance
= new CdmPreferenceCache();
49 public CdmPreference
get(String predicate
){
50 if (preferenceCache
.get(predicate
) != null){
51 if (preferenceCache
.get(predicate
).size() > 1){
52 CdmPreference pref
= PreferenceResolver
.resolve(preferenceCache
.get(predicate
), CdmPreference
.NewKey(PreferenceSubject
.NewTaxEditorInstance(), PreferencePredicate
.getByKey(predicate
)));
55 return preferenceCache
.get(predicate
).get(0);
60 public List
<CdmPreference
> getAllForPredicate(String predicate
){
61 if (preferenceCache
.get(predicate
) != null){
62 return preferenceCache
.get(predicate
);
68 //looking for the equal prefkey
69 public CdmPreference
get(PrefKey key
){
70 if (preferenceCache
.containsKey(key
.getPredicate())){
71 for (CdmPreference pref
: preferenceCache
.get(key
.getPredicate())){
72 if (pref
.getSubjectString().equals(key
.getSubject())){
81 public void put(CdmPreference pref
){
82 if (preferenceCache
.containsKey(pref
.getPredicate())){
83 List
<CdmPreference
> cachedPreferences
= preferenceCache
.get(pref
.getPredicate());
84 CdmPreference prefToRemove
= null;
85 for (CdmPreference cachedPref
:cachedPreferences
){
86 if (pref
.getKey().equals(cachedPref
.getKey())){
87 prefToRemove
= cachedPref
;
90 cachedPreferences
.remove(prefToRemove
);
91 cachedPreferences
.add(pref
);
93 List
<CdmPreference
> prefs
= new ArrayList
<>();
95 preferenceCache
.put(pref
.getPredicate(), prefs
);
99 public boolean remove(CdmPreference pref
){
100 if (preferenceCache
.containsKey(pref
.getPredicate())){
101 List
<CdmPreference
> cachedPreferences
= preferenceCache
.get(pref
.getPredicate());
102 CdmPreference prefToRemove
= null;
103 for (CdmPreference cachedPref
:cachedPreferences
){
104 if (pref
.getKey().equals(cachedPref
.getKey())){
105 prefToRemove
= cachedPref
;
108 cachedPreferences
.remove(prefToRemove
);
113 public void getAllTaxEditorDBPreferences(){
114 ICdmRepository controller
;
115 controller
= CdmStore
.getCurrentApplicationConfiguration();
116 List
<CdmPreference
> allPreferences
= controller
.getPreferenceService().list();
117 preferenceCache
.clear();
119 for (CdmPreference pref
: allPreferences
){
123 loadAndSet(PreferencePredicate
.AvailableDistributionStatus
, TermType
.PresenceAbsenceTerm
);
124 loadAndSet(PreferencePredicate
.AvailableRanks
, TermType
.Rank
);
125 loadAndSet(PreferencePredicate
.AvailableNomenclaturalStatus
, TermType
.NomenclaturalStatusType
);
129 private void loadAndSet(PreferencePredicate preferencePredicate
, TermType termType
) {
130 PrefKey key
= CdmPreference
.NewKey(PreferenceSubject
.NewTaxEditorInstance(), preferencePredicate
);
131 if (get(key
) != null){
132 if (!PreferencesUtil
.getOverrideForPreference(preferencePredicate
.getKey()) || !get(key
).isAllowOverride()){
133 //get terms for the uuids... and add them to the termManager as preferred terms
134 Collection
<TermDto
> dtos
= createDtoList(key
);
136 CdmStore
.getTermManager().setPreferredTermsByType(dtos
, termType
);
142 public Collection
<TermDto
> createDtoList(PrefKey key
) {
143 ITermService termService
= CdmStore
.getService(ITermService
.class);
144 List
<UUID
> uuidList
= createUuidList(key
);
145 Collection
<TermDto
> dtos
= termService
.findByUUIDsAsDto(uuidList
);
149 public List
<UUID
> createUuidList(PrefKey key
) {
150 List
<UUID
> uuidList
= new ArrayList
<>();
151 if (get(key
).getValue() != null){
152 String
[] uuidArray
=findBestMatching(key
).getValue().split(";");
153 for (String uuidString
:uuidArray
){
155 uuidList
.add(UUID
.fromString(uuidString
));
156 } catch (Exception e
) {
157 logger
.warn("Preference loading failed", e
);
164 public CdmPreference
findBestMatching(PrefKey key
) {
165 List
<CdmPreference
> allPrefs
= new ArrayList
<>();
166 for (String predicate
: preferenceCache
.keySet()){
167 allPrefs
.addAll(preferenceCache
.get(predicate
));
169 return PreferenceResolver
.resolve(allPrefs
, key
);