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