[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 {