ref #9359 upgrade TaxEditor to log4j2
[taxeditor.git] / eu.etaxonomy.taxeditor.workbench / src / main / java / eu / etaxonomy / taxeditor / workbench / handler / OpenAdminPreferencesHandler.java
1 // $Id$
2 /**
3 * Copyright (C) 2018 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 package eu.etaxonomy.taxeditor.workbench.handler;
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.Comparator;
14 import java.util.HashMap;
15 import java.util.Iterator;
16 import java.util.List;
17 import java.util.Map;
18
19 import javax.inject.Named;
20
21 import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;
22 import org.eclipse.core.runtime.CoreException;
23 import org.eclipse.core.runtime.IConfigurationElement;
24 import org.eclipse.core.runtime.IExtensionRegistry;
25 import org.eclipse.core.runtime.Platform;
26 import org.eclipse.e4.core.di.annotations.CanExecute;
27 import org.eclipse.e4.core.di.annotations.Execute;
28 import org.eclipse.e4.ui.services.IServiceConstants;
29 import org.eclipse.jface.preference.IPreferencePage;
30 import org.eclipse.jface.preference.PreferenceDialog;
31 import org.eclipse.jface.preference.PreferenceManager;
32 import org.eclipse.jface.preference.PreferenceNode;
33 import org.eclipse.swt.widgets.Shell;
34
35
36 /**
37 * Scans all extension for extension point <code>eu.etaxonomy.taxeditor.store.preferencePage</code> and
38 * creates the tree of preference nodes according to the <code>category</code> attribute of the
39 * extension point.<br>
40 * <b>Note:</b> If, for a given category, no parent node can be found then this page will not be
41 * added to the preferences
42 * @author pplitzner/k.luther
43 * @date 14.03.2018
44 *
45 */
46 public class OpenAdminPreferencesHandler {
47
48 private static final String ATT_NAME = "name"; //$NON-NLS-1$
49 private static final String ATT_ID = "id"; //$NON-NLS-1$
50 private static final String ATT_CATEGORY = "category"; //$NON-NLS-1$
51 private static final String ATT_CLASS = "class"; //$NON-NLS-1$
52 private static final String EXTENSION_ELEMENT_PAGE = "page"; //$NON-NLS-1$
53 private static final String EXTENSION_POINT_ID = "eu.etaxonomy.taxeditor.store.adminPreferencePage"; //$NON-NLS-1$
54 private Logger logger = LogManager.getLogger(OpenAdminPreferencesHandler.class);
55
56 @Execute
57 public void execute(@Named(IServiceConstants.ACTIVE_SHELL)Shell shell) {
58 List<PageWrapper> pagesYetToBeAdded = new ArrayList<>();
59 List<PageWrapper> rootPages = new ArrayList<>();
60 Map<String, PreferenceNode> idToNodeMap = new HashMap<>();
61
62 PreferenceManager manager = new PreferenceManager('/');
63
64 IExtensionRegistry reg = Platform.getExtensionRegistry();
65 IConfigurationElement[] extensions = reg
66 .getConfigurationElementsFor(EXTENSION_POINT_ID); //$NON-NLS-1$
67 for (IConfigurationElement configElement : extensions) {
68 if(configElement.getName().equals(EXTENSION_ELEMENT_PAGE)){ //$NON-NLS-1$
69 Object o;
70 try {
71 o = configElement.createExecutableExtension(ATT_CLASS);
72 if(o instanceof IPreferencePage){
73 IPreferencePage page = (IPreferencePage) o;
74 String category = configElement.getAttribute(ATT_CATEGORY);
75 String id = configElement.getAttribute(ATT_ID);
76 String name = configElement.getAttribute(ATT_NAME);
77
78 page.setTitle(name);
79 //add all root nodes
80 if(category==null){
81 rootPages.add(new PageWrapper(page, category, id, name));
82 }
83 //child nodes will be handled later
84 else{
85 pagesYetToBeAdded.add(new PageWrapper(page, category, id, name));
86 }
87 }
88 } catch (CoreException e) {
89 logger.error(String.format("Failed to initialize preference page for config element: %s", configElement), e); //$NON-NLS-1$
90 }
91 }
92 }
93
94 //sort root nodes
95 Collections.sort(rootPages, new PreferenceNodeComparator());
96 //add root nodes
97 rootPages.forEach(pageWrapper->{
98 PreferenceNode node = new PreferenceNode(pageWrapper.id, pageWrapper.page);
99 manager.addToRoot(node);
100 idToNodeMap.put(pageWrapper.id, node);
101 });
102
103 //sort child nodes
104 Collections.sort(pagesYetToBeAdded, new PreferenceNodeComparator());
105 //add child nodes
106 int size = pagesYetToBeAdded.size();
107 while(!pagesYetToBeAdded.isEmpty()){
108
109 Iterator<PageWrapper> iterator = pagesYetToBeAdded.iterator();
110 while(iterator.hasNext()){
111 PageWrapper pageWrapper = iterator.next();
112 if(addPage(pageWrapper, idToNodeMap)){
113 iterator.remove();
114 }
115 }
116 if(size==pagesYetToBeAdded.size()){
117 //avoid potential endless loop
118 break;
119 }
120 size = pagesYetToBeAdded.size();
121 }
122 PreferenceDialog dialog = new PreferenceDialog(shell, manager);
123 dialog.create();
124 dialog.open();
125 }
126
127 @CanExecute
128 public boolean canExecute()
129 {
130 return true;
131 }
132
133
134 private boolean addPage(PageWrapper pageWrapper, Map<String, PreferenceNode> idToNodeMap){
135 PreferenceNode node = new PreferenceNode(pageWrapper.id, pageWrapper.page);
136 PreferenceNode parent = idToNodeMap.get(pageWrapper.category);
137 if(parent!=null){
138 idToNodeMap.put(pageWrapper.id, node);
139 parent.add(node);
140 return true;
141 }
142 return false;
143 }
144
145 private class PreferenceNodeComparator implements Comparator<PageWrapper>{
146 @Override
147 public int compare(PageWrapper o1, PageWrapper o2) {
148 return o1.name.compareTo(o2.name);
149 }
150 }
151
152 private class PageWrapper{
153 IPreferencePage page;
154 String category;
155 String id;
156 String name;
157 public PageWrapper(IPreferencePage page, String category, String id, String name) {
158 super();
159 this.page = page;
160 this.category = category;
161 this.id = id;
162 this.name = name;
163 }
164 }
165 }
166
167