pull exclusions file support into util project and then share it with

the shrike-based dynamic call graph builder so that static and dynamic
graphs can be built consistently more easily.
This commit is contained in:
Julian Dolby 2013-11-14 13:02:56 -05:00
parent eacfe38dbb
commit 0ccaae3b2c
36 changed files with 344 additions and 198 deletions

View File

@ -22,9 +22,9 @@ import com.ibm.wala.classLoader.ClassLoaderFactoryImpl;
import com.ibm.wala.classLoader.ClassLoaderImpl;
import com.ibm.wala.classLoader.IClassLoader;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.util.config.SetOfClasses;
public class PolyglotClassLoaderFactory extends ClassLoaderFactoryImpl {

View File

@ -12,7 +12,7 @@ package com.ibm.wala.cast.java.translator.polyglot;
import com.ibm.wala.cast.java.client.JavaSourceAnalysisEngine;
import com.ibm.wala.classLoader.ClassLoaderFactory;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.util.config.SetOfClasses;
public class PolyglotJavaSourceAnalysisEngine extends JavaSourceAnalysisEngine {

View File

@ -19,9 +19,9 @@ import com.ibm.wala.cast.java.ipa.callgraph.JavaSourceAnalysisScope;
import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl;
import com.ibm.wala.cast.java.translator.SourceModuleTranslator;
import com.ibm.wala.classLoader.IClassLoader;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.util.config.SetOfClasses;
public class PolyglotSourceLoaderImpl extends JavaSourceLoaderImpl {
protected final IRTranslatorExtension fExtInfo;

View File

@ -11,7 +11,9 @@
package com.ibm.wala.cast.java.client;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Set;
import com.ibm.wala.cast.ir.ssa.AstIRFactory;
@ -25,7 +27,6 @@ import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.cha.ClassHierarchy;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
@ -35,6 +36,8 @@ import com.ibm.wala.ssa.SymbolTable;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.util.collections.HashSetFactory;
import com.ibm.wala.util.config.FileOfClasses;
import com.ibm.wala.util.config.SetOfClasses;
import com.ibm.wala.util.io.FileProvider;
/**
*/
@ -105,7 +108,8 @@ public abstract class JavaSourceAnalysisEngine extends AbstractAnalysisEngine {
scope = makeSourceAnalysisScope();
if (getExclusionsFile() != null) {
scope.setExclusions(FileOfClasses.createFileOfClasses(new File(getExclusionsFile())));
InputStream is = new File(getExclusionsFile()).exists()? new FileInputStream(getExclusionsFile()): FileProvider.class.getClassLoader().getResourceAsStream(getExclusionsFile());
scope.setExclusions(new FileOfClasses(is));
}
for (Module M : this.systemEntries) {

View File

@ -61,7 +61,6 @@ import com.ibm.wala.classLoader.Language;
import com.ibm.wala.classLoader.Module;
import com.ibm.wala.classLoader.ModuleEntry;
import com.ibm.wala.classLoader.NewSiteReference;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.shrikeCT.AnnotationsReader.ConstantElementValue;
import com.ibm.wala.shrikeCT.AnnotationsReader.ElementValue;
@ -78,6 +77,7 @@ import com.ibm.wala.types.TypeReference;
import com.ibm.wala.types.annotations.Annotation;
import com.ibm.wala.util.collections.HashMapFactory;
import com.ibm.wala.util.collections.HashSetFactory;
import com.ibm.wala.util.config.SetOfClasses;
import com.ibm.wala.util.debug.Assertions;
import com.ibm.wala.util.strings.Atom;

View File

@ -27,7 +27,6 @@ import com.ibm.wala.cast.tree.CAst;
import com.ibm.wala.cast.tree.CAstEntity;
import com.ibm.wala.cast.tree.impl.CAstImpl;
import com.ibm.wala.cast.util.CAstPrinter;
import com.ibm.wala.cast.util.TemporaryFile;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.classLoader.IClassLoader;
import com.ibm.wala.classLoader.Module;
@ -37,6 +36,7 @@ import com.ibm.wala.classLoader.SourceModule;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.types.TypeName;
import com.ibm.wala.util.collections.Pair;
import com.ibm.wala.util.io.TemporaryFile;
import com.ibm.wala.util.warnings.Warning;
/**

View File

@ -0,0 +1,17 @@
package dynamicCG;
public class ExtraClass {
public ExtraClass() {
}
private static String getName() {
return "ExtraClass";
}
@Override
public String toString() {
return getName();
}
}

View File

@ -0,0 +1,23 @@
package dynamicCG;
public class MainClass {
private final Object x;
private MainClass(Object x) {
this.x = x;
}
private String toStringImpl() {
return "mc:" + x.toString();
}
@Override
public String toString() {
return toStringImpl();
}
public static void main(String[] args) {
MainClass mc = new MainClass(new ExtraClass());
System.err.println(mc.toString());
}
}

View File

@ -0,0 +1,12 @@
java\/awt\/.*
javax\/swing\/.*
sun\/awt\/.*
sun\/swing\/.*
com\/sun\/.*
sun\/.*
org\/netbeans\/.*
org\/openide\/.*
com\/ibm\/crypto\/.*
com\/ibm\/security\/.*
org\/apache\/xerces\/.*
dynamicCG\/ExtraClass

View File

@ -7,6 +7,9 @@
<listEntry value="4"/>
</listAttribute>
<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
<mapAttribute key="org.eclipse.debug.core.preferred_launchers">
<mapEntry key="[run]" value="org.eclipse.jdt.junit.launchconfig"/>
</mapAttribute>
<stringAttribute key="org.eclipse.debug.ui.ATTR_CAPTURE_IN_FILE" value="/tmp/wala.out"/>
<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=com.ibm.wala.core.tests"/>
<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>

View File

@ -32,6 +32,6 @@ public class ExclusionsTest {
ExclusionsTest.class.getClassLoader());
TypeReference buttonRef = TypeReference.findOrCreate(ClassLoaderReference.Application,
StringStuff.deployment2CanonicalTypeString("java.awt.Button"));
Assert.assertTrue(scope.getExclusions().contains(buttonRef));
Assert.assertTrue(scope.getExclusions().contains(buttonRef.getName().toString().substring(1)));
}
}

View File

@ -0,0 +1,124 @@
package com.ibm.wala.core.tests.shrike;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Set;
import java.util.StringTokenizer;
import org.junit.Assert;
import org.junit.Test;
import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;
import com.ibm.wala.core.tests.util.TestConstants;
import com.ibm.wala.ipa.callgraph.AnalysisCache;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.cha.ClassHierarchy;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
import com.ibm.wala.shrike.cg.DynamicCallGraph;
import com.ibm.wala.shrikeBT.analysis.Analyzer.FailureException;
import com.ibm.wala.shrikeCT.InvalidClassFileException;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.types.MethodReference;
import com.ibm.wala.types.Selector;
import com.ibm.wala.types.TypeReference;
import com.ibm.wala.util.CancelException;
import com.ibm.wala.util.io.FileProvider;
import com.ibm.wala.util.io.TemporaryFile;
public class DynamicCallGraphTests {
private static final URL testJarLocation = DynamicCallGraphTests.class.getClassLoader().getResource("com.ibm.wala.core.testdata_1.0.0.jar");
private boolean instrumentedJarBuilt = false;
private void instrument() throws IOException, ClassNotFoundException, InvalidClassFileException, FailureException {
if (! instrumentedJarBuilt) {
DynamicCallGraph.main(new String[]{testJarLocation.getPath(), "-o", "/tmp/test.jar"});
Assert.assertTrue("expected to create /tmp/test.jar", new File("/tmp/test.jar").exists());
instrumentedJarBuilt = true;
}
}
private void run(String exclusionsFile) throws IOException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
String shrikeBin = new File("../com.ibm.wala.shrike/bin/").getCanonicalPath();
String utilBin = new File("../com.ibm.wala.util/bin/").getCanonicalPath();
URLClassLoader jcl = new URLClassLoader(new URL[]{ new URL("file:///tmp/test.jar"), new URL("file://" + shrikeBin + "/"), new URL("file://" + utilBin + "/") }, DynamicCallGraphTests.class.getClassLoader().getParent());
Class<?> testClass = jcl.loadClass("dynamicCG.MainClass");
Assert.assertNotNull(testClass);
Method testMain = testClass.getDeclaredMethod("main", String[].class);
Assert.assertNotNull(testMain);
System.setProperty("dynamicCGFile", "/tmp/cg.txt");
if (exclusionsFile != null) {
File tmpFile = TemporaryFile.urlToFile("exclusions.txt", getClass().getClassLoader().getResource(exclusionsFile));
System.setProperty("dynamicCGFilter", tmpFile.getCanonicalPath());
}
testMain.invoke(null, (Object)new String[0]);
Assert.assertTrue("expected to create call graph", new File(System.getProperty("dynamicCGFile")).exists());
}
private CallGraph staticCG(String exclusionsFile) throws IOException, ClassHierarchyException, IllegalArgumentException, CancelException {
AnalysisScope scope = CallGraphTestUtil.makeJ2SEAnalysisScope(TestConstants.WALA_TESTDATA, exclusionsFile != null? exclusionsFile: CallGraphTestUtil.REGRESSION_EXCLUSIONS);
ClassHierarchy cha = ClassHierarchy.make(scope);
Iterable<Entrypoint> entrypoints = com.ibm.wala.ipa.callgraph.impl.Util.makeMainEntrypoints(scope, cha, "LdynamicCG/MainClass");
AnalysisOptions options = CallGraphTestUtil.makeAnalysisOptions(scope, entrypoints);
return CallGraphTestUtil.buildZeroOneCFA(options, new AnalysisCache(), cha, scope, false);
}
private void check(CallGraph staticCG) throws IOException {
BufferedReader dynamicEdgesFile = new BufferedReader(new FileReader(System.getProperty("dynamicCGFile")));
String line;
while ((line = dynamicEdgesFile.readLine()) != null) {
StringTokenizer edge = new StringTokenizer(line, "\t");
CGNode caller;
String callerClass = edge.nextToken();
if ("root".equals(callerClass)) {
caller = staticCG.getFakeRootNode();
} else {
String callerMethod = edge.nextToken();
Set<CGNode> nodes = staticCG.getNodes(MethodReference.findOrCreate(TypeReference.findOrCreate(ClassLoaderReference.Application, "L" + callerClass), Selector.make(callerMethod)));
Assert.assertEquals(1, nodes.size());
caller = nodes.iterator().next();
}
String calleeClass = edge.nextToken();
String calleeMethod = edge.nextToken();
Set<CGNode> nodes = staticCG.getNodes(MethodReference.findOrCreate(TypeReference.findOrCreate(ClassLoaderReference.Application, "L" + calleeClass), Selector.make(calleeMethod)));
Assert.assertEquals(1, nodes.size());
CGNode callee = nodes.iterator().next();
Assert.assertTrue(staticCG.getPossibleSites(caller, callee).hasNext());
System.err.println("found expected edge" + caller + " --> " + callee);
}
dynamicEdgesFile.close();
}
@Test
public void testGraph() throws IOException, ClassNotFoundException, InvalidClassFileException, FailureException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, ClassHierarchyException, CancelException {
instrument();
run(null);
CallGraph staticCG = staticCG(null);
check(staticCG);
}
@Test
public void testExclusions() throws IOException, ClassNotFoundException, InvalidClassFileException, FailureException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, ClassHierarchyException, CancelException {
instrument();
run("ShrikeTestExclusions.txt");
CallGraph staticCG = staticCG("ShrikeTestExclusions.txt");
check(staticCG);
}
}

View File

@ -142,7 +142,7 @@ public class SlicerTest {
Collection<Statement> slice = computeBackwardSlice;
dumpSlice(slice);
Assert.assertEquals(9, countNormals(slice));
Assert.assertEquals(slice.toString(), 9, countNormals(slice));
}
@Test
@ -164,7 +164,7 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.NONE);
dumpSlice(slice);
Assert.assertEquals(1, countAllocations(slice));
Assert.assertEquals(slice.toString(), 1, countAllocations(slice));
}
@Test
@ -187,7 +187,7 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeForwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.NONE);
dumpSlice(slice);
Assert.assertEquals(4, slice.size());
Assert.assertEquals(slice.toString(), 4, slice.size());
}
@Test
@ -210,7 +210,7 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeForwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.NONE);
dumpSlice(slice);
Assert.assertEquals(7, slice.size());
Assert.assertEquals(slice.toString(), 7, slice.size());
}
/**
@ -271,7 +271,7 @@ public class SlicerTest {
// should only get 4 statements total when ignoring control dependences completely
slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.NONE);
Assert.assertEquals(4, slice.size());
Assert.assertEquals(slice.toString(), 4, slice.size());
}
@Test
@ -294,7 +294,7 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.NONE,
ControlDependenceOptions.FULL);
dumpSlice(slice);
Assert.assertEquals(2, countConditionals(slice));
Assert.assertEquals(slice.toString(), 2, countConditionals(slice));
}
@Test
@ -317,7 +317,7 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.NONE,
ControlDependenceOptions.FULL);
dumpSlice(slice);
Assert.assertEquals(1, countConditionals(slice));
Assert.assertEquals(slice.toString(), 1, countConditionals(slice));
}
@Test
@ -340,7 +340,7 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.NONE,
ControlDependenceOptions.FULL);
dumpSlice(slice);
Assert.assertEquals(0, countConditionals(slice));
Assert.assertEquals(slice.toString(), 0, countConditionals(slice));
}
@Test
@ -370,7 +370,7 @@ public class SlicerTest {
slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.FULL);
dumpSlice(slice);
Assert.assertEquals(1, countConditionals(slice));
Assert.assertEquals(slice.toString(), 1, countConditionals(slice));
}
@Test
@ -394,7 +394,7 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeForwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.NONE,
ControlDependenceOptions.NO_EXCEPTIONAL_EDGES);
dumpSlice(slice);
Assert.assertTrue(slice.size() > 1);
Assert.assertTrue(slice.toString(), slice.size() > 1);
}
@Test
@ -418,7 +418,7 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeForwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.NONE,
ControlDependenceOptions.NO_EXCEPTIONAL_EDGES);
dumpSlice(slice);
Assert.assertEquals(2, countInvokes(slice));
Assert.assertEquals(slice.toString(), 2, countInvokes(slice));
}
@Test
@ -441,7 +441,7 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.NONE);
dumpSlice(slice);
Assert.assertEquals(1, countAllocations(slice));
Assert.assertEquals(slice.toString(), 1, countAllocations(slice));
}
@Test
@ -464,8 +464,8 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.NONE);
dumpSlice(slice);
Assert.assertEquals(2, countAllocations(slice));
Assert.assertEquals(1, countAloads(slice));
Assert.assertEquals(slice.toString(), 2, countAllocations(slice));
Assert.assertEquals(slice.toString(), 1, countAloads(slice));
}
@Test
@ -488,8 +488,8 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.NONE);
dumpSlice(slice);
Assert.assertEquals(2, countAllocations(slice));
Assert.assertEquals(1, countPutfields(slice));
Assert.assertEquals(slice.toString(), 2, countAllocations(slice));
Assert.assertEquals(slice.toString(), 1, countPutfields(slice));
}
@Test
@ -522,8 +522,8 @@ public class SlicerTest {
DataDependenceOptions.NO_BASE_PTRS, ControlDependenceOptions.NONE);
slice = computeBackwardSlice;
dumpSlice(slice);
Assert.assertEquals(2, countAllocations(slice));
Assert.assertEquals(1, countPutfields(slice));
Assert.assertEquals(slice.toString(), 2, countAllocations(slice));
Assert.assertEquals(slice.toString(), 1, countPutfields(slice));
}
@Test
@ -546,9 +546,9 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.NONE);
dumpSlice(slice);
Assert.assertEquals(1, countAllocations(slice));
Assert.assertEquals(2, countPutstatics(slice));
Assert.assertEquals(2, countGetstatics(slice));
Assert.assertEquals(slice.toString(), 1, countAllocations(slice));
Assert.assertEquals(slice.toString(), 2, countPutstatics(slice));
Assert.assertEquals(slice.toString(), 2, countGetstatics(slice));
}
@Test
@ -571,7 +571,7 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.NONE);
dumpSlice(slice);
Assert.assertEquals(2, countAllocations(slice));
Assert.assertEquals(slice.toString(), 2, countAllocations(slice));
}
@Test
@ -595,8 +595,8 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.NONE);
dumpSlice(slice);
Assert.assertEquals(3, countAllocations(slice));
Assert.assertEquals(2, countPutfields(slice));
Assert.assertEquals(slice.toString(), 3, countAllocations(slice));
Assert.assertEquals(slice.toString(), 2, countPutfields(slice));
}
@Test
@ -622,8 +622,8 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, pcg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.FULL);
dumpSlice(slice);
Assert.assertEquals(0, countAllocations(slice));
Assert.assertEquals(1, countPutfields(slice));
Assert.assertEquals(slice.toString(), 0, countAllocations(slice));
Assert.assertEquals(slice.toString(), 1, countPutfields(slice));
}
@Test
@ -646,9 +646,9 @@ public class SlicerTest {
Collection<Statement> slice = Slicer.computeBackwardSlice(s, cg, builder.getPointerAnalysis(), DataDependenceOptions.FULL,
ControlDependenceOptions.NONE);
dumpSlice(slice);
Assert.assertEquals(1, countApplicationAllocations(slice));
Assert.assertEquals(1, countThrows(slice));
Assert.assertEquals(1, countGetfields(slice));
Assert.assertEquals(slice.toString(), 1, countApplicationAllocations(slice));
Assert.assertEquals(slice.toString(), 1, countThrows(slice));
Assert.assertEquals(slice.toString(), 1, countGetfields(slice));
}
@Test

View File

@ -15,10 +15,10 @@ import java.lang.reflect.Constructor;
import java.util.HashMap;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.util.collections.HashMapFactory;
import com.ibm.wala.util.config.SetOfClasses;
import com.ibm.wala.util.warnings.Warning;
import com.ibm.wala.util.warnings.Warnings;

View File

@ -27,7 +27,6 @@ import java.util.TreeSet;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.shrikeCT.ClassReader;
import com.ibm.wala.shrikeCT.InvalidClassFileException;
@ -39,6 +38,7 @@ import com.ibm.wala.util.collections.HashMapFactory;
import com.ibm.wala.util.collections.HashSetFactory;
import com.ibm.wala.util.collections.Iterator2Collection;
import com.ibm.wala.util.collections.Iterator2Iterable;
import com.ibm.wala.util.config.SetOfClasses;
import com.ibm.wala.util.io.FileProvider;
import com.ibm.wala.util.io.FileSuffixes;
import com.ibm.wala.util.shrike.ShrikeClassReaderHandle;

View File

@ -27,7 +27,6 @@ import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.cha.ClassHierarchy;
@ -38,6 +37,7 @@ import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.util.CancelException;
import com.ibm.wala.util.MonitorUtil.IProgressMonitor;
import com.ibm.wala.util.config.AnalysisScopeReader;
import com.ibm.wala.util.config.SetOfClasses;
import com.ibm.wala.util.debug.Assertions;
import com.ibm.wala.util.io.FileProvider;

View File

@ -34,7 +34,6 @@ import com.ibm.wala.classLoader.Language;
import com.ibm.wala.classLoader.Module;
import com.ibm.wala.classLoader.SourceDirectoryTreeModule;
import com.ibm.wala.classLoader.SourceFileModule;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.shrikeCT.InvalidClassFileException;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.types.Descriptor;
@ -45,6 +44,7 @@ import com.ibm.wala.util.PlatformUtil;
import com.ibm.wala.util.collections.HashMapFactory;
import com.ibm.wala.util.collections.HashSetFactory;
import com.ibm.wala.util.collections.MapUtil;
import com.ibm.wala.util.config.SetOfClasses;
import com.ibm.wala.util.debug.Assertions;
import com.ibm.wala.util.strings.Atom;
import com.ibm.wala.util.strings.ImmutableByteArray;

View File

@ -14,8 +14,8 @@ import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.util.config.AnalysisScopeReader;
import com.ibm.wala.util.config.SetOfClasses;
/**
* A serializable version of {@link AnalysisScope}. Note: any information about the array class loader is lost using this

View File

@ -1,54 +0,0 @@
/*******************************************************************************
* Copyright (c) 2002 - 2006 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.ipa.callgraph.impl;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.types.TypeReference;
import com.ibm.wala.util.collections.HashSetFactory;
/**
* Logically, a set of {@link IClass}.
*
* TODO: why does this not extend {@link Set}? Is there a good reason anymore?
*/
public abstract class SetOfClasses implements Serializable {
public abstract boolean contains(String klassName);
public abstract boolean contains(TypeReference klass);
/**
* Iterate all classes in the given hierarchy that this set contains.
*
* @throws IllegalArgumentException if hierarchy is null
*/
public Iterator<IClass> iterator(IClassHierarchy hierarchy) {
if (hierarchy == null) {
throw new IllegalArgumentException("hierarchy is null");
}
HashSet<IClass> result = HashSetFactory.make();
for (IClass klass : hierarchy) {
if (contains(klass.getReference())) {
result.add(klass);
}
}
return result.iterator();
}
public abstract void add(IClass klass);
}

View File

@ -14,12 +14,12 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.callgraph.propagation.AbstractFieldPointerKey;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.callgraph.propagation.StaticFieldKey;
import com.ibm.wala.types.TypeReference;
import com.ibm.wala.util.collections.HashSetFactory;
import com.ibm.wala.util.config.SetOfClasses;
import com.ibm.wala.util.debug.Assertions;
/**
@ -53,7 +53,7 @@ public class HeapExclusions {
if (p instanceof AbstractFieldPointerKey) {
AbstractFieldPointerKey f = (AbstractFieldPointerKey) p;
if (f.getInstanceKey().getConcreteType() != null) {
if (!set.contains(f.getInstanceKey().getConcreteType().getReference())) {
if (!set.contains(f.getInstanceKey().getConcreteType().getReference().getName().toString().substring(1))) {
result.add(p);
if (VERBOSE) {
verboseAction(p);
@ -64,7 +64,7 @@ public class HeapExclusions {
}
} else if (p instanceof StaticFieldKey) {
StaticFieldKey sf = (StaticFieldKey) p;
if (!set.contains(sf.getField().getDeclaringClass().getReference())) {
if (!set.contains(sf.getField().getDeclaringClass().getReference().getName().toString().substring(1))) {
result.add(p);
if (VERBOSE) {
verboseAction(p);
@ -102,7 +102,7 @@ public class HeapExclusions {
public boolean excludes(PointerKey pk) {
TypeReference t = getType(pk);
return (t == null) ? false : set.contains(t);
return (t == null) ? false : set.contains(t.getName().toString().substring(1));
}
public static TypeReference getType(PointerKey pk) {

View File

@ -25,7 +25,6 @@ import com.ibm.wala.classLoader.CallSiteReference;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.callgraph.propagation.PointerKey;
import com.ibm.wala.ipa.cfg.ExceptionPrunedCFG;
@ -60,6 +59,7 @@ import com.ibm.wala.util.collections.HashSetFactory;
import com.ibm.wala.util.collections.Iterator2Collection;
import com.ibm.wala.util.collections.Iterator2Iterable;
import com.ibm.wala.util.collections.MapUtil;
import com.ibm.wala.util.config.SetOfClasses;
import com.ibm.wala.util.debug.Assertions;
import com.ibm.wala.util.debug.UnimplementedError;
import com.ibm.wala.util.graph.NumberedGraph;
@ -581,19 +581,13 @@ public class PDG implements NumberedGraph<Statement> {
}
@Override
public void add(IClass klass) {
public void add(String klass) {
Assertions.UNREACHABLE();
}
@Override
public boolean contains(String klassName) {
Assertions.UNREACHABLE();
return false;
}
@Override
public boolean contains(TypeReference klass) {
return t.equals(klass);
return t.getName().toString().substring(1).equals(klassName);
}
}
@ -613,19 +607,13 @@ public class PDG implements NumberedGraph<Statement> {
}
@Override
public void add(IClass klass) {
public void add(String klass) {
Assertions.UNREACHABLE();
}
@Override
public boolean contains(String klassName) {
Assertions.UNREACHABLE();
return false;
}
@Override
public boolean contains(TypeReference klass) {
return !set.contains(klass);
return !set.contains(klassName);
}
}

View File

@ -22,12 +22,12 @@ import com.ibm.wala.classLoader.IClassLoader;
import com.ibm.wala.classLoader.IMethod;
import com.ibm.wala.classLoader.Language;
import com.ibm.wala.classLoader.Module;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.ssa.SSAInstructionFactory;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.types.TypeName;
import com.ibm.wala.util.collections.HashMapFactory;
import com.ibm.wala.util.config.SetOfClasses;
import com.ibm.wala.util.strings.Atom;
/**

View File

@ -12,6 +12,7 @@ package com.ibm.wala.util.config;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@ -67,7 +68,8 @@ public class AnalysisScopeReader {
}
if (exclusionsFile != null) {
scope.setExclusions(FileOfClasses.createFileOfClasses(exclusionsFile));
InputStream fs = exclusionsFile.exists()? new FileInputStream(exclusionsFile): FileProvider.class.getClassLoader().getResourceAsStream(exclusionsFile.getName());
scope.setExclusions(new FileOfClasses(fs));
}
} finally {

View File

@ -56,9 +56,9 @@ import com.ibm.wala.ipa.callgraph.AnalysisCache;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.util.config.SetOfClasses;
public class JDTJavaSourceAnalysisEngine extends EclipseProjectSourceAnalysisEngine<IJavaProject> {

View File

@ -44,9 +44,9 @@ import com.ibm.wala.classLoader.ClassLoaderFactoryImpl;
import com.ibm.wala.classLoader.ClassLoaderImpl;
import com.ibm.wala.classLoader.IClassLoader;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.util.config.SetOfClasses;
public class JDTClassLoaderFactory extends ClassLoaderFactoryImpl {

View File

@ -42,9 +42,9 @@ import java.io.IOException;
import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl;
import com.ibm.wala.cast.java.translator.SourceModuleTranslator;
import com.ibm.wala.classLoader.IClassLoader;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.util.config.SetOfClasses;
public class JDTSourceLoaderImpl extends JavaSourceLoaderImpl {

View File

@ -46,13 +46,13 @@ import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.util.CancelException;
import com.ibm.wala.util.NullProgressMonitor;
import com.ibm.wala.util.collections.HashSetFactory;
import com.ibm.wala.util.collections.Pair;
import com.ibm.wala.util.config.SetOfClasses;
import com.ibm.wala.util.functions.Function;
public class EclipseJavaScriptAnalysisEngine extends EclipseProjectSourceAnalysisEngine<IJavaScriptProject> {

View File

@ -21,10 +21,10 @@ import com.ibm.wala.ide.util.JavaScriptEclipseProjectPath;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.util.CancelException;
import com.ibm.wala.util.collections.HashSetFactory;
import com.ibm.wala.util.collections.Pair;
import com.ibm.wala.util.config.SetOfClasses;
public class EclipseWebAnalysisEngine extends EclipseJavaScriptAnalysisEngine {

View File

@ -11,7 +11,9 @@
package com.ibm.wala.ide.client;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
@ -25,6 +27,7 @@ import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.CallGraphBuilder;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.util.config.FileOfClasses;
import com.ibm.wala.util.io.FileProvider;
abstract public class EclipseProjectAnalysisEngine<P> extends AbstractAnalysisEngine {
@ -55,7 +58,8 @@ abstract public class EclipseProjectAnalysisEngine<P> extends AbstractAnalysisEn
ePath = createProjectPath(project);
super.scope = ePath.toAnalysisScope(makeAnalysisScope());
if (getExclusionsFile() != null) {
scope.setExclusions(FileOfClasses.createFileOfClasses(new File(getExclusionsFile())));
InputStream is = new File(getExclusionsFile()).exists()? new FileInputStream(getExclusionsFile()): FileProvider.class.getClassLoader().getResourceAsStream(getExclusionsFile());
scope.setExclusions(new FileOfClasses(is));
}
} catch (CoreException e) {
assert false : e.getMessage();

View File

@ -7,6 +7,7 @@ Bundle-Vendor: %providerName
Bundle-ActivationPolicy: lazy
Bundle-Localization: plugin
Export-Package: com.ibm.wala.shrike.bench,
com.ibm.wala.shrike.cg,
com.ibm.wala.shrike.copywriter,
com.ibm.wala.shrikeBT,
com.ibm.wala.shrikeBT.analysis,

View File

@ -11,9 +11,10 @@
package com.ibm.wala.shrike.cg;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.regex.Pattern;
import com.ibm.wala.shrikeBT.ConstantInstruction;
import com.ibm.wala.shrikeBT.Constants;
@ -26,11 +27,15 @@ import com.ibm.wala.shrikeBT.MethodEditor.Output;
import com.ibm.wala.shrikeBT.ReturnInstruction;
import com.ibm.wala.shrikeBT.ThrowInstruction;
import com.ibm.wala.shrikeBT.Util;
import com.ibm.wala.shrikeBT.analysis.Analyzer.FailureException;
import com.ibm.wala.shrikeBT.analysis.Verifier;
import com.ibm.wala.shrikeBT.shrikeCT.ClassInstrumenter;
import com.ibm.wala.shrikeBT.shrikeCT.OfflineInstrumenter;
import com.ibm.wala.shrikeCT.ClassReader;
import com.ibm.wala.shrikeCT.ClassWriter;
import com.ibm.wala.shrikeCT.InvalidClassFileException;
import com.ibm.wala.util.config.FileOfClasses;
import com.ibm.wala.util.config.SetOfClasses;
/**
* Class files are taken as input arguments (or if there are none, from standard
@ -57,9 +62,9 @@ public class DynamicCallGraph {
private static Class<?> runtime = Runtime.class;
private static Pattern filter;
private static SetOfClasses filter;
public static void main(String[] args) throws Exception {
public static void main(String[] args) throws IOException, ClassNotFoundException, InvalidClassFileException, FailureException {
instrumenter = new OfflineInstrumenter();
Writer w = new BufferedWriter(new FileWriter("report", false));
@ -69,8 +74,8 @@ public class DynamicCallGraph {
for(int i = 0; i < args.length - 1; i++) {
if ("--runtime".equals(args[i])) {
runtime = Class.forName(args[i+1]);
} else if ("--filter".equals(args[i])) {
filter = Pattern.compile(args[i+1]);
} else if ("--exclusions".equals(args[i])) {
filter = new FileOfClasses(new FileInputStream(args[i+1]));
}
}
@ -83,9 +88,9 @@ public class DynamicCallGraph {
instrumenter.close();
}
private static void doClass(final ClassInstrumenter ci, Writer w) throws Exception {
private static void doClass(final ClassInstrumenter ci, Writer w) throws InvalidClassFileException, IOException, FailureException {
final String className = ci.getReader().getName();
if (filter != null && ! filter.matcher(className).find()) {
if (filter != null && ! filter.contains(className)) {
return;
}
w.write("Class: " + className + "\n");
@ -114,18 +119,20 @@ public class DynamicCallGraph {
final MethodEditor me = new MethodEditor(d);
me.beginPass();
final String method = r.getName().replace('/', '.').concat(".").concat(r.getMethodName(m).concat(r.getMethodType(m)));
final boolean isConstructor = method.contains("<init>");
final String theClass = r.getName();
final String theMethod = r.getMethodName(m).concat(r.getMethodType(m));
final boolean isConstructor = theMethod.contains("<init>");
final boolean nonStatic = !java.lang.reflect.Modifier.isStatic(r.getMethodAccessFlags(m));
me.insertAtStart(new MethodEditor.Patch() {
@Override
public void emitTo(MethodEditor.Output w) {
w.emit(ConstantInstruction.makeString(method));
w.emit(ConstantInstruction.makeString(theClass));
w.emit(ConstantInstruction.makeString(theMethod));
if (nonStatic && !isConstructor)
w.emit(LoadInstruction.make(Constants.TYPE_Object, 0)); //load this
else
w.emit(ConstantInstruction.make(Constants.TYPE_null, null));
w.emit(Util.makeInvoke(runtime, "execution", new Class[] {String.class, Object.class}));
w.emit(Util.makeInvoke(runtime, "execution", new Class[] {String.class, String.class, Object.class}));
}
});
@ -135,13 +142,14 @@ public class DynamicCallGraph {
insertBefore(new MethodEditor.Patch() {
@Override
public void emitTo(MethodEditor.Output w) {
w.emit(ConstantInstruction.makeString(method));
w.emit(ConstantInstruction.makeString(theClass));
w.emit(ConstantInstruction.makeString(theMethod));
if (nonStatic)
w.emit(LoadInstruction.make(Constants.TYPE_Object, 0)); //load this
else
w.emit(ConstantInstruction.make(Constants.TYPE_null, null));
w.emit(ConstantInstruction.make(0)); // false
w.emit(Util.makeInvoke(runtime, "termination", new Class[] {String.class, Object.class, boolean.class}));
w.emit(Util.makeInvoke(runtime, "termination", new Class[] {String.class, String.class, Object.class, boolean.class}));
}
});
}
@ -151,42 +159,47 @@ public class DynamicCallGraph {
insertBefore(new MethodEditor.Patch() {
@Override
public void emitTo(Output w) {
w.emit(ConstantInstruction.makeString(method));
w.emit(ConstantInstruction.makeString(theClass));
w.emit(ConstantInstruction.makeString(theMethod));
if (nonStatic)
w.emit(LoadInstruction.make(Constants.TYPE_Object, 0)); //load this
else
w.emit(ConstantInstruction.make(Constants.TYPE_null, null));
w.emit(ConstantInstruction.make(1)); // true
w.emit(Util.makeInvoke(runtime, "termination", new Class[] {String.class, Object.class, boolean.class}));
w.emit(Util.makeInvoke(runtime, "termination", new Class[] {String.class, String.class, Object.class, boolean.class}));
}
});
}
@Override
public void visitInvoke(IInvokeInstruction inv) {
final String callee = Util.makeClass(inv.getClassType()) + "." + inv.getMethodName() + inv.getMethodSignature();
final String calleeClass = inv.getClassType();
final String calleeMethod = inv.getMethodName() + inv.getMethodSignature();
addInstructionExceptionHandler(/*"java.lang.Throwable"*/null, new MethodEditor.Patch() {
@Override
public void emitTo(MethodEditor.Output w) {
w.emit(ConstantInstruction.makeString(callee));
w.emit(Util.makeInvoke(runtime, "pop", new Class[] {String.class}));
w.emit(ConstantInstruction.makeString(calleeClass));
w.emit(ConstantInstruction.makeString(calleeMethod));
w.emit(Util.makeInvoke(runtime, "pop", new Class[] {String.class, String.class}));
w.emit(ThrowInstruction.make(true));
}
});
insertBefore(new MethodEditor.Patch() {
@Override
public void emitTo(MethodEditor.Output w) {
w.emit(ConstantInstruction.makeString(callee));
// target unknown
w.emit(ConstantInstruction.makeString(calleeClass));
w.emit(ConstantInstruction.makeString(calleeMethod));
// target unknown
w.emit(ConstantInstruction.make(Constants.TYPE_null, null));
w.emit(Util.makeInvoke(runtime, "addToCallStack", new Class[] {String.class, Object.class}));
w.emit(Util.makeInvoke(runtime, "addToCallStack", new Class[] {String.class, String.class, Object.class}));
}
});
insertAfter(new MethodEditor.Patch() {
@Override
public void emitTo(MethodEditor.Output w) {
w.emit(ConstantInstruction.makeString(callee));
w.emit(Util.makeInvoke(runtime, "pop", new Class[] {String.class}));
w.emit(ConstantInstruction.makeString(calleeClass));
w.emit(ConstantInstruction.makeString(calleeMethod));
w.emit(Util.makeInvoke(runtime, "pop", new Class[] {String.class, String.class}));
}
});
}

View File

@ -1,21 +1,33 @@
package com.ibm.wala.shrike.cg;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Stack;
import com.ibm.wala.util.config.FileOfClasses;
import com.ibm.wala.util.config.SetOfClasses;
public class Runtime {
private static final Runtime runtime = new Runtime(System.getProperty("dynamicCGFile"));
private static final Runtime runtime =
new Runtime(System.getProperty("dynamicCGFile"), System.getProperty("dynamicCGFilter"));
private PrintWriter output;
private SetOfClasses filter;
private Stack<String> callStack;
private Runtime(String fileName) {
private Runtime(String fileName, String filterFileName) {
callStack = new Stack<String>();
callStack.push("root");
try {
filter = new FileOfClasses(new FileInputStream(filterFileName));
} catch (Exception e) {
filter = null;
}
try {
output = new PrintWriter(new FileWriter(fileName));
} catch (IOException e) {
@ -23,21 +35,24 @@ public class Runtime {
}
}
public static void execution(String method, Object receiver) {
public static void execution(String klass, String method, Object receiver) {
if (runtime.filter == null || ! runtime.filter.contains(klass)) {
runtime.output.printf(runtime.callStack.peek() + "\t" + klass + "\t" + method + "\n");
runtime.output.flush();
}
runtime.callStack.push(klass + "\t" + method);
}
public static void termination(String method, Object receiver, boolean exception) {
}
public static void pop(String method) {
public static void termination(String klass, String method, Object receiver, boolean exception) {
runtime.callStack.pop();
}
public static void addToCallStack(String method, Object receiver) {
runtime.output.printf(runtime.callStack.peek() + "\t" + method + "\n");
runtime.callStack.push(method);
runtime.output.flush();
public static void pop(String klass, String method) {
}
public static void addToCallStack(String klass, String method, Object receiver) {
}
}

View File

@ -8,6 +8,7 @@ Export-Package: com.ibm.wala.dataflow.graph,
com.ibm.wala.fixpoint,
com.ibm.wala.util,
com.ibm.wala.util.collections,
com.ibm.wala.util.config,
com.ibm.wala.util.debug,
com.ibm.wala.util.functions,
com.ibm.wala.util.graph,

View File

@ -11,8 +11,6 @@
package com.ibm.wala.util.config;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@ -20,11 +18,6 @@ import java.io.Serializable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.ibm.wala.classLoader.IClass;
import com.ibm.wala.ipa.callgraph.impl.SetOfClasses;
import com.ibm.wala.types.TypeReference;
import com.ibm.wala.util.io.FileProvider;
/**
* An object which represents a set of classes read from a text file.
*/
@ -35,24 +28,11 @@ public class FileOfClasses extends SetOfClasses implements Serializable {
private static final boolean DEBUG = false;
private Pattern pattern = null;
private String regex = null;
private boolean needsCompile = false;
private FileOfClasses(File textFile) throws IOException {
this(textFile.exists()? new FileInputStream(textFile): FileProvider.class.getClassLoader().getResourceAsStream(textFile.getName()));
}
public static FileOfClasses createFileOfClasses(File textFile) throws IOException {
if (textFile == null) {
throw new IllegalArgumentException("null textFile");
}
return new FileOfClasses(textFile);
}
public FileOfClasses(InputStream input) throws IOException {
if (input == null) {
@ -83,20 +63,6 @@ public class FileOfClasses extends SetOfClasses implements Serializable {
needsCompile = false;
}
@Override
public boolean contains(TypeReference klass) {
if (klass == null) {
throw new IllegalArgumentException("klass is null");
}
if (klass.isPrimitiveType()) {
// can't exclude primitives
return false;
}
// get rid of the initial 'L'
final String klassName = klass.getName().toString().substring(1);
return contains(klassName);
}
/*
* @see com.ibm.wala.ipa.callgraph.impl.SetOfClasses#contains(java.lang.String)
*/
@ -123,14 +89,14 @@ public class FileOfClasses extends SetOfClasses implements Serializable {
* @see com.ibm.wala.ipa.callgraph.impl.SetOfClasses#add(com.ibm.wala.classLoader.IClass)
*/
@Override
public void add(IClass klass) {
public void add(String klass) {
if (klass == null) {
throw new IllegalArgumentException("klass is null");
}
if (regex == null) {
regex = klass.getReference().getName().toString();
regex = klass;
} else {
regex = regex + '|' + klass.getReference().getName().toString();
regex = regex + '|' + klass;
}
needsCompile = true;
}

View File

@ -0,0 +1,27 @@
/*******************************************************************************
* Copyright (c) 2002 - 2006 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.util.config;
import java.io.Serializable;
import java.util.Set;
/**
* Logically, a set of {@link IClass}.
*
* TODO: why does this not extend {@link Set}? Is there a good reason anymore?
*/
public abstract class SetOfClasses implements Serializable {
public abstract boolean contains(String klassName);
public abstract void add(String klass);
}

View File

@ -8,7 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
*****************************************************************************/
package com.ibm.wala.cast.util;
package com.ibm.wala.util.io;
import java.io.File;
import java.io.FileOutputStream;