ca.mcgill.sable.soot.examples.NewSootExampleWizard.java Source code

Java tutorial

Introduction

Here is the source code for ca.mcgill.sable.soot.examples.NewSootExampleWizard.java

Source

/* Soot - a J*va Optimization Framework
 * Copyright (C) 2008 Eric Bodden
 *
 * 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.examples;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.wizards.JavaProjectWizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IDE;

import ca.mcgill.sable.soot.SootClasspathVariableInitializer;
import ca.mcgill.sable.soot.SootPlugin;

public abstract class NewSootExampleWizard extends JavaProjectWizard {

    protected final String fromFile;
    protected final String toFile;

    protected NewSootExampleWizard(String fromFile, String toFile) {
        this.fromFile = fromFile;
        this.toFile = toFile;
    }

    @Override
    public boolean performFinish() {
        boolean performFinish = super.performFinish();

        if (performFinish) {
            IJavaProject newProject = (IJavaProject) getCreatedElement();
            try {
                IClasspathEntry[] originalCP = newProject.getRawClasspath();
                IClasspathEntry ajrtLIB = JavaCore.newVariableEntry(
                        new Path(SootClasspathVariableInitializer.VARIABLE_NAME_CLASSES),
                        new Path(SootClasspathVariableInitializer.VARIABLE_NAME_SOURCE), null);
                // Update the raw classpath with the new entry
                int originalCPLength = originalCP.length;
                IClasspathEntry[] newCP = new IClasspathEntry[originalCPLength + 1];
                System.arraycopy(originalCP, 0, newCP, 0, originalCPLength);
                newCP[originalCPLength] = ajrtLIB;
                newProject.setRawClasspath(newCP, new NullProgressMonitor());
            } catch (JavaModelException e) {
            }

            String templateFilePath = fromFile;
            InputStream is = null;
            FileOutputStream fos = null;
            try {
                is = SootPlugin.getDefault().getBundle().getResource(templateFilePath).openStream();
                if (is == null) {
                    new RuntimeException("Resource " + templateFilePath + " not found!").printStackTrace();
                } else {

                    IClasspathEntry[] resolvedClasspath = newProject.getResolvedClasspath(true);
                    IClasspathEntry firstSourceEntry = null;
                    for (IClasspathEntry classpathEntry : resolvedClasspath) {
                        if (classpathEntry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
                            firstSourceEntry = classpathEntry;
                            break;
                        }
                    }
                    if (firstSourceEntry != null) {
                        IPath path = SootPlugin.getWorkspace().getRoot().getFile(firstSourceEntry.getPath())
                                .getLocation();
                        String srcPath = path.toString();
                        String newfileName = toFile;
                        final IPath newFilePath = firstSourceEntry.getPath().append(newfileName);
                        fos = new FileOutputStream(srcPath + File.separator + newfileName);
                        int temp = is.read();
                        while (temp > -1) {
                            fos.write(temp);
                            temp = is.read();
                        }
                        fos.close();
                        //refresh project
                        newProject.getProject().refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());

                        final IWorkbenchPage activePage = JavaPlugin.getActivePage();
                        if (activePage != null) {
                            final Display display = getShell().getDisplay();
                            if (display != null) {
                                display.asyncExec(new Runnable() {
                                    public void run() {
                                        try {
                                            IResource newResource = SootPlugin.getWorkspace().getRoot()
                                                    .findMember(newFilePath);
                                            IDE.openEditor(activePage, (IFile) newResource, true);
                                        } catch (PartInitException e) {
                                            JavaPlugin.log(e);
                                        }
                                    }
                                });
                            }
                        }

                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (is != null)
                        is.close();
                    if (fos != null)
                        fos.close();
                } catch (IOException e) {
                }
            }
        }

        return performFinish;
    }

    @Override
    public void addPages() {
        addPage(new FirstPage());
        super.addPages();
    }

    protected static class FirstPage extends WizardPage {

        private FirstPage() {
            super("ca.mcgill.sable.soot.examples.NewExamplePage");
        }

        public void createControl(Composite parent) {
            final Composite composite = new Composite(parent, SWT.NULL);
            composite.setFont(parent.getFont());
            composite.setLayout(new FillLayout());
            setControl(composite);

            Label label = new Label(composite, SWT.WRAP);
            setControl(composite);
            label.setText("Please create a new Java project using the following Wizard "
                    + "pages. Soot will then create the example source files in the project's source folder.");

            setTitle("Create example Soot extension");
            setMessage("This wizard will help you create a new example Soot extension.");
        }

    }
}