Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 319020

Summary: Important reordering for J2EEInit.initEMFModels()
Product: [WebTools] WTP Java EE Tools Reporter: Carl Anderson <ccc>
Component: jst.j2eeAssignee: Carl Anderson <ccc>
Status: RESOLVED FIXED QA Contact: Chuck Bridgham <cbridgha>
Severity: major    
Priority: P3 Flags: ccc: pmc_approved? (david_williams)
ccc: pmc_approved? (raghunathan.srinivasan)
ccc: pmc_approved? (naci.dai)
deboer: pmc_approved+
ccc: pmc_approved? (neil.hauge)
ccc: pmc_approved? (kaloyan)
cbridgha: review+
Version: 3.2   
Target Milestone: 3.2.1   
Hardware: PC   
OS: Windows XP   
Whiteboard: PMC_approved
Bug Depends on: 315286    
Bug Blocks:    
Attachments:
Description Flags
Move TaglibPackage's initialization after WebapplicationPackage none

Description Carl Anderson CLA 2010-07-06 11:11:57 EDT
When I went through and set up the ordering for initialization in J2EEInit.initEMFModels(), I based it off of the ordering required by the J2EE XSD files.  However, since initParams were put into WebapplicationPackage, there is a dependence from TaglibPackage to WebapplicationPackage.  This can cause problems during the traversal of J2EEInit.initEMFModels(), and thus a reordering is needed.
Comment 1 Carl Anderson CLA 2010-07-06 11:32:16 EDT
Here is a stack trace from an encounter of this problem in an adopter product:

Exception in thread "Thread-7" java.lang.ExceptionInInitializerError
        at java.lang.J9VMInternals.initialize(J9VMInternals.java:222)
        at sun.misc.Unsafe.ensureClassInitialized(Native Method)
        at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:25)
        at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:122)
        at java.lang.reflect.Field.acquireFieldAccessor(Field.java:934)
        at java.lang.reflect.Field.getFieldAccessor(Field.java:901)
        at java.lang.reflect.Field.get(Field.java:360)
        at org.eclipse.emf.ecore.plugin.RegistryReader$EPackageDescriptor.getEPackage(RegistryReader.java:274)
        at org.eclipse.emf.ecore.impl.EPackageRegistryImpl.getEPackage(EPackageRegistryImpl.java:133)
        at org.eclipse.jst.j2ee.webapplication.internal.impl.WebapplicationPackageImpl.initializePackageContents(WebapplicationPackageImpl.java:1579)
        at org.eclipse.jst.j2ee.webapplication.internal.impl.WebapplicationPackageImpl.init(WebapplicationPackageImpl.java:337)
        at org.eclipse.jst.j2ee.webapplication.WebapplicationPackage.<clinit>(WebapplicationPackage.java:1230)
        at java.lang.J9VMInternals.initializeImpl(Native Method)
        at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
        at sun.misc.Unsafe.ensureClassInitialized(Native Method)
        at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:25)
        at sun.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:122)        
        at java.lang.reflect.Field.acquireFieldAccessor(Field.java:934)
        at java.lang.reflect.Field.getFieldAccessor(Field.java:901)
        at java.lang.reflect.Field.get(Field.java:360)
        at org.eclipse.emf.ecore.plugin.RegistryReader$EPackageDescriptor.getEPackage(RegistryReader.java:274)
        at org.eclipse.emf.ecore.impl.EPackageRegistryImpl.getEPackage(EPackageRegistryImpl.java:133)
        at org.eclipse.jst.j2ee.taglib.internal.impl.TaglibPackageImpl.initializePackageContents(TaglibPackageImpl.java:719)
        at org.eclipse.jst.j2ee.taglib.internal.impl.TaglibPackageImpl.init(TaglibPackageImpl.java:154)
        at org.eclipse.jst.j2ee.taglib.internal.TaglibPackage.<clinit>(TaglibPackage.java:66)
        at java.lang.J9VMInternals.initializeImpl(Native Method)
        at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
        at org.eclipse.jst.j2ee.internal.J2EEInit$20.run(J2EEInit.java:342)
        at java.lang.Thread.run(Thread.java:736)
Caused by: java.lang.NullPointerException
        at org.eclipse.emf.common.util.AbstractEList.getNonDuplicates(AbstractEList.java:1167)
        at org.eclipse.emf.common.util.AbstractEList.addAll(AbstractEList.java:372)
        at org.eclipse.emf.ecore.impl.EClassImpl.getEAllStructuralFeatures(EClassImpl.java:767)
        at org.eclipse.emf.ecore.impl.EClassImpl.freeze(EClassImpl.java:132)
        at org.eclipse.emf.ecore.impl.EModelElementImpl.freeze(EModelElementImpl.java:100)
        at org.eclipse.emf.ecore.impl.EPackageImpl.freeze(EPackageImpl.java:203)
        at org.eclipse.jst.j2ee.jsp.internal.impl.JspPackageImpl.init(JspPackageImpl.java:127)
        at org.eclipse.jst.j2ee.jsp.JspPackage.<clinit>(JspPackage.java:74)
        at java.lang.J9VMInternals.initializeImpl(Native Method)
        at java.lang.J9VMInternals.initialize(J9VMInternals.java:200)
        ... 28 more
Comment 2 Carl Anderson CLA 2010-07-06 11:34:39 EDT
Created attachment 173570 [details]
Move TaglibPackage's initialization after WebapplicationPackage
Comment 3 Chuck Bridgham CLA 2010-07-07 09:12:30 EDT
approved
Comment 4 Carl Anderson CLA 2010-07-07 09:25:15 EDT
This fix is important to ensure proper initialization of the EMF models.
There is no workaround.
I have run the JUnit bucket against it and tested this by hand.
The fix is to move TaglibPackage's initialization after WebapplicationPackage. Chuck Bridgham has reviewed this fix. 
This is an extremely low risk fix- all that is happening is a simple reordering of the deferred initialization of the EMF models, to comply with the hard coded dependencies.
Comment 5 Carl Anderson CLA 2010-07-07 11:35:01 EDT
Committed to HEAD for WTP 3.2.1 and WTP 3.3