1 package org.kit.furia.fragment.soot;
2
3 import java.io.File;
4 import java.io.FileNotFoundException;
5 import java.io.FileWriter;
6 import java.io.IOException;
7 import java.io.PrintStream;
8 import java.util.ArrayList;
9 import java.util.HashMap;
10 import java.util.Iterator;
11 import java.util.LinkedList;
12 import java.util.List;
13 import java.util.Map;
14
15 import org.apache.log4j.Logger;
16 import org.kit.furia.exceptions.IRException;
17 import org.kit.furia.fragment.AbstractFragmentExtractor;
18 import org.kit.furia.fragment.FragmentExtractor;
19 import org.kit.furia.fragment.FragmentParseException;
20 import org.kit.furia.fragment.MTDFragmentAST;
21 import org.kit.furia.fragment.OBFragment;
22 import org.kit.furia.fragment.soot.representation.FrimpBody;
23 import org.kit.furia.misc.IntegerHolder;
24
25 import soot.Body;
26 import soot.G;
27 import soot.PackManager;
28 import soot.Transform;
29 import soot.grimp.Grimp;
30 import soot.grimp.GrimpBody;
31 import soot.toolkits.graph.BlockGraph;
32 import soot.util.cfgcmd.CFGGraphType;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 public class FragmentExtractorSoot extends AbstractFragmentExtractor implements FragmentExtractor {
61 private static final Logger logger = Logger
62 .getLogger(FragmentExtractorSoot.class);
63
64
65
66 public static final CFGGraphType defaultGraphType = CFGGraphType.EXCEPTIONAL_BLOCK_GRAPH;
67
68
69
70 public FragmentExtractorSoot() {
71
72 }
73
74 public void extractMethodsFromDirectory(final String directory,
75 final int maxStructuresAllowed, final int minStructuresAllowed,
76 final String outputPath, String outputFile)
77 throws FileNotFoundException, NoClassesFound, IOException,
78 IRException, FragmentParseException {
79 extractMethodsFromDirectory(directory, defaultGraphType,
80 maxStructuresAllowed, minStructuresAllowed, outputPath,
81 outputFile);
82 }
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 public void extractMethodsFromDirectory(final String directory,
104 final CFGGraphType graphtype, final int maxStructuresAllowed,
105 final int minStructuresAllowed, final String outputPath,
106 String outputFile) throws FileNotFoundException, NoClassesFound,
107 IOException, IRException, FragmentParseException {
108 final BodyStealer stealer = stealBodiesFromDir(directory, outputPath);
109
110 if (!stealer.isFound()) {
111 throw new NoClassesFound("In directory:" + directory);
112 }
113 final Iterator < Body > it = stealer.getIterator();
114 FileWriter output = new FileWriter(outputFile);
115
116 HashMap < String, IntegerHolder > repetitionCounts = new HashMap < String, IntegerHolder >();
117 while (it.hasNext()) {
118 final Body tempBody = it.next();
119
120
121 FrimpBody fb = new FrimpBody(tempBody);
122 FragmentBuilder sootFragmentBuilder = new FragmentBuilder(fb,
123 (BlockGraph) graphtype.buildGraph(fb),
124 maxStructuresAllowed, minStructuresAllowed);
125 sootFragmentBuilder.fillRepetitionCounts(repetitionCounts);
126 }
127
128 Iterator < Map.Entry < String, IntegerHolder >> itAll = repetitionCounts
129 .entrySet().iterator();
130 while (itAll.hasNext()) {
131 Map.Entry < String, IntegerHolder > entry = itAll.next();
132
133 MTDFragmentAST tree = OBFragment.parseTree(entry.getKey());
134
135 if (tree.getSize() >= minStructuresAllowed
136 && tree.getSize() <= maxStructuresAllowed) {
137 output.write(entry.getValue().getValue() + "\t"
138 + entry.getKey() + "\n");
139 }
140 }
141 output.close();
142 }
143
144 public BodyStealer stealBodiesFromDir(String dir, String outputPath)
145 throws FileNotFoundException, NoClassesFound {
146 List < String > argumentos = new LinkedList < String >();
147
148 argumentos.add("-allow-phantom-refs");
149
150 argumentos.add("-p");
151 argumentos.add("jb.tr");
152 argumentos.add("enabled:false");
153
154
155 argumentos.add("--soot-class-path");
156 String cp = dir + File.pathSeparator + System.getProperty("java.home")
157 + File.separator + "lib" + File.separator + "rt.jar";
158 logger.info("class path: " + cp);
159 argumentos.add(cp);
160 argumentos.add("-output-format");
161 argumentos.add("n");
162 argumentos.add("-output-dir");
163 argumentos.add(System.getProperty("user.home") + File.separator
164 + "temp" + File.separator + "sootemptyness");
165
166
167
168
169
170
171
172 int size = argumentos.size();
173 getClassFiles(new File(dir), argumentos, dir);
174 if (size == argumentos.size()) {
175 throw new NoClassesFound();
176 }
177
178
179
180 G.v().out = new PrintStream(outputPath + File.separator + "sootLog.txt");
181 BodyStealer stealer = new BodyStealer();
182
183 Transform stealerTransform = new Transform("jtp.stealerTransform",
184 stealer);
185 stealerTransform.setDeclaredOptions("enabled");
186 stealerTransform.setDefaultOptions("enabled");
187 PackManager.v().getPack("jtp").add(stealerTransform);
188
189 String[] sootArgs = new String[argumentos.size()];
190 argumentos.toArray(sootArgs);
191
192 soot.Main.main(sootArgs);
193 logger.info("Extracted soot methods for: " + dir);
194 G.v().out.close();
195 return stealer;
196
197 }
198
199 }