blob: 102dd01ea39f1f52ac2601d413422c6523891426 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.help.internal.appserver;
import java.io.*;
import java.net.*;
import java.util.*;
import org.eclipse.core.runtime.*;
import org.eclipse.osgi.util.*;
import org.osgi.framework.*;
/**
* Wrapper for a plugin class loader. This class is only needed because the
* current PluginClassLoader is not clearly exposed as a URLClassLoader and its
* getURLs() method does not properly return the list of url's (it misses
* required jars, etc.)
*/
public class PluginClassLoaderWrapper extends URLClassLoader {
private String plugin;
private Bundle bundle;
public PluginClassLoaderWrapper(String plugin) {
super(new URL[0]);
this.plugin = plugin;
this.bundle = Platform.getBundle(plugin);
}
public Class loadClass(String className) throws ClassNotFoundException {
return bundle.loadClass(className);
}
public URL getResource(String resName) {
return bundle.getResource(resName);
}
/**
* This is a workaround for the jsp compiler that needs to know the
* classpath.
*/
public URL[] getURLs() {
Set urls = getPluginClasspath(plugin);
return (URL[]) urls.toArray(new URL[urls.size()]);
}
private Set getPluginClasspath(String pluginId) {
// Collect set of plug-ins
Set plugins = new HashSet();
addPluginWithPrereqs(pluginId, plugins);
// Collect URLs for each plug-in
Set urls = new HashSet();
for (Iterator it = plugins.iterator(); it.hasNext();) {
String id = (String) it.next();
try {
Bundle b = Platform.getBundle(id);
if (b != null) {
// declared classpath
String headers = (String) b.getHeaders().get(
Constants.BUNDLE_CLASSPATH);
ManifestElement[] paths = ManifestElement.parseHeader(
Constants.BUNDLE_CLASSPATH, headers);
if (paths != null) {
for (int i = 0; i < paths.length; i++) {
String path = paths[i].getValue();
URL url = b.getEntry(path);
if (url != null)
try {
urls.add(Platform.asLocalURL(url));
} catch (IOException ioe) {
}
}
}
// dev classpath
String[] devpaths = DevClassPathHelper
.getDevClassPath(pluginId);
if (devpaths != null) {
for (int i = 0; i < devpaths.length; i++) {
URL url = b.getEntry(devpaths[i]);
if (url != null)
try {
urls.add(Platform.asLocalURL(url));
} catch (IOException ioe) {
}
}
}
}
} catch (BundleException e) {
}
}
return urls;
}
/**
* Ensures set contains plugin ID of given plugin and all its prereqs. Does
* nothing if set contains given plug-in.
*/
private void addPluginWithPrereqs(String pluginId, Set pluginIds) {
if (pluginIds.contains(pluginId)) {
return;
}
String[] immidiatePrereqs = getDirectPrereqs(pluginId);
for (int i = 0; i < immidiatePrereqs.length; i++) {
addPluginWithPrereqs(immidiatePrereqs[i], pluginIds);
}
pluginIds.add(pluginId);
}
/**
* Obtain plug-ins immidiately required by given plug-in
*
* @param pluginId
* @return
*/
private String[] getDirectPrereqs(String pluginId) {
try {
Bundle bundle = Platform.getBundle(pluginId);
if (bundle != null) {
String header = (String) bundle.getHeaders().get(
Constants.REQUIRE_BUNDLE);
ManifestElement[] requires = ManifestElement.parseHeader(
Constants.REQUIRE_BUNDLE, header);
if (requires != null) {
String[] reqs = new String[requires.length];
for (int i = 0; i < requires.length; i++) {
reqs[i] = requires[i].getValue();
}
return reqs;
}
}
} catch (BundleException e) {
}
return new String[0];
}
}