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