You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2010/03/18 05:38:58 UTC

svn commit: r924633 - in /openjpa/trunk/openjpa-kernel/src/main: java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java resources/org/apache/openjpa/kernel/jpql/localizer.properties

Author: ppoddar
Date: Thu Mar 18 04:38:57 2010
New Revision: 924633

URL: http://svn.apache.org/viewvc?rev=924633&view=rev
Log:
Better error message for multi-valued object path traversal

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java
    openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java?rev=924633&r1=924632&r2=924633&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/AbstractExpressionBuilder.java Thu Mar 18 04:38:57 2010
@@ -288,6 +288,9 @@ public abstract class AbstractExpression
         if (fmd == null) {
             Object val = traverseStaticField(meta.getDescribedType(), field);
             if (val == null) {
+                if (isMultiValuedTraversalAttempt(path, field)) {
+                    throw parseException(EX_USER, "multi-valued-travesal", new Object[]{field, path.last()}, null);
+                }
             	String[] all = meta.getFieldNames();
             	Class<?> cls = meta.getDescribedType();
                 throw parseException(EX_USER, "no-field",
@@ -333,6 +336,15 @@ public abstract class AbstractExpression
             return null;
         }
     }
+    
+    private boolean isMultiValuedTraversalAttempt(Path path, String field) {
+        if (path == null) return false;
+        if (path.last() == null) return false;
+        if (path.last().getElement() == null) return false;
+        if (path.last().getElement().getDeclaredTypeMetaData() == null) return false;
+        if (path.last().getElement().getDeclaredTypeMetaData().getField(field) == null) return false;
+        return true;
+    }
 
     /**
      * Returns the type of the named variable if it has been declared.

Modified: openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties?rev=924633&r1=924632&r2=924633&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties (original)
+++ openjpa/trunk/openjpa-kernel/src/main/resources/org/apache/openjpa/kernel/jpql/localizer.properties Thu Mar 18 04:38:57 2010
@@ -30,6 +30,9 @@ cant-resolve-type: The entity "{0}" cann
 not-identifer: The specified node ("{0}") is not a valid identifier.
 no-field: No field named "{0}" in "{1}". Did you mean "{2}"? Expected one of \
 	the available field names in "{3}": "{4}".
+multi-valued-travesal: Attempt to navigate to relation field "{0}" via multi-valued \
+	association "{1}". JPQL does not allow traversal through multi-valued \
+	relation path. Try join instead.   	
 unaccessible-field: The field named "{1}" in class "{0}" could not be accessed.
 multi-children: Expression "{0}" does not allow multiple children ("{1}").
 no-children: Expression "{0}" requires at least one child.