334134 - fix to prevent invalid validation message for inherited PK's in Generic platform.
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/AbstractEntityPrimaryKeyValidator.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/AbstractEntityPrimaryKeyValidator.java
new file mode 100644
index 0000000..48e1a0f
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/AbstractEntityPrimaryKeyValidator.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ *  Copyright (c) 2011  Oracle. 
+ *  All rights reserved.  This program and the accompanying materials are 
+ *  made available under the terms of the Eclipse Public License v1.0 which 
+ *  accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.core.internal.jpa1.context;
+
+import java.util.List;
+
+import org.eclipse.jpt.core.context.AttributeMapping;
+import org.eclipse.jpt.core.context.Entity;
+import org.eclipse.jpt.core.context.IdClassReference;
+import org.eclipse.jpt.core.internal.context.PrimaryKeyTextRangeResolver;
+import org.eclipse.jpt.core.internal.validation.DefaultJpaValidationMessages;
+import org.eclipse.jpt.core.internal.validation.JpaValidationMessages;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+
+public abstract class AbstractEntityPrimaryKeyValidator extends
+		AbstractPrimaryKeyValidator {
+
+	public AbstractEntityPrimaryKeyValidator(Entity entity,
+			PrimaryKeyTextRangeResolver textRangeResolver) {
+		super(entity, textRangeResolver);
+	}
+
+	protected Entity entity() {
+		return (Entity) this.typeMapping();
+	}
+	
+	@Override
+	protected IdClassReference idClassReference() {
+		return entity().getIdClassReference();
+	}
+	
+	public void validate(List<IMessage> messages, IReporter reporter) {
+		// if an entity is non-root, it is not allowed to define primary keys
+		if (! entity().isRoot()) {
+			validatePrimaryKeyForNonRoot(messages, reporter);
+		}
+		else {
+			validatePrimaryKeyForRoot(messages, reporter);
+		}
+	}
+	
+	protected void validatePrimaryKeyForNonRoot(List<IMessage> messages, IReporter reporter) {
+		validateNonRootEntityDoesNotSpecifyIdClass(messages, reporter);
+		validateNonRootEntityDoesNotSpecifyPrimaryKeyAttributes(messages, reporter);
+	}
+	
+	protected void validatePrimaryKeyForRoot(List<IMessage> messages, IReporter reporter) {
+		validatePrimaryKeyIsNotRedefined(messages, reporter);
+		validateIdClassIsUsedIfNecessary(messages, reporter);
+		
+		// if the primary key is not defined on an ancestor, it must be defined here
+		if (! definesPrimaryKey(typeMapping())) {
+			messages.add(
+					DefaultJpaValidationMessages.buildMessage(
+						IMessage.HIGH_SEVERITY,
+						JpaValidationMessages.ENTITY_NO_PK,
+						new String[0],
+						entity(),
+						textRangeResolver().getTypeMappingTextRange()));
+		}
+		
+		// if primary key is composite, it may either use an id class or embedded id, not both
+		validateOneOfIdClassOrEmbeddedIdIsUsed(messages, reporter);
+		// ... and only one embedded id
+		validateOneEmbeddedId(messages, reporter);
+		
+		validateMapsIdMappings(messages, reporter);
+		
+		if (specifiesIdClass()) {
+			validateIdClass(idClassReference().getIdClass(), messages, reporter);
+		}
+	}
+	
+	protected void validateNonRootEntityDoesNotSpecifyIdClass(List<IMessage> messages, IReporter reporter) {
+		if (idClassReference().isSpecified()) {
+			messages.add(
+					DefaultJpaValidationMessages.buildMessage(
+						IMessage.HIGH_SEVERITY,
+						JpaValidationMessages.ENTITY_NON_ROOT_ID_CLASS_SPECIFIED,
+						new String[0],
+						entity(),
+						textRangeResolver().getIdClassTextRange()));
+		}
+	}
+	
+	protected void validateNonRootEntityDoesNotSpecifyPrimaryKeyAttributes(List<IMessage> messages, IReporter reporter) {
+		for (AttributeMapping each : getPrimaryKeyMappingsDefinedLocally(typeMapping())) {
+			messages.add(
+					DefaultJpaValidationMessages.buildMessage(
+						IMessage.HIGH_SEVERITY,
+						JpaValidationMessages.ENTITY_NON_ROOT_ID_ATTRIBUTE_SPECIFIED,
+						new String[0],
+						each,
+						textRangeResolver().getAttributeMappingTextRange(each.getName())));
+		}
+	}
+}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/AbstractMappedSuperclassPrimaryKeyValidator.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/AbstractMappedSuperclassPrimaryKeyValidator.java
new file mode 100644
index 0000000..364cedf
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/AbstractMappedSuperclassPrimaryKeyValidator.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ *  Copyright (c) 2011  Oracle. 
+ *  All rights reserved.  This program and the accompanying materials are 
+ *  made available under the terms of the Eclipse Public License v1.0 which 
+ *  accompanies this distribution, and is available at 
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *  
+ *  Contributors: 
+ *  	Oracle - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jpt.core.internal.jpa1.context;
+
+import java.util.List;
+import org.eclipse.jpt.core.context.IdClassReference;
+import org.eclipse.jpt.core.context.MappedSuperclass;
+import org.eclipse.jpt.core.internal.context.PrimaryKeyTextRangeResolver;
+import org.eclipse.wst.validation.internal.provisional.core.IMessage;
+import org.eclipse.wst.validation.internal.provisional.core.IReporter;
+
+public abstract class AbstractMappedSuperclassPrimaryKeyValidator
+	extends AbstractPrimaryKeyValidator
+{
+	public AbstractMappedSuperclassPrimaryKeyValidator(
+			MappedSuperclass mappedSuperclass, PrimaryKeyTextRangeResolver textRangeResolver) {
+		
+		super(mappedSuperclass, textRangeResolver);
+	}
+	
+	
+	protected MappedSuperclass mappedSuperclass() {
+		return (MappedSuperclass) this.typeMapping();
+	}
+	
+	@Override
+	protected IdClassReference idClassReference() {
+		return mappedSuperclass().getIdClassReference();
+	}
+	
+	public void validate(List<IMessage> messages, IReporter reporter) {
+		validatePrimaryKeyIsNotRedefined(messages, reporter);
+		validateIdClassIsUsedIfNecessary(messages, reporter);
+		
+		// if primary key is composite, it may either use an id class or embedded id, not both
+		validateOneOfIdClassOrEmbeddedIdIsUsed(messages, reporter);
+		// ... and only one embedded id
+		validateOneEmbeddedId(messages, reporter);
+		
+		if (specifiesIdClass()) {
+			validateIdClass(idClassReference().getIdClass(), messages, reporter);
+		}
+	}
+}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/GenericEntityPrimaryKeyValidator.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/GenericEntityPrimaryKeyValidator.java
index 82eb610..2ef9b73 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/GenericEntityPrimaryKeyValidator.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/GenericEntityPrimaryKeyValidator.java
@@ -10,96 +10,26 @@
  *******************************************************************************/
 package org.eclipse.jpt.core.internal.jpa1.context;
 
