Bug 179695 - [prefs] NPE when using Preferences API without a product
Summary: [prefs] NPE when using Preferences API without a product
Status: RESOLVED FIXED
Alias: None
Product: Equinox
Classification: Eclipse Project
Component: Compendium (show other bugs)
Version: 3.3   Edit
Hardware: All All
: P3 normal (vote)
Target Milestone: 3.3 M7   Edit
Assignee: DJ Houghton CLA
QA Contact:
URL:
Whiteboard:
Keywords: contributed
Depends on:
Blocks:
 
Reported: 2007-03-28 05:35 EDT by Gunnar Wagenknecht CLA
Modified: 2007-04-04 15:56 EDT (History)
0 users

See Also:


Attachments
Patch for org.eclipse.equinox.preferences (951 bytes, patch)
2007-03-28 05:45 EDT, Gunnar Wagenknecht CLA
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Gunnar Wagenknecht CLA 2007-03-28 05:35:06 EDT
3.3M6

I'm using the Eclipse Preferences API in a server environment where I don't have the concept of a "product". When using the API I get the following NPE which indicates that the Preferences API is trying to load default product preferences which aren't available.

 
java.lang.NullPointerException
at org.eclipse.core.internal.preferences.DefaultPreferences.applyDefaults(DefaultPreferences.java:126)
at org.eclipse.core.internal.preferences.DefaultPreferences.applyProductDefaults(DefaultPreferences.java:190)
at org.eclipse.core.internal.preferences.DefaultPreferences.loadDefaults(DefaultPreferences.java:233)
at org.eclipse.core.internal.preferences.DefaultPreferences.load(DefaultPreferences.java:227)
at org.eclipse.core.internal.preferences.EclipsePreferences.create(EclipsePreferences.java:307)
at org.eclipse.core.internal.preferences.EclipsePreferences.internalNode(EclipsePreferences.java:543)
at org.eclipse.core.internal.preferences.EclipsePreferences.node(EclipsePreferences.java:662)
at org.eclipse.core.internal.preferences.PreferencesService.getNodes(PreferencesService.java:588)
at org.eclipse.core.internal.preferences.PreferencesService.getString(PreferencesService.java:635)
at yada.yada.MyServlet.getSomethingFromIPreferencesService(MyServlet.java:78)
at yada.yada.MyServlet.doGet(MyServlet.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:596)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at org.eclipse.equinox.http.servlet.internal.ServletRegistration.handleRequest(ServletRegistration.java:91)
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.processAlias(ProxyServlet.java:110)
at org.eclipse.equinox.http.servlet.internal.ProxyServlet.service(ProxyServlet.java:60)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
at org.eclipse.equinox.http.jetty.internal.HttpServerManager$InternalHttpServiceServlet.service(HttpServerManager.java:275)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:428)
at org.mortbay.jetty.servlet.ServletHandler.dispatch(ServletHandler.java:677)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:568)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1530)
at org.mortbay.http.HttpContext.handle(HttpContext.java:1482)
at org.mortbay.http.HttpServer.service(HttpServer.java:909)
at org.mortbay.http.HttpConnection.service(HttpConnection.java:820)
at org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:986)
at org.mortbay.http.HttpConnection.handle(HttpConnection.java:837)
at org.mortbay.http.SocketListener.handleConnection(SocketListener.java:245)
at org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:357)
at org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:534)
Comment 1 Gunnar Wagenknecht CLA 2007-03-28 05:45:08 EDT
Created attachment 62199 [details]
Patch for org.eclipse.equinox.preferences

The fix for the actual NPE might be as simple as in this patch. 

However, I wonder about the performance overhead of applyProductDefaults in an environment where no IProductPreferencesService is available. It's called by loadDefaults which is called by load. How often might load get called? If it's not very frequent then this might be ok, otherwise there might be room for performance optimizations here.
Comment 2 DJ Houghton CLA 2007-04-04 15:56:26 EDT
Its called once per bundle who accesses their default preferences. I have released a change that sets the field to an empty table if one doesn't exist, and the check is now table.isEmpty().

Thanks for the patch. 

Released to HEAD.