Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 355723 - NPE when adding a theme contribution
Summary: NPE when adding a theme contribution
Status: RESOLVED FIXED
Alias: None
Product: RAP
Classification: RT
Component: RWT (show other bugs)
Version: 1.5   Edit
Hardware: All All
: P1 normal (vote)
Target Milestone: 1.5 M3   Edit
Assignee: Project Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2011-08-24 11:37 EDT by Ivan Furnadjiev CLA
Modified: 2011-09-29 05:44 EDT (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Ivan Furnadjiev CLA 2011-08-24 11:37:34 EDT
Adding a theme contribution like: (RAP 1.5 from CVS HEAD)
<extension
         point="org.eclipse.rap.ui.themes">      
      <themeContribution
            file="css/addition.css"
            themeId="org.eclipse.rap.rwt.theme.Default">
      </themeContribution>
   </extension>
leads to NPE:
!ENTRY rap.bugs.application.tester 4 0 2011-08-24 18:34:02.293
!MESSAGE Could not register contribution for theme 'org.eclipse.rap.rwt.theme.Default' from file 'css/addition.css'.
!STACK 0
java.lang.NullPointerException
	at org.eclipse.rwt.internal.engine.ContextImpl.addThemeContribution(ContextImpl.java:108)
	at org.eclipse.rap.ui.internal.servlet.RWTConfigurator.registerThemeContributions(RWTConfigurator.java:264)
	at org.eclipse.rap.ui.internal.servlet.RWTConfigurator.configure(RWTConfigurator.java:77)
	at org.eclipse.rwt.internal.engine.ContextConfigurable.configureCustomSettings(ContextConfigurable.java:51)
	at org.eclipse.rwt.internal.engine.ContextConfigurable.configure(ContextConfigurable.java:41)
	at org.eclipse.rwt.internal.engine.ApplicationContext.notifyConfigurablesAboutActivation(ApplicationContext.java:246)
	at org.eclipse.rwt.internal.engine.ApplicationContext.doActivate(ApplicationContext.java:267)
	at org.eclipse.rwt.internal.engine.ApplicationContext.activate(ApplicationContext.java:106)
	at org.eclipse.rwt.engine.ContextControl.activateApplicationContext(ContextControl.java:68)
	at org.eclipse.rwt.engine.ContextControl.startContext(ContextControl.java:40)
	at org.eclipse.rap.rwt.osgi.internal.RWTContextImpl.startContext(RWTContextImpl.java:121)
	at org.eclipse.rap.rwt.osgi.internal.RWTContextImpl.start(RWTContextImpl.java:77)
	at org.eclipse.rap.rwt.osgi.internal.RWTServiceImpl.start(RWTServiceImpl.java:91)
	at org.eclipse.rap.ui.internal.servlet.HttpServiceTracker.startRWTContext(HttpServiceTracker.java:118)
	at org.eclipse.rap.ui.internal.servlet.HttpServiceTracker.addingService(HttpServiceTracker.java:83)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:980)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1)
	at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:262)
	at org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:185)
	at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:348)
	at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:283)
	at org.eclipse.rap.ui.internal.servlet.HttpServiceTracker.access$4(HttpServiceTracker.java:1)
	at org.eclipse.rap.ui.internal.servlet.HttpServiceTracker$RWTServiceTracker.addingService(HttpServiceTracker.java:65)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:980)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1)
	at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:262)
	at org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:185)
	at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:348)
	at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:283)
	at org.eclipse.rap.ui.internal.servlet.HttpServiceTracker.openAsSoonAsRWTServiceHasBeenStarted(HttpServiceTracker.java:103)
	at org.eclipse.rap.ui.internal.servlet.HttpServiceTracker.access$2(HttpServiceTracker.java:101)
	at org.eclipse.rap.ui.internal.servlet.HttpServiceTracker$HttpContextTracker.addingService(HttpServiceTracker.java:46)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:980)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1)
	at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:262)
	at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:234)
	at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:941)
	at org.eclipse.osgi.internal.serviceregistry.FilteredServiceListener.serviceChanged(FilteredServiceListener.java:104)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:861)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEventPrivileged(ServiceRegistry.java:819)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.publishServiceEvent(ServiceRegistry.java:771)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistrationImpl.register(ServiceRegistrationImpl.java:130)
	at org.eclipse.osgi.internal.serviceregistry.ServiceRegistry.registerService(ServiceRegistry.java:214)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:433)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.registerService(BundleContextImpl.java:451)
	at org.eclipse.equinox.http.registry.internal.HttpServiceTracker.open(HttpServiceTracker.java:43)
	at org.eclipse.equinox.http.registry.internal.Activator.addingService(Activator.java:59)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:980)
	at org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:1)
	at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:262)
	at org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:185)
	at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:348)
	at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:283)
	at org.eclipse.equinox.http.registry.internal.Activator.start(Activator.java:37)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl$1.run(BundleContextImpl.java:711)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702)
	at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
	at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
	at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:389)
	at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1130)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:559)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:544)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:457)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:438)
	at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:1)
	at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
	at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)
	Works fine with RAP 1.4
Comment 1 Ivan Furnadjiev CLA 2011-08-24 15:27:32 EDT
getTheme( "org.eclipse.rap.rwt.theme.Default" ) at that point returns null.
Comment 2 Frank Appel CLA 2011-09-29 03:40:09 EDT
Fixed in CVS HEAD.

The problem was that with the new configuration API adding a theme contribution could take place before the actual theme was registered. With the default theme this was always the case, since the default theme is registered during the activation of the theme manger, which always takes place after the configuration.

So I introduced a theme contribution buffer that picks up all contributions during configuration time and applies them during activation after all themes have been registered. In case a contribution refers to a non existing theme id an ThemeManagerException will be thrown.