ca.mcgill.sable.soot.launching.DavaHandler.java Source code

Java tutorial

Introduction

Here is the source code for ca.mcgill.sable.soot.launching.DavaHandler.java

Source

/* Soot - a J*va Optimization Framework
 * Copyright (C) 2003 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.launching;

import java.util.*;

import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;

import ca.mcgill.sable.soot.*;
import org.eclipse.jface.dialogs.*;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.jdt.core.*;

/**
 * After Soot runs handles any new dava files by either 
 * copying them to an already existing "Dava Project" or
 * creating a "Dava Project" and copying the files there
 * 
 * Currently disabled 
 */
public class DavaHandler {

    private IFolder sootOutputFolder;
    private boolean davaBefore;
    private ArrayList beforeList;
    private String davaProjName;
    private IJavaProject davaProj;
    private IFolder srcFolder;

    public DavaHandler() {
        setDavaProjName(Messages.getString("DavaHandler.Dava_Project"));
    }

    public boolean isDava() {
        if (!getSootOutputFolder().getFolder(Messages.getString("DavaHandler.dava")).exists())
            return false;
        return true;
    }

    // creates list of Dava files before Soot runs
    public void handleBefore() {
        if (isDava()) {
            createBeforeList();
        }
    }

    private void createBeforeList() {
        try {
            IResource[] elems = getSootOutputFolder().getFolder(Messages.getString("DavaHandler.dava"))
                    .getFolder(Messages.getString("DavaHandler.src")).members();
            for (int i = 0; i < elems.length; i++) {
                if (getBeforeList() == null) {
                    setBeforeList(new ArrayList());
                }
                getBeforeList().add(elems[i]);
            }
        } catch (CoreException e) {
        }

    }

    // handles two things:
    // 1. if new dava files exist
    // 2. if already existing dava files have changed
    // if one of those two things is true then:
    // if no dava project exists asks to create one else
    // asks to copy files
    public void handleAfter() {
        ArrayList newMembers = new ArrayList();
        IPath jreLibPath = null;
        try {
            IResource[] elems = getSootOutputFolder().getFolder(Messages.getString("DavaHandler.dava"))
                    .getFolder(Messages.getString("DavaHandler.src")).members();
            for (int i = 0; i < elems.length; i++) {
                if (getBeforeList() == null) {
                    newMembers.add(elems[i]);
                    if (elems[i] instanceof IFile) {

                        SootPlugin.getDefault().getManager().setToFalseRemove((IFile) elems[i]);
                    }
                } else if (getBeforeList().contains(elems[i])) {
                    if (elems[i] instanceof IFile) {

                        if (SootPlugin.getDefault().getManager().isFileMarkersRemove((IFile) elems[i])) {
                            newMembers.add(elems[i]);
                            // this sets changed bit to 0 - so file doesn't stay on list indefinitely

                            SootPlugin.getDefault().getManager().setToFalseRemove((IFile) elems[i]);
                        }
                    }

                } else if (!getBeforeList().contains(elems[i])) {
                    if (SootPlugin.getDefault().getManager().getChangedResources() == null) {
                    } else if (SootPlugin.getDefault().getManager().getChangedResources().containsKey(elems[i])) {
                        newMembers.add(elems[i]);
                        // this sets changed bit to 0 - so file doesn't stay on list indefinitely
                        if (elems[i] instanceof IFile) {

                            SootPlugin.getDefault().getManager().setToFalseRemove((IFile) elems[i]);
                        }
                    }
                }
            }

            // testing class lib copying
            IProject proj = getSootOutputFolder().getProject();
            IResource[] elements = proj.members();

            IJavaProject jProj = JavaCore.create(proj);
            IClasspathEntry[] paths = jProj.getRawClasspath();

            for (int i = 0; i < paths.length; i++) {
                switch (paths[i].getEntryKind()) {
                case IClasspathEntry.CPE_CONTAINER: {
                    jreLibPath = paths[i].getPath();

                    break;
                }

                }
            }
        } catch (CoreException e) {
        }

        if (!newMembers.isEmpty()) {

            // if is special dava project add src files there
            if (davaProjectExists()) {
                setDavaProj(JavaCore.create(SootPlugin.getWorkspace().getRoot().getProject(getDavaProjName())));
                if (getDavaProj().isOpen()) {
                    if (shouldCopyFiles()) {
                        copyFiles(newMembers);
                    }
                } else {
                    openProject();
                    if (shouldCopyFiles()) {
                        copyFiles(newMembers);
                    }
                }
            }
            // if not special dava project ask user to create and add files there
            else {
                boolean result = createSpecialDavaProject(jreLibPath);
                if (result) {
                    copyFiles(newMembers);
                }

            }
        }
    }

