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";