You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by mg...@apache.org on 2013/06/19 16:44:16 UTC
svn commit: r1494641 - in
/cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation:
DbRelationshipValidator.java ObjAttributeValidator.java
ObjEntityValidator.java ObjRelationshipValidator.java
Author: mgentry
Date: Wed Jun 19 14:44:15 2013
New Revision: 1494641
URL: http://svn.apache.org/r1494641
Log:
CAY-1813: Missing ObjEntity Attribute Validation with Duplicate DbEntity Columns. Added changes from 3.0 branch.
Modified:
cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/DbRelationshipValidator.java
cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjAttributeValidator.java
cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjEntityValidator.java
cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjRelationshipValidator.java
Modified: cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/DbRelationshipValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/DbRelationshipValidator.java?rev=1494641&r1=1494640&r2=1494641&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/DbRelationshipValidator.java (original)
+++ cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/DbRelationshipValidator.java Wed Jun 19 14:44:15 2013
@@ -18,6 +18,11 @@
****************************************************************/
package org.apache.cayenne.project.validation;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.cayenne.map.DbEntity;
import org.apache.cayenne.map.DbJoin;
import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.util.Util;
@@ -93,6 +98,67 @@ class DbRelationshipValidator extends Co
invalidChars);
}
}
+
+ checkForDuplicates(relationship, validationResult);
+ }
+
+ /**
+ * Per CAY-1813, make sure two (or more) DbRelationships do not map to the
+ * same database path.
+ */
+ private void checkForDuplicates(DbRelationship relationship, ValidationResult validationResult) {
+ if (relationship != null &&
+ relationship.getName() != null &&
+ relationship.getTargetEntityName() != null) {
+
+ String dbRelationshipPath =
+ relationship.getTargetEntityName() +
+ "." +
+ getJoins(relationship);
+
+ if (dbRelationshipPath != null) {
+ DbEntity entity = (DbEntity) relationship.getSourceEntity();
+
+ for (DbRelationship comparisonRelationship : entity.getRelationships()) {
+ if (relationship != comparisonRelationship) {
+ String comparisonDbRelationshipPath =
+ comparisonRelationship.getTargetEntityName() +
+ "." +
+ getJoins(comparisonRelationship);
+
+ if (dbRelationshipPath.equals(comparisonDbRelationshipPath)) {
+ addFailure(validationResult,
+ relationship,
+ "DbEntity '%s' contains a duplicate DbRelationship mapping ('%s' -> '%s')",
+ entity.getName(),
+ relationship.getName(),
+ dbRelationshipPath);
+ return; // Duplicate found, stop.
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private String getJoins(DbRelationship relationship) {
+ List<String> joins = new ArrayList<String>();
+
+ for (DbJoin join : relationship.getJoins()) {
+ StringBuilder builder = new StringBuilder();
+
+ builder.append("[");
+ builder.append("source=").append(join.getSourceName());
+ builder.append(",");
+ builder.append("target=").append(join.getTargetName());
+ builder.append("]");
+
+ joins.add(builder.toString());
+ }
+
+ Collections.sort(joins);
+
+ return Util.join(joins, ",");
}
private String toString(DbRelationship relationship) {
@@ -102,5 +168,4 @@ class DbRelationshipValidator extends Co
return relationship.getSourceEntity().getName() + "." + relationship.getName();
}
-
}
Modified: cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjAttributeValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjAttributeValidator.java?rev=1494641&r1=1494640&r2=1494641&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjAttributeValidator.java (original)
+++ cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjAttributeValidator.java Wed Jun 19 14:44:15 2013
@@ -148,5 +148,40 @@ class ObjAttributeValidator extends Conf
attribute.getName(),
attribute.getDbAttributeName());
}
+
+ checkForDuplicates(attribute, validationResult);
+ }
+
+ /**
+ * Per CAY-1813, make sure two (or more) ObjAttributes do not map to the
+ * same database path.
+ */
+ private void checkForDuplicates(ObjAttribute attribute,
+ ValidationResult validationResult) {
+ if (attribute != null &&
+ attribute.getName() != null &&
+ attribute.isInherited() == false) {
+
+ ObjEntity entity = (ObjEntity) attribute.getEntity();
+
+ for (ObjAttribute comparisonAttribute : entity.getAttributes()) {
+ if (attribute != comparisonAttribute) {
+ String dbAttributePath = attribute.getDbAttributePath();
+
+ if (dbAttributePath != null) {
+ if (dbAttributePath.equals(comparisonAttribute.getDbAttributePath())) {
+ addFailure
+ (validationResult,
+ attribute,
+ "ObjEntity '%s' contains a duplicate DbAttribute mapping ('%s' -> '%s')",
+ entity.getName(),
+ attribute.getName(),
+ dbAttributePath);
+ return; // Duplicate found, stop.
+ }
+ }
+ }
+ }
+ }
}
}
Modified: cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjEntityValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjEntityValidator.java?rev=1494641&r1=1494640&r2=1494641&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjEntityValidator.java (original)
+++ cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjEntityValidator.java Wed Jun 19 14:44:15 2013
@@ -18,12 +18,8 @@
****************************************************************/
package org.apache.cayenne.project.validation;
-import java.util.HashSet;
-import java.util.Set;
-
import org.apache.cayenne.configuration.DataChannelDescriptor;
import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.ObjAttribute;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.util.Util;
import org.apache.cayenne.validation.ValidationResult;
@@ -31,11 +27,9 @@ import org.apache.cayenne.validation.Val
class ObjEntityValidator extends ConfigurationNodeValidator {
void validate(ObjEntity entity, ValidationResult validationResult) {
-
validateName(entity, validationResult);
validateClassName(entity, validationResult);
validateSuperClassName(entity, validationResult);
- validateAttributes(entity, validationResult);
// validate DbEntity presence
if (entity.getDbEntity() == null && !entity.isAbstract()) {
@@ -128,25 +122,6 @@ class ObjEntityValidator extends Configu
}
}
- private void validateAttributes(ObjEntity entity, ValidationResult validationResult) {
- Set<String> dbAttributeNames = new HashSet<String>();
-
- for (ObjAttribute attribute : entity.getAttributes()) {
- String dbAttributeName = attribute.getDbAttribute().getName();
-
- if (Util.isEmptyString(dbAttributeName) == false) {
- if (dbAttributeNames.contains(dbAttributeName)) {
- addFailure(validationResult,
- entity,
- "ObjEntity contains duplicate DbAttribute mappings (%s)",
- dbAttributeName);
- }
-
- dbAttributeNames.add(dbAttributeName);
- }
- }
- }
-
void validateName(ObjEntity entity, ValidationResult validationResult) {
String name = entity.getName();
Modified: cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjRelationshipValidator.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjRelationshipValidator.java?rev=1494641&r1=1494640&r2=1494641&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjRelationshipValidator.java (original)
+++ cayenne/main/branches/STABLE-3.1/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/ObjRelationshipValidator.java Wed Jun 19 14:44:15 2013
@@ -133,28 +133,28 @@ class ObjRelationshipValidator extends C
}
}
}
-
+
// check for relationships with same source and target entities
ObjEntity entity = (ObjEntity) relationship.getSourceEntity();
for (ObjRelationship rel : entity.getRelationships()) {
if (relationship.getDbRelationshipPath() != null && relationship.getDbRelationshipPath().equals(rel.getDbRelationshipPath())) {
- if (relationship != rel &&
+ if (relationship != rel &&
relationship.getTargetEntity() == rel.getTargetEntity() &&
relationship.getSourceEntity() == rel.getSourceEntity()) {
addFailure(
- validationResult,
- relationship,
- "ObjectRelationship '%s' duplicates relationship '%s'",
- toString(relationship),
+ validationResult,
+ relationship,
+ "ObjectRelationship '%s' duplicates relationship '%s'",
+ toString(relationship),
toString(rel));
}
}
}
-
+
// check for invalid relationships in inherited entities
if (relationship.getReverseRelationship() != null) {
ObjRelationship revRel = relationship.getReverseRelationship();
- if (relationship.getSourceEntity() != revRel.getTargetEntity()
+ if (relationship.getSourceEntity() != revRel.getTargetEntity()
|| relationship.getTargetEntity() != revRel.getSourceEntity()) {
addFailure(
validationResult,
@@ -163,6 +163,48 @@ class ObjRelationshipValidator extends C
toString(revRel));
}
}
+
+ checkForDuplicates(relationship, validationResult);
+ }
+
+ /**
+ * Per CAY-1813, make sure two (or more) ObjRelationships do not map to the
+ * same database path.
+ */
+ private void checkForDuplicates(ObjRelationship relationship,
+ ValidationResult validationResult) {
+ if (relationship != null &&
+ relationship.getName() != null &&
+ relationship.getTargetEntityName() != null) {
+
+ String dbRelationshipPath =
+ relationship.getTargetEntityName() +
+ "." +
+ relationship.getDbRelationshipPath();
+
+ if (dbRelationshipPath != null) {
+ ObjEntity entity = (ObjEntity) relationship.getSourceEntity();
+
+ for (ObjRelationship comparisonRelationship : entity.getRelationships()) {
+ if (relationship != comparisonRelationship) {
+ String comparisonDbRelationshipPath =
+ comparisonRelationship.getTargetEntityName() +
+ "." +
+ comparisonRelationship.getDbRelationshipPath();
+
+ if (dbRelationshipPath.equals(comparisonDbRelationshipPath)) {
+ addFailure(validationResult,
+ relationship,
+ "ObjEntity '%s' contains a duplicate ObjRelationship mapping ('%s' -> '%s')",
+ entity.getName(),
+ relationship.getName(),
+ dbRelationshipPath);
+ return; // Duplicate found, stop.
+ }
+ }
+ }
+ }
+ }
}
private String toString(ObjRelationship relationship) {