One thing to note is that the files are versioned just like native code
in a bundle.  When a bundle is updated then we need to extract the new 
files to a cache.  Since the framework already knows how to do this for 
native code it was natural for the framework to provide a general 
facility for other files in a bundle.

We can certainly write a FileLocator that works on other frameworks, but
it will have to do the same kind of accounting that the framework 
already does to make sure the latest content is extracted to a cache.

This is certainly feasible, but I wanted to point out why we have done 
it this way.  On other frameworks we would have to write a 
URLConverter service that understands the protocols that 
framework uses for bundle resources and do the proper extracting. 
Then FileLocator would use that URLConverter to convert bundle 
resource URLs to file URLs.

In Equinox we just happen to publish this URLConverter service from 
the system bundle.

Tom.

P.S. In another post I saw that Erik wanted to use this to get access 
to a class file and then modify the bits of the class.  This will not 
work because the extracted file is not used to load a class at 
runtime.  There are various AspectJ projects looking at 
doing load time weaving in OSGi and as Richard points out
CPEG is looking into this for future specifications.  For example:

http://www.eclipse.org/equinox/incubator/aspects/index.php

"Richard S. Hall" <[EMAIL PROTECTED]> wrote on 09/13/2006 10:04:35 PM:

> Great. Then it is nice to know that it can be done by a separate bundle. 

> Perhaps Equinox should package it up separately so that it can be used 
> on other frameworks. :-)
> 
> -> richard
> 
> Jeff McAffer wrote:
> > I'm not sure I would call it "baked in".  FileLocator itself is just a 

> > helper that aquires a "URLConverter" service.  It happens that that 
> > service is provided by the system bundle since it is the same code 
that is 
> > used by the framework to do nested JAR and native code extraction. 
Your 
> > characterization of the processing is exactly what the service does.
> >
> > Jeff
> >
> >
> >
> >
> > "Richard S. Hall" <[EMAIL PROTECTED]> 
> > 09/13/2006 10:17 PM
> > Please respond to
> > felix-dev@incubator.apache.org
> >
> >
> > To
> > felix-dev@incubator.apache.org
> > cc
> >
> > Subject
> > Re: OSGi URL to file
> >
> >
> >
> >
> >
> >
> > Jeff McAffer wrote:
> > 
> >> In practice this takes things that you would get back from 
getResource 
> >> 
> > or 
> > 
> >> getEntry and converts them to file:.  In the case of a directory 
based 
> >> bundle, the file is likely already directly in the filesystem so its 
> >> 
> > file: 
> > 
> >> url is returned.  In the case of a JAR'd bundle, the file (or 
directory) 
> >> 
> >
> > 
> >> is extracted to a cache and that location returned. 
> >>
> >> 
> >
> > If that's the case, then why not just write a simple utility library 
> > bundle that provides the code to do this? It doesn't seem like it 
needs 
> > to be baked into the framework. Simply check to see if the URL is a 
> > file, if so you are done, if not, then copy the resource to the 
bundle's 
> > private area and return that file.
> >
> > -> richard
> >
> > 
> >> Jeff
> >>
> >>
> >>
> >>
> >> "Richard S. Hall" <[EMAIL PROTECTED]> 
> >> 09/13/2006 07:52 PM
> >> Please respond to
> >> felix-dev@incubator.apache.org
> >>
> >>
> >> To
> >> felix-dev@incubator.apache.org
> >> cc
> >>
> >> Subject
> >> Re: OSGi URL to file
> >>
> >>
> >>
> >>
> >>
> >>
> >> No, there is no standard way, nor any equivalent method in Felix.
> >>
> >> This is something you could construct for Felix, perhaps, but it 
seems 
> >> like bad form since the whole point of getResource() is to eliminate 
the 
> >> 
> >
> > 
> >> dependencies on file locations.
> >>
> >> And what happens if the resource is in a JAR file, then it will never 
be 
> >> 
> >
> > 
> >> a file: resource?
> >>
> >> You might be trying to do something and this is the only way to do 
it, 
> >> but it would certainly be better if there was another way.
> >>
> >> -> richard
> >>
> >> Erik Bengtson wrote:
> >>
> >> 
> >>> Hi,
> >>>
> >>> I need to convert the URL given by
> >>> URL url =
> >>>
> >>>
> >>> 
> > 
Bundle.loadClass('something').getClassLoader().getResource('anotherthing');
> > 
> >>> Using equinox I get "bundleresource://" protocol, so I want to 
convert 
> >>>
> >>> 
> >> to
> >>
> >> 
> >>> file://.
> >>>
> >>> To convert I use:
> >>>
> >>> URL fileURL = org.eclipse.core.runtime.FileLocator.toFileURL(url);
> >>>
> >>> Is there an Felix equivalent or in the OSGI standard?
> >>>
> >>> Thanks,
> >>>
> >>> Erik Bengtson
> >>>
> >>>
> >>> PS:
> >>> Richard,
> >>>
> >>> thanks for the previous answer regarding best pratices on 
dependencies.
> >>>
> >>>
> >>> 
> >>
> >> 
> >
> >
> > 

Reply via email to