| /* |
| * 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. |
| * |
| * @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 |
| { |
| rollback(); |
| close(); |
| 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 ); |
| } |
| } |