I'm pretty sure this isn't possible for resources, like it is for classes.
The OSGi spec doesn't mandate the format of bundle resource URLs, which
is what you would need if you wanted to determine from which bundle a
looked up resource comes.
Not sure about other frameworks, but this is fairly easy to determine
from a resource URL in the Felix framework, since this host is the
bundle id + revision id.
-> richard
On 9/1/13 11:31 , Nicolas Lalevée wrote:
Hi,
Maybe my issue has already been addressed several time, so here is the actual
question: how can I get the bundle/classloader which *owns* the URL which I
looked up through classloader.getResource(file) ?
If it's not clear, here is my context.
I am experimenting a build system where some Ant build files and Ant task would
be managed like as OSGi bundles. So I can do a modularisation of build files
and jars of Ant Tasks.
At some point a build file (within a bundle) will have to load some other Ant script
(through the bundle wiring). For that I simply get the classloader of the current
classloader and do a classloader.getResource("/path/other/build.xml"). So far
so good.
But when running that other build file, I would need its classloader to do some
other import of build.xml file. But I only have the resolved URL, not the
bundle which is containing the resolved script. Which java code, it's simple,
from the resolved class I can get its classloader. But I cannot do that for a
script which as been resolved as an URL.
Here is what I have manage to do so far but I find it not pretty:
URL buildUrl = currentClassLoader.getResource(buildFile);
ClassLoader buildClassLoader = null;
for (Bundle bundle : allBundles) {
BundleWiring wiring = bundle.adapt(BundleWiring.class);
int i = buildFile.lastIndexOf('/');
String path = buildFile.substring(0, i);
String name = buildFile.substring(i + 1);
List<URL> entries = wiring.findEntries(path, name, 0);
if (!entries.isEmpty() && containsUrls(entries, buildUrl)) {
buildClassLoader = wiring.getClassLoader();
break;
}
}
if (buildClassLoader == null) {
throw new RuntimeException("WTF! Unable to find the classloader of the
build file " + buildFile);
}
It is working but it doesn't sound nice. Is there an API I didn't found which
allows to look for a resource and its bundle or classloader ? I would prefer an
OSGi API, but if it's a Felix one I don't mind.
Nicolas
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]