got code to compile again, and wala.core regression tests pass

This commit is contained in:
Manu Sridharan 2012-04-16 22:30:03 -04:00
parent e0d3df8ea7
commit c116f16823
20 changed files with 348 additions and 275 deletions

View File

@ -24,11 +24,11 @@ import com.ibm.wala.cast.java.test.ide.IDEIRTestUtil;
import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;
import com.ibm.wala.core.tests.plugin.CoreTestsPlugin;
import com.ibm.wala.ide.tests.util.EclipseTestUtil;
import com.ibm.wala.ide.util.EclipseFileProvider;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.util.io.FileProvider;
public class JDTJava15IRTests extends IRTests {
@ -62,7 +62,7 @@ public class JDTJava15IRTests extends IRTests {
};
try {
engine.setExclusionsFile((new FileProvider())
engine.setExclusionsFile((new EclipseFileProvider())
.getFileFromPlugin(CoreTestsPlugin.getDefault(), CallGraphTestUtil.REGRESSION_EXCLUSIONS).getAbsolutePath());
} catch (IOException e) {
Assert.assertFalse("Cannot find exclusions file", true);

View File

@ -54,11 +54,11 @@ import com.ibm.wala.cast.java.test.ide.IDEIRTestUtil;
import com.ibm.wala.core.tests.callGraph.CallGraphTestUtil;
import com.ibm.wala.core.tests.plugin.CoreTestsPlugin;
import com.ibm.wala.ide.tests.util.EclipseTestUtil;
import com.ibm.wala.ide.util.EclipseFileProvider;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.ipa.callgraph.Entrypoint;
import com.ibm.wala.ipa.callgraph.impl.Util;
import com.ibm.wala.ipa.cha.IClassHierarchy;
import com.ibm.wala.util.io.FileProvider;
public class JDTJavaIRTests extends JavaIRTests {
@ -96,7 +96,7 @@ public class JDTJavaIRTests extends JavaIRTests {
};
try {
engine.setExclusionsFile((new FileProvider())
engine.setExclusionsFile((new EclipseFileProvider())
.getFileFromPlugin(CoreTestsPlugin.getDefault(), CallGraphTestUtil.REGRESSION_EXCLUSIONS).getAbsolutePath());
} catch (IOException e) {
Assert.assertFalse("Cannot find exclusions file", true);

View File

@ -25,7 +25,8 @@ import com.ibm.wala.classLoader.BinaryDirectoryTreeModule;
import com.ibm.wala.classLoader.ClassLoaderFactory;
import com.ibm.wala.classLoader.Module;
import com.ibm.wala.classLoader.SourceDirectoryTreeModule;
import com.ibm.wala.core.plugin.CorePlugin;
import com.ibm.wala.ide.plugin.CorePlugin;
import com.ibm.wala.ide.util.EclipseFileProvider;
import com.ibm.wala.ide.util.EclipseProjectPath;
import com.ibm.wala.ide.util.EclipseProjectPath.Loader;
import com.ibm.wala.ipa.callgraph.AnalysisCache;
@ -64,7 +65,7 @@ public class EclipseProjectSourceAnalysisEngine extends EclipseProjectAnalysisEn
super(project);
this.fileExt = fileExt;
try {
setExclusionsFile((new FileProvider()).getFileFromPlugin(CorePlugin.getDefault(), "J2SEClassHierarchyExclusions.txt")
setExclusionsFile((new EclipseFileProvider()).getFileFromPlugin(CorePlugin.getDefault(), "J2SEClassHierarchyExclusions.txt")
.getAbsolutePath());
} catch (IOException e) {
Assertions.UNREACHABLE("Cannot find exclusions file");

View File

@ -13,7 +13,8 @@ Require-Bundle: org.eclipse.core.runtime,
com.ibm.wala.cast.js.test;bundle-version="1.0.0",
com.ibm.wala.cast.test;bundle-version="1.0.0",
com.ibm.wala.core.tests;bundle-version="1.1.3",
org.junit4;bundle-version="4.3.1"
org.junit4;bundle-version="4.3.1",
com.ibm.wala.ide;bundle-version="1.1.3"
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Bundle-ActivationPolicy: lazy
Export-Package: com.ibm.wala.cast.js.test

View File

@ -20,13 +20,13 @@ import com.ibm.wala.cast.js.ipa.callgraph.correlations.extraction.CorrelatedPair
import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil;
import com.ibm.wala.cast.js.test.JSCallGraphBuilderUtil.CGBuilderType;
import com.ibm.wala.cast.js.translator.CAstRhinoTranslatorFactory;
import com.ibm.wala.ide.util.ProgressMaster;
import com.ibm.wala.ide.util.ProgressMonitorDelegate;
import com.ibm.wala.ipa.callgraph.CGNode;
import com.ibm.wala.ipa.callgraph.CallGraph;
import com.ibm.wala.ipa.callgraph.CallGraphBuilderCancelException;
import com.ibm.wala.ipa.callgraph.propagation.PointerAnalysis;
import com.ibm.wala.ipa.cha.ClassHierarchyException;
import com.ibm.wala.util.ProgressMaster;
import com.ibm.wala.util.ProgressMonitorDelegate;
import com.ibm.wala.util.io.CommandLine;
import com.ibm.wala.util.io.FileProvider;

View File

@ -7,7 +7,8 @@ Bundle-Activator: com.ibm.wala.cast.plugin.AstPlugin
Bundle-Vendor: IBM
Require-Bundle: com.ibm.wala.core,
com.ibm.wala.shrike,
org.eclipse.core.runtime
org.eclipse.core.runtime,
com.ibm.wala.ide;bundle-version="1.1.3"
Bundle-ActivationPolicy: lazy
Export-Package: com.ibm.wala.cast.analysis.typeInference,
com.ibm.wala.cast.ipa.callgraph,

View File

@ -11,7 +11,7 @@
package com.ibm.wala.cast.ir.translator;
import com.ibm.wala.cast.tree.CAst;
import com.ibm.wala.core.plugin.CorePlugin;
import com.ibm.wala.ide.plugin.CorePlugin;
/**
* superclass for CAst parsers / translators making use of native code. performs

View File

@ -7,7 +7,8 @@ Bundle-Vendor: %providerName
Require-Bundle: com.ibm.wala.shrike,
com.ibm.wala.core,
org.eclipse.core.runtime,
org.junit4;bundle-version="4.3.1"
org.junit4;bundle-version="4.3.1",
com.ibm.wala.ide;bundle-version="1.1.3"
Bundle-Localization: plugin
Export-Package: com.ibm.wala.core.tests.basic,
com.ibm.wala.core.tests.callGraph,

View File

@ -52,6 +52,8 @@ import com.ibm.wala.demandpa.alg.statemachine.StateMachineFactory;
import com.ibm.wala.demandpa.flowgraph.IFlowLabel;
import com.ibm.wala.demandpa.util.MemoryAccessMap;
import com.ibm.wala.demandpa.util.SimpleMemoryAccessMap;
import com.ibm.wala.ide.util.ProgressMaster;
import com.ibm.wala.ide.util.ProgressMonitorDelegate;
import com.ibm.wala.ipa.callgraph.AnalysisCache;
import com.ibm.wala.ipa.callgraph.AnalysisOptions;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
@ -77,8 +79,6 @@ import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.types.TypeReference;
import com.ibm.wala.util.CancelException;
import com.ibm.wala.util.Predicate;
import com.ibm.wala.util.ProgressMaster;
import com.ibm.wala.util.ProgressMonitorDelegate;
import com.ibm.wala.util.WalaException;
import com.ibm.wala.util.collections.Pair;
import com.ibm.wala.util.debug.Assertions;

View File

@ -4,7 +4,7 @@ Eclipse-LazyStart: true
Bundle-Name: %pluginName
Bundle-SymbolicName: com.ibm.wala.core
Bundle-Version: 1.1.3.qualifier
Bundle-Activator: com.ibm.wala.core.plugin.CorePlugin
Bundle-Activator: com.ibm.wala.ide.plugin.CorePlugin
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Require-Bundle: com.ibm.wala.shrike,

View File

@ -1,42 +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.classLoader;
import java.io.File;
import org.eclipse.core.resources.IFile;
/**
* A module which is a wrapper around a .java file
*/
public class EclipseSourceFileModule extends SourceFileModule {
private IFile f;
public static EclipseSourceFileModule createEclipseSourceFileModule(IFile f) {
if (f == null) {
throw new IllegalArgumentException("null f");
}
return new EclipseSourceFileModule(f);
}
private EclipseSourceFileModule(IFile f) {
super(new File(f.getLocation().toOSString()),f.getLocation().lastSegment());
this.f = f;
}
public IFile getIFile() {
return f;
}
@Override
public String toString() {
return "EclipseSourceFileModule:" + getFile().toString();
}
}

View File

@ -17,10 +17,6 @@ import java.net.URL;
import java.util.Collection;
import java.util.Properties;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
import com.ibm.wala.core.plugin.CorePlugin;
import com.ibm.wala.util.WalaException;
import com.ibm.wala.util.debug.Assertions;
import com.ibm.wala.util.io.FileProvider;
@ -147,24 +143,4 @@ public final class WalaProperties {
}
}
/**
* This is fragile. Use with care.
* @return a String representing the path to the wala.core plugin installation
*/
public static String getWalaCorePluginHome() {
if (CorePlugin.getDefault() == null) {
return null;
}
String install = Platform.getInstallLocation().getURL().getPath();
Bundle b = Platform.getBundle("com.ibm.wala.core");
String l = b.getLocation();
if (l.startsWith("update@")) {
l = l.replace("update@", "");
}
if (l.startsWith("reference:file:")) {
return l.replace("reference:file:","");
} else {
return install + File.separator + l;
}
}
}

View File

@ -18,12 +18,9 @@ import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.jar.JarFile;
import org.eclipse.core.runtime.Plugin;
import com.ibm.wala.classLoader.BinaryDirectoryTreeModule;
import com.ibm.wala.classLoader.Module;
import com.ibm.wala.classLoader.SourceDirectoryTreeModule;
import com.ibm.wala.core.plugin.CorePlugin;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.properties.WalaProperties;
import com.ibm.wala.shrikeCT.InvalidClassFileException;
@ -39,7 +36,7 @@ public class AnalysisScopeReader {
private static final ClassLoader MY_CLASSLOADER = AnalysisScopeReader.class.getClassLoader();
private static final String BASIC_FILE = "primordial.txt";
protected static final String BASIC_FILE = "primordial.txt";
/**
* read in an analysis scope for a Java application from a text file
@ -51,20 +48,15 @@ public class AnalysisScopeReader {
*/
public static AnalysisScope readJavaScope(String scopeFileName, File exclusionsFile, ClassLoader javaLoader) throws IOException {
AnalysisScope scope = AnalysisScope.createJavaAnalysisScope();
return read(scope, scopeFileName, exclusionsFile, javaLoader, CorePlugin.getDefault());
return read(scope, scopeFileName, exclusionsFile, javaLoader, new FileProvider());
}
private static AnalysisScope readJavaScope(String scopeFileName, File exclusionsFile, ClassLoader javaLoader, Plugin plugIn) throws IOException {
AnalysisScope scope = AnalysisScope.createJavaAnalysisScope();
return read(scope, scopeFileName, exclusionsFile, javaLoader, plugIn);
}
private static AnalysisScope read(AnalysisScope scope, String scopeFileName, File exclusionsFile, ClassLoader javaLoader,
Plugin plugIn) throws IOException {
protected static AnalysisScope read(AnalysisScope scope, String scopeFileName, File exclusionsFile, ClassLoader javaLoader,
FileProvider fp) throws IOException {
BufferedReader r = null;
try {
File scopeFile = (plugIn == null) ? (new FileProvider()).getFile(scopeFileName, javaLoader) : (new FileProvider()).getFileFromPlugin(plugIn,
scopeFileName);
File scopeFile = fp.getFile(scopeFileName, javaLoader);
assert scopeFile.exists();
String line;
@ -147,12 +139,10 @@ public class AnalysisScopeReader {
* @throws IllegalStateException if there are problmes reading wala properties
*/
public static AnalysisScope makePrimordialScope(File exclusionsFile) throws IOException {
return readJavaScope(BASIC_FILE, exclusionsFile, MY_CLASSLOADER, CorePlugin.getDefault());
return readJavaScope(BASIC_FILE, exclusionsFile, MY_CLASSLOADER);
}
private static AnalysisScope makePrimordialScope(File exclusionsFile, Plugin plugIn) throws IOException {
return readJavaScope(BASIC_FILE, exclusionsFile, MY_CLASSLOADER, plugIn);
}
/**
* @param classPath class path to analyze, delimited by File.pathSeparator
@ -161,20 +151,10 @@ public class AnalysisScopeReader {
* @throws IllegalStateException if there are problems reading wala properties
*/
public static AnalysisScope makeJavaBinaryAnalysisScope(String classPath, File exclusionsFile) throws IOException {
return makeJavaBinaryAnalysisScope(classPath, exclusionsFile, CorePlugin.getDefault());
}
/**
* @param classPath class path to analyze, delimited by File.pathSeparator
* @param exclusionsFile file holding class hierarchy exclusions. may be null
* @throws IOException
* @throws IllegalStateException if there are problems reading wala properties
*/
public static AnalysisScope makeJavaBinaryAnalysisScope(String classPath, File exclusionsFile, Plugin plugIn) throws IOException {
if (classPath == null) {
throw new IllegalArgumentException("classPath null");
}
AnalysisScope scope = makePrimordialScope(exclusionsFile, plugIn);
AnalysisScope scope = makePrimordialScope(exclusionsFile);
ClassLoaderReference loader = scope.getLoader(AnalysisScope.APPLICATION);
addClassPathToScope(classPath, scope, loader);

View File

@ -14,68 +14,22 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.JarURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.zip.ZipException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Plugin;
import com.ibm.wala.classLoader.JarFileModule;
import com.ibm.wala.classLoader.Module;
import com.ibm.wala.classLoader.NestedJarFileModule;
import com.ibm.wala.core.plugin.CorePlugin;
import com.ibm.wala.util.debug.Assertions;
/**
* This class provides files that are packaged with this plug-in
*/
public class FileProvider {
/**
* This class uses reflection to access classes and methods that are only
* available when Eclipse is running as an IDE environment. The choice to use
* reflection is related to builds: with this design the build doesn't need to
* provide IDE bundles during compilation and hence can spot invalid uses of
* such classes through this bundle.
*
* Because of this class, this bundle must OPTIONALY require
* 'org.eclipse.core.resources'.
*/
private static final class EclipseUtil {
private static Object workspaceRoot = null;
private static Method workspaceRoot_getFile = null;
public static Module getJarFileModule(String fileName, ClassLoader loader) {
// Using reflection to enable this code to be built without the
// org.eclipse.core.resources bundle
//
try {
if (workspaceRoot_getFile == null) {
Class<?> cls = Class.forName("org.eclipse.core.resources.ResourcesPlugin");
Method getWorkspaceMethod = cls.getDeclaredMethod("getWorkspace");
Object workspace = getWorkspaceMethod.invoke(null);
Method getRoot = workspace.getClass().getDeclaredMethod("getRoot");
workspaceRoot = getRoot.invoke(workspace);
workspaceRoot_getFile = workspaceRoot.getClass().getMethod("getFile", IPath.class);
}
IPath path = new Path(fileName);
if (workspaceRoot_getFile.invoke(workspaceRoot, path) != null) {
return new JarFileModule(new JarFile(fileName, false));
}
} catch (Exception e) {
}
return null;
}
}
private final static int DEBUG_LEVEL = 0;
@ -89,15 +43,7 @@ public class FileProvider {
}
public Module getJarFileModule(String fileName, ClassLoader loader) throws IOException {
if (CorePlugin.getDefault() == null) {
return getJarFileFromClassLoader(fileName, loader);
} else if (CorePlugin.IS_RESOURCES_BUNDLE_AVAILABLE) {
Module module = EclipseUtil.getJarFileModule(fileName, loader);
if (module != null) {
return module;
}
}
return getFromPlugin(CorePlugin.getDefault(), fileName);
return getJarFileFromClassLoader(fileName, loader);
}
public URL getResource(String fileName) throws IOException {
@ -111,11 +57,10 @@ public class FileProvider {
if (fileName == null) {
throw new IllegalArgumentException("null fileName");
}
if (CorePlugin.getDefault() == null && loader == null) {
if (loader == null) {
throw new IllegalArgumentException("null loader");
}
return (CorePlugin.getDefault() == null) ? loader.getResource(fileName) : FileLocator.find(CorePlugin.getDefault().getBundle(),
new Path(fileName), null);
return loader.getResource(fileName);
}
public File getFile(String fileName) throws IOException {
@ -126,111 +71,7 @@ public class FileProvider {
}
public File getFile(String fileName, ClassLoader loader) throws IOException {
return (CorePlugin.getDefault() == null) ? getFileFromClassLoader(fileName, loader) : getFileFromPlugin(
CorePlugin.getDefault(), fileName);
}
/**
* @param fileName
* @return the jar file packaged with this plug-in of the given name, or null
* if not found.
* @throws IllegalArgumentException
* if p is null
*/
public File getFileFromPlugin(Plugin p, String fileName) throws IOException {
if (p == null) {
throw new IllegalArgumentException("p is null");
}
if (fileName == null) {
throw new IllegalArgumentException("null fileName");
}
URL url = getFileURLFromPlugin(p, fileName);
if (url == null) {
throw new FileNotFoundException(fileName);
}
return new File(filePathFromURL(url));
}
/**
* @param fileName
* @return the jar file packaged with this plug-in of the given name, or null
* if not found.
*/
private JarFileModule getFromPlugin(Plugin p, String fileName) throws IOException {
URL url = getFileURLFromPlugin(p, fileName);
return (url == null) ? null : new JarFileModule(new JarFile(filePathFromURL(url)));
}
/**
* get a file URL for a file from a plugin
*
* @param fileName
* the file name
* @return the URL, or <code>null</code> if the file is not found
* @throws IOException
*/
private URL getFileURLFromPlugin(Plugin p, String fileName) throws IOException {
try {
URL url = FileLocator.find(p.getBundle(), new Path(fileName), null);
if (url == null) {
// try lib/fileName
String libFileName = "lib/" + fileName;
url = FileLocator.find(p.getBundle(), new Path(libFileName), null);
if (url == null) {
// try bin/fileName
String binFileName = "bin/" + fileName;
url = FileLocator.find(p.getBundle(), new Path(binFileName), null);
if (url == null) {
// try it as an absolute path?
File f = new File(fileName);
if (!f.exists()) {
// give up
return null;
} else {
url = f.toURI().toURL();
}
}
}
}
url = FileLocator.toFileURL(url);
url = fixupFileURLSpaces(url);
return url;
} catch (ExceptionInInitializerError e) {
throw new IOException("failure to get file URL for " + fileName);
}
}
/**
* escape spaces in a URL, primarily to work around a bug in
* {@link File#toURL()}
*
* @param url
* @return an escaped version of the URL
*/
private URL fixupFileURLSpaces(URL url) {
String urlString = url.toExternalForm();
StringBuffer fixedUpUrl = new StringBuffer();
int lastIndex = 0;
while (true) {
int spaceIndex = urlString.indexOf(' ', lastIndex);
if (spaceIndex < 0) {
fixedUpUrl.append(urlString.substring(lastIndex));
break;
}
fixedUpUrl.append(urlString.substring(lastIndex, spaceIndex));
fixedUpUrl.append("%20");
lastIndex = spaceIndex + 1;
}
try {
return new URL(fixedUpUrl.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
Assertions.UNREACHABLE();
}
return null;
return getFileFromClassLoader(fileName, loader);
}
/**

View File

@ -18,5 +18,6 @@ Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Export-Package: com.ibm.wala.ide,
com.ibm.wala.ide.classloader,
com.ibm.wala.ide.plugin,
com.ibm.wala.ide.ui,
com.ibm.wala.ide.util

View File

@ -8,7 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.core.plugin;
package com.ibm.wala.ide.plugin;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;

View File

@ -0,0 +1,67 @@
/*******************************************************************************
* Copyright (c) 2008 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.ide.util;
import java.io.File;
import java.io.IOException;
import org.eclipse.core.runtime.Plugin;
import com.ibm.wala.ide.plugin.CorePlugin;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.util.config.AnalysisScopeReader;
public class EclipseAnalysisScopeReader extends AnalysisScopeReader {
public static AnalysisScope readJavaScopeFromPlugin(String scopeFileName, File exclusionsFile, ClassLoader javaLoader) throws IOException {
return readJavaScopeFromPlugin(scopeFileName, exclusionsFile, javaLoader, CorePlugin.getDefault());
}
public static AnalysisScope readJavaScopeFromPlugin(String scopeFileName, File exclusionsFile, ClassLoader javaLoader, Plugin plugIn) throws IOException {
AnalysisScope scope = AnalysisScope.createJavaAnalysisScope();
return read(scope, scopeFileName, exclusionsFile, javaLoader, new EclipseFileProvider(plugIn));
}
public static AnalysisScope makePrimordialScopeFromPlugin(File exclusionsFile) throws IOException {
return makePrimordialScopeFromPlugin(exclusionsFile, CorePlugin.getDefault());
}
/**
* @param exclusionsFile file holding class hierarchy exclusions. may be null
* @throws IOException
* @throws IllegalStateException if there are problmes reading wala properties
*/
public static AnalysisScope makePrimordialScopeFromPlugin(File exclusionsFile, Plugin plugIn) throws IOException {
return read(AnalysisScope.createJavaAnalysisScope(), BASIC_FILE, exclusionsFile,
EclipseAnalysisScopeReader.class.getClassLoader(), new EclipseFileProvider(plugIn));
}
public static AnalysisScope makeJavaBinaryAnalysisScopeFromPlugin(String classPath, File exclusionsFile) throws IOException {
return makeJavaBinaryAnalysisScopeFromPlugin(classPath, exclusionsFile, CorePlugin.getDefault());
}
/**
* @param classPath class path to analyze, delimited by File.pathSeparator
* @param exclusionsFile file holding class hierarchy exclusions. may be null
* @throws IOException
* @throws IllegalStateException if there are problems reading wala properties
*/
public static AnalysisScope makeJavaBinaryAnalysisScopeFromPlugin(String classPath, File exclusionsFile, Plugin plugIn) throws IOException {
if (classPath == null) {
throw new IllegalArgumentException("classPath null");
}
AnalysisScope scope = makePrimordialScopeFromPlugin(exclusionsFile, plugIn);
ClassLoaderReference loader = scope.getLoader(AnalysisScope.APPLICATION);
addClassPathToScope(classPath, scope, loader);
return scope;
}
}

View File

@ -0,0 +1,245 @@
/*******************************************************************************
* Copyright (c) 2008 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.ide.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.jar.JarFile;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.osgi.framework.Bundle;
import com.ibm.wala.classLoader.JarFileModule;
import com.ibm.wala.classLoader.Module;
import com.ibm.wala.ide.plugin.CorePlugin;
import com.ibm.wala.util.debug.Assertions;
import com.ibm.wala.util.io.FileProvider;
public class EclipseFileProvider extends FileProvider {
/**
* the plug-in to use. If <code>null</code>, {@link CorePlugin#getDefault()} is used.
*/
private final Plugin plugIn;
public EclipseFileProvider() {
this(null);
}
public EclipseFileProvider(Plugin plugIn) {
this.plugIn = plugIn;
}
/**
* This class uses reflection to access classes and methods that are only
* available when Eclipse is running as an IDE environment. The choice to use
* reflection is related to builds: with this design the build doesn't need to
* provide IDE bundles during compilation and hence can spot invalid uses of
* such classes through this bundle.
*
* Because of this class, this bundle must OPTIONALY require
* 'org.eclipse.core.resources'.
*/
private static final class EclipseUtil {
private static Object workspaceRoot = null;
private static Method workspaceRoot_getFile = null;
public static Module getJarFileModule(String fileName) {
// Using reflection to enable this code to be built without the
// org.eclipse.core.resources bundle
//
try {
if (workspaceRoot_getFile == null) {
Class<?> cls = Class.forName("org.eclipse.core.resources.ResourcesPlugin");
Method getWorkspaceMethod = cls.getDeclaredMethod("getWorkspace");
Object workspace = getWorkspaceMethod.invoke(null);
Method getRoot = workspace.getClass().getDeclaredMethod("getRoot");
workspaceRoot = getRoot.invoke(workspace);
workspaceRoot_getFile = workspaceRoot.getClass().getMethod("getFile", IPath.class);
}
IPath path = new Path(fileName);
if (workspaceRoot_getFile.invoke(workspaceRoot, path) != null) {
return new JarFileModule(new JarFile(fileName, false));
}
} catch (Exception e) {
}
return null;
}
}
@Override
public Module getJarFileModule(String fileName, ClassLoader loader) throws IOException {
if (CorePlugin.getDefault() == null) {
return getJarFileFromClassLoader(fileName, loader);
} else if (plugIn != null) {
return getFromPlugin(plugIn, fileName);
} else if (CorePlugin.IS_RESOURCES_BUNDLE_AVAILABLE) {
Module module = EclipseUtil.getJarFileModule(fileName);
if (module != null) {
return module;
}
}
return getFromPlugin(CorePlugin.getDefault(), fileName);
}
/**
* @param fileName
* @return the jar file packaged with this plug-in of the given name, or null
* if not found.
*/
private JarFileModule getFromPlugin(Plugin p, String fileName) throws IOException {
URL url = getFileURLFromPlugin(p, fileName);
return (url == null) ? null : new JarFileModule(new JarFile(filePathFromURL(url)));
}
/**
* get a file URL for a file from a plugin
*
* @param fileName
* the file name
* @return the URL, or <code>null</code> if the file is not found
* @throws IOException
*/
private URL getFileURLFromPlugin(Plugin p, String fileName) throws IOException {
try {
URL url = FileLocator.find(p.getBundle(), new Path(fileName), null);
if (url == null) {
// try lib/fileName
String libFileName = "lib/" + fileName;
url = FileLocator.find(p.getBundle(), new Path(libFileName), null);
if (url == null) {
// try bin/fileName
String binFileName = "bin/" + fileName;
url = FileLocator.find(p.getBundle(), new Path(binFileName), null);
if (url == null) {
// try it as an absolute path?
File f = new File(fileName);
if (!f.exists()) {
// give up
return null;
} else {
url = f.toURI().toURL();
}
}
}
}
url = FileLocator.toFileURL(url);
url = fixupFileURLSpaces(url);
return url;
} catch (ExceptionInInitializerError e) {
throw new IOException("failure to get file URL for " + fileName);
}
}
/**
* escape spaces in a URL, primarily to work around a bug in
* {@link File#toURL()}
*
* @param url
* @return an escaped version of the URL
*/
private URL fixupFileURLSpaces(URL url) {
String urlString = url.toExternalForm();
StringBuffer fixedUpUrl = new StringBuffer();
int lastIndex = 0;
while (true) {
int spaceIndex = urlString.indexOf(' ', lastIndex);
if (spaceIndex < 0) {
fixedUpUrl.append(urlString.substring(lastIndex));
break;
}
fixedUpUrl.append(urlString.substring(lastIndex, spaceIndex));
fixedUpUrl.append("%20");
lastIndex = spaceIndex + 1;
}
try {
return new URL(fixedUpUrl.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
Assertions.UNREACHABLE();
}
return null;
}
@Override
public URL getResource(String fileName, ClassLoader loader) throws IOException {
if (fileName == null) {
throw new IllegalArgumentException("null fileName");
}
Plugin p = plugIn == null ? CorePlugin.getDefault() : plugIn;
if (p == null && loader == null) {
throw new IllegalArgumentException("null loader");
}
return (p == null) ? loader.getResource(fileName) : FileLocator.find(p.getBundle(),
new Path(fileName), null);
}
@Override
public File getFile(String fileName, ClassLoader loader) throws IOException {
Plugin p = plugIn == null ? CorePlugin.getDefault() : plugIn;
return (p == null) ? getFileFromClassLoader(fileName, loader) : getFileFromPlugin(
p, fileName);
}
/**
* @param fileName
* @return the jar file packaged with this plug-in of the given name, or null
* if not found.
* @throws IllegalArgumentException
* if p is null
*/
public File getFileFromPlugin(Plugin p, String fileName) throws IOException {
if (p == null) {
throw new IllegalArgumentException("p is null");
}
if (fileName == null) {
throw new IllegalArgumentException("null fileName");
}
URL url = getFileURLFromPlugin(p, fileName);
if (url == null) {
throw new FileNotFoundException(fileName);
}
return new File(filePathFromURL(url));
}
/**
* This is fragile. Use with care.
* @return a String representing the path to the wala.core plugin installation
*/
public static String getWalaCorePluginHome() {
if (CorePlugin.getDefault() == null) {
return null;
}
String install = Platform.getInstallLocation().getURL().getPath();
Bundle b = Platform.getBundle("com.ibm.wala.core");
String l = b.getLocation();
if (l.startsWith("update@")) {
l = l.replace("update@", "");
}
if (l.startsWith("reference:file:")) {
return l.replace("reference:file:","");
} else {
return install + File.separator + l;
}
}
}

View File

@ -8,7 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.util;
package com.ibm.wala.ide.util;
import org.eclipse.core.runtime.IProgressMonitor;

View File

@ -8,8 +8,9 @@
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.util;
package com.ibm.wala.ide.util;
import com.ibm.wala.util.MonitorUtil;
import com.ibm.wala.util.MonitorUtil.IProgressMonitor;
/**