Bug 130683

Summary: NPE in DeltaProcessingState.addElementChangedListener()
Product: [Eclipse Project] JDT Reporter: Jess Garms <jgarms>
Component: CoreAssignee: Jerome Lanneluc <jerome_lanneluc>
Status: VERIFIED FIXED QA Contact:
Severity: normal    
Priority: P3    
Version: 3.1.2   
Target Milestone: 3.2 M6   
Hardware: PC   
OS: Windows XP   
Whiteboard:

Description Jess Garms CLA 2006-03-06 20:36:01 EST
Ran into the following NPE:

java.lang.NullPointerException
    at org.eclipse.jdt.internal.core.DeltaProcessingState.addElementChangedListener(DeltaProcessingState.java:171)
    at org.eclipse.jdt.core.JavaCore.addElementChangedListener(JavaCore.java:1087)
    at org.eclipse.jem.internal.adapters.jdom.JavaModelListener.<init>(JavaModelListener.java:38)
    at org.eclipse.jem.internal.adapters.jdom.JavaModelListener.<init>(JavaModelListener.java:34)
    at org.eclipse.jem.internal.adapters.jdom.JavaReflectionSynchronizer.<init>(JavaReflectionSynchronizer.java:45)
    at org.eclipse.jem.internal.adapters.jdom.JavaJDOMAdapterFactory.initializeSynchronizer(JavaJDOMAdapterFactory.java:191)
    at org.eclipse.jem.internal.adapters.jdom.JavaJDOMAdapterFactory.setJavaProject(JavaJDOMAdapterFactory.java:231)
    at org.eclipse.jem.internal.adapters.jdom.JavaJDOMAdapterFactory.<init>(JavaJDOMAdapterFactory.java:45)
    at org.eclipse.jem.internal.plugin.JavaEMFNature.addJavaReflectionAdapterFactories(JavaEMFNature.java:177)
    at org.eclipse.jem.internal.plugin.JavaEMFNature.addAdapterFactories(JavaEMFNature.java:165)
    at org.eclipse.jem.internal.plugin.JavaEMFNature.primaryContributeToContext(JavaEMFNature.java:141)
    at org.eclipse.jem.internal.util.emf.workbench.EMFWorkbenchContextFactory.initializeEMFContextFromContributors(EMFWorkbenchContextFactory.java:127)
    at org.eclipse.jem.internal.util.emf.workbench.EMFWorkbenchContextFactory.createEMFContext(EMFWorkbenchContextFactory.java:110)
    at org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase.createEMFContext(WorkbenchResourceHelperBase.java:222)
    at org.eclipse.jem.util.emf.workbench.nature.EMFNature.createEmfContext(EMFNature.java:105)
    at org.eclipse.jem.util.emf.workbench.nature.EMFNature.getEmfContextBase(EMFNature.java:229)
    at org.eclipse.wst.common.internal.emfworkbench.integration.EditModelNature.getEmfContext(EditModelNature.java:61)
    at org.eclipse.wst.common.internal.emfworkbench.integration.EditModelNature.getEditModelForRead(EditModelNature.java:48)
    at org.eclipse.wst.common.internal.emfworkbench.integration.EditModelNature.getEditModelForRead(EditModelNature.java:39)
    at org.eclipse.wst.common.componentcore.ModuleCoreNature.getModuleStructuralModelForRead(ModuleCoreNature.java:238)
    at org.eclipse.wst.common.componentcore.internal.StructureEdit.<init>(StructureEdit.java:315)
    at org.eclipse.wst.common.componentcore.internal.StructureEdit.getStructureEditForRead(StructureEdit.java:114)
    at org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent.exists(VirtualComponent.java:87)
    at com.bea.wlw.webproject.core.util.WebProject.refreshWebProjectInfo(WebProject.java:747)
    at com.bea.wlw.webproject.core.util.WebProjectManager.rescanWebProject(WebProjectManager.java:366)
    at com.bea.wlw.webproject.core.util.WebProjectManager.access$0(WebProjectManager.java:362)
    at com.bea.wlw.webproject.core.util.WebProjectManager$1.run(WebProjectManager.java:188)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:76)

As far as I can tell, this looks like a race condition between adding and/or removing element change listeners on different threads. It could be fixed by adding synchronization in either JavaCore or DeltaProcessingState.
Comment 1 Jess Garms CLA 2006-03-07 13:02:21 EST
I should mention that I tried adding a null check for the argument passed in to DeltaProcessingState.addElementChangedListener(), but it was not triggered before I saw the NPE later.

The NPE happens periodically, but I do not have a reliable repro.
Comment 2 Jerome Lanneluc CLA 2006-03-09 06:46:39 EST
Synchronized DeltaProcessingState#addElementChangedListener() and removeElementChangedListener() as well as the access to those fields in DeltaProcessor#fire(IJavaElementDelta,int) and resourceChanged(IResourceChangedEvent)
Comment 3 Maxime Daniel CLA 2006-03-28 04:11:53 EST
Verified for 3.2M6 using build I20060327-0010.