blob: 240a1da6bfa924f803fcbbac3b59251b2a9e2c36 [file] [log] [blame]
/*
* TestDataStoreTrips.java
*
* Created on September 29, 2006, 4:48 PM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
/*
* 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.jdbc.kernel;
import java.util.*;
import org.apache.openjpa.persistence.jdbc.common.apps.*;
import java.lang.annotation.Annotation;
import junit.framework.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.lib.jdbc.AbstractJDBCListener;
import org.apache.openjpa.lib.jdbc.JDBCEvent;
import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.persistence.OpenJPAPersistence;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.persistence.Extent;
public class TestDataStoreTrips extends BaseJDBCTest{
// private boolean = true;//Boolean.valueOf(bool);
private OpenJPAEntityManagerFactory _factory = null;
private Object _oid = null;
private SelectCounter _counter = null;
/** Creates a new instance of TestDataStoreTrips */
public TestDataStoreTrips() {
}
public TestDataStoreTrips(String name) {
super(name);
}
public void setUp()
throws Exception {
deleteAll(DataStoreTripsPC.class);
// figure out what table to look for in SQL statements
EntityManager em= currentEntityManager();
OpenJPAEntityManager kem = OpenJPAPersistence.cast (em);
JDBCConfiguration conf = (JDBCConfiguration) ((OpenJPAEntityManagerSPI) kem).getConfiguration();
ClassMapping mapping = conf.getMappingRepositoryInstance().getMapping
(DataStoreTripsPC.class, null, true);
String table = conf.getDBDictionaryInstance()
.getFullName(mapping.getTable(), false);
// get factory with counter listener
_factory = getEmf();
/* getPMFactory(new String[]{
"openjpa.jdbc.JDBCListeners",
SelectCounter.class.getName() + "(Table=" + table + ")",
"openjpa.Compatibility",
"ValidateTrueChecksStore=true"
});
*/
OpenJPAEntityManager pm = _factory.createEntityManager();
startTx(pm);
DataStoreTripsPC pc = new DataStoreTripsPC(0);
pm.persist(pc);
_oid = pm.getObjectId(pc);
for (int i = 1; i < 10; i++)
pm.persist(new DataStoreTripsPC(i));
endTx(pm);
em.close();
// do a query so that the subclass list will get initialized and
// won't count as a select
pm = _factory.createEntityManager();
pm.getObjectId(_oid);
pm.close();
_counter = (SelectCounter) ((JDBCConfiguration)
((OpenJPAEntityManagerFactorySPI) _factory).getConfiguration()).getJDBCListenerInstances()[0];
_counter.selects = 0;
_counter.counts = 0;
}
public void testTrips() {
OpenJPAEntityManager pm = _factory.createEntityManager();
Extent ext = pm.createExtent(DataStoreTripsPC.class, true);
for (Iterator itr = ext.iterator(); itr.hasNext();)
itr.next();
ext.closeAll();
pm.close();
// there might be more than 1 trip if subclasses need to be
// initialized and so forth, but make sure there isn't more than
// 1 + # objects trips to the DB
assertTrue(_counter.selects > 0);
assertTrue("Should have been 1-3 trips to the data store; got "
+ _counter.selects, _counter.selects < 5);
}
public void testExistsCalls() {
OpenJPAEntityManager pm = _factory.createEntityManager();
// first time there shouldn't be any call to exists b/c the data
// needs to be loaded
pm.getObjectId(_oid);
assertEquals(0, _counter.counts);
assertEquals(1, _counter.selects);
// this time there should be a call b/c data is already loaded but
// we're still asking to validate
pm.getObjectId(_oid);
assertEquals(1, _counter.counts);
assertEquals(2, _counter.selects);
pm.getObjectId(_oid);
assertEquals(2, _counter.counts);
assertEquals(3, _counter.selects);
// shouldn't be a call if validate is false; no select b/c data loaded
pm.getObjectId(_oid);
assertEquals(2, _counter.counts);
assertEquals(3, _counter.selects);
// this will hollow the object
//FIXME jthomas ...need to find a substitute
//pm.currentTransaction().setOptimistic(false);
startTx(pm);
// no count call b/c loading data
pm.getObjectId(_oid);
assertEquals(2, _counter.counts);
assertEquals(4, _counter.selects);
// no count call b/c transactional; no select b/c data loaded
pm.getObjectId(_oid);
assertEquals(2, _counter.counts);
assertEquals(4, _counter.selects);
rollbackTx(pm);
pm.close();
}
public static class SelectCounter
extends AbstractJDBCListener {
public int selects = 0;
public int counts = 0;
private String _table = null;
public void setTable(String table) {
_table = table;
}
public void beforeExecuteStatement(JDBCEvent event) {
if (event.getSQL().indexOf(_table) != -1)
selects++;
{
if (event.getSQL().indexOf(" COUNT(") != -1)
counts++;
}
}
}
}