package org.ops4j.pax.web.utils;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;
import org.apache.xbean.osgi.bundle.util.BundleResourceHelper;
import org.osgi.framework.Bundle;
import org.osgi.framework.wiring.BundleRevision;
import org.osgi.framework.wiring.BundleWiring;
public class FelixBundleResourceHelper extends BundleResourceHelper {
private List<Bundle> bundles;
public FelixBundleResourceHelper(Bundle bundle, List<Bundle> bundles) {
super(bundle);
this.bundles = bundles;
}
@Override
public URL getResource(String name) {
if (!name.contains("META-INF/")) {
return super.getResource(name);
}
for (Bundle delegate : bundles) {
try {
URL resource = delegate.getResource(name);
if (resource != null) {
BundleRevision revision = delegate.adapt(BundleRevision.class);
Method method = revision.getClass().getMethod("getLocalURL", int.class,
String.class);
if (resource.getProtocol().equals("bundle")) {
return (URL) method.invoke(revision, 0, resource.getPath());
}
else {
return resource;
}
}
}
catch (IllegalStateException | NoSuchMethodException | SecurityException
| IllegalAccessException | IllegalArgumentException | InvocationTargetException exc) {
// ignore
}
}
return null;
}
@Override
public Enumeration<URL> getResources(String name) throws IOException {
if (!name.contains("META-INF/")) {
return super.getResources(name);
}
Vector<URL> resources = new Vector<URL>();
for (Bundle delegate : bundles) {
try {
BundleWiring wiring = delegate.adapt(BundleWiring.class);
Enumeration<URL> urls = wiring.getClassLoader().getResources(name);
BundleRevision revision = delegate.adapt(BundleRevision.class);
Method method = revision.getClass().getMethod("getLocalURL", int.class,
String.class);
if (urls != null) {
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
if (url.getProtocol().equals("bundle")) {
resources.add((URL) method.invoke(revision, 0, url.getPath()));
}
else {
resources.add(url);
}
}
}
}
catch (IllegalStateException | NoSuchMethodException | SecurityException
| IllegalAccessException | IllegalArgumentException | InvocationTargetException exc) {
// ignore
}
}
return resources.elements();
}
}