    private boolean createSpecialDavaProject(IPath jreLibPath) {
        IWorkbenchWindow window = SootPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
        MessageDialog create = new MessageDialog(window.getShell(), Messages.getString("DavaHandler.Soot_Question"),
                null,
                Messages.getString(
                        "DavaHandler.Would_you_like_to_create_a_new_Dava_Project_with_generated_Dava_src_files"),
                0, new String[] { Messages.getString("DavaHandler.OK"), Messages.getString("DavaHandler.Cancel") },
                0);
        create.open();
        if (create.getReturnCode() == Dialog.OK) {
            // create proj
            IProject proj = SootPlugin.getWorkspace().getRoot().getProject(getDavaProjName());
            if (!proj.exists()) {
                try {
                    proj.create(null);
                    proj.open(null);
                    IProjectDescription pd = proj.getDescription();
                    String[] natures = new String[] { Messages.getString("org.eclipse.jdt.core.javanature") };

                    pd.setNatureIds(natures);
                    proj.setDescription(pd, null);

                    setDavaProj(JavaCore.create(proj));
                    IFolder folder = proj.getFolder(Messages.getString("DavaHandler.src")); //$NON-NLS-1$
                    if (!folder.exists()) {
                        folder.create(false, true, null);
                    }
                    setSrcFolder(folder);
                    IFolder out = proj.getFolder(Messages.getString("DavaHandler.bin")); //$NON-NLS-1$
                    if (!folder.exists()) {
                        folder.create(false, true, null);
                    }
                    getDavaProj().setOutputLocation(out.getFullPath(), null);
                    IClasspathEntry[] entries = new IClasspathEntry[2];
                    entries[0] = JavaCore.newSourceEntry(folder.getFullPath());
                    if (jreLibPath != null) {
                        entries[1] = JavaCore.newContainerEntry(jreLibPath);
                    }
                    getDavaProj().setRawClasspath(entries, null);
                    return true;
                } catch (CoreException e) {
                    e.printStackTrace();
                    return false;
                }
            }

        }
        return false;
    }

    private boolean shouldCopyFiles() {
        IWorkbenchWindow window = SootPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
        MessageDialog copy = new MessageDialog(window.getShell(), Messages.getString("DavaHandler.Soot_Question"), //$NON-NLS-1$
                null, Messages.getString("DavaHandler.Would_you_like_to_copy_Dava_src_files_to_the_Dava_Project"), //$NON-NLS-1$
                0, new String[] { Messages.getString("DavaHandler.OK"), Messages.getString("DavaHandler.Cancel") }, //$NON-NLS-1$//$NON-NLS-2$
                0);
        copy.open();
        if (copy.getReturnCode() == Dialog.OK)
            return true;
        return false;
    }

    private void copyFiles(ArrayList newFiles) {
        // copy new files
        Iterator it = newFiles.iterator();
        IPath srcPath = getDavaProj().getProject().getFolder(Messages.getString("DavaHandler.src")).getFullPath();
        while (it.hasNext()) {

            try {
                IResource next = (IResource) it.next();
                IPath copyTo = srcPath.append(System.getProperty("file.separator") + next.getName()); //$NON-NLS-1$
                if (getDavaProj().getProject().getFolder(Messages.getString("DavaHandler.src")) //$NON-NLS-1$
                        .getFile(next.getName()).exists()) {
                    getDavaProj().getProject().getFolder(Messages.getString("DavaHandler.src"))
                            .getFile(next.getName()).delete(false, null);
                }
                next.copy(copyTo, false, null);
            } catch (CoreException e) {
                e.printStackTrace();

            }
        }

    }

    private void openProject() {
        try {
            getDavaProj().open(null);
        } catch (CoreException e) {
            e.printStackTrace();
        }
    }

    private boolean davaProjectExists() {
        if (SootPlugin.getWorkspace().getRoot().getProject(getDavaProjName()).exists())
            return true;
        return false;
    }

    public void updateDavaProject() {

    }

    /**
     * @return
     */
    public IFolder getSootOutputFolder() {
        return sootOutputFolder;
    }

    /**
     * @param folder
     */
    public void setSootOutputFolder(IFolder folder) {
        sootOutputFolder = folder;
    }

    /**
     * @return
     */
    public boolean isDavaBefore() {
        return davaBefore;
    }

    /**
     * @param b
     */
    public void setDavaBefore(boolean b) {
        davaBefore = b;
    }

    /**
     * @return
     */
    public ArrayList getBeforeList() {
        return beforeList;
    }

    /**
     * @param list
     */
    public void setBeforeList(ArrayList list) {
        beforeList = list;
    }

    /**
     * @return
     */
    public String getDavaProjName() {
        return davaProjName;
    }

    /**
     * @param string
     */
    public void setDavaProjName(String string) {
        davaProjName = string;
    }

    /**
     * @return
     */
    public IJavaProject getDavaProj() {
        return davaProj;
    }

    /**
     * @param project
     */
    public void setDavaProj(IJavaProject project) {
        davaProj = project;
    }

    /**
     * @return
     */
    public IFolder getSrcFolder() {
        return srcFolder;
    }

    /**
     * @param folder
     */
    public void setSrcFolder(IFolder folder) {
        srcFolder = folder;
    }

}