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