/******************************************************************************* * Copyright (c) 2011 Subgraph. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Subgraph - initial API and implementation ******************************************************************************/ package com.subgraph.vega.ui.scanner.alerts; import java.util.Date; import java.util.logging.Logger; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.part.ViewPart; import com.subgraph.vega.api.events.IEvent; import com.subgraph.vega.api.events.IEventHandler; import com.subgraph.vega.api.model.IModel; import com.subgraph.vega.api.model.IWorkspace; import com.subgraph.vega.api.model.WorkspaceCloseEvent; import com.subgraph.vega.api.model.WorkspaceOpenEvent; import com.subgraph.vega.api.model.WorkspaceResetEvent; import com.subgraph.vega.api.model.alerts.IScanAlertRepository; import com.subgraph.vega.ui.scanner.Activator; import com.subgraph.vega.ui.scanner.alerts.tree.AlertScanNode; import com.subgraph.vega.ui.scanner.alerts.tree.AlertSeverityNode; public class ScanAlertView extends ViewPart implements IDoubleClickListener { public final static String ID = "com.subgraph.vega.views.alert"; private final Logger logger = Logger.getLogger("scan-alert-view"); private TreeViewer viewer; private IWorkspace currentWorkspace; @Override public void createPartControl(Composite parent) { viewer = new TreeViewer(parent); viewer.setContentProvider(new AlertTreeContentProvider()); viewer.setLabelProvider(new AlertTreeLabelProvider()); viewer.addDoubleClickListener(this); viewer.setSorter(new ViewerSorter() { @Override public int compare(Viewer viewer, Object e1, Object e2) { final int cat1 = category(e1); final int cat2 = category(e2); if(cat1 != cat2) { return cat1 - cat2; } if((e1 instanceof AlertScanNode) && (e2 instanceof AlertScanNode)) { return compareAlertNodes((AlertScanNode)e1, (AlertScanNode)e2); } else if((e1 instanceof AlertSeverityNode) && (e2 instanceof AlertSeverityNode)) { final AlertSeverityNode asn1 = (AlertSeverityNode) e1; final AlertSeverityNode asn2 = (AlertSeverityNode) e2; return asn2.getSeverityIndex() - asn1.getSeverityIndex(); } else { return super.compare(viewer, e1, e2); } } @Override public int category(Object element) { if(element instanceof AlertScanNode) { return (((AlertScanNode) element).getScanId() == IScanAlertRepository.PROXY_ALERT_ORIGIN_SCAN_ID) ? (0) : (1); } return 0; } }); getSite().setSelectionProvider(viewer); final IModel model = Activator.getDefault().getModel(); if(model == null) { logger.warning("Failed to obtain reference to model"); return; } currentWorkspace = model.addWorkspaceListener(new IEventHandler() { @Override public void handleEvent(IEvent event) { if(event instanceof WorkspaceOpenEvent) handleWorkspaceOpen((WorkspaceOpenEvent) event); else if(event instanceof WorkspaceCloseEvent) handleWorkspaceClose((WorkspaceCloseEvent) event); else if(event instanceof WorkspaceResetEvent) handleWorkspaceReset((WorkspaceResetEvent) event); } }); if(currentWorkspace != null) { viewer.setInput(currentWorkspace); selectFirstScan(); } } private int compareAlertNodes(AlertScanNode n1, AlertScanNode n2) { if((n1.getScanInstance() == null) || (n2.getScanInstance() == null)) { return (int) (n1.getScanId() - n2.getScanId()); } else { final Date d1 = n1.getScanInstance().getStartTime(); final Date d2 = n2.getScanInstance().getStartTime(); if(d1 == null || d2 == null) { return 0; } return (d1.getTime() < d2.getTime()) ? (1) : (-1); } } private void selectFirstScan() { if(viewer.getTree().getItemCount() > 0) { final TreeItem item = viewer.getTree().getItem(0); viewer.setSelection(new StructuredSelection(item.getData())); } } private void handleWorkspaceOpen(WorkspaceOpenEvent event) { viewer.setInput(event.getWorkspace()); selectFirstScan(); } private void handleWorkspaceClose(WorkspaceCloseEvent event) { viewer.setInput(null); } private void handleWorkspaceReset(WorkspaceResetEvent event) { viewer.setInput(null); viewer.setInput(event.getWorkspace()); selectFirstScan(); } @Override public void setFocus() { viewer.getTree().setFocus(); } @Override public void doubleClick(DoubleClickEvent event) { final IStructuredSelection selection = (IStructuredSelection) event.getSelection(); final Object element = selection.getFirstElement(); if(viewer.isExpandable(element)) { viewer.setExpandedState(element, !viewer.getExpandedState(element)); } } }