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