blob: 38c2328a432525b98fe7c13a95f5942c9e7a6eee [file] [log] [blame]
/*
* 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.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<>();
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 = 0;
Integer qTime = 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
closeEMF(emf1);
closeEMF(emf2);
}
}
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 = 10000;
Integer qTime = 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
closeEMF(emf1);
closeEMF(emf2);
}
}
}