diff options
author | bvosburgh | 2012-05-16 21:08:22 +0000 |
---|---|---|
committer | bvosburgh | 2012-05-16 21:08:22 +0000 |
commit | 12599f029e78f252a003118408e40b6923027834 (patch) | |
tree | ca1d3ab06560ee1105acc243b5058ae87e4e69b8 | |
parent | 5538ef021e73448412fb63b9ef84781cc692b891 (diff) | |
download | webtools.dali-12599f029e78f252a003118408e40b6923027834.tar.gz webtools.dali-12599f029e78f252a003118408e40b6923027834.tar.xz webtools.dali-12599f029e78f252a003118408e40b6923027834.zip |
[348483] prevent validation of external or binary Java queries, generators, and converters
4 files changed, 142 insertions, 74 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/MappingTools.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/MappingTools.java index e3e4cb7428..fa76e4bccc 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/MappingTools.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/MappingTools.java @@ -9,9 +9,12 @@ ******************************************************************************/ package org.eclipse.jpt.jpa.core.internal.context; +import org.eclipse.core.resources.IResource; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IType; +import org.eclipse.jpt.common.core.internal.resource.java.source.SourceNode; import org.eclipse.jpt.common.core.internal.utility.JDTTools; +import org.eclipse.jpt.common.core.resource.java.JavaResourceNode; import org.eclipse.jpt.common.utility.internal.ArrayTools; import org.eclipse.jpt.common.utility.internal.ClassName; import org.eclipse.jpt.common.utility.internal.ReflectionTools; @@ -31,6 +34,7 @@ import org.eclipse.jpt.jpa.core.context.ReferenceTable; import org.eclipse.jpt.jpa.core.context.Relationship; import org.eclipse.jpt.jpa.core.context.RelationshipMapping; import org.eclipse.jpt.jpa.core.context.TypeMapping; +import org.eclipse.jpt.jpa.core.context.java.JavaJpaContextNode; import org.eclipse.jpt.jpa.core.jpa2.context.AttributeMapping2_0; import org.eclipse.jpt.jpa.core.jpa2.context.CollectionMapping2_0; import org.eclipse.jpt.jpa.core.jpa2.context.ElementCollectionMapping2_0; @@ -467,6 +471,21 @@ public final class MappingTools { } } + /** + * TODO temporary hack since we don't know yet where to put + * any messages for types in another project (e.g. referenced by + * persistence.xml) + */ + public static boolean nodeIsInternalSource(JavaJpaContextNode contextNode, JavaResourceNode resourceNode) { + IResource resource = contextNode.getResource(); + // 'resource' will be null if the node is "external" and binary; + // the resource will be in a different project if the node is "external" and source; + // the node will be binary if it is in a JAR in the current project + return (resource != null) && + resource.getProject().equals(contextNode.getJpaProject().getProject()) && + (resourceNode instanceof SourceNode); + } + // ********** constructor ********** diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaPersistentType.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaPersistentType.java index 4455b94c73..06d0ea9fb8 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaPersistentType.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/java/AbstractJavaPersistentType.java @@ -15,11 +15,9 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Vector; -import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jpt.common.core.internal.resource.java.source.SourceNode; import org.eclipse.jpt.common.core.resource.java.Annotation; import org.eclipse.jpt.common.core.resource.java.JavaResourceAnnotatedElement; import org.eclipse.jpt.common.core.resource.java.JavaResourceAttribute; @@ -51,6 +49,7 @@ import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute; import org.eclipse.jpt.jpa.core.context.java.JavaPersistentType; import org.eclipse.jpt.jpa.core.context.java.JavaTypeMapping; import org.eclipse.jpt.jpa.core.context.java.JavaTypeMappingDefinition; +import org.eclipse.jpt.jpa.core.internal.context.MappingTools; import org.eclipse.jpt.jpa.core.jpa2.resource.java.Access2_0Annotation; import org.eclipse.jst.j2ee.model.internal.validation.ValidationCancelledException; import org.eclipse.wst.validation.internal.provisional.core.IMessage; @@ -980,15 +979,7 @@ public abstract class AbstractJavaPersistentType if (reporter.isCancelled()) { throw new ValidationCancelledException(); } - // TODO temporary hack since we don't know yet where to put - // any messages for types in another project (e.g. referenced by - // persistence.xml) - IFile file = this.resourceType.getFile(); - // 'file' will be null if the type is "external" and binary; - // the file will be in a different project if the type is "external" and source; - // the type will be binary if it is in a JAR in the current project - if ((file != null) && file.getProject().equals(this.getJpaProject().getProject()) && - (this.resourceType instanceof SourceNode)) { + if (MappingTools.nodeIsInternalSource(this, this.resourceType)) { // build the AST root here to pass down this.validate(messages, reporter, this.buildASTRoot()); } diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractPersistenceUnit.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractPersistenceUnit.java index 19fa579a1c..9b0d80c313 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractPersistenceUnit.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/persistence/AbstractPersistenceUnit.java @@ -85,6 +85,7 @@ import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitProperties; import org.eclipse.jpt.jpa.core.context.persistence.PersistenceUnitTransactionType; import org.eclipse.jpt.jpa.core.context.persistence.PersistentTypeContainer; import org.eclipse.jpt.jpa.core.internal.JptCoreMessages; +import org.eclipse.jpt.jpa.core.internal.context.MappingTools; import org.eclipse.jpt.jpa.core.internal.validation.DefaultJpaValidationMessages; import org.eclipse.jpt.jpa.core.internal.validation.JpaValidationMessages; import org.eclipse.jpt.jpa.core.jpa2.JpaFactory2_0; @@ -2500,18 +2501,28 @@ public abstract class AbstractPersistenceUnit protected void validateGeneratorsWithSameName(String generatorName, ArrayList<Generator> dups, List<IMessage> messages) { String[] parms = new String[] {generatorName}; for (Generator dup : dups) { - messages.add( - DefaultJpaValidationMessages.buildMessage( - IMessage.HIGH_SEVERITY, - JpaValidationMessages.GENERATOR_DUPLICATE_NAME, - parms, - dup, - this.extractNameTextRange(dup) - ) - ); + if (this.generatorSupportsValidationMessages(dup)) { + messages.add( + DefaultJpaValidationMessages.buildMessage( + IMessage.HIGH_SEVERITY, + JpaValidationMessages.GENERATOR_DUPLICATE_NAME, + parms, + dup, + this.extractNameTextRange(dup) + ) + ); + } } } + protected boolean generatorSupportsValidationMessages(Generator generator) { + return (generator instanceof OrmGenerator) || this.generatorSupportsValidationMessages((JavaGenerator) generator); + } + + protected boolean generatorSupportsValidationMessages(JavaGenerator javaGenerator) { + return MappingTools.nodeIsInternalSource(javaGenerator, javaGenerator.getGeneratorAnnotation()); + } + // TODO bjv isn't it obvious? protected TextRange extractNameTextRange(Generator generator) { return (generator instanceof OrmGenerator) ? @@ -2524,7 +2535,10 @@ public abstract class AbstractPersistenceUnit if (generator instanceof OrmGenerator) { ((OrmGenerator) generator).validate(messages, reporter); } else { - ((JavaGenerator) generator).validate(messages, reporter, null); + JavaGenerator javaGenerator = (JavaGenerator) generator; + if (this.generatorSupportsValidationMessages(javaGenerator)) { + javaGenerator.validate(messages, reporter, null); + } } } @@ -2558,18 +2572,28 @@ public abstract class AbstractPersistenceUnit protected void validateQueriesWithSameName(String queryName, ArrayList<Query> dups, List<IMessage> messages) { String[] parms = new String[] {queryName}; for (Query dup : dups) { - messages.add( - DefaultJpaValidationMessages.buildMessage( - IMessage.HIGH_SEVERITY, - JpaValidationMessages.QUERY_DUPLICATE_NAME, - parms, - dup, - this.extractNameTextRange(dup) - ) - ); + if (this.querySupportsValidationMessages(dup)) { + messages.add( + DefaultJpaValidationMessages.buildMessage( + IMessage.HIGH_SEVERITY, + JpaValidationMessages.QUERY_DUPLICATE_NAME, + parms, + dup, + this.extractNameTextRange(dup) + ) + ); + } } } + protected boolean querySupportsValidationMessages(Query query) { + return (query instanceof OrmQuery) || this.querySupportsValidationMessages((JavaQuery) query); + } + + protected boolean querySupportsValidationMessages(JavaQuery javaQuery) { + return MappingTools.nodeIsInternalSource(javaQuery, javaQuery.getQueryAnnotation()); + } + // TODO bjv isn't it obvious? protected TextRange extractNameTextRange(Query query) { return (query instanceof OrmQuery) ? @@ -2581,9 +2605,11 @@ public abstract class AbstractPersistenceUnit protected void validate(Query query, JpaJpqlQueryHelper queryHelper, List<IMessage> messages, IReporter reporter) { if (query instanceof OrmQuery) { ((OrmQuery) query).validate(queryHelper, messages, reporter); - } - else { - ((JavaQuery) query).validate(queryHelper, messages, reporter, null); + } else { + JavaQuery javaQuery = (JavaQuery) query; + if (this.querySupportsValidationMessages(javaQuery)) { + javaQuery.validate(queryHelper, messages, reporter, null); + } } } @@ -2593,19 +2619,7 @@ public abstract class AbstractPersistenceUnit if (StringTools.stringIsNotEmpty(entityName)) { ArrayList<Entity> dups = entry.getValue(); if (dups.size() > 1) { - String[] parms = new String[] {entityName}; - for (Entity dup : dups) { - messages.add( - DefaultJpaValidationMessages.buildMessage( - IMessage.HIGH_SEVERITY, - JpaValidationMessages.ENTITY_NAME_DUPLICATED, - parms, - dup, - this.extractNameTextRange(dup) - ) - ); - } - + this.validateEntitiesWithSameName(entityName, dups, messages); } } } @@ -2631,6 +2645,32 @@ public abstract class AbstractPersistenceUnit return map; } + protected void validateEntitiesWithSameName(String entityName, ArrayList<Entity> dups, List<IMessage> messages) { + String[] parms = new String[] {entityName}; + for (Entity dup : dups) { + if (this.entitySupportsValidationMessages(dup)) { + messages.add( + DefaultJpaValidationMessages.buildMessage( + IMessage.HIGH_SEVERITY, + JpaValidationMessages.ENTITY_NAME_DUPLICATED, + parms, + dup, + this.extractNameTextRange(dup) + ) + ); + } + } + } + + protected boolean entitySupportsValidationMessages(Entity entity) { + return (entity instanceof OrmEntity) || this.entitySupportsValidationMessages((JavaEntity) entity); + } + + protected boolean entitySupportsValidationMessages(JavaEntity javaEntity) { + return MappingTools.nodeIsInternalSource(javaEntity, javaEntity.getJavaResourceType()); + } + + // TODO bjv isn't it obvious? protected TextRange extractNameTextRange(Entity entity) { return (entity instanceof OrmEntity) ? ((OrmEntity) entity).getXmlTypeMapping().getNameTextRange(): diff --git a/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/context/persistence/EclipseLinkPersistenceUnit.java b/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/context/persistence/EclipseLinkPersistenceUnit.java index 00a7723f71..66307043f2 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/context/persistence/EclipseLinkPersistenceUnit.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.eclipselink.core/src/org/eclipse/jpt/jpa/eclipselink/core/context/persistence/EclipseLinkPersistenceUnit.java @@ -55,6 +55,7 @@ import org.eclipse.jpt.jpa.core.context.orm.OrmQueryContainer; import org.eclipse.jpt.jpa.core.context.persistence.MappingFileRef; import org.eclipse.jpt.jpa.core.context.persistence.Persistence; import org.eclipse.jpt.jpa.core.internal.JptCoreMessages; +import org.eclipse.jpt.jpa.core.internal.context.MappingTools; import org.eclipse.jpt.jpa.core.internal.context.persistence.AbstractPersistenceUnit; import org.eclipse.jpt.jpa.core.internal.jpa1.context.persistence.ImpliedMappingFileRef; import org.eclipse.jpt.jpa.core.jpa2.context.persistence.options.SharedCacheMode; @@ -1008,15 +1009,17 @@ public class EclipseLinkPersistenceUnit String[] parms = new String[] {converterName}; if (this.anyNodesAreInequivalent(dups)) { for (EclipseLinkConverter dup : dups) { - messages.add( - DefaultEclipseLinkJpaValidationMessages.buildMessage( - IMessage.HIGH_SEVERITY, - EclipseLinkJpaValidationMessages.CONVERTER_DUPLICATE_NAME, - parms, - dup, - this.extractNameTextRange(dup) - ) - ); + if (this.converterSupportsValidationMessages(dup)) { + messages.add( + DefaultEclipseLinkJpaValidationMessages.buildMessage( + IMessage.HIGH_SEVERITY, + EclipseLinkJpaValidationMessages.CONVERTER_DUPLICATE_NAME, + parms, + dup, + this.extractNameTextRange(dup) + ) + ); + } } } } @@ -1043,6 +1046,14 @@ public class EclipseLinkPersistenceUnit return false; } + protected boolean converterSupportsValidationMessages(EclipseLinkConverter converter) { + return (converter instanceof OrmEclipseLinkConverter<?>) || this.converterSupportsValidationMessages((JavaEclipseLinkConverter<?>) converter); + } + + protected boolean converterSupportsValidationMessages(JavaEclipseLinkConverter<?> javaConverter) { + return MappingTools.nodeIsInternalSource(javaConverter, javaConverter.getConverterAnnotation()); + } + // TODO bjv isn't it obvious? protected TextRange extractNameTextRange(EclipseLinkConverter converter) { return (converter instanceof OrmEclipseLinkConverter<?>) ? @@ -1055,7 +1066,10 @@ public class EclipseLinkPersistenceUnit if (converter instanceof OrmEclipseLinkConverter<?>) { ((OrmEclipseLinkConverter<?>) converter).validate(messages, reporter); } else { - ((JavaEclipseLinkConverter<?>) converter).validate(messages, reporter, null); + JavaEclipseLinkConverter<?> javaConverter = (JavaEclipseLinkConverter<?>) converter; + if (this.converterSupportsValidationMessages(javaConverter)) { + javaConverter.validate(messages, reporter, null); + } } } @@ -1068,15 +1082,17 @@ public class EclipseLinkPersistenceUnit if (this.allNodesAreEquivalent(dups)) { String[] parms = new String[] {generatorName}; for (Generator dup : dups) { - messages.add( - DefaultEclipseLinkJpaValidationMessages.buildMessage( - IMessage.LOW_SEVERITY, - EclipseLinkJpaValidationMessages.GENERATOR_EQUIVALENT, - parms, - dup, - this.extractNameTextRange(dup) - ) - ); + if (this.generatorSupportsValidationMessages(dup)) { + messages.add( + DefaultEclipseLinkJpaValidationMessages.buildMessage( + IMessage.LOW_SEVERITY, + EclipseLinkJpaValidationMessages.GENERATOR_EQUIVALENT, + parms, + dup, + this.extractNameTextRange(dup) + ) + ); + } } } else { super.validateGeneratorsWithSameName(generatorName, dups, messages); @@ -1091,15 +1107,17 @@ public class EclipseLinkPersistenceUnit if (this.allNodesAreEquivalent(dups)) { String[] parms = new String[] {queryName}; for (Query dup : dups) { - messages.add( - DefaultEclipseLinkJpaValidationMessages.buildMessage( - IMessage.LOW_SEVERITY, - EclipseLinkJpaValidationMessages.QUERY_EQUIVALENT, - parms, - dup, - this.extractNameTextRange(dup) - ) - ); + if (this.querySupportsValidationMessages(dup)) { + messages.add( + DefaultEclipseLinkJpaValidationMessages.buildMessage( + IMessage.LOW_SEVERITY, + EclipseLinkJpaValidationMessages.QUERY_EQUIVALENT, + parms, + dup, + this.extractNameTextRange(dup) + ) + ); + } } } else { super.validateQueriesWithSameName(queryName, dups, messages); |