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 2010/09/19 11:14:28 UTC
svn commit: r998620 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src:
main/java/org/apache/cayenne/access/trans/
test/java/org/apache/cayenne/query/
test/java/org/apache/cayenne/testdo/consttest/
test/java/org/apache/cayenne/testdo/con...
Author: aadamchik
Date: Sun Sep 19 09:14:28 2010
New Revision: 998620
URL: http://svn.apache.org/viewvc?rev=998620&view=rev
Log:
CAY-1213 Cayenne should support enum types in qualifier statements/expression handling
* patch by Andrei Veprev
* (Andrus) fixing use of StringUtils
Added:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/ConstQueryTest.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Entity.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Status.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Type.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/auto/
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/auto/_Const.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/auto/_Const1Entity.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/cayenne-const.xml
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/const.map.xml
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/QualifierTranslator.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/spring-test-resources.xml
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/QualifierTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/QualifierTranslator.java?rev=998620&r1=998619&r2=998620&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/QualifierTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/trans/QualifierTranslator.java Sun Sep 19 09:14:28 2010
@@ -20,6 +20,7 @@
package org.apache.cayenne.access.trans;
import java.io.IOException;
+import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.List;
@@ -27,6 +28,7 @@ import org.apache.cayenne.CayenneRuntime
import org.apache.cayenne.ObjectId;
import org.apache.cayenne.Persistent;
import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.ExpressionException;
import org.apache.cayenne.exp.TraversalHandler;
import org.apache.cayenne.exp.parser.ASTDbPath;
import org.apache.cayenne.exp.parser.ASTObjPath;
@@ -39,6 +41,7 @@ import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.query.QualifiedQuery;
import org.apache.cayenne.query.Query;
import org.apache.cayenne.reflect.ClassDescriptor;
+import org.apache.cayenne.util.Util;
import org.apache.commons.collections.IteratorUtils;
import org.apache.commons.collections.Transformer;
@@ -372,11 +375,50 @@ public class QualifierTranslator extends
}
}
- public void objectNode(Object leaf, Expression parentNode) {
+ private boolean tryAppendConst(String path, Expression parentNode) throws IOException {
+
+ if (path.length() < 3) {
+ return false;
+ }
+
+ int lastDot = path.lastIndexOf('.');
+ if (lastDot <= 0 || lastDot == path.length() - 1) {
+ return false;
+ }
+
+ String constName = path.substring(lastDot + 1);
+ String className = path.substring(0, lastDot);
+
+ Object constValue;
+ try {
+ Class<?> klass = Util.getJavaClass(className);
+ Field constField = klass.getField(constName);
+ constValue = constField.get(null);
+ }
+ catch (ClassNotFoundException e) {
+ return false;
+ }
+ catch (NoSuchFieldException e) {
+ return false;
+ }
+ catch (IllegalAccessException e) {
+ throw new ExpressionException("Can't access const field", e);
+ }
+ appendLiteral(constValue, paramsDbType(parentNode), parentNode);
+ return true;
+ }
+ private void appendObjPathOrConst(Object leaf, Expression parentNode)
+ throws IOException {
+ if (!(leaf instanceof String && tryAppendConst((String) leaf, parentNode))) {
+ appendObjPath(parentNode);
+ }
+ }
+
+ public void objectNode(Object leaf, Expression parentNode) {
try {
if (parentNode.getType() == Expression.OBJ_PATH) {
- appendObjPath(parentNode);
+ appendObjPathOrConst(leaf, parentNode);
}
else if (parentNode.getType() == Expression.DB_PATH) {
appendDbPath(parentNode);
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/ConstQueryTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/ConstQueryTest.java?rev=998620&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/ConstQueryTest.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/query/ConstQueryTest.java Sun Sep 19 09:14:28 2010
@@ -0,0 +1,106 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+package org.apache.cayenne.query;
+
+import static java.util.Collections.singletonMap;
+
+import java.util.List;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.consttest.Const1Entity;
+import org.apache.cayenne.testdo.consttest.Const1Type;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime("cayenne-const.xml")
+public class ConstQueryTest extends ServerCase {
+
+ @Inject
+ protected ObjectContext context;
+
+ @Inject
+ protected DBHelper dbHelper;
+
+ @Override
+ protected void setUpAfterInjection() throws Exception {
+ dbHelper.deleteAll("CONST1_ENTITY");
+ }
+
+ private void createConst1EntityDataSet() throws Exception {
+ TableHelper tableHelper = new TableHelper(dbHelper, "CONST1_ENTITY");
+ tableHelper.setColumns("ID", "NAME", "STATUS", "TYPE");
+ tableHelper.insert(1, "entity1", 1, 0);
+ tableHelper.insert(2, "entity2", null, 1);
+ }
+
+ private void createConst1EntityDataSetWithEnumName() throws Exception {
+ TableHelper tableHelper = new TableHelper(dbHelper, "CONST1_ENTITY");
+ tableHelper.setColumns("ID", "NAME", "STATUS", "TYPE");
+ tableHelper.insert(1, "entity1", 1, 0);
+ tableHelper.insert(2, "org.apache.cayenne.testdo.consttest.Const1Type.ADMIN", null, 1);
+ }
+
+ public void testSelectByEnumValue() throws Exception {
+ createConst1EntityDataSet();
+
+ Expression expr = Expression.fromString("type = $type");
+ SelectQuery query = new SelectQuery(Const1Entity.class, expr)
+ .queryWithParameters(singletonMap("type", Const1Type.ORDINARY));
+ List users = context.performQuery(query);
+ assertEquals(1, users.size());
+ assertEquals("entity1", ((Const1Entity) users.get(0)).getName());
+ }
+
+ public void testSelectByEnumValueSpecifiedAsConstant() throws Exception {
+ createConst1EntityDataSet();
+
+ Expression expr = Expression
+ .fromString("type = org.apache.cayenne.testdo.consttest.Const1Type.ADMIN");
+ SelectQuery query = new SelectQuery(Const1Entity.class, expr);
+ List users = context.performQuery(query);
+ assertEquals(1, users.size());
+ assertEquals("entity2", ((Const1Entity) users.get(0)).getName());
+ }
+
+ public void testSelectByConstValue() throws Exception {
+ createConst1EntityDataSet();
+
+ Expression expr = Expression
+ .fromString("status = org.apache.cayenne.testdo.consttest.Const1Status.DEFAULT");
+ SelectQuery query = new SelectQuery(Const1Entity.class, expr);
+ List users = context.performQuery(query);
+ assertEquals(1, users.size());
+ assertEquals("entity1", ((Const1Entity) users.get(0)).getName());
+ }
+
+ public void testSelectByString() throws Exception {
+ createConst1EntityDataSetWithEnumName();
+
+ Expression expr = Expression
+ .fromString("name = 'org.apache.cayenne.testdo.consttest.Const1Type.ADMIN'");
+ SelectQuery query = new SelectQuery(Const1Entity.class, expr);
+ List users = context.performQuery(query);
+ assertEquals(1, users.size());
+ assertEquals("org.apache.cayenne.testdo.consttest.Const1Type.ADMIN", ((Const1Entity) users.get(0)).getName());
+ }
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const.java?rev=998620&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const.java Sun Sep 19 09:14:28 2010
@@ -0,0 +1,18 @@
+package org.apache.cayenne.testdo.consttest;
+
+import org.apache.cayenne.testdo.consttest.auto._Const;
+
+public class Const extends _Const {
+
+ private static Const instance;
+
+ private Const() {}
+
+ public static Const getInstance() {
+ if(instance == null) {
+ instance = new Const();
+ }
+
+ return instance;
+ }
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Entity.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Entity.java?rev=998620&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Entity.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Entity.java Sun Sep 19 09:14:28 2010
@@ -0,0 +1,7 @@
+package org.apache.cayenne.testdo.consttest;
+
+import org.apache.cayenne.testdo.consttest.auto._Const1Entity;
+
+public class Const1Entity extends _Const1Entity {
+
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Status.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Status.java?rev=998620&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Status.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Status.java Sun Sep 19 09:14:28 2010
@@ -0,0 +1,25 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+package org.apache.cayenne.testdo.consttest;
+
+
+public interface Const1Status {
+ Integer DEFAULT = 1;
+ Integer NULL = null;
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Type.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Type.java?rev=998620&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Type.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/Const1Type.java Sun Sep 19 09:14:28 2010
@@ -0,0 +1,24 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+package org.apache.cayenne.testdo.consttest;
+
+
+public enum Const1Type {
+ ORDINARY, ADMIN
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/auto/_Const.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/auto/_Const.java?rev=998620&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/auto/_Const.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/auto/_Const.java Sun Sep 19 09:14:28 2010
@@ -0,0 +1,12 @@
+package org.apache.cayenne.testdo.consttest.auto;
+
+
+
+/**
+ * This class was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public class _Const {
+}
\ No newline at end of file
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/auto/_Const1Entity.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/auto/_Const1Entity.java?rev=998620&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/auto/_Const1Entity.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/consttest/auto/_Const1Entity.java Sun Sep 19 09:14:28 2010
@@ -0,0 +1,41 @@
+package org.apache.cayenne.testdo.consttest.auto;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.testdo.consttest.Const1Type;
+
+/**
+ * Class _Const1Entity was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _Const1Entity extends CayenneDataObject {
+
+ public static final String NAME_PROPERTY = "name";
+ public static final String STATUS_PROPERTY = "status";
+ public static final String TYPE_PROPERTY = "type";
+
+ public static final String ID_PK_COLUMN = "ID";
+
+ public void setName(String name) {
+ writeProperty("name", name);
+ }
+ public String getName() {
+ return (String)readProperty("name");
+ }
+
+ public void setStatus(Integer status) {
+ writeProperty("status", status);
+ }
+ public Integer getStatus() {
+ return (Integer)readProperty("status");
+ }
+
+ public void setType(Const1Type type) {
+ writeProperty("type", type);
+ }
+ public Const1Type getType() {
+ return (Const1Type)readProperty("type");
+ }
+
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/cayenne-const.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/cayenne-const.xml?rev=998620&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/cayenne-const.xml (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/cayenne-const.xml Sun Sep 19 09:14:28 2010
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<domain project-version="6">
+ <map name="const"/>
+</domain>
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/const.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/const.map.xml?rev=998620&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/const.map.xml (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/const.map.xml Sun Sep 19 09:14:28 2010
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+ project-version="6">
+ <property name="defaultPackage" value="org.apache.cayenne.testdo.consttest"/>
+ <db-entity name="CONST1_ENTITY">
+ <db-attribute name="ID" type="BIGINT" isPrimaryKey="true" isMandatory="true"/>
+ <db-attribute name="NAME" type="CHAR" isMandatory="true" length="200"/>
+ <db-attribute name="STATUS" type="INTEGER" isMandatory="false"/>
+ <db-attribute name="TYPE" type="INTEGER" isMandatory="true"/>
+ </db-entity>
+ <obj-entity name="Const1Entity" className="org.apache.cayenne.testdo.consttest.Const1Entity" dbEntityName="CONST1_ENTITY">
+ <obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
+ <obj-attribute name="status" type="java.lang.Integer" db-attribute-path="STATUS"/>
+ <obj-attribute name="type" type="org.apache.cayenne.testdo.consttest.Const1Type" db-attribute-path="TYPE"/>
+ </obj-entity>
+</data-map>
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/spring-test-resources.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/spring-test-resources.xml?rev=998620&r1=998619&r2=998620&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/spring-test-resources.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/spring-test-resources.xml Sun Sep 19 09:14:28 2010
@@ -112,6 +112,9 @@
<bean id="InheritanceVerticalMap" class="org.apache.cayenne.unit.DataMapFactory">
<constructor-arg><value>inheritance-vertical.map.xml</value></constructor-arg>
</bean>
+ <bean id="ConstMap" class="org.apache.cayenne.unit.DataMapFactory">
+ <constructor-arg><value>const.map.xml</value></constructor-arg>
+ </bean>
<!-- ======================================= -->
@@ -195,6 +198,7 @@
<ref bean="QuoteMap"/>
<ref bean="InheritanceSingleTable1Map"/>
<ref bean="InheritanceVerticalMap"/>
+ <ref bean="ConstMap"/>
</list>
</constructor-arg>
</bean>