com.kdmanalytics.toif.report.internal.views.ReportView.java Source code

Java tutorial

Introduction

Here is the source code for com.kdmanalytics.toif.report.internal.views.ReportView.java

Source

/*******************************************************************************
 * Copyright (c) 2012 KDM Analytics, Inc. All rights reserved. This program and
 * the accompanying materials are made available under the terms of the Open
 * Source Initiative OSI - Open Software License v3.0 which accompanies this
 * distribution, and is available at
 * http://www.opensource.org/licenses/osl-3.0.php/
 ******************************************************************************/

package com.kdmanalytics.toif.report.internal.views;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.part.ViewPart;

import com.kdmanalytics.toif.report.internal.filters.TermFilter;
import com.kdmanalytics.toif.report.internal.listeners.ReportDoubleClickListener;
import com.kdmanalytics.toif.report.internal.providers.ReportContentProvider;
import com.kdmanalytics.toif.report.internal.providers.ReportStyledCellLabelProvider;
import com.kdmanalytics.toif.report.items.IToifProject;

/**
 * the report view.
 * 
 * @author Adam Nunn <adam@kdmanalytics.com>
 * @author Kyle Girard <kyle@kdmanalytics.com>
 * 
 */
public class ReportView extends ViewPart {

    public static final String VIEW_ID = "com.kdmanalytics.toif.report.view";

    private enum Mode {
        Table, None,
    }

    private Composite parent;

    private PageBook pageBook;

    private PageBook viewerBook;

    private Map<Mode, ColumnViewer> viewers;

    /**
     * currently only table view.
     */
    private Mode currentViewerMode;

    private Composite reportPage;

    private Label numberOfDefects;

    private Label noReportPage;

    private Label emptyViewer;

    private IToifProject inputProject;

    private TableViewer tableViewer;

    protected IProject currentProject;

