/*
* 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.jdbc.meta.strats;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import org.apache.openjpa.conf.OpenJPAConfiguration;
import org.apache.openjpa.datacache.DataCachePCData;
import org.apache.openjpa.jdbc.sql.DB2Dictionary;
import org.apache.openjpa.jdbc.sql.MySQLDictionary;
import org.apache.openjpa.jdbc.sql.OracleDictionary;
import org.apache.openjpa.jdbc.sql.SQLServerDictionary;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.persistence.JPAFacadeHelper;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
/**
* This abstract class defines all the tests for LOB streaming.
*
* @author Ignacio Andreu
* @since 1.1.0
*/
public abstract class AbstractLobTest extends SingleEMFTestCase {
protected static boolean firstTestExecuted;
protected List<Class<?>> supportedDatabases =
new ArrayList<Class<?>>
(Arrays.asList(MySQLDictionary.class, OracleDictionary.class, SQLServerDictionary.class,
DB2Dictionary.class));
public void setUp() throws Exception {
setSupportedDatabases(supportedDatabases.toArray(new Class<?>[] {}));
if (isTestsDisabled()) {
return;
}
// Test CREATE TABLE but only once to save time.
Object clearOrDropTables = (firstTestExecuted) ? CLEAR_TABLES : DROP_TABLES;
firstTestExecuted = true;
super.setUp(getLobEntityClass(), clearOrDropTables,
"openjpa.DataCache", "true",
"openjpa.RemoteCommitProvider", "sjvm",
"openjpa.ConnectionRetainMode", "transaction");
}
public void insert(LobEntity le) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(le);
em.getTransaction().commit();
em.close();
}
public void testInsert() {
insert(newLobEntity(createLobData(), 1));
}
public void testInsertAndSelect() throws IOException {
String s = createLobData();
insert(newLobEntity(s, 1));
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Query query = em.createQuery(getSelectQuery());
LobEntity entity = (LobEntity) query.getSingleResult();
assertNotNull(entity.getStream());
assertEquals(s, getStreamContentAsString(entity.getStream()));
em.getTransaction().commit();
em.close();
}
public void testInsertNull() {
insert(newLobEntity(null, 1));
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity le = (LobEntity) em.find(getLobEntityClass(), 1);
assertNull(le.getStream());
em.getTransaction().commit();
em.close();
}
public void testUpdate() throws IOException {
insert(newLobEntity(createLobData(), 1));
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity entity = (LobEntity) em.find(getLobEntityClass(), 1);
String string = createLobData2();
changeStream(entity, string);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
entity = (LobEntity) em.find(getLobEntityClass(), 1);
assertEquals(string, getStreamContentAsString(entity.getStream()));
em.getTransaction().commit();
em.close();
}
public void testUpdateWithNull() {
insert(newLobEntity(createLobData(), 1));
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity entity = (LobEntity) em.find(getLobEntityClass(), 1);
entity.setStream(null);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
entity = (LobEntity) em.find(getLobEntityClass(), 1);
assertNull(entity.getStream());
em.getTransaction().commit();
em.close();
}
public void testUpdateANullObjectWithoutNull() throws IOException {
insert(newLobEntity(null, 1));
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity entity = (LobEntity) em.find(getLobEntityClass(), 1);
String string = createLobData2();
changeStream(entity, string);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
entity = (LobEntity) em.find(getLobEntityClass(), 1);
assertEquals(string, getStreamContentAsString(entity.getStream()));
em.getTransaction().commit();
em.close();
}
public void testDelete() {
insert(newLobEntity(createLobData(), 1));
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity entity = (LobEntity) em.find(getLobEntityClass(), 1);
em.remove(entity);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
Query q = em.createQuery(getSelectQuery());
assertEquals(0, q.getResultList().size());
em.getTransaction().commit();
em.close();
}
public void testLifeCycleInsertFlushModify() {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity le = newLobEntity(createLobData(), 1);
em.persist(le);
em.flush();
changeStream(le, createLobData2());
em.getTransaction().commit();
em.close();
}
public void testLifeCycleLoadFlushModifyFlush() {
insert(newLobEntity(createLobData(), 1));
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity entity = (LobEntity) em.find(getLobEntityClass(), 1);
em.flush();
changeStream(entity, createLobData2());
em.flush();
em.getTransaction().commit();
em.close();
}
public void testReadingMultipleTimesWithASingleConnection()
throws IOException {
insert(newLobEntity(createLobData(), 1));
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity le = (LobEntity) em.find(getLobEntityClass(), 1);
String string = createLobData2();
changeStream(le, string);
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
le = (LobEntity) em.find(getLobEntityClass(), 1);
assertNotNull(le.getStream());
LobEntity entity = newLobEntity(createLobData(), 2);
em.persist(entity);
assertEquals(string, getStreamContentAsString(le.getStream()));
em.getTransaction().commit();
em.close();
}
public void testDataCache() {
OpenJPAEntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity le = newLobEntity(createLobData(), 1);
em.persist(le);
em.getTransaction().commit();
OpenJPAConfiguration conf = emf.getConfiguration();
Object o = em.getObjectId(le);
ClassMetaData meta = JPAFacadeHelper.getMetaData(le);
Object objectId = JPAFacadeHelper.toOpenJPAObjectId(meta, o);
DataCachePCData pcd =
conf.getDataCacheManagerInstance()
.getSystemDataCache().get(objectId);
assertFalse(pcd.isLoaded(meta.getField("stream").getIndex()));
em.close();
}
public void testSetResetAndFlush() throws IOException {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity le = newLobEntity(createLobData(), 1);
em.persist(le);
String string = createLobData2();
changeStream(le, string);
em.flush();
em.getTransaction().commit();
em.close();
em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity entity = (LobEntity) em.find(getLobEntityClass(), 1);
assertEquals(string, getStreamContentAsString(entity.getStream()));
em.getTransaction().commit();
em.close();
}
public void testSetFlushAndReset() throws IOException {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
LobEntity le = newLobEntity(createLobData(), 1);
em.persist(le);
em.flush();
String string = createLobData2();
changeStream(le, string);
LobEntity entity = (LobEntity) em.find(getLobEntityClass(), 1);
assertEquals(string, getStreamContentAsString(entity.getStream()));
em.getTransaction().commit();
em.close();
}
protected String createLobData() {
return repeatString("ooOOOOoo, ", 3000);
}
protected String createLobData2() {
return repeatString("iiIIIIii, ", 1000);
}
protected abstract Class getLobEntityClass();
protected abstract String getStreamContentAsString(Object o)
throws IOException;
protected abstract LobEntity newLobEntity(String s, int id);
protected abstract LobEntity newLobEntityForLoadContent(String s, int id);
protected abstract String getSelectQuery();
protected abstract void changeStream(LobEntity le, String s);
}