Author: oltka
Date: Tue Mar 13 11:08:39 2012
New Revision: 1300074

URL: http://svn.apache.org/viewvc?rev=1300074&view=rev
Log:
CAY-1674 Error generating classes with invalid path in the query qualifier

Modified:
    cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
    
cayenne/main/trunk/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java
    
cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
    
cayenne/main/trunk/framework/cayenne-tools/src/main/resources/templates/v1_2/datamap-superclass.vm

Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=1300074&r1=1300073&r2=1300074&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Tue Mar 13 
11:08:39 2012
@@ -44,6 +44,7 @@ CAY-1668 Memory Exhaustion Problem with 
 CAY-1669 RuntimeProperties use of System properties becomes a contention point 
when creating query translators 
 CAY-1670 Non-blocking DataRowStore
 CAY-1672 [PATCH] SQLException thrown by processSchemaUpdate in 
BaseSchemaUpdateStrategy is not thrown in sub classes
+CAY-1674 Error generating classes with invalid path in the query qualifier
 CAY-1675 [PATCH] add .first(List<T>) method to Expression to enhance in-memory 
filtering
 CAY-1679 A notion of default node
 CAY-1680 Get rid of shared locks in DataDomain metadata lookups

Modified: 
cayenne/main/trunk/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java?rev=1300074&r1=1300073&r2=1300074&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java
 Tue Mar 13 11:08:39 2012
@@ -18,13 +18,17 @@
  ****************************************************************/
 package org.apache.cayenne.project.validation;
 
+import java.util.Iterator;
+
 import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.ExpressionException;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.query.PrefetchTreeNode;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationResult;
 
@@ -42,7 +46,7 @@ class SelectQueryValidator extends Confi
             validateQualifier(root, query.getQualifier(), validationResult);
 
             for (final Ordering ordering : query.getOrderings()) {
-                validateOrdering(root, ordering, validationResult);
+                validateOrdering(query, root, ordering, validationResult);
             }
 
             if (query.getPrefetchTree() != null) {
@@ -52,6 +56,7 @@ class SelectQueryValidator extends Confi
                     validatePrefetch(root, prefetchTreeNode.getPath(), 
validationResult);
                 }
             }
+      
         }
     }
 
@@ -60,10 +65,21 @@ class SelectQueryValidator extends Confi
     }
 
     void validateOrdering(
+            SelectQuery query,
             Entity root,
             Ordering ordering,
             ValidationResult validationResult) {
-        // TODO: andrus 03/10/2010 - should this be implemented?
+       
+        // validate paths in ordering
+        String path = ordering.getSortSpecString();
+        Iterator<CayenneMapEntry> it = root.resolvePathComponents(path);
+        while (it.hasNext()) {
+            try {
+                it.next();
+            } catch (ExpressionException e) {
+                addFailure(validationResult, query, "Invalid ordering path: 
'%s'", path);
+            }
+        }
     }
 
     void validateQualifier(

Modified: 
cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java?rev=1300074&r1=1300073&r2=1300074&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-tools/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
 Tue Mar 13 11:08:39 2012
@@ -20,6 +20,7 @@
 package org.apache.cayenne.gen;
 
 import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.ExpressionException;
 import org.apache.cayenne.exp.ExpressionParameter;
 import org.apache.cayenne.exp.parser.ASTList;
 import org.apache.cayenne.exp.parser.ASTObjPath;
@@ -28,13 +29,17 @@ import org.apache.cayenne.map.ObjAttribu
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.PathComponent;
 import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.query.QualifiedQuery;
 import org.apache.cayenne.query.Query;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.NameConverter;
 import org.apache.commons.collections.set.ListOrderedSet;
 
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -77,7 +82,7 @@ public class DataMapUtils {
         
         Map<String, String> queryParameters = queriesMap.get(query.getName());
 
-        if ( queryParameters == null) {
+        if (queryParameters == null) {
             queryParameters = getParameterNames(query.getQualifier(), 
query.getRoot());
             queriesMap.put(query.getName(), queryParameters);
         }
@@ -85,6 +90,42 @@ public class DataMapUtils {
         return parseQualifier(query.getQualifier().toString());
     }
 
+    public Boolean isValidParameterNames(QualifiedQuery query) {
+        
+        if(query.getQualifier() == null) {
+            return true;
+        }
+        
+        Map<String, String> queryParameters = queriesMap.get(query.getName());
+
+        if (queryParameters == null) {
+            try {
+                queryParameters = getParameterNames(query.getQualifier(), 
query.getRoot());
+            } catch (Exception e) {
+                // if we have wrong path in queryParameters return false.
+                return false;
+            }
+        }
+        
+        if(query instanceof SelectQuery) {
+            for(Ordering ordering: ((SelectQuery)query).getOrderings()) {
+                // validate paths in ordering
+                String path = ordering.getSortSpecString();
+                Iterator<CayenneMapEntry> it = 
((ObjEntity)query.getRoot()).resolvePathComponents(path);
+                while (it.hasNext()) {
+                    try {
+                        it.next();
+                    } catch (ExpressionException e) {
+                        // if we have wrong path in orderings return false.
+                        return false;
+                    }
+                }
+            }
+        }
+
+        return true;
+    }
+    
     /**
      * Get list of parameter names in the same order as in qualifier.
      * 

Modified: 
cayenne/main/trunk/framework/cayenne-tools/src/main/resources/templates/v1_2/datamap-superclass.vm
URL: 
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-tools/src/main/resources/templates/v1_2/datamap-superclass.vm?rev=1300074&r1=1300073&r2=1300074&view=diff
==============================================================================
--- 
cayenne/main/trunk/framework/cayenne-tools/src/main/resources/templates/v1_2/datamap-superclass.vm
 (original)
+++ 
cayenne/main/trunk/framework/cayenne-tools/src/main/resources/templates/v1_2/datamap-superclass.vm
 Tue Mar 13 11:08:39 2012
@@ -40,8 +40,10 @@ ${importUtils.addType('org.apache.cayenn
 ${importUtils.addType('org.apache.cayenne.query.NamedQuery')}##
 #foreach( $selectQuery in ${object.SelectQueries})
 ${importUtils.addType(${selectQuery.Root.ClassName})}##
+#if(${dataMapUtils.isValidParameterNames($selectQuery)})
 #foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})})
 ${importUtils.addType(${dataMapUtils.getParameterType(${selectQuery}, 
${parameter})})}##
+#end
 #end    
 #end
 #end
@@ -62,6 +64,7 @@ public class ${superClassName} {
 #end
 #foreach( $selectQuery in ${object.SelectQueries})
 
+#if(${dataMapUtils.isValidParameterNames($selectQuery)})
     public List<${stringUtils.stripPackageName($selectQuery.Root.ClassName)}> 
perform${dataMapUtils.getQueryMethodName(${selectQuery})}(ObjectContext context 
#foreach( $parameter in ${dataMapUtils.getParameterNames(${selectQuery})}), 
${stringUtils.stripPackageName(${dataMapUtils.getParameterType(${selectQuery}, 
${parameter})})} ${parameter}#end) {
 #if(${dataMapUtils.hasParameters($selectQuery)})
         String[] parameters = {
@@ -80,4 +83,5 @@ public class ${superClassName} {
         return context.performQuery(new 
NamedQuery("${selectQuery.Name}"#if(${dataMapUtils.hasParameters($selectQuery)}),
 parameters, values#end));
     }
 #end
+#end
 }
\ No newline at end of file


Reply via email to