    /**
     * selection changed listener. looks for selection of project to reload toif
     * data.
     */
    ISelectionListener selectionListener = new ISelectionListener() {

        public void selectionChanged(IWorkbenchPart part, ISelection sel) {

            IProject newProject = null;

            if (sel instanceof IStructuredSelection) {

                for (Object object : ((IStructuredSelection) sel).toArray()) {
                    if (object instanceof IProject) {
                        newProject = (IProject) object;

                        if (currentProject == newProject) {
                            return;
                        } else {
                            currentProject = newProject;
                        }
                    }
                }

                if (newProject == null) {
                    return;
                }

                if (newProject != null) {
                    persistData();
                    File file = new File(newProject.getLocation() + "/.toifProject.ser");

                    if (!file.exists()) {
                        pageBook.showPage(noReportPage);
                        return;
                    }

                    try {
                        FileInputStream fileIn = new FileInputStream(file);
                        ObjectInputStream in = new ObjectInputStream(fileIn);
                        IToifProject project = (IToifProject) in.readObject();
                        in.close();
                        fileIn.close();

                        if (project != null) {
                            System.out.println("toif project deserialized");
                            // view.getTableViewer().setInput(project);

                            IFolder repoFolder = ensureKdmRepoFolderExists(newProject);
                            project.setRepository(repoFolder);
                            project.setIProject(repoFolder.getProject());
                            // project.setIProject(iProject.getLocation());

                            clearInput();
                            updateInput(project);
                            refresh();
                            return;
                        }
                    } catch (IOException i) {
                        System.out.println("problem with serialization file.");
                        i.printStackTrace();
                        // return;
                    } catch (ClassNotFoundException c) {
                        System.out.println("IToifProject class not found.");
                        c.printStackTrace();
                        // return;
                    } catch (CoreException e) {
                        System.out.println("repo folder could not be found.");
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
        }
    };

    /**
     * makes sure that the kdm repository folder does exist.
     * 
     * @param project
     *            the kdm project
     * @throws CoreException
     */
    private static IFolder ensureKdmRepoFolderExists(final IProject project) throws CoreException {
        IFolder kdmDataDir = project.getFolder(".KDM");
        if (!kdmDataDir.exists()) {
            kdmDataDir.create(true, true, null);
        }

        IFolder kdmRepoDir = kdmDataDir.getFolder("repository");
        if (!kdmRepoDir.exists()) {
            kdmRepoDir.create(true, true, null);
        }
        return kdmRepoDir;
    }

    public ReportView() {
        parent = null;
        pageBook = null;
        reportPage = null;
        viewers = null;
        currentViewerMode = Mode.None;
    }

    protected void persistData() {
        // ReportContentProvider cp = (ReportContentProvider)
        // tableViewer.getContentProvider();
        //
        // IToifProject project = cp.getProject();

        if (inputProject == null) {
            System.out.println("no project to save.");
            return;
        }

        if (inputProject.getIProject().getLocation() == null) {
            System.out.println("no project to save.");
            return;
        }

        File serFile = new File(inputProject.getIProject().getLocation() + "/.toifProject.ser");
        serFile.delete();

        try {
            serFile.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            FileOutputStream fileOut = new FileOutputStream(serFile);
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(inputProject);
            out.close();
            fileOut.close();
        } catch (IOException i) {
            i.printStackTrace();
        }

        return;

    }

    @Override
    public void createPartControl(Composite container) {
        getSite().getPage().addSelectionListener(selectionListener);
        parent = container;
        pageBook = new PageBook(parent, SWT.NONE);

        // Page 1 no data loaded label
        noReportPage = new Label(pageBook, SWT.TOP + SWT.LEFT + SWT.WRAP);
        noReportPage.setText("No TOIF data available");

        // Page 2 Report Composite
        reportPage = new Composite(pageBook, SWT.NONE);
        reportPage.setLayout(new GridLayout());
        reportPage.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());

        createSearchControl(reportPage);
        numberOfDefects = new Label(reportPage, SWT.NONE);
        numberOfDefects.setText("Number of Defects:");

        createReportViewerControl(reportPage);
        pageBook.showPage(noReportPage);

    }

    public void dispose() {
        persistData();
        System.err.println("DATA PERSISTED");
        getSite().getPage().removeSelectionListener(selectionListener);
    }

    /**
     * deal with the term filter. apply the term filter data to the current
     * view.
     * 
     * @param text
     */
    private void handleTermFilter(Text text) {
        String[] terms = text.getText().split("OR");
        if (text.getText().isEmpty()) {
            List<ViewerFilter> filters = new ArrayList<ViewerFilter>(
                    Arrays.asList(getCurrentViewer().getFilters()));
            for (Iterator<ViewerFilter> i = filters.iterator(); i.hasNext();) {
                ViewerFilter filter = (ViewerFilter) i.next();
                if (filter instanceof TermFilter) {
                    i.remove();
                }
            }
            getCurrentViewer().setFilters(filters.toArray(new ViewerFilter[] {}));
        } else {
            getCurrentViewer().addFilter(new TermFilter(terms));
        }
        text.setMessage("Search for Everything...");
        updateDefectCount();
    }

    /**
     * create the search bar control
     * 
     * @param parent
     * @return
     */
    private Control createSearchControl(Composite parent) {
        GridData ld = new GridData();
        ld.grabExcessHorizontalSpace = true;
        ld.horizontalAlignment = GridData.FILL;

        Composite search = new Composite(parent, SWT.NONE);
        GridLayout layout2 = new GridLayout(2, false);
        search.setLayout(layout2);
        search.setLayoutData(ld);

        // create a label to display information about the view in.
        final Text text = new Text(search, SWT.SINGLE | SWT.BORDER);
        text.setMessage("Search for Everything...");

        text.addListener(SWT.DefaultSelection, new Listener() {

            @Override
            public void handleEvent(Event event) {
                handleTermFilter(text);

            }
        });

        GridData layoutData = new GridData();
        layoutData.grabExcessHorizontalSpace = true;
        layoutData.horizontalAlignment = GridData.FILL;
        text.setLayoutData(layoutData);

        Button button = new Button(search, SWT.BORDER);
        button.setText("Search");
        button.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                handleTermFilter(text);
            }

        });

