View Javadoc

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 			try {
169 				EPCryptoProviderManager.getTerminals();
170 			} catch (CardException e) {
171 				log.error(e.getLocalizedMessage(),e);
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 		 * We set up a dummy model to initialize tree heararchy.
194 		 * In a real code, you will connect to a real model and
195 		 * expose its hierarchy.
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 	 * The constructor.
218 	 */
219 	public CryptoProvidersView() {
220 	}
221 
222 	/**
223 	 * This is a callback that will allow us
224 	 * to create the viewer and initialize it.
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 		//manager.add(new Separator());
270 		manager.add(refreshAction);
271 		//drillDownAdapter.addNavigationActions(manager);
272 		// Other plug-ins can contribute there actions here
273 		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
274 		
275 		//manager.add(new Separator());
276         //manager.add(propertyAction);
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 	 * Passing the focus request to the viewer's control.
323 	 */
324 	public void setFocus() {
325 		viewer.getControl().setFocus();
326 	}
327 	
328 	/*
329 	 *   IActionBars bars = getViewSite().getActionBars();
330      *   IStatusLineManager statusLine = bars.getStatusLineManager();
331      *  IProgressMonitor pm = statusLine.getProgressMonitor();
332      */
333 	public void refreshView() {
334 		//refresh the view
335 		if (viewer!=null)
336 			viewer.refresh();
337 	}
338 
339 }