/* Soot - a J*va Optimization Framework
* Copyright (C) 2008 Eric Bodden
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package ca.mcgill.sable.soot;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.ClasspathVariableInitializer;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.osgi.framework.Bundle;
/**
* This adds a classpath variable "SOOTCLASSES" to the eclipse environment.
* The variable points to lib/sootclasses.jar in the plugin ca.mcgill.sable.soot.lib.
*
* @author Eric Bodden
*/
public class SootClasspathVariableInitializer extends
ClasspathVariableInitializer {
//the following heavily depend on plugin.xml and the projects' structure!
public static final String VARIABLE_NAME_CLASSES = "SOOTCLASSES";
public static final String VARIABLE_NAME_SOURCE = "SOOTSRC";
private static final String LIBRARY_PLUGIN_NAME = "ca.mcgill.sable.soot.lib";
private static final String RELATIVE_PATH_CLASSES_JAR = "lib/sootclasses.jar";
private static final String RELATIVE_PATH_SRC_ZIP = "lib/sootsrc.zip";
@Override
public void initialize(String variable) {
if (variable.equals(VARIABLE_NAME_CLASSES)) { //$NON-NLS-1$
String jarPath = getSootFilePath(RELATIVE_PATH_CLASSES_JAR);
if(jarPath==null) return;
try {
JavaCore.setClasspathVariable(VARIABLE_NAME_CLASSES, //$NON-NLS-1$
new Path(jarPath), new NullProgressMonitor());
} catch (JavaModelException e) {
e.printStackTrace();
}
}
if (variable.equals(VARIABLE_NAME_SOURCE)) { //$NON-NLS-1$
String jarPath = getSootFilePath(RELATIVE_PATH_SRC_ZIP);
if(jarPath==null) return;
try {
JavaCore.setClasspathVariable(VARIABLE_NAME_SOURCE, //$NON-NLS-1$
new Path(jarPath), new NullProgressMonitor());
} catch (JavaModelException e) {
e.printStackTrace();
}
}
}
/**
* Code copied from AJDT implementation http://www.eclipse.org/ajdt
* org.eclipse.ajdt.internal.core.AspectJRTInitializer
* @param relativePath
*/
private static String getSootFilePath(String relativePath) {
StringBuffer cpath = new StringBuffer();
// This returns the bundle with the highest version or null if none
// found
// - for Eclipse 3.0 compatibility
Bundle ajdeBundle = Platform
.getBundle(LIBRARY_PLUGIN_NAME);
String pluginLoc = null;
// 3.0 using bundles instead of plugin descriptors
if (ajdeBundle != null) {
URL installLoc = ajdeBundle.getEntry("/"); //$NON-NLS-1$
URL resolved = null;
try {
resolved = FileLocator.resolve(installLoc);
pluginLoc = resolved.toExternalForm();
} catch (IOException e) {
}
}
if (pluginLoc != null) {
if (pluginLoc.startsWith("file:")) { //$NON-NLS-1$
cpath.append(pluginLoc.substring("file:".length())); //$NON-NLS-1$
cpath.append(relativePath); //$NON-NLS-1$
}
}
String sootJarPath = null;
// Verify that the file actually exists at the plugins location
// derived above. If not then it might be because we are inside
// a runtime workbench. Check under the workspace directory.
if (new File(cpath.toString()).exists()) {
// File does exist under the plugins directory
sootJarPath = cpath.toString();
} else {
// File does *not* exist under plugins. Try under workspace...
IPath rootPath = SootPlugin.getWorkspace().getRoot()
.getLocation();
IPath installPath = rootPath.removeLastSegments(1);
cpath = new StringBuffer().append(installPath.toOSString());
cpath.append(File.separator);
// TODO: what if the workspace isn't called workspace!!!
cpath.append("workspace"); //$NON-NLS-1$
cpath.append(File.separator);
cpath.append(LIBRARY_PLUGIN_NAME);
cpath.append(File.separator);
cpath.append("aspectjrt.jar"); //$NON-NLS-1$
// Only set the aspectjrtPath if the jar file exists here.
if (new File(cpath.toString()).exists())
sootJarPath = cpath.toString();
}
return sootJarPath;
}
}