1 19 20 21 package ca.mcgill.sable.soot.launching; 22 23 import java.util.*; 24 25 import org.eclipse.core.resources.*; 26 import org.eclipse.core.runtime.CoreException; 27 import org.eclipse.core.runtime.IPath; 28 29 import ca.mcgill.sable.soot.*; 30 import org.eclipse.jface.dialogs.*; 31 import org.eclipse.ui.IWorkbenchWindow; 32 import org.eclipse.jdt.core.*; 33 34 41 public class DavaHandler { 42 43 private IFolder sootOutputFolder; 44 private boolean davaBefore; 45 private ArrayList beforeList; 46 private String davaProjName; 47 private IJavaProject davaProj; 48 private IFolder srcFolder; 49 50 51 public DavaHandler(){ 52 setDavaProjName(Messages.getString("DavaHandler.Dava_Project")); 53 } 54 55 public boolean isDava(){ 56 if (!getSootOutputFolder().getFolder(Messages.getString("DavaHandler.dava")).exists()) return false; 57 return true; 58 } 59 60 public void handleBefore() { 62 if (isDava()){ 63 createBeforeList(); 64 } 65 } 66 67 private void createBeforeList(){ 68 try { 69 IResource [] elems = getSootOutputFolder().getFolder(Messages.getString("DavaHandler.dava")).getFolder(Messages.getString("DavaHandler.src")).members(); 70 for (int i = 0; i < elems.length; i++) { 71 if (getBeforeList() == null){ 72 setBeforeList(new ArrayList()); 73 } 74 getBeforeList().add(elems[i]); 75 } 76 } 77 catch(CoreException e){ 78 } 79 80 } 81 82 public void handleAfter() { 89 ArrayList newMembers = new ArrayList(); 90 IPath jreLibPath = null; 91 try { 92 IResource [] elems = getSootOutputFolder().getFolder(Messages.getString("DavaHandler.dava")).getFolder(Messages.getString("DavaHandler.src")).members(); 93 for (int i = 0; i < elems.length; i++) { 94 if (getBeforeList() == null){ 95 newMembers.add(elems[i]); 96 if (elems[i] instanceof IFile){ 97 98 SootPlugin.getDefault().getManager().setToFalseRemove((IFile)elems[i]); 99 } 100 } 101 else if (getBeforeList().contains(elems[i])) { 102 if (elems[i] instanceof IFile){ 103 104 if (SootPlugin.getDefault().getManager().isFileMarkersRemove((IFile)elems[i])){ 105 newMembers.add(elems[i]); 106 108 SootPlugin.getDefault().getManager().setToFalseRemove((IFile)elems[i]); 109 } 110 } 111 112 } 113 else if (!getBeforeList().contains(elems[i])){ 114 if (SootPlugin.getDefault().getManager().getChangedResources() == null){ 115 } 116 else if (SootPlugin.getDefault().getManager().getChangedResources().containsKey(elems[i])){ 117 newMembers.add(elems[i]); 118 if (elems[i] instanceof IFile){ 120 121 SootPlugin.getDefault().getManager().setToFalseRemove((IFile)elems[i]); 122 } 123 } 124 } 125 } 126 127 IProject proj = getSootOutputFolder().getProject(); 129 IResource [] elements = proj.members(); 130 131 132 IJavaProject jProj = JavaCore.create(proj); 133 IClasspathEntry [] paths = jProj.getRawClasspath(); 134 135 for (int i = 0; i < paths.length; i++){ 136 switch(paths[i].getEntryKind()){ 137 case IClasspathEntry.CPE_CONTAINER:{ 138 jreLibPath = paths[i].getPath(); 139 140 break; 141 } 142 143 } 144 } 145 } 146 catch(CoreException e){ 147 } 148 149 if (!newMembers.isEmpty()){ 150 151 if (davaProjectExists()){ 153 setDavaProj(JavaCore.create(SootPlugin.getWorkspace().getRoot().getProject(getDavaProjName()))); 154 if (getDavaProj().isOpen()){ 155 if (shouldCopyFiles()){ 156 copyFiles(newMembers); 157 } 158 } 159 else { 160 openProject(); 161 if (shouldCopyFiles()){ 162 copyFiles(newMembers); 163 } 164 } 165 } 166 else { 168 boolean result = createSpecialDavaProject(jreLibPath); 169 if (result){ 170 copyFiles(newMembers); 171 } 172 173 } 174 } 175 } 176 177 private boolean createSpecialDavaProject(IPath jreLibPath){ 178 IWorkbenchWindow window = SootPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow(); 179 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); 180 create.open(); 181 if (create.getReturnCode() == Dialog.OK){ 182 IProject proj = SootPlugin.getWorkspace().getRoot().getProject(getDavaProjName()); 184 if (!proj.exists()){ 185 try { 186 proj.create(null); 187 proj.open(null); 188 IProjectDescription pd = proj.getDescription(); 189 String [] natures = new String [] {Messages.getString("org.eclipse.jdt.core.javanature")}; 190 191 pd.setNatureIds(natures); 192 proj.setDescription(pd, null); 193 194 setDavaProj(JavaCore.create(proj)); 195 IFolder folder = proj.getFolder(Messages.getString("DavaHandler.src")); if (!folder.exists()){ 197 folder.create(false, true, null); 198 } 199 setSrcFolder(folder); 200 IFolder out = proj.getFolder(Messages.getString("DavaHandler.bin")); if (!folder.exists()){ 202 folder.create(false, true, null); 203 } 204 getDavaProj().setOutputLocation(out.getFullPath(), null); 205 IClasspathEntry [] entries = new IClasspathEntry [2]; 206 entries[0] = JavaCore.newSourceEntry(folder.getFullPath()); 207 if (jreLibPath != null){ 208 entries[1] = JavaCore.newContainerEntry(jreLibPath); 209 } 210 getDavaProj().setRawClasspath(entries, null); 211 return true; 212 } 213 catch (CoreException e) { 214 e.printStackTrace(); 215 return false; 216 } 217 } 218 219 } 220 return false; 221 } 222 223 private boolean shouldCopyFiles() { 224 IWorkbenchWindow window = SootPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow(); 225 MessageDialog copy = new MessageDialog(window.getShell(), Messages.getString("DavaHandler.Soot_Question"), null, Messages.getString("DavaHandler.Would_you_like_to_copy_Dava_src_files_to_the_Dava_Project"), 0, new String [] {Messages.getString("DavaHandler.OK"), Messages.getString("DavaHandler.Cancel")}, 0); copy.open(); 227 if (copy.getReturnCode() == Dialog.OK) return true; 228 return false; 229 } 230 231 private void copyFiles(ArrayList newFiles){ 232 Iterator it = newFiles.iterator(); 234 IPath srcPath = getDavaProj().getProject().getFolder(Messages.getString("DavaHandler.src")).getFullPath(); 235 while (it.hasNext()){ 236 237 try { 238 IResource next = (IResource)it.next(); 239 IPath copyTo = srcPath.append(System.getProperty("file.separator")+next.getName()); if (getDavaProj().getProject().getFolder(Messages.getString("DavaHandler.src")).getFile(next.getName()).exists()) { getDavaProj().getProject().getFolder(Messages.getString("DavaHandler.src")).getFile(next.getName()).delete(false, null); 242 } 243 next.copy(copyTo, false, null); 244 } 245 catch (CoreException e) { 246 e.printStackTrace(); 247 248 } 249 } 250 251 252 } 253 254 private void openProject(){ 255 try { 256 getDavaProj().open(null); 257 } 258 catch (CoreException e) { 259 e.printStackTrace(); 260 } 261 } 262 263 private boolean davaProjectExists() { 264 if (SootPlugin.getWorkspace().getRoot().getProject(getDavaProjName()).exists()) return true; 265 return false; 266 } 267 public void updateDavaProject(){ 268 269 } 270 273 public IFolder getSootOutputFolder() { 274 return sootOutputFolder; 275 } 276 277 280 public void setSootOutputFolder(IFolder folder) { 281 sootOutputFolder = folder; 282 } 283 284 287 public boolean isDavaBefore() { 288 return davaBefore; 289 } 290 291 294 public void setDavaBefore(boolean b) { 295 davaBefore = b; 296 } 297 298 301 public ArrayList getBeforeList() { 302 return beforeList; 303 } 304 305 308 public void setBeforeList(ArrayList list) { 309 beforeList = list; 310 } 311 312 315 public String getDavaProjName() { 316 return davaProjName; 317 } 318 319 322 public void setDavaProjName(String string) { 323 davaProjName = string; 324 } 325 326 329 public IJavaProject getDavaProj() { 330 return davaProj; 331 } 332 333 336 public void setDavaProj(IJavaProject project) { 337 davaProj = project; 338 } 339 340 343 public IFolder getSrcFolder() { 344 return srcFolder; 345 } 346 347 350 public void setSrcFolder(IFolder folder) { 351 srcFolder = folder; 352 } 353 354 } 355 | Popular Tags |