blob: e572f9dec7fef3d177c9305e28d903ffd45c3dfd [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.persistence.test;
import java.util.Collections;
import java.util.List;
import javax.persistence.EntityTransaction;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.OpenJPAQuery;
/**
* A base test case that can be used to easily test scenarios where there
* is only a single EntityManager at any given time.
* Extends SingleEMFTestCase and cleans up provided EM in tearDown() and relies on
* SingEMFTestCase.tearDown() to clean up the EMF it provides.
*
* @author Marc Prud'hommeaux
*/
public abstract class SingleEMTestCase
extends SingleEMFTestCase {
protected OpenJPAEntityManager em;
@Override
public void setUp() {
setUp(new Object[0]);
}
@Override
public void setUp(Object... props) {
super.setUp(props);
em = emf.createEntityManager();
}
/**
* Clear the current EntityManager and re-initialize it.
*/
protected void reset() {
close();
em = emf.createEntityManager();
}
@Override
public void tearDown() throws Exception {
closeEM(em);
em = null;
super.tearDown();
}
/**
* Start a new transaction if there isn't currently one active.
* @return true if a transaction was started, false if one already existed
*/
protected boolean begin() {
EntityTransaction tx = em.getTransaction();
if (tx.isActive())
return false;
tx.begin();
return true;
}
/**
* Commit the current transaction, if it is active.
* @return true if the transaction was committed
*/
protected boolean commit() {
EntityTransaction tx = em.getTransaction();
if (!tx.isActive())
return false;
tx.commit();
return true;
}
/**
* Rollback the current transaction, if it is active.
* @return true if the transaction was rolled back
*/
protected boolean rollback() {
EntityTransaction tx = em.getTransaction();
if (!tx.isActive())
return false;
tx.rollback();
return true;
}
/**
* Closes the current EntityManager if it is open.
* @return false if the EntityManager was already closed.
*/
protected boolean close() {
if (em == null)
return false;
rollback();
if (!em.isOpen())
return false;
em.close();
return !em.isOpen();
}
/**
* Delete all of the instances.
*
* If no transaction is running, then one will be started and committed.
* Otherwise, the operation will take place in the current transaction.
*/
protected void remove(Object... obs) {
boolean tx = begin();
for (Object ob : obs)
em.remove(ob);
if (tx)
commit();
}
/**
* Persist all of the instances.
*
* If no transaction is running, then one will be started and committed.
* Otherwise, the operation will take place in the current transaction.
*/
protected void persist(Object... obs) {
boolean tx = begin();
for (Object ob : obs)
em.persist(ob);
if (tx)
commit();
}
/**
* Creates a query in the current EntityManager with the specified string.
*/
protected OpenJPAQuery query(String str) {
return em.createQuery(str);
}
/**
* Create a query against the specified class, which will be aliased
* as "x". For example, query(Person.class, "where x.age = 21") will
* create the query "select x from Person x where x.age = 21".
*
* @param c the class to query against
* @param str the query suffix
* @param params the parameters, if any
* @return the Query object
*/
protected OpenJPAQuery query(Class c, String str, Object... params) {
String query = "select x from " + entityName(emf, c) + " x "
+ (str == null ? "" : str);
OpenJPAQuery q = em.createQuery(query);
for (int i = 0; params != null && i < params.length; i++)
q.setParameter(i + 1, params[i]);
return q;
}
/**
* Returns a list of all instances of the specific class in the database.
*
* @param c the class to find
* @param q the query string suffix to use
* @param params the positional parameter list value
*
* @see #query(java.lang.Class,java.lang.String)
*/
protected <E> List<E> find(Class<E> c, String q, Object... params) {
return Collections.checkedList(query(c, q, params).getResultList(), c);
}
/**
* Returns a list of all instances of the specific class in the database.
*/
protected <E> List<E> find(Class<E> c) {
return find(c, null);
}
}