Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornhauge2011-01-24 04:30:24 +0000
committernhauge2011-01-24 04:30:24 +0000
commit4dbcfb8dd419f7403527217e736dfde7aad98242 (patch)
tree84143b887068fa2571aa2c0d21fab5dccc0e2942 /jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal
parente317361c4dff07d6371b3bf35c07d2b636cc9544 (diff)
downloadwebtools.dali-4dbcfb8dd419f7403527217e736dfde7aad98242.tar.gz
webtools.dali-4dbcfb8dd419f7403527217e736dfde7aad98242.tar.xz
webtools.dali-4dbcfb8dd419f7403527217e736dfde7aad98242.zip
[332673] Added validation for duplicate entities. Patch from Nan.
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal')
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/AbstractJavaEntity.java46
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmEntity.java43
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmTypeMapping.java4
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/persistence/AbstractPersistenceUnit.java209
4 files changed, 258 insertions, 44 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/AbstractJavaEntity.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/AbstractJavaEntity.java
index d75fba9834..bec3be9cf9 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/AbstractJavaEntity.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/AbstractJavaEntity.java
@@ -14,6 +14,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
+
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jpt.core.JpaPlatformVariation.Supported;
import org.eclipse.jpt.core.MappingKeys;
@@ -103,7 +104,9 @@ import org.eclipse.jpt.core.utility.TextRange;
import org.eclipse.jpt.db.Schema;
import org.eclipse.jpt.utility.Filter;
import org.eclipse.jpt.utility.internal.CollectionTools;
+import org.eclipse.jpt.utility.internal.HashBag;
import org.eclipse.jpt.utility.internal.NotNullFilter;
+import org.eclipse.jpt.utility.internal.StringTools;
import org.eclipse.jpt.utility.internal.Tools;
import org.eclipse.jpt.utility.internal.iterables.CompositeIterable;
import org.eclipse.jpt.utility.internal.iterables.EmptyListIterable;
@@ -1324,6 +1327,8 @@ public abstract class AbstractJavaEntity
this.queryContainer.validate(messages, reporter, astRoot);
this.attributeOverrideContainer.validate(messages, reporter, astRoot);
this.associationOverrideContainer.validate(messages, reporter, astRoot);
+ this.validateEntityName(messages, reporter, astRoot);
+ this.validateDuplicateEntityNames(messages, reporter, astRoot);
}
@Override
@@ -1331,6 +1336,47 @@ public abstract class AbstractJavaEntity
return super.validatesAgainstDatabase() && ! this.isAbstractTablePerClass();
}
+ protected void validateEntityName(List<IMessage> messages,
+ IReporter reporter, CompilationUnit astRoot) {
+ if (StringTools.stringIsEmpty(this.getName())){
+ messages.add(
+ DefaultJpaValidationMessages.buildMessage(
+ IMessage.HIGH_SEVERITY,
+ JpaValidationMessages.ENTITY_NAME_MISSING,
+ new String[] {this.getPersistentType().getName()},
+ this,
+ this.getMappingAnnotation().getNameTextRange(astRoot)
+ )
+ );
+ }
+ }
+
+ protected void validateDuplicateEntityNames(List<IMessage> messages,
+ IReporter reporter, CompilationUnit astRoot) {
+ HashBag<String> javaEntityNamesExclOverridden = new HashBag<String>();
+ CollectionTools.addAll(javaEntityNamesExclOverridden, this.getPersistenceUnit().javaEntityNamesExclOverridden());
+ HashBag<String> ormEntityNames = new HashBag<String>();
+ CollectionTools.addAll(ormEntityNames, this.getPersistenceUnit().ormEntityNames());
+ String javaEntityName = this.getName();
+ if ((javaEntityName != null)
+ // Check whether or not this entity name has duplicates among
+ // the java entities that are not overridden by orm entities
+ && ((javaEntityNamesExclOverridden.count(javaEntityName) > 1)
+ //Check whether or not this entity name has duplicates
+ //with the names of orm entities
+ || (ormEntityNames.contains(javaEntityName)))) {
+ messages.add(
+ DefaultJpaValidationMessages.buildMessage(
+ IMessage.HIGH_SEVERITY,
+ JpaValidationMessages.PERSISTENCE_UNIT_ENTITY_NAME_ATTRIBUTE_MISSING,
+ new String[] {javaEntityName},
+ this,
+ this.getMappingAnnotation().getNameTextRange(astRoot)
+ )
+ );
+ }
+ }
+
protected void validatePrimaryKey(List<IMessage> messages, IReporter reporter, CompilationUnit astRoot) {
this.buildPrimaryKeyValidator(astRoot).validate(messages, reporter);
}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmEntity.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmEntity.java
index f55426ddac..411bfd35ea 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmEntity.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmEntity.java
@@ -14,6 +14,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
+
import org.eclipse.emf.common.util.EList;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
@@ -115,6 +116,7 @@ import org.eclipse.jpt.core.utility.TextRange;
import org.eclipse.jpt.db.Schema;
import org.eclipse.jpt.utility.internal.ClassName;
import org.eclipse.jpt.utility.internal.CollectionTools;
+import org.eclipse.jpt.utility.internal.HashBag;
import org.eclipse.jpt.utility.internal.NotNullFilter;
import org.eclipse.jpt.utility.internal.StringTools;
import org.eclipse.jpt.utility.internal.Tools;
@@ -1776,6 +1778,47 @@ public abstract class AbstractOrmEntity<X extends XmlEntity>
this.associationOverrideContainer.validate(messages, reporter);
this.generatorContainer.validate(messages, reporter);
this.queryContainer.validate(messages, reporter);
+ this.validateEntityName(messages, reporter);
+ this.validateDuplicateEntityNames(messages, reporter);
+ }
+
+ protected void validateEntityName(List<IMessage> messages, IReporter reporter) {
+ if (StringTools.stringIsEmpty(this.getName())){
+ messages.add(
+ DefaultJpaValidationMessages.buildMessage(
+ IMessage.HIGH_SEVERITY,
+ JpaValidationMessages.ENTITY_NAME_MISSING,
+ new String[] {this.getClass_()},
+ this,
+ this.getNameTextRange()
+ )
+ );
+ }
+ }
+
+ protected void validateDuplicateEntityNames(List<IMessage> messages,
+ IReporter reporter) {
+ HashBag<String> ormEntityNames = new HashBag<String>();
+ CollectionTools.addAll(ormEntityNames, this.getPersistenceUnit().ormEntityNames());
+ HashBag<String> javaEntityNamesExclOverridden = new HashBag<String>();
+ CollectionTools.addAll(javaEntityNamesExclOverridden, this.getPersistenceUnit().javaEntityNamesExclOverridden());
+ String name = this.getName();
+ if ((name != null) &&
+ // Check whether or not this entity name has duplicates among the orm entities
+ ((ormEntityNames.count(name) > 1)
+ // Check whether or not this entity name has duplicates among
+ // the java entities that are not defined in the mapping files
+ || (javaEntityNamesExclOverridden.contains(name)))) {
+ messages.add(
+ DefaultJpaValidationMessages.buildMessage(
+ IMessage.HIGH_SEVERITY,
+ JpaValidationMessages.PERSISTENCE_UNIT_ENTITY_NAME_ATTRIBUTE_MISSING,
+ new String[] {name},
+ this,
+ this.getClassTextRange()
+ )
+ );
+ }
}
protected void validatePrimaryKey(List<IMessage> messages, IReporter reporter) {
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmTypeMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmTypeMapping.java
index 3420e15fe8..2fecfe2ce2 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmTypeMapping.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmTypeMapping.java
@@ -399,6 +399,10 @@ public abstract class AbstractOrmTypeMapping<X extends XmlTypeMapping>
return this.xmlTypeMapping.getAttributesTextRange();
}
+ public TextRange getNameTextRange() {
+ return this.xmlTypeMapping.getNameTextRange();
+ }
+
public boolean containsOffset(int textOffset) {
return this.xmlTypeMapping.containsOffset(textOffset);
}
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/persistence/AbstractPersistenceUnit.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/persistence/AbstractPersistenceUnit.java
index 0a7042d948..b96c6ca838 100644
--- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/persistence/AbstractPersistenceUnit.java
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/persistence/AbstractPersistenceUnit.java
@@ -20,6 +20,7 @@ import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.Vector;
+
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
@@ -464,6 +465,15 @@ public abstract class AbstractPersistenceUnit
return this.getMappingFileRefs().iterator();
}
+ protected Iterator<String> mappingFileRefNames() {
+ return new TransformationIterator<MappingFileRef, String>(this.mappingFileRefs()) {
+ @Override
+ protected String transform(MappingFileRef mappingFileRef) {
+ return mappingFileRef.getFileName();
+ }
+ };
+ }
+
protected ListIterable<MappingFileRef> getMappingFileRefs() {
return (this.impliedMappingFileRef == null) ?
this.getSpecifiedMappingFileRefs() :
@@ -696,7 +706,16 @@ public abstract class AbstractPersistenceUnit
public int jarFileRefsSize() {
return this.jarFileRefs.size();
}
-
+
+ protected Iterator<String> jarFileNames() {
+ return new TransformationIterator<JarFileRef, String>(this.jarFileRefs()) {
+ @Override
+ protected String transform(JarFileRef jarFileRef) {
+ return jarFileRef.getFileName();
+ }
+ };
+ }
+
public JarFileRef addJarFileRef(String fileName) {
return this.addJarFileRef(this.jarFileRefs.size(), fileName);
}
@@ -808,6 +827,15 @@ public abstract class AbstractPersistenceUnit
return this.specifiedClassRefs.size() + this.impliedClassRefs.size();
}
+ protected Iterator<String> classRefNames() {
+ return new TransformationIterator<ClassRef, String>(this.classRefs()) {
+ @Override
+ protected String transform(ClassRef classRef) {
+ return classRef.getClassName();
+ }
+ };
+ }
+
protected Iterable<PersistentType> getNonNullClassRefPersistentTypes() {
return new FilteringIterable<PersistentType>(this.getClassRefPersistentTypes(), NotNullFilter.<PersistentType>instance());
}
@@ -1640,15 +1668,6 @@ public abstract class AbstractPersistenceUnit
}
}
- protected Iterator<String> mappingFileRefNames() {
- return new TransformationIterator<MappingFileRef, String>(this.mappingFileRefs()) {
- @Override
- protected String transform(MappingFileRef mappingFileRef) {
- return mappingFileRef.getFileName();
- }
- };
- }
-
protected void validateClassRefs(List<IMessage> messages, IReporter reporter) {
this.checkForDuplicateClasses(messages);
for (Iterator<ClassRef> stream = this.classRefs(); stream.hasNext(); ) {
@@ -1657,34 +1676,43 @@ public abstract class AbstractPersistenceUnit
}
protected void checkForDuplicateClasses(List<IMessage> messages) {
- HashBag<String> classNames = new HashBag<String>();
- CollectionTools.addAll(classNames, this.classRefNames());
+ HashBag<String> ormMappedClassNames = new HashBag<String>();
+ CollectionTools.addAll(ormMappedClassNames, this.ormMappedClassNames());
+ for (Iterator<PersistentType> ormMappedClasses = this.getMappingFilePersistentTypes().iterator(); ormMappedClasses.hasNext();){
+ PersistentType ormMappedClass = ormMappedClasses.next();
+ String ormMappedClassName = ormMappedClass.getName();
+ if ((ormMappedClassName != null) && (ormMappedClassNames.count(ormMappedClassName) > 1)) {
+ messages.add(
+ DefaultJpaValidationMessages.buildMessage(
+ IMessage.HIGH_SEVERITY,
+ JpaValidationMessages.PERSISTENCE_UNIT_DUPLICATE_CLASS,
+ new String[] {ormMappedClassName},
+ ormMappedClass,
+ ormMappedClass.getSelectionTextRange()
+ )
+ );
+ }
+ }
+ HashBag<String> javaClassNames = new HashBag<String>();
+ CollectionTools.addAll(javaClassNames, this.classRefNames());
for (Iterator<ClassRef> stream = this.classRefs(); stream.hasNext(); ) {
ClassRef classRef = stream.next();
- String className = classRef.getClassName();
- if ((className != null) && (classNames.count(className) > 1)) {
- messages.add(
- DefaultJpaValidationMessages.buildMessage(
- IMessage.HIGH_SEVERITY,
- JpaValidationMessages.PERSISTENCE_UNIT_DUPLICATE_CLASS,
- new String[] {className},
- classRef,
- classRef.getValidationTextRange()
- )
+ String javaClassName = classRef.getClassName();
+ if ((javaClassName != null) && (!ormMappedClassNames.contains(javaClassName))
+ && (javaClassNames.count(javaClassName) > 1)) {
+ messages.add(
+ DefaultJpaValidationMessages.buildMessage(
+ IMessage.HIGH_SEVERITY,
+ JpaValidationMessages.PERSISTENCE_UNIT_DUPLICATE_CLASS,
+ new String[] {javaClassName},
+ classRef,
+ classRef.getValidationTextRange()
+ )
);
}
}
}
- protected Iterator<String> classRefNames() {
- return new TransformationIterator<ClassRef, String>(this.classRefs()) {
- @Override
- protected String transform(ClassRef classRef) {
- return classRef.getClassName();
- }
- };
- }
-
protected void validateJarFileRefs(List<IMessage> messages, IReporter reporter) {
this.checkForDuplicateJarFileRefs(messages);
for (JarFileRef each : CollectionTools.iterable(this.jarFileRefs())) {
@@ -1711,16 +1739,6 @@ public abstract class AbstractPersistenceUnit
}
}
- protected Iterator<String> jarFileNames() {
- return new TransformationIterator<JarFileRef, String>(this.jarFileRefs()) {
- @Override
- protected String transform(JarFileRef jarFileRef) {
- return jarFileRef.getFileName();
- }
- };
- }
-
- @SuppressWarnings("unused")
protected void validateProperties(List<IMessage> messages, IReporter reporter) {
// do nothing by default
}
@@ -1728,12 +1746,11 @@ public abstract class AbstractPersistenceUnit
public boolean validatesAgainstDatabase() {
return this.connectionProfileIsActive();
}
-
+
public TextRange getValidationTextRange() {
return this.xmlPersistenceUnit.getValidationTextRange();
}
-
// ********** refactoring **********
public Iterable<DeleteEdit> createDeleteTypeEdits(final IType type) {
@@ -1881,7 +1898,6 @@ public abstract class AbstractPersistenceUnit
);
}
-
// ********** misc **********
public XmlPersistenceUnit getXmlPersistenceUnit() {
@@ -1909,6 +1925,7 @@ public abstract class AbstractPersistenceUnit
return this;
}
+ // ------------------- all entities -----------------
public Iterable<Entity> getEntities() {
return new SubIterableWrapper<TypeMapping, Entity>(this.getEntities_());
}
@@ -1931,6 +1948,110 @@ public abstract class AbstractPersistenceUnit
};
}
+ protected Iterator<String> ormMappedClassNames() {
+ return new TransformationIterator<PersistentType, String>(this.getMappingFilePersistentTypes()) {
+ @Override
+ protected String transform(PersistentType persistentType) {
+ return persistentType.getName();
+ }
+ };
+ }
+
+ // ------------------ orm entities --------------------
+ protected Iterator<String> ormEntityClassNames() {
+ return new TransformationIterator<Entity, String>(this.getOrmEntities()) {
+ @Override
+ protected String transform(Entity ormEntity) {
+ return ormEntity.getPersistentType().getName();
+ }
+ };
+ }
+
+ public Iterator<String> ormEntityNames() {
+ return new TransformationIterator<Entity, String>(this.getOrmEntities()) {
+ @Override
+ protected String transform(Entity ormEntity) {
+ return ormEntity.getName();
+ }
+ };
+ }
+
+ public Iterable<Entity> getOrmEntities(){
+ return new SubIterableWrapper<TypeMapping, Entity>(this.getOrmEntities_());
+ }
+
+ protected Iterable<TypeMapping> getOrmEntities_(){
+ return new FilteringIterable<TypeMapping>(this.getOrmTypeMappings()){
+ @Override
+ protected boolean accept(TypeMapping typeMapping) {
+ return typeMapping instanceof Entity;
+ }
+ };
+ }
+
+ private Iterable<? extends TypeMapping> getOrmTypeMappings() {
+ return new TransformationIterable<PersistentType, TypeMapping>(this.getMappingFilePersistentTypes()) {
+ @Override
+ protected TypeMapping transform(PersistentType persistentType) {
+ return persistentType.getMapping();
+ }
+ };
+ }
+
+ //--------------- java entities -----------------
+ protected Iterator<String> javaEntityClassNames(){
+ return new TransformationIterator<Entity, String>(this.getJavaEntities()) {
+ @Override
+ protected String transform(Entity javaEntity) {
+ return javaEntity.getPersistentType().getName();
+ }
+ };
+ }
+
+ public Iterator<String> javaEntityNamesExclOverridden() {
+ HashBag<String> ormMappedClassNames = new HashBag<String>();
+ CollectionTools.addAll(ormMappedClassNames, this.ormMappedClassNames());
+ List<String> javaEntityNamesExclOverridden = new ArrayList<String>();
+ for (Iterator<String> javaEntityClassNames = this.javaEntityClassNames(); javaEntityClassNames.hasNext();){
+ String javaEntityClassName = javaEntityClassNames.next();
+ if (!ormMappedClassNames.contains(javaEntityClassName)) {
+ javaEntityNamesExclOverridden.add((this.getEntity(javaEntityClassName)).getName());
+ }
+ }
+ return javaEntityNamesExclOverridden.iterator();
+ }
+
+ public Iterator<String> javaEntityNames(){
+ return new TransformationIterator<Entity, String>(this.getJavaEntities()) {
+ @Override
+ protected String transform(Entity javaEntity) {
+ return javaEntity.getName();
+ }
+ };
+ }
+
+ public Iterable<Entity> getJavaEntities(){
+ return new SubIterableWrapper<TypeMapping, Entity>(this.getJavaEntities_());
+ }
+
+ protected Iterable<TypeMapping> getJavaEntities_(){
+ return new FilteringIterable<TypeMapping>(this.getJavaTypeMappings()){
+ @Override
+ protected boolean accept(TypeMapping typeMapping) {
+ return typeMapping instanceof Entity;
+ }
+ };
+ }
+
+ private Iterable<? extends TypeMapping> getJavaTypeMappings() {
+ return new TransformationIterable<PersistentType, TypeMapping>(this.getNonNullClassPersistentTypes()) {
+ @Override
+ protected TypeMapping transform(PersistentType persistentType) {
+ return persistentType.getMapping();
+ }
+ };
+ }
+
@SuppressWarnings("unchecked")
public Iterable<PersistentType> getPersistentTypes() {
return new CompositeIterable<PersistentType>(

Back to the top