        return search;
    }

    /**
     * create the control for the viewer.
     * 
     * @param parent
     * @return
     */
    private Control createReportViewerControl(Composite parent) {
        viewerBook = new PageBook(parent, SWT.NONE);
        viewerBook.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).create());
        TableViewer tableViewer = createReportTableViewer(viewerBook);
        tableViewer.addDoubleClickListener(new ReportDoubleClickListener());

        emptyViewer = new Label(viewerBook, SWT.TOP | SWT.LEFT | SWT.WRAP);
        viewers = new EnumMap<ReportView.Mode, ColumnViewer>(Mode.class);
        viewers.put(Mode.Table, tableViewer);
        setReportMode(Mode.Table);
        viewerBook.showPage(tableViewer.getControl());

        return viewerBook;
    }

    /**
     * create the report table.
     * 
     * @param parent
     * @return
     */
    private TableViewer createReportTableViewer(Composite parent) {
        tableViewer = new TableViewer(parent,
                SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
        tableViewer.setContentProvider(new ReportContentProvider());
        tableViewer.setComparator(new ReportViewerComparator());
        Table table = tableViewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        ColumnViewerToolTipSupport.enableFor(tableViewer);

        String[] titles = { "File", "Location", "Tool", "SFP", "CWE", "Trust", "Description" };
        int[] bounds = { 200, 100, 200, 70, 90, 50, 900 };

        // File Column
        TableViewerColumn col = createTableViewerColumn(tableViewer, titles[0], bounds[0], 0, true);
        col.setLabelProvider(new ReportStyledCellLabelProvider());
        // Location Column
        col = createTableViewerColumn(tableViewer, titles[1], bounds[1], 1, true);
        col.setLabelProvider(new ReportStyledCellLabelProvider());

        // Tool Column
        col = createTableViewerColumn(tableViewer, titles[2], bounds[2], 2, true);
        col.setLabelProvider(new ReportStyledCellLabelProvider());

        // SFP Column
        col = createTableViewerColumn(tableViewer, titles[3], bounds[3], 3, true);
        col.setLabelProvider(new ReportStyledCellLabelProvider());

        // CWE Column
        col = createTableViewerColumn(tableViewer, titles[4], bounds[4], 4, true);
        col.setLabelProvider(new ReportStyledCellLabelProvider());

        // Trust Column
        col = createTableViewerColumn(tableViewer, titles[5], bounds[5], 5, true);
        col.setLabelProvider(new ReportStyledCellLabelProvider());

        // Description Column
        col = createTableViewerColumn(tableViewer, titles[6], bounds[6], 6, true);
        col.setLabelProvider(new ReportStyledCellLabelProvider());

        MenuManager menuManager = new MenuManager();
        Menu menu = menuManager.createContextMenu(tableViewer.getTable());

        tableViewer.getTable().setMenu(menu);
        getSite().registerContextMenu(menuManager, tableViewer);

        return tableViewer;
    }

    /**
     * Create treeViewerColumns
     * 
     * @param title
     * @param bound
     * @param colNumber
     * @return
     */
    private TableViewerColumn createTableViewerColumn(TableViewer viewer, final String title, final int bound,
            final int colNumber, boolean enableSorting) {
        TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.LEFT);
        final TableColumn column = viewerColumn.getColumn();
        column.setText(title);
        column.setWidth(bound);
        column.setResizable(true);
        column.setMoveable(true);
        if (enableSorting == true) {
            column.addSelectionListener(getSelectionAdapter(viewer, column, colNumber));
        }
        return viewerColumn;
    }

    /**
     * Create a Selection Adapter for the given column and index
     * 
     * @param column
     * @param index
     * @return
     */
    private SelectionAdapter getSelectionAdapter(final TableViewer viewer, final TableColumn column,
            final int index) {
        SelectionAdapter selectionAdaptor = new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                ReportViewerComparator comparator = (ReportViewerComparator) viewer.getComparator();
                comparator.setColumn(index);
                int dir = comparator.getDirection();
                viewer.getTable().setSortDirection(dir);
                viewer.getTable().setSortColumn(column);
                viewer.refresh();
            }
        };
        return selectionAdaptor;

    }

    /**
     * @param table
     */
    private void setReportMode(Mode newMode) {
        currentViewerMode = newMode;
        getSite().setSelectionProvider(getCurrentViewer());
        getCurrentViewer().getControl().setFocus();
    }

    /**
     * get the mode that the view is in. eg table.
     * 
     * @return
     */
    public Mode getReportMode() {
        return currentViewerMode;
    }

    /**
     * @return
     */
    public ColumnViewer getCurrentViewer() {
        return viewers.get(currentViewerMode);
    }

    @Override
    public void setFocus() {
        pageBook.setFocus();
    }

    public IToifProject getReportInput() {
        return inputProject;
    }

    public void setReportInput(IToifProject project) {
        updateInput(project);
    }

    /**
     * sets the input. updates the defect counter
     * 
     * @param proj
     */
    public void updateInput(IToifProject proj) {
        IToifProject prevProj = inputProject;
        if (proj == null) {
            clearInput();
        } else {
            inputProject = proj;
            if (!inputProject.equals(prevProj)) {
                updateReportViewer(true);
                for (ColumnViewer colViewer : viewers.values()) {
                    colViewer.setInput(inputProject);
                    colViewer.getControl().pack();
                }
                updateDefectCount();
            }

            pageBook.showPage(reportPage);
        }
    }

    /**
     * clears input
     */
    public void clearInput() {
        inputProject = null;
        updateReportViewer(true);
    }

    /**
     * update the viewer. refreshes.
     */
    private void updateReportViewer(final boolean doExpand) {
        if (inputProject == null) {
            pageBook.showPage(noReportPage);
        } else {
            if (getCurrentViewer().getInput() != null) {
                Runnable runnable = new Runnable() {

                    @Override
                    public void run() {
                        getCurrentViewer().refresh();
                        updateDefectCount();
                    }
                };
                BusyIndicator.showWhile(getDisplay(), runnable);
                setViewerVisible(true);
            }
        }
    }

    /**
     * @return
     */
    private Display getDisplay() {
        if (pageBook != null && !pageBook.isDisposed()) {
            return pageBook.getDisplay();
        }
        return null;
    }

    /**
     * @param b
     */
    private void setViewerVisible(boolean showReport) {
        if (showReport) {
            viewerBook.showPage(getCurrentViewer().getControl());
        } else {
            viewerBook.showPage(emptyViewer);
        }
    }

    public void refresh() {
        if (inputProject == null) {
            return;
        }
        setViewerVisible(true);
        updateReportViewer(false);
        pageBook.showPage(reportPage);
    }

    /**
     * update the defect counter. this calculates what to display in the status
     * text.
     */
    public void updateDefectCount() {

        final int totalEntries = inputProject.getFindingEntries().size();
        final int visibleEntries = ((TableViewer) getCurrentViewer()).getTable().getItemCount();

        PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {

            @Override
            public void run() {
                numberOfDefects.setText("Number of Defects: " + visibleEntries + " ("
                        + (totalEntries - visibleEntries) + " filtered from view)");
                numberOfDefects.getParent().layout();
            }
        });
    }

    /**
     * @return
     */
    public ViewerFilter[] getFilters() {
        return getCurrentViewer().getFilters();
    }

    /**
     * @param array
     */
    public void setFilters(ViewerFilter[] array) {
        getCurrentViewer().setFilters(array);
    }

    public TableViewer getTableViewer() {
        return tableViewer;
    }
}