com.kdmanalytics.toif.report.internal.handlers.ModelUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.kdmanalytics.toif.report.internal.handlers.ModelUtil.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.handlers;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.openrdf.model.URI;
import org.openrdf.model.ValueFactory;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;

import com.kdmanalytics.toif.report.internal.items.FindingEntry;
import com.kdmanalytics.toif.report.internal.items.ProjectFactory;
import com.kdmanalytics.toif.report.internal.views.ReportView;
import com.kdmanalytics.toif.report.items.IFindingEntry;
import com.kdmanalytics.toif.report.items.IToifProject;

/**
 * Utilities for the toif model.
 * 
 * @author Adam Nunn <adam@kdmanalytics.com>
 * 
 */
public class ModelUtil {

    private ModelUtil() {
        // private constructor to prevent construction
    }

    /**
     * Sets the trust values on findings.
     * 
     * @param ss
     *            the ss
     * @param treeViewer
     *            the tree viewer
     * @param value
     *            the value
     */
    public static void setTrustValuesOnFindings(final Collection<FindingEntry> findingEntries,
            final IToifProject project, final Integer value, final IProgressMonitor monitor) {
        SubMonitor progress = SubMonitor.convert(monitor, 100);
        SubMonitor loopProgress = progress.newChild(100).setWorkRemaining(findingEntries.size());

        final Repository rep = project.getRepository();
        final List<FindingEntry> entries = new LinkedList<FindingEntry>();
        for (FindingEntry entry : findingEntries) {
            // get entry tool name
            String toolName = entry.getTool().toString();

            // get entry weakness term.
            String descriptor = entry.getDescription().split(":")[0];

            List<FindingEntry> projEntries = entry.getProject().getFindingEntries();
            SubMonitor innerLoopProgress = loopProgress.newChild(100).setWorkRemaining(projEntries.size());

            // for each finding, match the weakness term and tool
            // name.
            // if a match, set its trust.
            for (FindingEntry finding : projEntries) {
                // get entry tool name
                String findingToolName = finding.getTool().toString();
                innerLoopProgress.setTaskName(findingToolName);

                // get entry weakness term.
                String findingDescriptior = finding.getDescription();

                if (findingToolName.equals(toolName) && findingDescriptior.startsWith(descriptor)) {
                    finding.setTrust(value);
                    //
                    // treeViewer.update(finding, null);
                    entries.add(finding);
                    setTrustInRepository(finding, rep, value);
                }

                innerLoopProgress.worked(1);
            }

        }

    }

    /**
     * Sets the trust in repository.
     * 
     * @param finding
     *            the finding
     * @param rep
     *            the rep
     * @param value
     *            the value
     */
    private static void setTrustInRepository(IFindingEntry finding, Repository rep, int value) {
        try {
            ValueFactory factory = rep.getValueFactory();
            RepositoryConnection con = rep.getConnection();

            URI trustURI = factory.createURI("http://toif/trust");
            URI findingURI = factory.createURI(finding.getFindingId());

            con.remove(findingURI, trustURI, null);

            con.add(findingURI, trustURI, factory.createLiteral(value));
        } catch (RepositoryException e) {
            System.err.println("Could not add or remove the trust statements in the repository: " + e);
        }

    }

    /**
     * Create the project model
     * 
     * @param s
     */
    public static void buildModel(ISelection s) {
        final ReportView view = (ReportView) openView();
        // final TreeViewer treeViewer = view.getViewer();

        boolean inWorkbench = false;
        IPerspectiveDescriptor[] desc = PlatformUI.getWorkbench().getPerspectiveRegistry().getPerspectives();

        for (IPerspectiveDescriptor iPerspectiveDescriptor : desc) {
            if (iPerspectiveDescriptor.getId().equals("com.kdmanalytics.kdmwb.kdm.ui.KdmPerspective")) {
                inWorkbench = true;
                break;
            }
        }

        if (s instanceof IStructuredSelection) {
            IProject iProject = null;

            for (Object object : ((IStructuredSelection) s).toArray()) {
                if (object instanceof IProject) {
                    iProject = (IProject) object;
                }
            }

            if (iProject != null) {

                File file = new File(iProject.getLocation() + "/.toifProject.ser");

                if (file.exists()) {

                    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(iProject);
                            project.setRepository(repoFolder);
                            project.setIProject(repoFolder.getProject());
                            // project.setIProject(iProject.getLocation());

                            view.clearInput();
                            view.updateInput(project);
                            view.refresh();
                            return;
                        }
                    } catch (IOException i) {
                        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();
                    }
                }
            }

            final boolean wbValue = inWorkbench;
            final IFolder folder = getFolderFromSelection((IStructuredSelection) s);
            if (folder != null) {
                ProgressMonitorDialog dialog = new ProgressMonitorDialog(
                        PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
                try {
                    IRunnableWithProgress runnable = new IRunnableWithProgress() {

                        @Override
                        public void run(IProgressMonitor monitor)
                                throws InvocationTargetException, InterruptedException {
                            monitor.setTaskName("Populating TOIF View.");
                            final IToifProject project = ProjectFactory.createProjectModel(folder, wbValue,
                                    monitor);

                            // have to set the input on the UI thread
                            PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {

                                @Override
                                public void run() {
                                    view.setReportInput(project);
                                }
                            });

                        }
                    };

                    dialog.run(true, false, runnable);
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }
    }

    /**
     * open the report view.
     * 
     * @return
     */
    private static IViewPart openView() {
        try {
            IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
            if (window != null) {
                IWorkbenchPage page = window.getActivePage();
                if (page != null) {
                    return page.showView(ReportView.VIEW_ID);

                }

            }
        } catch (PartInitException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * get the project folder from the selection
     * 
     * @param selection
     * @return
     */
    private static IFolder getFolderFromSelection(IStructuredSelection selection) {
        IFolder folder = null;
        for (Object object : selection.toArray()) {
            try {
                if (object instanceof IProject) {
                    IProject project = (IProject) object;
                    folder = ensureKdmRepoFolderExists(project);
                } else if (object instanceof IJavaProject) {
                    IJavaProject project = (IJavaProject) object;
                    folder = ensureKdmRepoFolderExists(project.getProject());
                }
            } catch (CoreException ce) {
                ce.printStackTrace();
                return null;
            }
        }
        return folder;
    }

    /**
     * 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;
    }

    /**
     * gets the project folder ready.
     * 
     * @param folder
     * @throws CoreException
     */
    public void prepareFolder(IFolder folder) throws CoreException {
        if (!folder.exists()) {
            folder.create(true, true, null);
        }

        IContainer parent = folder.getParent();
        if (parent instanceof IFolder) {
            prepareFolder((IFolder) parent);
        }
    }

}