You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2014/11/27 08:11:52 UTC

[09/39] cayenne git commit: [CAY-1969] Malformed EJBQL Yields NPE

[CAY-1969] Malformed EJBQL Yields NPE


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/583df135
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/583df135
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/583df135

Branch: refs/heads/CAY-1946_1
Commit: 583df135b3ee0c3a758a586678252979852ae3f3
Parents: 4207ebe
Author: Andrew Lindesay <ap...@lindesay.co.nz>
Authored: Wed Nov 19 07:27:29 2014 +1300
Committer: Andrew Lindesay <ap...@lindesay.co.nz>
Committed: Wed Nov 19 07:27:29 2014 +1300

----------------------------------------------------------------------
 .../apache/cayenne/ejbql/parser/Compiler.java   |  3 +++
 .../org/apache/cayenne/query/EJBQLQueryIT.java  | 25 ++++++++++++++++++++
 2 files changed, 28 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/583df135/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java b/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
index e4829e7..b90acf6 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
@@ -308,6 +308,9 @@ class Compiler {
         if (descriptor == null) {
             descriptor = descriptorsById.get(expression.getText());
         }
+        if(descriptor == null) {
+            throw new EJBQLException("the entity variable '" + id +"' does not refer to any entity in the FROM clause");
+        }
         final EntityResult entityResult = new EntityResult(descriptor.getObjectClass());
         final String prefix = "ec" + position + "_";
         final int[] index = {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/583df135/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
index fcc78f5..5ed52a6 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/query/EJBQLQueryIT.java
@@ -23,6 +23,7 @@ import org.apache.cayenne.access.DataContext;
 import org.apache.cayenne.configuration.server.ServerRuntime;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.ejbql.EJBQLCompiledExpression;
+import org.apache.cayenne.ejbql.EJBQLException;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.map.EntityResolver;
@@ -50,6 +51,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 @UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
 public class EJBQLQueryIT extends ServerCase {
@@ -190,6 +192,29 @@ public class EJBQLQueryIT extends ServerCase {
         assertEquals(ejbql, parsed.getSource());
     }
 
+    /**
+     * <p>If an expression has an 'entity variable' used in the SELECT clause then there should be a
+     * corresponding definition for the 'entity variable' in the FROM clause.  This did, at some
+     * point throw an NPE.</p>
+     */
+
+    @Test
+    public void testMissingEntityBeanVariable() {
+       String ejbql = "SELECT b FROM Artist a";
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+
+        try {
+            context.performQuery(query);
+            fail("expected an instance of " + EJBQLException.class.getSimpleName() + " to have been thrown.");
+        }
+        catch(EJBQLException e) {
+            assertEquals("the entity variable 'b' does not refer to any entity in the FROM clause", e.getUnlabeledMessage());
+        }
+        catch(Throwable th) {
+            fail("expected an instance of " + EJBQLException.class.getSimpleName() + " to have been thrown.");
+        }
+    }
+
     @Test
     public void testGetName() {
         String ejbql = "select a FROM Artist a";