-import java.util.List;
-import org.eclipse.jpt.core.context.AttributeMapping;
 import org.eclipse.jpt.core.context.Entity;
-import org.eclipse.jpt.core.context.IdClassReference;
 import org.eclipse.jpt.core.internal.context.PrimaryKeyTextRangeResolver;
-import org.eclipse.jpt.core.internal.validation.DefaultJpaValidationMessages;
-import org.eclipse.jpt.core.internal.validation.JpaValidationMessages;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
 
 public class GenericEntityPrimaryKeyValidator
-	extends AbstractPrimaryKeyValidator
+	extends AbstractEntityPrimaryKeyValidator
 {
 	public GenericEntityPrimaryKeyValidator(Entity entity, PrimaryKeyTextRangeResolver textRangeResolver) {
 		super(entity, textRangeResolver);
 	}
 	
-	
-	protected Entity entity() {
-		return (Entity) this.typeMapping();
-	}
-	
 	@Override
-	protected IdClassReference idClassReference() {
-		return entity().getIdClassReference();
+	protected boolean idClassIsRequired() {
+		//Short circuit check for idClassIsRequired if any part of the primary key is defined
+		//in a superclass for Generic types.  Other validation will exist and needs to be
+		//addressed first
+		if(definesPrimaryKeyOnAncestor(typeMapping())){
+			return false;
+		}
+		return super.idClassIsRequired();
 	}
 	
-	public void validate(List<IMessage> messages, IReporter reporter) {
-		// if an entity is non-root, it is not allowed to define primary keys
-		if (! entity().isRoot()) {
-			validatePrimaryKeyForNonRoot(messages, reporter);
-		}
-		else {
-			validatePrimaryKeyForRoot(messages, reporter);
-		}
-	}
-	
-	protected void validatePrimaryKeyForNonRoot(List<IMessage> messages, IReporter reporter) {
-		validateNonRootEntityDoesNotSpecifyIdClass(messages, reporter);
-		validateNonRootEntityDoesNotSpecifyPrimaryKeyAttributes(messages, reporter);
-	}
-	
-	protected void validatePrimaryKeyForRoot(List<IMessage> messages, IReporter reporter) {
-		validatePrimaryKeyIsNotRedefined(messages, reporter);
-		validateIdClassIsUsedIfNecessary(messages, reporter);
-		
-		// if the primary key is not defined on an ancestor, it must be defined here
-		if (! definesPrimaryKey(typeMapping())) {
-			messages.add(
-					DefaultJpaValidationMessages.buildMessage(
-						IMessage.HIGH_SEVERITY,
-						JpaValidationMessages.ENTITY_NO_PK,
-						new String[0],
-						entity(),
-						textRangeResolver().getTypeMappingTextRange()));
-		}
-		
-		// if primary key is composite, it may either use an id class or embedded id, not both
-		validateOneOfIdClassOrEmbeddedIdIsUsed(messages, reporter);
-		// ... and only one embedded id
-		validateOneEmbeddedId(messages, reporter);
-		
-		validateMapsIdMappings(messages, reporter);
-		
-		if (specifiesIdClass()) {
-			validateIdClass(idClassReference().getIdClass(), messages, reporter);
-		}
-	}
-	
-	protected void validateNonRootEntityDoesNotSpecifyIdClass(List<IMessage> messages, IReporter reporter) {
-		if (idClassReference().isSpecified()) {
-			messages.add(
-					DefaultJpaValidationMessages.buildMessage(
-						IMessage.HIGH_SEVERITY,
-						JpaValidationMessages.ENTITY_NON_ROOT_ID_CLASS_SPECIFIED,
-						new String[0],
-						entity(),
-						textRangeResolver().getIdClassTextRange()));
-		}
-	}
-	
-	protected void validateNonRootEntityDoesNotSpecifyPrimaryKeyAttributes(List<IMessage> messages, IReporter reporter) {
-		for (AttributeMapping each : getPrimaryKeyMappingsDefinedLocally(typeMapping())) {
-			messages.add(
-					DefaultJpaValidationMessages.buildMessage(
-						IMessage.HIGH_SEVERITY,
-						JpaValidationMessages.ENTITY_NON_ROOT_ID_ATTRIBUTE_SPECIFIED,
-						new String[0],
-						each,
-						textRangeResolver().getAttributeMappingTextRange(each.getName())));
-		}
-	}
+
 }
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/GenericMappedSuperclassPrimaryKeyValidator.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/GenericMappedSuperclassPrimaryKeyValidator.java
index 55fe515..b9b47ad 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/GenericMappedSuperclassPrimaryKeyValidator.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/jpa1/context/GenericMappedSuperclassPrimaryKeyValidator.java
@@ -10,43 +10,24 @@
  *******************************************************************************/
 package org.eclipse.jpt.core.internal.jpa1.context;
 
-import java.util.List;
-import org.eclipse.jpt.core.context.IdClassReference;
 import org.eclipse.jpt.core.context.MappedSuperclass;
 import org.eclipse.jpt.core.internal.context.PrimaryKeyTextRangeResolver;
-import org.eclipse.wst.validation.internal.provisional.core.IMessage;
-import org.eclipse.wst.validation.internal.provisional.core.IReporter;
 
-public class GenericMappedSuperclassPrimaryKeyValidator
-	extends AbstractPrimaryKeyValidator
-{
-	public GenericMappedSuperclassPrimaryKeyValidator(
-			MappedSuperclass mappedSuperclass, PrimaryKeyTextRangeResolver textRangeResolver) {
-		
-		super(mappedSuperclass, textRangeResolver);
-	}
-	
-	
-	protected MappedSuperclass mappedSuperclass() {
-		return (MappedSuperclass) this.typeMapping();
-	}
-	
-	@Override
-	protected IdClassReference idClassReference() {
-		return mappedSuperclass().getIdClassReference();
-	}
-	
-	public void validate(List<IMessage> messages, IReporter reporter) {
-		validatePrimaryKeyIsNotRedefined(messages, reporter);
-		validateIdClassIsUsedIfNecessary(messages, reporter);
-		
-		// if primary key is composite, it may either use an id class or embedded id, not both
-		validateOneOfIdClassOrEmbeddedIdIsUsed(messages, reporter);
-		// ... and only one embedded id
-		validateOneEmbeddedId(messages, reporter);
-		
-		if (specifiesIdClass()) {
-			validateIdClass(idClassReference().getIdClass(), messages, reporter);
+public class GenericMappedSuperclassPrimaryKeyValidator extends
+		AbstractMappedSuperclassPrimaryKeyValidator {
+
+	public GenericMappedSuperclassPrimaryKeyValidator(MappedSuperclass mappedSuperclass, PrimaryKeyTextRangeResolver textRangeResolver) {
+			super(mappedSuperclass, textRangeResolver);
 		}
+		
+	@Override
+	protected boolean idClassIsRequired() {
+		//Short circuit check for idClassIsRequired if any part of the primary key is defined
+		//in a superclass for Generic types.  Other validation will exist and needs to be
+		//addressed first
+		if(definesPrimaryKeyOnAncestor(typeMapping())){
+			return false;
+		}
+		return super.idClassIsRequired();
 	}
 }
diff --git a/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/v1_1/context/EclipseLinkEntityPrimaryKeyValidator.java b/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/v1_1/context/EclipseLinkEntityPrimaryKeyValidator.java
index b12d908..f6a6a2b 100644
--- a/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/v1_1/context/EclipseLinkEntityPrimaryKeyValidator.java
+++ b/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/v1_1/context/EclipseLinkEntityPrimaryKeyValidator.java
@@ -13,7 +13,7 @@
 import java.util.List;
 import org.eclipse.jpt.core.context.TypeMapping;
 import org.eclipse.jpt.core.internal.context.PrimaryKeyTextRangeResolver;
-import org.eclipse.jpt.core.internal.jpa1.context.GenericEntityPrimaryKeyValidator;
+import org.eclipse.jpt.core.internal.jpa1.context.AbstractEntityPrimaryKeyValidator;
 import org.eclipse.jpt.core.internal.validation.DefaultJpaValidationMessages;
 import org.eclipse.jpt.core.internal.validation.JpaValidationMessages;
 import org.eclipse.jpt.eclipselink.core.context.EclipseLinkEntity;
@@ -22,7 +22,7 @@
 import org.eclipse.wst.validation.internal.provisional.core.IReporter;
 
 public class EclipseLinkEntityPrimaryKeyValidator
-	extends GenericEntityPrimaryKeyValidator
+	extends AbstractEntityPrimaryKeyValidator
 {
 	public EclipseLinkEntityPrimaryKeyValidator(
 			EclipseLinkEntity entity, PrimaryKeyTextRangeResolver textRangeResolver) {
diff --git a/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/v1_1/context/EclipseLinkMappedSuperclassPrimaryKeyValidator.java b/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/v1_1/context/EclipseLinkMappedSuperclassPrimaryKeyValidator.java
index c194a10..4eddd9a 100644
--- a/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/v1_1/context/EclipseLinkMappedSuperclassPrimaryKeyValidator.java
+++ b/jpa/plugins/org.eclipse.jpt.eclipselink.core/src/org/eclipse/jpt/eclipselink/core/internal/v1_1/context/EclipseLinkMappedSuperclassPrimaryKeyValidator.java
@@ -14,7 +14,7 @@
 import org.eclipse.jpt.core.context.TypeMapping;
 import org.eclipse.jpt.core.context.java.JavaPersistentType;
 import org.eclipse.jpt.core.internal.context.PrimaryKeyTextRangeResolver;
-import org.eclipse.jpt.core.internal.jpa1.context.GenericMappedSuperclassPrimaryKeyValidator;
+import org.eclipse.jpt.core.internal.jpa1.context.AbstractMappedSuperclassPrimaryKeyValidator;
 import org.eclipse.jpt.core.internal.validation.DefaultJpaValidationMessages;
 import org.eclipse.jpt.core.internal.validation.JpaValidationMessages;
 import org.eclipse.jpt.eclipselink.core.context.EclipseLinkMappedSuperclass;
@@ -23,7 +23,7 @@
 import org.eclipse.wst.validation.internal.provisional.core.IReporter;
 
 public class EclipseLinkMappedSuperclassPrimaryKeyValidator
-	extends GenericMappedSuperclassPrimaryKeyValidator
+	extends AbstractMappedSuperclassPrimaryKeyValidator
 {
 	public EclipseLinkMappedSuperclassPrimaryKeyValidator(
 			EclipseLinkMappedSuperclass mappedSuperclass, PrimaryKeyTextRangeResolver textRangeResolver) {