On Tue, Sep 3, 2013 at 1:42 AM, Nicolas Lalevée
<[email protected]> wrote:
>
> Le 2 sept. 2013 à 18:15, Murad Mamedov <[email protected]> a écrit :
>
>> Hello, I'm newbie here, but using OSGi for long time.
>>
>> From my understanding of your problem:
>> - you expect some bundles to have build.xml
>> - you are a build system that does somethings with those bundles.
>> If above is true, I would start BundleListener and listen bundle events. Of
>> course, on startup of build system you will need to get the initial list of
>> bundles your self.
>> Once BundleListener gets event on installed bundle, I would check if it is
>> my bundle (has build.xml for example) and keep it in private map (ex:
>> taskName -> Bundle).
>> This will be faster and more dynamic, better than traversing over bundles
>> every time.
>
> The thing is that I don't expect a "build" bundle to only have a build.xml at 
> a precise location. I could be anywhere, named in any way. For instance there 
> can be a bundle in which there would be a common-build-java.xml and a 
> common-build-resources.xml, in anther bundle a common-build-webapp.xml which 
> is importing the former ones, and my main build.xml is just importing the 
> later one.

You could add them to the manifest of the providing bundle, using the
Provide-Capability header [1], for instance

Provide-Capability: build.file; location=/common-build-java.xml

Robert


>
> I would really like the build files to behave like Java classes in this OSGi 
> environment.
>
>> But I'm still not sure if you can access actual ClassLoader of that bundle
>> even if you have it and for example instantiate some class from there.
>> You have to depend (import somethings from it) on that bundle, but as far
>> as I understand you expect unknown user ant tasks to be around in unknown
>> user bundles.
>> Is it possible to get actual class loader of some bundle and do something
>> with it?
>
> Well, I don't need a classloader per se. To make a build file load an Ant 
> task, I need something to load a class, so Bundle#loadClass() is fine. And to 
> make a build file import another one, I need something to load a resource, so 
> Bundle#findEntries() is fine too.

[1]: http://wiki.osgi.org/wiki/Provide-Capability

>
>> Using services could be a better option for this problem in my opinion.
>
> Could you elaborate on that ? I know a little bit about services but not 
> enough to understand what kind of solution you are thinking of.
>
> cheers,
> Nicolas
>
>>
>> Regards,
>> Murad
>>
>>
>>
>> On Mon, Sep 2, 2013 at 5:59 PM, Nicolas Lalevée
>> <[email protected]>wrote:
>>
>>>
>>> Le 2 sept. 2013 à 10:34, Christian Schneider <[email protected]> a
>>> écrit :
>>>
>>>> I think it would be a bad idea to rely on an URI scheme. After all it is
>>> not specified in the OSGi standard.
>>>> Can't you simply forward the bundle or classloader together with the URL?
>>>
>>> The URL is pointing to a build file which I want to "run" within its
>>> bundle just like a java class would do. When running it will probably need
>>> to load resources, and I want this loading to follow the OSGi visibility
>>> rules. So I would need the classloader which "owns" that resource, and I
>>> don't have it, the OSGi framework has.
>>>
>>> Nicolas
>>>
>>>>
>>>> Christian
>>>>
>>>> On 02.09.2013 10:13, Nicolas Lalevée wrote:
>>>>> Le 1 sept. 2013 à 22:28, Richard S. Hall <[email protected]> a
>>> écrit :
>>>>>
>>>>>> 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.
>>>>> I can do an if(felix) in my code to optimize. In the long term can I
>>> rely on this URL scheme ?
>>>>>
>>>>> Nicolas
>>>>>
>>>>>
>>>>>> -> 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]
>>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: [email protected]
>>>>> For additional commands, e-mail: [email protected]
>>>>>
>>>>
>>>>
>>>> --
>>>> Christian Schneider
>>>> http://www.liquid-reality.de
>>>>
>>>> Open Source Architect
>>>> http://www.talend.com
>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> 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]
>>>
>>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>



-- 
Sent from my (old) computer

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to