looks fine, please add it to a jira issue
-igor
On Fri, Feb 22, 2008 at 4:06 PM, Adam Harris <[EMAIL PROTECTED]> wrote:
>
> I'm experiencing this same problem (Wicket not loading the wicket.properties
> due to the thread context classloader) with Wicket 1.3.1 in Equinox OSGi.
>
> From looking at Wicket's Application code, it appears that multiple
> wicket.properties files can exist, and it will load them all. So, the
> wicket.properties in wicket.jar should always be loaded as well as any other
> wicket.properties that are application specific. This will work in a
> traditional WAR file.
>
> However, in OSGi, each bundle has its own classloader. So, if Wicket is in
> its own bundle and my web application is in its own bundle, the current
> implementation of Application will not work. Using only the thread context
> classloader will not accomodate loading multiple wicket.properties.
> Multiple classloaders must be checked.
>
> I've put together and tested a modified Application.java which works in
> OSGi. Would something like this be acceptable?
>
> public final void initializeComponents()
> {
> // Load any wicket properties files we can find
> try
> {
> Set loadedFiles = new HashSet();
> // Load properties files used by all libraries
>
> // Try the classloader for the wicket jar/bundle
> Enumeration resources = Application.class.getClassLoader()
> .getResources("wicket.properties");
> loadResources(resources, loadedFiles);
>
> // Try the classloader for the user's application jar/bundle
> resources = getClass().getClassLoader()
> .getResources("wicket.properties");
> loadResources(resources, loadedFiles);
>
> // Try the context class loader
> resources = Thread.currentThread()
> .getContextClassLoader()
> .getResources("wicket.properties");
> loadResources(resources, loadedFiles);
> }
> catch (IOException e)
> {
> throw new WicketRuntimeException("Unable to load
> initializers file", e);
> }
>
> // now call any initializers we read
> callInitializers();
> }
>
> private void loadResources(Enumeration resources, Set loadedFiles) throws
> IOException
> {
> if (resources != null)
> {
> while (resources.hasMoreElements())
> {
> InputStream in = null;
> try
> {
> final URL url = (URL)resources.nextElement();
> if (!loadedFiles.contains(url))
> {
> log.info("resource url: {} ",
> url);
> final Properties properties = new
> Properties();
> in = url.openStream();
> properties.load(in);
> load(properties);
> loadedFiles.add(url);
> }
> }
> finally
> {
> if (in != null)
> {
> in.close();
> }
> }
> }
> }
> }
>
>
> Al Maw wrote:
> >
> > Jan Vermeulen wrote:
> >> So my question is now: is that 'wicket.properties' file meant to be a
> >> resource that's always within the Wicket 'bundle' ? If so, would it not
> >> be
> >> better to use the latter code to lookup resources, so that it works in
> >> environments with multiple classloaders ?
> >
> > Yes, it will always be packaged in the Wicket JAR file, at any rate.
> > What this means in an OSGI environment I'm afraid I don't know. ;-)
> >
> >> And if it's not that evident where the 'wicket.properties' file should
> >> reside, don't you need some utility method for resource loading that
> >> tries
> >> out different classloaders ? Something like:
> >>
> >> public static URL loadResource(String path) throws
> >> ClassNotFoundException {
> >> try {
> >> return
> >> (Thread.currentThread().getContextClassLoader().getResource(path));
> >> } catch (ClassNotFoundException e) {
> >> return
> (getClass().getClassLoader().getResource(path));
> >> }
> >> }
> >>
> >> Jan.
> >>
> >
> > Yep, absolutely. I've updated it to use the Thread's contextClassLoader,
> > which I think should be sufficient, no?
> >
> > Al
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/NPE-in-PropertyResolver.getGetAndSetter%28%29-tp11194510p15642235.html
> Sent from the Wicket - Dev mailing list archive at Nabble.com.
>
>