Package org.erlide.wrangler.refactoring.codeinspection

Source Code of org.erlide.wrangler.refactoring.codeinspection.GraphResultingInspectionHandler

/*******************************************************************************
* Copyright (c) 2010 György Orosz.
* 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:
*     György Orosz - initial API and implementation
******************************************************************************/
package org.erlide.wrangler.refactoring.codeinspection;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.PlatformUI;
import org.erlide.util.ErlLogger;
import org.erlide.wrangler.refactoring.backend.internal.WranglerBackendManager;
import org.erlide.wrangler.refactoring.exception.WranglerException;
import org.erlide.wrangler.refactoring.selection.IErlSelection;
import org.erlide.wrangler.refactoring.util.GlobalParameters;

import com.abstratt.graphviz.GraphViz;
import com.ericsson.otp.erlang.OtpErlangBoolean;

/**
* This class is for handling commands which are from wrangler code inspection
* functionality, and result a graph.
*
* @author Gyorgy Orosz
*
*/
public class GraphResultingInspectionHandler extends AbstractHandler {
    protected static final String CYCLYC_VIEW_ID = "cyclic";
    protected static final String FUNCTION_CALL_GRAPH_VIEW_ID = "functioncallgraph";
    protected static final String MODULE_GRAPH_VIEW_ID = "modulegraph";
    protected static final String IMPROPER_DEPENDECIES_VIEW_ID = "improperdependecies";

    @Override
    public Object execute(final ExecutionEvent event) throws ExecutionException {
        final String actionId = event.getCommand().getId();
        PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
                .getActiveEditor().setFocus();
        try {
            GlobalParameters.setSelection(PlatformUI.getWorkbench()
                    .getActiveWorkbenchWindow().getActivePage().getSelection());
        } catch (final WranglerException e1) {
            MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow()
                    .getShell(), "Error", e1.getMessage());
            return null;
        }
        try {
            final File tmpFile = File.createTempFile("wrangler_graph_", ".dot");
            tmpFile.deleteOnExit();

            final IErlSelection wranglerSelection = GlobalParameters
                    .getWranglerSelection();

            if (actionId
                    .equals("org.erlide.wrangler.refactoring.codeinspection.cyclicdependencies")) {
                final Boolean answer = MessageDialog.openQuestion(PlatformUI
                        .getWorkbench().getActiveWorkbenchWindow().getShell(), "Labels",
                        "Label edges with function names called?");
                runInspection("Cyclic module dependency", CYCLYC_VIEW_ID,
                        "There is no cyclic dependent modules in the project!", tmpFile,
                        "cyclic_dependent_modules", "ssx", tmpFile.getAbsolutePath(),
                        wranglerSelection.getSearchPath(), new OtpErlangBoolean(answer));
            } else if (actionId
                    .equals("org.erlide.wrangler.refactoring.codeinspection.generatefunctioncallgraph")) {
                runInspection("Function callgraph", FUNCTION_CALL_GRAPH_VIEW_ID,
                        "There is no dependent functions in the module!", tmpFile,
                        "gen_function_callgraph", "sss", tmpFile.getAbsolutePath(),
                        wranglerSelection.getFilePath(),
                        wranglerSelection.getSearchPath());

            } else if (actionId
                    .equals("org.erlide.wrangler.refactoring.codeinspection.generatemodulegraph")) {
                final Boolean answer = MessageDialog.openQuestion(PlatformUI
                        .getWorkbench().getActiveWorkbenchWindow().getShell(), "Labels",
                        "Label edges with function names called?");
                runInspection("Module dependency graph", MODULE_GRAPH_VIEW_ID,
                        "There is no dependent modules in the project!", tmpFile,
                        "gen_module_graph", "ssx", tmpFile.getAbsolutePath(),
                        wranglerSelection.getSearchPath(), new OtpErlangBoolean(answer));

            } else if (actionId
                    .equals("org.erlide.wrangler.refactoring.codeinspection.improperdependecies")) {
                runInspection("Improper module dependencies",
                        IMPROPER_DEPENDECIES_VIEW_ID,
                        "There is no improper module dependecies!", tmpFile,
                        "improper_inter_module_calls", "ss", tmpFile.getAbsolutePath(),
                        wranglerSelection.getSearchPath());

            }

        } catch (final Exception e) {
            ErlLogger.error(e);
        }
        return event;
    }

    /**
     * Run code inspection function, and shows the result in the workbench
     *
     * @param viewtTitle
     *            title of the view
     * @param noResultMessage
     *            if there is no result, this message will be displayed
     * @param tmpFile
     *            temp .dot file
     * @param functionName
     *            function to call
     * @param signature
     *            parameters signature
     * @param parameters
     *            function parameters
     *
     */
    protected void runInspection(final String viewtTitle, final String secondaryID,
            final String noResultMessage, final File tmpFile, final String functionName,
            final String signature, final Object... parameters) {
        try {
            CodeInspectionViewsManager.hideView(CodeInspectionViewsManager.GRAPH_VIEW,
                    secondaryID);
            final Boolean b = WranglerBackendManager.getRefactoringBackend()
                    .callSimpleInspection(functionName, signature, parameters);
            if (b) {
                final FileInputStream fis = new FileInputStream(tmpFile);
                try {
                    if (fis.available() > 0) {

                        final Image img = GraphViz.load(fis, "png", new Point(0, 0));
                        CodeInspectionViewsManager.showDotImage(img, viewtTitle,
                                secondaryID, tmpFile);
                    } else {
                        MessageDialog.openInformation(GlobalParameters.getEditor()
                                .getSite().getShell(), viewtTitle, noResultMessage);
                    }
                } finally {
                    fis.close();
                }
            } else {
                MessageDialog.openError(
                        GlobalParameters.getEditor().getSite().getShell(),
                        "Internal error", "Internal error occured. Please report it!");
            }
        } catch (final IOException e) {
            ErlLogger.error(e);
        } catch (final CoreException e) {
            ErlLogger.error(e);
        } catch (final Exception e) {
            ErlLogger.error(e);
        }

    }
}
TOP

Related Classes of org.erlide.wrangler.refactoring.codeinspection.GraphResultingInspectionHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.