Author: jrbauer
Date: Wed Mar 18 15:18:44 2009
New Revision: 755615

URL: http://svn.apache.org/viewvc?rev=755615&view=rev
Log:
OPENJPA-972 Committing code doc update and tests contributed by Donald Woods.

Added:
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryProperties.java
   (with props)
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence3.xml
   (with props)

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryProperties.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryProperties.java?rev=755615&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryProperties.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryProperties.java
 Wed Mar 18 15:18:44 2009
@@ -0,0 +1,317 @@
+/*
+ * 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.openjpa.conf;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.openjpa.lib.log.Log;
+import org.apache.openjpa.persistence.OpenJPAEntityManager;
+import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
+import org.apache.openjpa.persistence.OpenJPAPersistence;
+import org.apache.openjpa.persistence.OpenJPAQuery;
+import org.apache.openjpa.persistence.query.common.apps.QTimeout;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+/**
+ * Tests the following JPA 2.0 Persistence Unit Properties scenarios:
+ *   1) persistence.xml provided properties 
+ *      1a) No PU properties provided is same as no timeout (JDBC defined)
+ *      1b) PU provided properties translated into config
+ *   2) Map of properties provided to createEMF()
+ *      2a) EMF props can be set when no PU props provided
+ *      2b) EMF props override PU set properties in config
+ *   3) QueryHints override default values from PU or EMF (2b)
+ *   4) Query.setHint() 
+ *      4a) can override default values from PU or EMF (2a)
+ *      4b) can override QueryHints (3)
+ *
+ * @version $Rev$ $Date$
+ */
+public class TestQueryProperties extends SingleEMFTestCase {
+    
+    private Map<String,String> props = null;
+
+    @Override
+    public void setUp() throws Exception {
+        // setup using a simple entity
+        super.setUp(QTimeout.class, CLEAR_TABLES);
+        // create the Map to test overrides
+        props = new HashMap<String,String>();
+        props.put("javax.persistence.lock.timeout", "12000");
+        props.put("javax.persistence.query.timeout", "7000");
+    }
+    
+    public void testNoProperties() {
+        getLog().trace("testNoProperties() - no properties in 
persistence.xml");
+        OpenJPAEntityManagerFactory emf1 = null, emf2 = null;
+        OpenJPAEntityManager em1 = null, em2 = null;
+        
+        try {
+            OpenJPAQuery q;
+            Map<String, Object> hints;
+            Integer timeout;
+            Integer lTime = new Integer(0);
+            Integer qTime = new Integer(0);
+            
+            // create our PU without properties
+            emf1 = OpenJPAPersistence.createEntityManagerFactory(
+                "qtimeout-no-properties", "persistence3.xml");
+            assertNotNull(emf1);
+            emf2 = OpenJPAPersistence.createEntityManagerFactory(
+                "qtimeout-no-properties", "persistence3.xml", props);
+            assertNotNull(emf2);
+            
+            //=============
+            // Test for 1a)
+            //=============
+            // verify no config properties from persistence.xml
+            OpenJPAConfiguration conf1 = emf1.getConfiguration();
+            assertNotNull(conf1);
+            assertEquals("Expected no default lock timeout", lTime.intValue(),
+                conf1.getLockTimeout());
+            assertEquals("Expected no default query timeout", qTime.intValue(),
+                conf1.getQueryTimeout());
+            // verify Query receives no properties
+            em1 = emf1.createEntityManager();
+            assertNotNull(em1);
+            q = em1.createNamedQuery("NoHintList");
+            // verify no Query hints
+            hints = q.getHints();
+            assertFalse(hints.containsKey("javax.persistence.lock.timeout"));
+            assertFalse(hints.containsKey("javax.persistence.query.timeout"));
+            // verify default config values of no timeouts
+            timeout = q.getFetchPlan().getLockTimeout();
+            assertEquals("Expected no default lock timeout", lTime.intValue(),
+                timeout.intValue());
+            timeout = q.getFetchPlan().getQueryTimeout();
+            assertEquals("Expected no default query timeout", qTime.intValue(),
+                timeout.intValue());
+
+            //=============
+            // Test for 2a)
+            //=============
+            // verify properties in Map override persistence.xml
+            OpenJPAConfiguration conf2 = emf2.getConfiguration();
+            assertNotNull(conf2);
+            lTime = 12000;
+            qTime = 7000;
+            assertEquals("Expected Map updated lock timeout", lTime.intValue(),
+                conf2.getLockTimeout());
+            assertEquals("Expected Map updated query timeout", 
qTime.intValue(),
+                conf2.getQueryTimeout());
+            // Verify Query receives the properties
+            em2 = emf2.createEntityManager();
+            assertNotNull(em2);
+            q = em2.createNamedQuery("NoHintList");
+            // Cannot verify properties are passed through as Query hints
+            /*
+             * Following test would fail, as the code currently does not pass
+             * the properties down as hints, but only as config settings.
+             * 
+             * The spec says that PU or Map provided properties to the EMF
+             * will be used as defaults and that Query.setHint() can be used
+             * to override, but there is no requirement for getHints() to 
+             * return these default values.
+             *  
+            hints = q.getHints();
+            assertTrue(hints.containsKey("javax.persistence.lock.timeout"));
+            assertTrue(hints.containsKey("javax.persistence.query.timeout"));
+            timeout = new Integer((String) 
hints.get("javax.persistence.lock.timeout"));
+            assertEquals("Expected Map updated lockTimeout",
+                lTime.intValue(), timeout.intValue());
+            timeout = new Integer((String) 
hints.get("javax.persistence.query.timeout"));
+            assertEquals("Expected Map updated queryTimeout",
+                qTime.intValue(), timeout.intValue());
+            */
+            // verify internal config values were updated
+            timeout = q.getFetchPlan().getLockTimeout();
+            assertEquals("Expected Map updated lock timeout", lTime.intValue(),
+                timeout.intValue());
+            timeout = q.getFetchPlan().getQueryTimeout();
+            assertEquals("Expected Map updated query timeout", 
qTime.intValue(),
+                timeout.intValue());
+            
+            //=============
+            // Test for 4a)
+            //=============
+            // verify setHint overrides Map provided properties
+            lTime = 15000;
+            qTime = 10000;
+            q.setHint("javax.persistence.lock.timeout", lTime);
+            q.setHint("javax.persistence.query.timeout", qTime);
+            hints = q.getHints();
+            // verify getHints values were updated
+            timeout = (Integer) hints.get("javax.persistence.lock.timeout");
+            assertEquals("Expected setHint updated 
javax.persistence.lock.timeout",
+                lTime.intValue(), timeout.intValue());
+            timeout = (Integer) hints.get("javax.persistence.query.timeout");
+            assertEquals("Expected setHint updated 
javax.persistence.query.timeout",
+                qTime.intValue(), timeout.intValue());
+            // verify internal config values were updated
+            timeout = q.getFetchPlan().getLockTimeout();
+            assertEquals("Expected setHint updated lockTimeout",
+                lTime.intValue(), timeout.intValue());
+            timeout = q.getFetchPlan().getQueryTimeout();
+            assertEquals("Expected setHint updated queryTimeout",
+                qTime.intValue(), timeout.intValue());
+        } finally {
+            // cleanup
+            if ((em1 != null) && em1.isOpen())
+                em1.close();
+            if (emf1 != null)
+                emf1.close();
+            if ((em2 != null) && em2.isOpen())
+                em2.close();
+            if (emf2!= null)
+                emf2.close();
+        }
+    }
+
+    public void testWithProperties() {
+        getLog().trace("testWithProperties() - properties in persistence.xml");
+        OpenJPAEntityManagerFactory emf1 = null, emf2 = null;
+        OpenJPAEntityManager em1 = null, em2 = null;
+        
+        try {
+            OpenJPAQuery q;
+            Map<String, Object> hints;
+            Integer timeout;
+            Integer lTime = new Integer(10000);
+            Integer qTime = new Integer(5000);
+            
+            // create our PU with properties
+            emf1 = OpenJPAPersistence.createEntityManagerFactory(
+                "qtimeout-with-properties", "persistence3.xml");
+            assertNotNull(emf1);
+            emf2 = OpenJPAPersistence.createEntityManagerFactory(
+                "qtimeout-with-properties", "persistence3.xml", props);
+            assertNotNull(emf2);
+            
+            //=============
+            // Test for 1b)
+            //=============
+            // verify properties in persistence.xml
+            OpenJPAConfiguration conf1 = emf1.getConfiguration();
+            assertNotNull(conf1);
+            assertEquals("Default PU lock timeout", lTime.intValue(),
+                conf1.getLockTimeout());
+            assertEquals("Default PU query timeout.", qTime.intValue(),
+                conf1.getQueryTimeout());
+            // verify Query receives the properties
+            em1 = emf1.createEntityManager();
+            assertNotNull(em1);
+            q = em1.createNamedQuery("NoHintList");    
+            // Cannot verify properties are passed through as Query hints
+            //     See explanation and commented out test in testNoProperties()
+            // verify timeout properties supplied in persistence.xml
+            timeout = q.getFetchPlan().getLockTimeout();
+            assertEquals("Expected default PU lock timeout", lTime.intValue(),
+                timeout.intValue());
+            timeout = q.getFetchPlan().getQueryTimeout();
+            assertEquals("Expected default PU query timeout", qTime.intValue(),
+                timeout.intValue());
+
+            //=============
+            // Test for 2b)
+            //=============
+            // verify properties in Map override persistence.xml
+            OpenJPAConfiguration conf2 = emf2.getConfiguration();
+            assertNotNull(conf2);
+            lTime = 12000;
+            qTime = 7000;
+            assertEquals("Expected Map updated lock timeout", lTime.intValue(),
+                conf2.getLockTimeout());
+            assertEquals("Expected Map updated query timeout", 
qTime.intValue(),
+                conf2.getQueryTimeout());
+            // Verify Query receives the properties
+            em2 = emf2.createEntityManager();
+            assertNotNull(em2);
+            q = em2.createNamedQuery("NoHintList");
+            // Cannot verify properties are passed through as Query hints
+            //     See explanation and commented out test in testNoProperties()
+            // verify internal config values were updated
+            timeout = q.getFetchPlan().getLockTimeout();
+            assertEquals("Expected Map updated lockTimeout", lTime.intValue(),
+                timeout.intValue());
+            timeout = q.getFetchPlan().getQueryTimeout();
+            assertEquals("Expected Map updated queryTimeout", qTime.intValue(),
+                timeout.intValue());
+            
+            //=============
+            // Test for 3)
+            //=============
+            // verify QueryHints override Map provided properties
+            q = em2.createNamedQuery("Hint1000msec");
+            qTime = 1000;
+            // verify getHints values were updated
+            hints = q.getHints();
+            timeout = new 
Integer((String)hints.get("javax.persistence.query.timeout"));
+            assertEquals("Expected QueryHints updated query timeout",
+                qTime.intValue(), timeout.intValue());
+            // verify internal config value was updated
+            timeout = q.getFetchPlan().getQueryTimeout();
+            assertEquals("Expected QueryHints updated queryTimeout",
+                qTime.intValue(), timeout.intValue());
+
+            //=============
+            // Test for 4b)
+            //=============
+            // verify setHint overrides QueryHint provided properties
+            lTime = 15000;
+            qTime = 10000;
+            q.setHint("javax.persistence.lock.timeout", lTime);
+            q.setHint("javax.persistence.query.timeout", qTime);
+            // verify getHints values were updated
+            hints = q.getHints();
+            timeout = (Integer) hints.get("javax.persistence.lock.timeout");
+            assertEquals("Expected setHint updated lock timeout",
+                lTime.intValue(), timeout.intValue());
+            timeout = (Integer) hints.get("javax.persistence.query.timeout");
+            assertEquals("Expected setHint updated query timeout",
+                qTime.intValue(), timeout.intValue());
+            // verify internal config values were updated
+            timeout = q.getFetchPlan().getLockTimeout();
+            assertEquals("Expected setHint updated lockTimeout",
+                lTime.intValue(), timeout.intValue());
+            timeout = q.getFetchPlan().getQueryTimeout();
+            assertEquals("Expected setHint updated queryTimeout",
+                qTime.intValue(), timeout.intValue());
+        } finally {
+            // cleanup
+            if ((em1 != null) && em1.isOpen())
+                em1.close();
+            if (emf1 != null)
+                emf1.close();
+            if ((em2 != null) && em2.isOpen())
+                em2.close();
+            if (emf2!= null)
+                emf2.close();
+        }
+    }
+    
+    /**
+     * Internal convenience method for getting the OpenJPA logger
+     * 
+     * @return
+     */
+    private Log getLog() {
+        return emf.getConfiguration().getLog("Tests");
+    }
+}

Propchange: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/conf/TestQueryProperties.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence3.xml
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence3.xml?rev=755615&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence3.xml
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence3.xml
 Wed Mar 18 15:18:44 2009
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.   
+-->
+<persistence xmlns="http://java.sun.com/xml/ns/persistence";
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+    version="1.0">
+    
+    <!-- Following 2 PUs are used by TestQueryProperties -->
+    <persistence-unit name="qtimeout-no-properties">
+       <class>org.apache.openjpa.persistence.query.common.apps.QTimeout</class>
+    </persistence-unit>
+    
+    <persistence-unit name="qtimeout-with-properties">
+       <class>org.apache.openjpa.persistence.query.common.apps.QTimeout</class>
+        <properties>
+            <property name="javax.persistence.lock.timeout" value="10000"/>
+            <property name="javax.persistence.query.timeout" value="5000"/>
+        </properties>
+    </persistence-unit>
+    
+    <!-- Following PU is used by TestQueryTimeout -->
+    <persistence-unit name="qtimeout-1000msecs">
+       <class>org.apache.openjpa.persistence.query.common.apps.QTimeout</class>
+        <properties>
+            <property name="javax.persistence.query.timeout" value="1000"/>
+        </properties>
+    </persistence-unit>
+    
+</persistence>

Propchange: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/resources/META-INF/persistence3.xml
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to