1 package org.eparapher.rcp.views;
2
3 import java.security.Provider;
4 import java.security.Security;
5 import java.security.Provider.Service;
6 import java.util.ArrayList;
7 import java.util.Set;
8
9 import org.apache.log4j.Logger;
10 import org.eclipse.core.runtime.IAdaptable;
11 import org.eclipse.jface.action.Action;
12 import org.eclipse.jface.action.IMenuListener;
13 import org.eclipse.jface.action.IMenuManager;
14 import org.eclipse.jface.action.IToolBarManager;
15 import org.eclipse.jface.action.MenuManager;
16 import org.eclipse.jface.action.Separator;
17 import org.eclipse.jface.viewers.DoubleClickEvent;
18 import org.eclipse.jface.viewers.IDoubleClickListener;
19 import org.eclipse.jface.viewers.IStructuredContentProvider;
20 import org.eclipse.jface.viewers.IStructuredSelection;
21 import org.eclipse.jface.viewers.ITreeContentProvider;
22 import org.eclipse.jface.viewers.LabelProvider;
23 import org.eclipse.jface.viewers.TreeViewer;
24 import org.eclipse.jface.viewers.Viewer;
25 import org.eclipse.jface.viewers.ViewerSorter;
26 import org.eclipse.swt.SWT;
27 import org.eclipse.swt.graphics.Image;
28 import org.eclipse.swt.widgets.Composite;
29 import org.eclipse.swt.widgets.Menu;
30 import org.eclipse.ui.IActionBars;
31 import org.eclipse.ui.IWorkbenchActionConstants;
32 import org.eclipse.ui.dialogs.PropertyDialogAction;
33 import org.eclipse.ui.part.DrillDownAdapter;
34 import org.eclipse.ui.part.ViewPart;
35 import org.eparapher.core.EParapherManager;
36 import org.eparapher.rcp.tools.GUIIcons;
37
38 public class CryptoProvidersView extends ViewPart {
39
40 public static final String ID = "org.eparapher.rcp.views.CryptoProvidersView";
41 private static Logger log = Logger.getLogger(CryptoProvidersView.class);
42
43 private TreeViewer viewer;
44 private DrillDownAdapter drillDownAdapter;
45
46 private Action refreshAction;
47
48 private Action doubleClickAction;
49
50 private Action propertyAction;
51
52 public class TreeObject implements IAdaptable {
53
54 protected Service serv;
55
56 private TreeParent parent;
57
58 public TreeObject(Service name) {
59 this.serv = name;
60 }
61 public String getName() {
62 return toString();
63 }
64 public void setParent(TreeParent parent) {
65 this.parent = parent;
66 }
67 public TreeParent getParent() {
68 return parent;
69 }
70 public Service getService() {
71 return serv;
72 }
73 public String toString() {
74 return serv.getType() + " - " +serv.getAlgorithm();
75 }
76 public Object getAdapter(Class key) {
77 return null;
78 }
79 }
80
81 public class TreeParent extends TreeObject {
82
83 private ArrayList<TreeObject> children;
84
85 protected Provider prov;
86 protected int order;
87 protected String serviceType;
88
89 public TreeParent(Provider p, int i) {
90 super(null);
91 children = new ArrayList<TreeObject>();
92 prov = p;
93 order = i;
94 serviceType=null;
95 }
96
97 public TreeParent(Provider p, String srvType) {
98 super(null);
99 prov = p;
100 serviceType = srvType;
101 children = new ArrayList<TreeObject>();
102 }
103
104 public void addChild(TreeObject child) {
105 children.add(child);
106 child.setParent(this);
107 }
108 public void removeChild(TreeObject child) {
109 children.remove(child);
110 child.setParent(null);
111 }
112 public TreeObject [] getChildren() {
113 return (TreeObject [])children.toArray(new TreeObject[children.size()]);
114 }
115 public Provider getProvider() {
116 return this.prov;
117 }
118 public boolean hasChildren() {
119 return children.size()>0;
120 }
121 public String toString() {
122 if (serviceType == null)
123 return "n°" + order + " - " + prov.getName() + " - " + prov.getVersion();
124 else
125 return serviceType;
126 }
127 }
128
129 class ViewLabelProvider extends LabelProvider {
130
131 public String getText(Object obj) {
132 return obj.toString();
133 }
134 public Image getImage(Object obj) {
135 if (obj instanceof TreeParent) {
136 return GUIIcons.FILE_ICON_ENC;
137 } else {
138 return GUIIcons.INFO_ICON_IMAGE;
139 }
140 }
141 }
142
143 class NameSorter extends ViewerSorter {
144 }
145
146 class DocViewContentProvider implements IStructuredContentProvider, ITreeContentProvider {
147
148 private TreeParent invisibleRoot;
149
150 public void inputChanged(Viewer v, Object oldInput, Object newInput) {
151 }
152 public void dispose() {
153 }
154 public Object[] getElements(Object parent) {
155 if (parent.equals(getViewSite())) {
156 if ( invisibleRoot==null )
157 initialize();
158 else refresh();
159 return getChildren(invisibleRoot);
160 }
161 return getChildren(parent);
162 }
163
164 private void refresh() {
165 log.debug("Reloading Java Security Providers");
166 initialize();
167
168
169
170
171
172
173
174 }
175 public Object getParent(Object child) {
176 if (child instanceof TreeObject) {
177 return ((TreeObject)child).getParent();
178 }
179 return null;
180 }
181 public Object [] getChildren(Object parent) {
182 if (parent instanceof TreeParent) {
183 return ((TreeParent)parent).getChildren();
184 }
185 return new Object[0];
186 }
187 public boolean hasChildren(Object parent) {
188 if (parent instanceof TreeParent)
189 return ((TreeParent)parent).hasChildren();
190 return false;
191 }
192
193
194
195
196
197 private void initialize() {
198
199 invisibleRoot = new TreeParent(null,0);
200
201 Provider[] providers = Security.getProviders();
202 for (int i= 0; i< providers.length; i++) {
203 Provider prov = providers[i];
204 TreeParent tp = new TreeParent(prov,i+1);
205 invisibleRoot.addChild(tp);
206
207 Set<Service> services = prov.getServices();
208 for (Service service : services) {
209 TreeObject to = new TreeObject(service);
210 tp.addChild(to);
211 }
212 }
213 }
214 }
215
216
217
218
219 public CryptoProvidersView() {
220 }
221
222
223
224
225
226 public void createPartControl(Composite parent) {
227 viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
228 drillDownAdapter = new DrillDownAdapter(viewer);
229 viewer.setContentProvider(new DocViewContentProvider());
230 viewer.setLabelProvider(new ViewLabelProvider());
231 viewer.setSorter(new NameSorter());
232 viewer.setInput(getViewSite());
233 makeActions();
234 hookContextMenu();
235 hookDoubleClickAction();
236 contributeToActionBars();
237 }
238
239 private void hookContextMenu() {
240 MenuManager menuMgr = new MenuManager("#PopupMenu");
241 menuMgr.setRemoveAllWhenShown(true);
242 menuMgr.addMenuListener(new IMenuListener() {
243 public void menuAboutToShow(IMenuManager manager) {
244 CryptoProvidersView.this.fillContextMenu(manager);
245 }
246 });
247 Menu menu = menuMgr.createContextMenu(viewer.getControl());
248 viewer.getControl().setMenu(menu);
249 getSite().registerContextMenu(menuMgr, viewer);
250 }
251
252 private void contributeToActionBars() {
253 IActionBars bars = getViewSite().getActionBars();
254 fillLocalPullDown(bars.getMenuManager());
255 fillLocalToolBar(bars.getToolBarManager());
256 }
257
258 private void fillLocalToolBar(IToolBarManager manager) {
259 manager.add(refreshAction);
260 manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
261 drillDownAdapter.addNavigationActions(manager);
262 }
263
264 private void fillLocalPullDown(IMenuManager manager) {
265 }
266
267 private void fillContextMenu(IMenuManager manager) {
268
269
270 manager.add(refreshAction);
271
272
273 manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
274
275
276
277
278 }
279
280 private void makeActions() {
281
282 refreshAction = new Action() {
283 public void run() {viewer.refresh();}
284 };
285 refreshAction.setText("Re&fresh");
286 refreshAction.setToolTipText("Refresh the Tree for added/removed files");
287 refreshAction.setImageDescriptor(GUIIcons.REFRESH_ICON);
288 refreshAction.setAccelerator(SWT.F5);
289
290 propertyAction = new PropertyDialogAction(getSite(), viewer);
291 propertyAction.setImageDescriptor(GUIIcons.INFO_ICON);
292
293 doubleClickAction = new Action() {
294 public void run() {
295 TreeObject to = (TreeObject) ((IStructuredSelection) viewer.getSelection()).getFirstElement();
296 if (to instanceof TreeParent) {
297 TreeParent tp = (TreeParent) to;
298 Provider prov = tp.getProvider();
299 String msg = prov.getInfo();
300 EParapherManager.getInstance().getUI().infoMessage(msg);
301 } else {
302 Service srv = to.getService();
303 String msg = "Security Provider : " + srv.getProvider();
304 msg += "\r\n Type : " + srv.getType();
305 msg += "\r\n Algorithm : " + srv.getAlgorithm();
306 msg += "\r\n Class : " + srv.getClassName();
307 EParapherManager.getInstance().getUI().infoMessage(msg);
308 }
309 }
310 };
311 }
312
313 private void hookDoubleClickAction() {
314 viewer.addDoubleClickListener(new IDoubleClickListener() {
315 public void doubleClick(DoubleClickEvent event) {
316 doubleClickAction.run();
317 }
318 });
319 }
320
321
322
323
324 public void setFocus() {
325 viewer.getControl().setFocus();
326 }
327
328
329
330
331
332
333 public void refreshView() {
334
335 if (viewer!=null)
336 viewer.refresh();
337 }
338
339 }