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>