correct handling of allowOverride in taxonnode admin preferences
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / preference / GeneralTermPreference.java
1 /**
2 * Copyright (C) 2019 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 package eu.etaxonomy.taxeditor.preference;
10
11 import java.util.ArrayList;
12 import java.util.Arrays;
13 import java.util.Collection;
14 import java.util.List;
15 import java.util.UUID;
16
17 import org.apache.commons.lang.StringUtils;
18 import org.eclipse.jface.viewers.ISelectionChangedListener;
19 import org.eclipse.jface.viewers.SelectionChangedEvent;
20 import org.eclipse.swt.SWT;
21 import org.eclipse.swt.custom.CLabel;
22 import org.eclipse.swt.events.SelectionEvent;
23 import org.eclipse.swt.events.SelectionListener;
24 import org.eclipse.swt.layout.GridData;
25 import org.eclipse.swt.layout.GridLayout;
26 import org.eclipse.swt.widgets.Combo;
27 import org.eclipse.swt.widgets.Composite;
28 import org.eclipse.swt.widgets.Control;
29
30 import eu.etaxonomy.cdm.api.service.ITermService;
31 import eu.etaxonomy.cdm.api.service.IVocabularyService;
32 import eu.etaxonomy.cdm.model.metadata.CdmPreference;
33 import eu.etaxonomy.cdm.model.metadata.IPreferencePredicate;
34 import eu.etaxonomy.cdm.model.metadata.PreferencePredicate;
35 import eu.etaxonomy.cdm.model.term.DefinedTermBase;
36 import eu.etaxonomy.cdm.model.term.TermType;
37 import eu.etaxonomy.cdm.model.term.TermVocabulary;
38 import eu.etaxonomy.cdm.persistence.dto.AbstractTermDto;
39 import eu.etaxonomy.cdm.persistence.dto.TermDto;
40 import eu.etaxonomy.cdm.persistence.dto.TermVocabularyDto;
41 import eu.etaxonomy.taxeditor.editor.definedterm.DefinedTermSorter;
42 import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoContentProvider;
43 import eu.etaxonomy.taxeditor.editor.definedterm.TermDtoLabelProvider;
44 import eu.etaxonomy.taxeditor.l10n.Messages;
45 import eu.etaxonomy.taxeditor.preference.menu.CdmPreferencePage;
46 import eu.etaxonomy.taxeditor.preference.wizard.CheckBoxTreeComposite;
47 import eu.etaxonomy.taxeditor.store.CdmStore;
48
49 /**
50 * @author k.luther
51 * @since 05.06.2019
52 *
53 */
54 abstract public class GeneralTermPreference extends CdmPreferencePage implements ISelectionChangedListener, SelectionListener{
55 protected CheckBoxTreeComposite treeComposite;
56 protected List<TermVocabularyDto> vocabularies = new ArrayList<>();
57 protected Combo useLocalOrAdmin ;
58
59 protected boolean isOverride;
60 protected boolean allowOverride;
61 protected CdmPreference pref;
62 protected IPreferencePredicate predicate;
63
64
65 public GeneralTermPreference(){
66 super();
67
68 }
69
70 public boolean isLocalPref() {
71 return !isAdminPreference;
72 }
73
74
75 protected TermType type;
76
77 public List<TermVocabularyDto> getVocabularies() {
78 return vocabularies;
79 }
80
81 public void setVocabularies(List<TermVocabularyDto> vocabularies) {
82 this.vocabularies = vocabularies;
83 }
84
85 public IPreferencePredicate getPredicate() {
86 return predicate;
87 }
88
89 public void setPredicate(PreferencePredicate predicate) {
90 this.predicate = predicate;
91 }
92
93 /**
94 * {@inheritDoc}
95 */
96 @Override
97 protected Control createContents(Composite parent) {
98 Composite container = new Composite(parent, SWT.NULL);
99 getPreferenceValues();
100 if (isLocalPref() && !allowOverride){
101 final CLabel description = new CLabel(parent, SWT.NULL);
102 description.setText(Messages.NameDetailsViewConfiguration_description_not_available);
103 this.setDefaultButtonActivated(false);
104 return parent;
105
106 }
107 final GridLayout gridLayout = new GridLayout();
108 gridLayout.numColumns = 2;
109 container.setLayout(gridLayout);
110 parent.setLayout(new GridLayout());
111 useLocalOrAdmin = new Combo(parent, SWT.BORDER | SWT.READ_ONLY);
112 if (!isAdminPreference){
113 useLocalOrAdmin.add(LocalOrDefaultEnum.Default.getLabel(), 0);
114 useLocalOrAdmin.add(LocalOrDefaultEnum.Local.getLabel(), 1);
115
116 }else{
117 useLocalOrAdmin.add(LocalOrDefaultEnum.AllowOverride.getLabel(), 0);
118 useLocalOrAdmin.add(LocalOrDefaultEnum.Database.getLabel(), 1);
119 }
120
121
122 treeComposite = new CheckBoxTreeComposite(container, new TermDtoContentProvider(), new TermDtoLabelProvider(), SWT.NONE);
123 treeComposite.getViewer().setComparator(new DefinedTermSorter());
124 rememberCheckedValues(getCheckedValuesFromPreferences());
125
126 if (isLocalPref()){
127 if (isOverride){
128 useLocalOrAdmin.select(1);
129 }else{
130 useLocalOrAdmin.select(0);
131 treeComposite.setEnabled(false);
132 }
133 }else{
134 if (allowOverride){
135 useLocalOrAdmin.select(0);
136 }else{
137 useLocalOrAdmin.select(1);
138 }
139 }
140 useLocalOrAdmin.addSelectionListener(this);
141
142 GridData data = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
143 data.heightHint = 300;
144 treeComposite.setLayoutData(data);
145 treeComposite.getViewer().addSelectionChangedListener(this);
146
147 return container;
148
149 }
150
151 public String getCheckedValuesFromPreferences(){
152 String values;
153 if (!isAdminPreference && isOverride){
154 values = PreferencesUtil.getStringValue(predicate.getKey(), true);
155 }else{
156 values = pref != null ?pref.getValue(): null;
157 }
158 return values;
159 }
160
161 protected void rememberCheckedValues(String checkedValues) {
162 initialiseVocabularies();
163 treeComposite.getViewer().getTree().deselectAll();
164 treeComposite.getViewer().refresh();
165 treeComposite.getViewer().setInput(getVocabularies());
166
167 if (checkedValues != null && checkedValues != "") { //$NON-NLS-1$
168 String[] listChecked = checkedValues.split(";"); //$NON-NLS-1$
169 String[] listCheckedComma = checkedValues.split(","); //$NON-NLS-1$
170 List<String> checked = new ArrayList<>();
171 if (listChecked != null ){
172 checked = Arrays.asList(listChecked);
173 }
174 if (listCheckedComma != null && checkedValues.contains(",")){ //$NON-NLS-1$
175 checked = Arrays.asList(listCheckedComma);
176 }
177 List<AbstractTermDto> termsFromStringValues = getTermsFromStringValues(checked);
178 treeComposite.setCheckedElements(termsFromStringValues.toArray());
179
180 }else{
181 List<AbstractTermDto> termsFromStringValues = getTermsFromStringValues(new ArrayList<String>());
182 treeComposite.setCheckedElements(termsFromStringValues.toArray());
183 treeComposite.getViewer().refresh();
184 treeComposite.redraw();
185
186 }
187 }
188
189 protected List<AbstractTermDto> getTermsFromStringValues(List<String> listValue) {
190 List<AbstractTermDto> termlist = new ArrayList<>();
191 ITermService termService = CdmStore.getService(ITermService.class);
192 for (String s : listValue) {
193 if (!StringUtils.isBlank(s)){
194 UUID uuid = UUID.fromString(s);
195
196 DefinedTermBase definedTermBase = termService.load(uuid);
197 if(definedTermBase != null){
198 termlist.add(TermDto.fromTerm(definedTermBase, true));
199 }else{
200 IVocabularyService vocabularyService = CdmStore.getService(IVocabularyService.class);
201 TermVocabulary termVocabulary = vocabularyService.load(uuid);
202 if (termVocabulary != null){
203 termlist.add(new TermVocabularyDto(uuid, termVocabulary.getRepresentations(), termVocabulary.getTermType()));
204 }
205 }
206 }
207 }
208 if (listValue.isEmpty()){
209 List<DefinedTermBase> terms = CdmStore.getTermManager().getAllTerms(type, null);
210 for (DefinedTermBase term: terms){
211 if (!(term instanceof eu.etaxonomy.cdm.model.description.Character) && term != null){
212 termlist.add(TermDto.fromTerm(term, true));
213 }
214 }
215 }
216
217 return termlist;
218 }
219
220 protected void initialiseVocabularies() {
221 if (getVocabularies() != null) {
222 getVocabularies().clear();
223 }
224 List<TermVocabularyDto> vocs = new ArrayList<>();
225 vocs = CdmStore.getService(IVocabularyService.class).findVocabularyDtoByTermType(type);
226
227 setVocabularies(vocs);
228 }
229
230 protected void getPreferenceValues(){
231 pref = PreferencesUtil.getPreferenceFromDB(predicate);
232 this.allowOverride = pref!= null?pref.isAllowOverride():true;
233 this.isOverride = PreferencesUtil.getBooleanValue(PreferencesUtil.createOverridePreferenceString(predicate.getKey()));
234 if (pref == null){
235 pref = CdmPreference.NewTaxEditorInstance(predicate, null);
236 }
237 }
238
239 /**
240 * {@inheritDoc}
241 */
242 @Override
243 public void selectionChanged(SelectionChangedEvent event) {
244 this.setApply(true);
245 }
246
247 /**
248 * {@inheritDoc}
249 */
250 @Override
251 public void widgetSelected(SelectionEvent e) {
252 if (e.getSource().equals(useLocalOrAdmin)){
253 if (useLocalOrAdmin.getText().equals(LocalOrDefaultEnum.Default.getLabel())){
254 rememberCheckedValues(getCheckedValuesFromPreferences());
255 treeComposite.setEnabled(false);
256 }else{
257 treeComposite.setEnabled(true);
258 }
259 }
260 this.setApply(true);
261 }
262
263 /**
264 * {@inheritDoc}
265 */
266 @Override
267 public void widgetDefaultSelected(SelectionEvent e) {
268 // TODO Auto-generated method stub
269
270 }
271
272 @Override
273 protected void performDefaults(){
274 if (!isLocalPref()){
275 rememberCheckedValues("");
276 treeComposite.setEnabled(true);
277 }else{
278 isOverride = false;
279 rememberCheckedValues(getCheckedValuesFromPreferences());
280 treeComposite.setEnabled(false);
281 }
282 pref = null;
283 useLocalOrAdmin.select(0);
284
285 setApply(true);
286 super.performDefaults();
287
288 }
289
290 @Override
291 public boolean performOk() {
292 if (!isApply()){
293 return true;
294 }
295 Object[] checkedElements = treeComposite.getViewer().getCheckedElements();
296 List<UUID> listUIIDChecked = new ArrayList<>();
297 Collection<TermDto> preferredTermDtos = new ArrayList<>();
298 List<DefinedTermBase> preferredTerms = new ArrayList<>();
299 for (Object o : checkedElements) {
300 if(o instanceof TermDto){
301 TermDto termDto = (TermDto) o;
302 listUIIDChecked.add(termDto.getUuid());
303 preferredTermDtos.add(termDto);
304 if (vocabularies.size() > 1){
305 preferredTerms.add(CdmStore.getService(ITermService.class).load(termDto.getUuid()));
306 }
307
308 }
309 }
310 String saveCheckedElements = StringUtils.join(listUIIDChecked, ";"); //$NON-NLS-1$
311
312 PreferencesUtil.setStringValue(predicate.getKey(), saveCheckedElements);
313 String text = this.useLocalOrAdmin.getText();
314 if (text.equals(LocalOrDefaultEnum.Database.getLabel()) || text.equals(LocalOrDefaultEnum.Default.getLabel())){
315 PreferencesUtil.setBooleanValue(PreferencesUtil.createOverridePreferenceString(predicate.getKey()), false);
316 }else if (text.equals(LocalOrDefaultEnum.Local.getLabel())){
317 PreferencesUtil.setBooleanValue(PreferencesUtil.createOverridePreferenceString(predicate.getKey()), true);
318 }
319 if (type == null){
320 CdmStore.getTermManager().setPreferredTermsByDto(preferredTermDtos, vocabularies.get(0));
321 }else{
322 CdmStore.getTermManager().setPreferredTermsByType(preferredTermDtos, type);
323 }
324 PreferencesUtil.firePreferencesChanged(this.getClass());
325 return true;
326 }
327
328 protected boolean performOkAdmin() {
329 Object[] checkedElements = treeComposite.getViewer().getCheckedElements();
330 List<UUID> listUIIDChecked = new ArrayList<>();
331 List<DefinedTermBase> preferredTerms = new ArrayList<>();
332 for (Object o : checkedElements) {
333 if(o instanceof TermDto){
334 TermDto termDto = (TermDto) o;
335 listUIIDChecked.add(termDto.getUuid());
336 preferredTerms.add(CdmStore.getService(ITermService.class).load(termDto.getUuid()));
337 }
338 }
339 String saveCheckedElements = StringUtils.join(listUIIDChecked, ";"); //$NON-NLS-1$
340 if (StringUtils.isBlank(saveCheckedElements)){
341 saveCheckedElements = null;
342 }
343 CdmPreference savePref = CdmPreference.NewTaxEditorInstance(predicate, saveCheckedElements);
344 String text = this.useLocalOrAdmin.getText();
345 if (text.equals(LocalOrDefaultEnum.Database.getLabel()) ){
346 savePref.setAllowOverride(false);
347 }else if (text.equals(LocalOrDefaultEnum.AllowOverride.getLabel())){
348 savePref.setAllowOverride(true);
349 }
350
351 PreferencesUtil.setPreferenceToDB(savePref);
352 PreferencesUtil.updateDBPreferences();
353 PreferencesUtil.firePreferencesChanged(this.getClass());
354 return true;
355 }
356
357 }