ca.mcgill.sable.soot.attributes.VisManLauncher.java Source code

Java tutorial

Introduction

Here is the source code for ca.mcgill.sable.soot.attributes.VisManLauncher.java

Source

/* Soot - a J*va Optimization Framework
 * Copyright (C) 2004 Jennifer Lhotak
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

package ca.mcgill.sable.soot.attributes;

import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.*;
import org.eclipse.ui.*;
import ca.mcgill.sable.soot.*;
import ca.mcgill.sable.soot.ui.*;
import java.util.*;
import org.eclipse.core.resources.*;
import org.eclipse.jdt.core.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.*;

public class VisManLauncher implements IWorkbenchWindowActionDelegate {

    private IProject proj;
    private IResource rec;

    public VisManLauncher() {
        super();
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
     */
    public void dispose() {
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
     */
    public void init(IWorkbenchWindow window) {
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
     */
    public void run(IAction action) {
        IWorkbenchWindow window = SootPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
        AnalysisVisManipDialog dialog = new AnalysisVisManipDialog(window.getShell());
        dialog.setFileList(getFilesFromCon(getProj()));
        dialog.setProj(getProj());
        dialog.open();
        if (dialog.getReturnCode() == Dialog.OK) {
            if (dialog.getAllSelected() != null) {
                Iterator selIt = dialog.getAllSelected().iterator();
                while (selIt.hasNext()) {
                    Object next = selIt.next();
                    SootAttributesHandler handler = SootPlugin.getDefault().getManager()
                            .getAttributesHandlerForFile((IFile) next);
                    Object[] elems;
                    if ((dialog.getCurrentSettingsMap() != null)
                            && (dialog.getCurrentSettingsMap().containsKey(next))) {
                        elems = (Object[]) dialog.getCurrentSettingsMap().get(next);
                    } else {
                        elems = dialog.getCheckTypes().getCheckedElements();
                    }
                    ArrayList toShow = new ArrayList();
                    for (int i = 0; i < elems.length; i++) {
                        toShow.add(elems[i]);
                    }
                    handler.setTypesToShow(toShow);
                    handler.setShowAllTypes(false);
                    // also update currently shown editor and legend
                    handler.setUpdate(true);
                    final IEditorPart activeEdPart = SootPlugin.getDefault().getWorkbench()
                            .getActiveWorkbenchWindow().getActivePage().getActiveEditor();

                    SootPlugin.getDefault().getPartManager().updatePart(activeEdPart);

                }
            }
        }

    }

    public HashMap configureDataMap() {
        HashMap map = new HashMap();
        // get all .java and .jimple files in the project
        // for each determine if attr xml exist and if yes which 
        // kinds of attrs there are
        ArrayList files = getFilesFromCon(getProj());
        Iterator it = files.iterator();
        while (it.hasNext()) {
            IFile next = (IFile) it.next();
            SootAttributesHandler handler;
            if (next.getFileExtension().equals("java")) {
                JavaAttributesComputer jac = new JavaAttributesComputer();
                jac.setProj(getProj());
                jac.setRec(getRec());
                handler = jac.getAttributesHandler(next);
            } else {
                JimpleAttributesComputer jac = new JimpleAttributesComputer();
                jac.setProj(getProj());
                jac.setRec(getRec());
                handler = jac.getAttributesHandler(next);
            }
            if ((handler != null) && (handler.getAttrList() != null)) {
                Iterator attrsIt = handler.getAttrList().iterator();
                ArrayList types = new ArrayList();
                while (attrsIt.hasNext()) {
                    SootAttribute sa = (SootAttribute) attrsIt.next();
                    Iterator typesIt = sa.getAnalysisTypes().iterator();
                    while (typesIt.hasNext()) {
                        String val = (String) typesIt.next();
                        if (!types.contains(val)) {
                            types.add(val);
                        }
                    }
                }
                map.put(next, types);
            } else {
                map.put(next, null);
            }

        }
        return map;
    }

    public ArrayList getFilesFromCon(IContainer con) {
        ArrayList files = new ArrayList();
        try {
            IResource[] recs = con.members();
            for (int i = 0; i < recs.length; i++) {
                if (recs[i] instanceof IFile) {
                    IFile file = (IFile) recs[i];
                    if (file.getFileExtension() == null)
                        continue;
                    if (file.getFileExtension().equals("jimple") || file.getFileExtension().equals("java")) {
                        files.add(recs[i]);
                    }
                } else if (recs[i] instanceof IContainer) {
                    files.addAll(getFilesFromCon((IContainer) recs[i]));
                } else {
                    throw new RuntimeException("unknown member type");
                }
            }
        } catch (CoreException e) {
        }
        return files;
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
     */
    public void selectionChanged(IAction action, ISelection selection) {
        if (selection instanceof IStructuredSelection) {
            IStructuredSelection struct = (IStructuredSelection) selection;
            Iterator it = struct.iterator();
            while (it.hasNext()) {
                Object next = it.next();
                if (next instanceof IResource) {
                    setProj(((IResource) next).getProject());
                    setRec((IResource) next);
                } else if (next instanceof IJavaElement) {
                    IJavaElement jElem = (IJavaElement) next;
                    setProj(jElem.getJavaProject().getProject());
                    setRec(jElem.getResource());
                }
            }
        }
    }

    /**
     * @return
     */
    public IProject getProj() {
        return proj;
    }

    /**
     * @param project
     */
    public void setProj(IProject project) {
        proj = project;
    }

    /**
     * @return
     */
    public IResource getRec() {
        return rec;
    }

    /**
     * @param resource
     */
    public void setRec(IResource resource) {
        rec = resource;
    }

}