[273478] EJB CMP key attributes not recognized after utility jar is added to the EAR
diff --git a/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/util/CMPKeySynchronizationAdapter.java b/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/util/CMPKeySynchronizationAdapter.java index 5864b38..bfc18a1 100644 --- a/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/util/CMPKeySynchronizationAdapter.java +++ b/plugins/org.eclipse.jst.j2ee.core/mofj2ee/org/eclipse/jst/j2ee/ejb/internal/util/CMPKeySynchronizationAdapter.java
@@ -17,7 +17,9 @@ package org.eclipse.jst.j2ee.ejb.internal.util; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import java.util.WeakHashMap; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.Notifier; @@ -53,6 +55,9 @@ protected ContainerManagedEntity cmp = null; private boolean isUpdating = false; private boolean isEnabled = true; + + private static WeakHashMap<CMPKeySynchronizationAdapter, Object> unresolvedCMPAttributesToFlush = new WeakHashMap<CMPKeySynchronizationAdapter, Object>(); + /** * Default constructor @@ -110,6 +115,11 @@ // reflect key fields into key attributes list List keyFields = keyClass.getFieldsExtended(); + if(keyFields.size() == 0){ + unresolvedCMPAttributesToFlush.put(this, null); + }else{ + unresolvedCMPAttributesToFlush.remove(this); + } for (int i = 0; i < keyFields.size(); i++) { Field field = (Field) keyFields.get(i); if (field.getJavaVisibility() == JavaVisibilityKind.PUBLIC_LITERAL) { //only public fields @@ -120,6 +130,15 @@ } } + public static void flushUnresolvedKeyAttributesOnCleanBuild(){ + Iterator itr = unresolvedCMPAttributesToFlush.keySet().iterator(); + while(itr.hasNext()){ + CMPKeySynchronizationAdapter curAdapter = (CMPKeySynchronizationAdapter)itr.next(); + curAdapter.initialized = false; + curAdapter.initializeKeyAttributes(); + } + } + public void notifyChanged(Notification notification) { if (isUpdating || !isEnabled) return; //we don't want to react to our own changes try {
diff --git a/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/CleanBuildCacheCleanerListener.java b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/CleanBuildCacheCleanerListener.java new file mode 100644 index 0000000..bd04807 --- /dev/null +++ b/plugins/org.eclipse.jst.j2ee/common/org/eclipse/jst/j2ee/internal/common/CleanBuildCacheCleanerListener.java
@@ -0,0 +1,21 @@ +package org.eclipse.jst.j2ee.internal.common; + +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.IResourceChangeListener; +import org.eclipse.core.resources.IResourceDelta; +import org.eclipse.jst.j2ee.ejb.internal.util.CMPKeySynchronizationAdapter; + +public class CleanBuildCacheCleanerListener implements IResourceChangeListener { + + public static CleanBuildCacheCleanerListener INSTANCE = new CleanBuildCacheCleanerListener(); + + private CleanBuildCacheCleanerListener() { + } + + public void resourceChanged(IResourceChangeEvent event) { + IResourceDelta delta = event.getDelta(); + if(delta.getFlags() != IResourceDelta.MARKERS && delta.getAffectedChildren().length > 0){ + CMPKeySynchronizationAdapter.flushUnresolvedKeyAttributesOnCleanBuild(); + } + } +}
diff --git a/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/plugin/J2EEPlugin.java b/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/plugin/J2EEPlugin.java index 58176db..58688c4 100644 --- a/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/plugin/J2EEPlugin.java +++ b/plugins/org.eclipse.jst.j2ee/j2eeplugin/org/eclipse/jst/j2ee/internal/plugin/J2EEPlugin.java
@@ -61,6 +61,7 @@ import org.eclipse.jst.j2ee.common.internal.impl.J2EEResourceFactoryRegistry; import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveInit; import org.eclipse.jst.j2ee.core.internal.plugin.CatalogJ2EEXmlDtDEntityResolver; +import org.eclipse.jst.j2ee.internal.common.CleanBuildCacheCleanerListener; import org.eclipse.jst.j2ee.internal.common.J2EEDependencyListener; import org.eclipse.jst.j2ee.internal.common.VirtualArchiveComponentAdapterFactory; import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater; @@ -523,7 +524,7 @@ JavaCore.addElementChangedListener(new J2EEElementChangedListener(), ElementChangedEvent.POST_CHANGE); ResourcesPlugin.getWorkspace().addResourceChangeListener(J2EEComponentClasspathUpdater.getInstance(), IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE); ResourcesPlugin.getWorkspace().addResourceChangeListener(J2EEDependencyListener.INSTANCE, IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE); - + ResourcesPlugin.getWorkspace().addResourceChangeListener(CleanBuildCacheCleanerListener.INSTANCE, IResourceChangeEvent.PRE_BUILD); } public void stop(BundleContext context) throws Exception {