KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > ca > mcgill > sable > soot > launching > DavaHandler


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

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 /**
35  * After Soot runs handles any new dava files by either
36  * copying them to an already existing "Dava Project" or
37  * creating a "Dava Project" and copying the files there
38  *
39  * Currently disabled
40  */

41 public class DavaHandler {
42
43     private IFolder sootOutputFolder;
44     private boolean davaBefore;
45     private ArrayList beforeList;
46     private String JavaDoc 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     // creates list of Dava files before Soot runs
61
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     // handles two things:
83
// 1. if new dava files exist
84
// 2. if already existing dava files have changed
85
// if one of those two things is true then:
86
// if no dava project exists asks to create one else
87
// asks to copy files
88
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                             // this sets changed bit to 0 - so file doesn't stay on list indefinitely
107

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                         // this sets changed bit to 0 - so file doesn't stay on list indefinitely
119
if (elems[i] instanceof IFile){
120                     
121                             SootPlugin.getDefault().getManager().setToFalseRemove((IFile)elems[i]);
122                         }
123                     }
124                 }
125             }
126             
127             // testing class lib copying
128
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 is special dava project add src files there
152
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             // if not special dava project ask user to create and add files there
167
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 JavaDoc [] {Messages.getString("DavaHandler.OK"), Messages.getString("DavaHandler.Cancel")}, 0);
180         create.open();
181         if (create.getReturnCode() == Dialog.OK){
182             // create proj
183
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 JavaDoc [] natures = new String JavaDoc [] {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")); //$NON-NLS-1$
196
if (!folder.exists()){
197                         folder.create(false, true, null);
198                     }
199                     setSrcFolder(folder);
200                     IFolder out = proj.getFolder(Messages.getString("DavaHandler.bin")); //$NON-NLS-1$
201
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 JavaDoc [] {Messages.getString("DavaHandler.OK"), Messages.getString("DavaHandler.Cancel")}, 0); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
226
copy.open();
227         if (copy.getReturnCode() == Dialog.OK) return true;
228         return false;
229     }
230     
231     private void copyFiles(ArrayList newFiles){
232         // copy new files
233
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()); //$NON-NLS-1$
240
if (getDavaProj().getProject().getFolder(Messages.getString("DavaHandler.src")).getFile(next.getName()).exists()) { //$NON-NLS-1$
241
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     /**
271      * @return
272      */

273     public IFolder getSootOutputFolder() {
274         return sootOutputFolder;
275     }
276
277     /**
278      * @param folder
279      */

280     public void setSootOutputFolder(IFolder folder) {
281         sootOutputFolder = folder;
282     }
283
284     /**
285      * @return
286      */

287     public boolean isDavaBefore() {
288         return davaBefore;
289     }
290
291     /**
292      * @param b
293      */

294     public void setDavaBefore(boolean b) {
295         davaBefore = b;
296     }
297
298     /**
299      * @return
300      */

301     public ArrayList getBeforeList() {
302         return beforeList;
303     }
304
305     /**
306      * @param list
307      */

308     public void setBeforeList(ArrayList list) {
309         beforeList = list;
310     }
311
312     /**
313      * @return
314      */

315     public String JavaDoc getDavaProjName() {
316         return davaProjName;
317     }
318
319     /**
320      * @param string
321      */

322     public void setDavaProjName(String JavaDoc string) {
323         davaProjName = string;
324     }
325
326     /**
327      * @return
328      */

329     public IJavaProject getDavaProj() {
330         return davaProj;
331     }
332
333     /**
334      * @param project
335      */

336     public void setDavaProj(IJavaProject project) {
337         davaProj = project;
338     }
339
340     /**
341      * @return
342      */

343     public IFolder getSrcFolder() {
344         return srcFolder;
345     }
346
347     /**
348      * @param folder
349      */

350     public void setSrcFolder(IFolder folder) {
351         srcFolder = folder;
352     }
353
354 }
355
Popular Tags