blob: fc104775cdadec42c2bb866335d4c2663f7899f4 [file] [log] [blame]
/*
* TestLRSProxies.java
*
* Created on October 3, 2006, 5:01 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.meta;
import java.util.*;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.lib.jdbc.JDBCEvent;
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;
public class TestLRSProxies extends org.apache.openjpa.persistence.jdbc.kernel.BaseJDBCTest{
private Object _oid = null;
private Object _coid = null;
public TestLRSProxies(String casename) {
super(casename);
}
/** Creates a new instance of TestLRSProxies */
public TestLRSProxies() {
}
public void setUp() {
deleteAll(LRSPC.class);
deleteAll(LRSCompoundPC.class);
LRSPC pc = new LRSPC("main");
pc.getStringSet().add("val1");
pc.getStringSet().add("val2");
pc.getStringSet().add("val3");
pc.getRelSet().add(new LRSPC("set1"));
pc.getRelSet().add(new LRSPC("set2"));
pc.getRelSet().add(new LRSPC("set3"));
pc.getStringCollection().add("val1");
pc.getStringCollection().add("val2");
pc.getStringCollection().add("val3");
pc.getRelCollection().add(new LRSPC("set1"));
pc.getRelCollection().add(new LRSPC("set2"));
pc.getRelCollection().add(new LRSPC("set3"));
pc.getStringMap().put("key1", "1");
pc.getStringMap().put("key2", "2");
pc.getStringMap().put("key3", "3");
pc.getRelMap().put("key1", new LRSPC("map1"));
pc.getRelMap().put("key2", new LRSPC("map2"));
pc.getRelMap().put("key3", new LRSPC("map3"));
LRSCompoundPC cpc = new LRSCompoundPC("main");
cpc.getStringSet().add("val1");
cpc.getStringSet().add("val2");
cpc.getStringSet().add("val3");
cpc.getRelSet().add(new LRSCompoundPC("set1"));
cpc.getRelSet().add(new LRSCompoundPC("set2"));
cpc.getRelSet().add(new LRSCompoundPC("set3"));
cpc.getStringCollection().add("val1");
cpc.getStringCollection().add("val2");
cpc.getStringCollection().add("val3");
cpc.getRelCollection().add(new LRSCompoundPC("set1"));
cpc.getRelCollection().add(new LRSCompoundPC("set2"));
cpc.getRelCollection().add(new LRSCompoundPC("set3"));
cpc.getStringMap().put("key1", "1");
cpc.getStringMap().put("key2", "2");
cpc.getStringMap().put("key3", "3");
cpc.getRelMap().put("key1", new LRSCompoundPC("map1"));
cpc.getRelMap().put("key2", new LRSCompoundPC("map2"));
cpc.getRelMap().put("key3", new LRSCompoundPC("map3"));
OpenJPAEntityManager pm = getEm(false, false);
startTx(pm);
pm.persist(pc);
pm.persist(cpc);
endTx(pm);
_oid = pm.getObjectId(pc);
_coid = pm.getObjectId(cpc);
pm.close();
}
public void testStringSet() {
stringCollectionTest(_oid, true, true);
stringCollectionTest(_coid, true, true);
}
public void testStringSetRetain() {
stringCollectionTest(_oid, false, true);
stringCollectionTest(_coid, false, true);
}
public void testStringCollection() {
stringCollectionTest(_oid, true, false);
stringCollectionTest(_coid, true, false);
}
public void testStringCollectionRetain() {
stringCollectionTest(_oid, false, false);
stringCollectionTest(_coid, false, false);
}
private void stringCollectionTest(Object oid, boolean close,
boolean isSet) {
//FIXME jthomas
//PersistenceManager pm = getPM(!close, !close);
OpenJPAEntityManager pm =null;
startTx(pm);
LRSPCIntf pc = (LRSPCIntf) pm.getObjectId(oid);
// check that orig values are correct
Collection set = isSet ? pc.getStringSet() : pc.getStringCollection();
assertEquals(3, set.size());
assertTrue(set.contains("val1"));
assertTrue(set.contains("val2"));
assertTrue(set.contains("val3"));
if (!isSet) {
Iterator itr = set.iterator();
assertEquals("val1", itr.next());
assertEquals("val2", itr.next());
assertEquals("val3", itr.next());
//FIXME jthomas
//KodoJDOHelper.close(itr);
}
// do some mods to try to confuse the proxy
set.remove("val1");
set.remove("val1");
set.add("val4");
set.remove("val4");
set.add("val5");
set.add("val6");
assertStringCollectionChanged(set, isSet);
endTx(pm);
if (close) {
pm.close();
pm = getEm(false, false);
}
// re-retrieve and check set
pc = (LRSPCIntf) pm.getObjectId(oid);
set = isSet ? pc.getStringSet() : pc.getStringCollection();
assertStringCollectionChanged(set, isSet);
pm.close();
}
private void assertStringCollectionChanged(Collection set, boolean isSet) {
assertEquals(4, set.size());
assertTrue(!set.contains("val1"));
assertTrue(set.contains("val2"));
assertTrue(set.contains("val3"));
assertTrue(!set.contains("val4"));
assertTrue(set.contains("val5"));
assertTrue(set.contains("val6"));
if (!isSet) {
Iterator itr = set.iterator();
assertEquals("val2", itr.next());
assertEquals("val3", itr.next());
assertEquals("val5", itr.next());
assertEquals("val6", itr.next());
assertTrue(!itr.hasNext());
//FIXME jthomas
//KodoJDOHelper.close(itr);
}
}
public void testStringMap() {
stringMapTest(_oid, true);
stringMapTest(_coid, true);
}
public void testStringMapRetain() {
stringMapTest(_oid, false);
stringMapTest(_coid, false);
}
private void stringMapTest(Object oid, boolean close) {
OpenJPAEntityManager pm = getEm(!close, !close);
startTx(pm);
LRSPCIntf pc = (LRSPCIntf) pm.getObjectId(oid);
// check that orig values are correct
Map map = pc.getStringMap();
assertEquals(3, map.size());
assertEquals("1", map.get("key1"));
assertEquals("2", map.get("key2"));
assertEquals("3", map.get("key3"));
// do some mods to try to confuse the proxy
map.put("key1", "1a");
map.put("key1", "1b");
map.put("key2", "4");
map.remove("key2");
map.remove("foo");
map.put("key5", "5");
assertStringMapChanged(map);
endTx(pm);
if (close) {
pm.close();
pm = getEm(false, false);
}
// re-retrieve and check map
pc = (LRSPCIntf) pm.getObjectId(oid);
map = pc.getStringMap();
assertStringMapChanged(map);
pm.close();
}
private void assertStringMapChanged(Map map) {
assertEquals(3, map.size());
assertEquals("1b", map.get("key1"));
assertEquals("3", map.get("key3"));
assertEquals("5", map.get("key5"));
assertNull(map.get("key2"));
assertTrue(map.containsKey("key1"));
assertFalse(map.containsKey("key2"));
assertTrue(map.containsValue("5"));
assertFalse(map.containsValue("1"));
Iterator itr = map.entrySet().iterator();
Map.Entry entry;
int count = 0;
for (; itr.hasNext(); count++) {
entry = (Map.Entry) itr.next();
if (entry.getKey().equals("key1"))
assertEquals("1b", entry.getValue());
else if (entry.getKey().equals("key3"))
assertEquals("3", entry.getValue());
else if (entry.getKey().equals("key5"))
assertEquals("5", entry.getValue());
else
fail("Bad key: " + entry.getKey());
}
assertEquals(3, count);
//FIXME
//KodoJDOHelper.close(itr);
}
public void testRelSet() {
relCollectionTest(_oid, true, true);
relCollectionTest(_coid, true, true);
}
public void testRelSetRetain() {
relCollectionTest(_oid, false, true);
relCollectionTest(_coid, false, true);
}
public void testRelCollection() {
relCollectionTest(_oid, true, false);
relCollectionTest(_coid, true, false);
}
public void testRelCollectionRetain() {
relCollectionTest(_oid, false, false);
relCollectionTest(_coid, false, false);
}
private void relCollectionTest(Object oid, boolean close, boolean isSet) {
OpenJPAEntityManager pm = getEm(!close, !close);
startTx(pm);
LRSPCIntf pc = (LRSPCIntf) pm.getObjectId(oid);
// check that orig values are correct
Collection set = isSet ? pc.getRelSet() : pc.getRelCollection();
assertEquals(3, set.size());
Collection ordered = new TreeSet();
Iterator itr = set.iterator();
ordered.add(itr.next());
ordered.add(itr.next());
ordered.add(itr.next());
assertTrue(!itr.hasNext());
//FIXME
//KodoJDOHelper.close(itr);
itr = ordered.iterator();
LRSPCIntf set1 = (LRSPCIntf) itr.next();
if (!isSet) {
LRSPCIntf set2 = (LRSPCIntf) itr.next();
LRSPCIntf set3 = (LRSPCIntf) itr.next();
assertEquals("set1", set1.getStringField());
assertEquals("set2", set2.getStringField());
assertEquals("set3", set3.getStringField());
}
assertTrue(set.contains(set1));
assertFalse(set.contains(pc));
// do some mods to try to confuse the proxy
set.remove(set1);
set.remove(set1);
LRSPCIntf set4 = pc.newInstance("set4");
set.add(set4);
set.remove(set4);
LRSPCIntf set5 = pc.newInstance("set5");
set.add(set5);
assertRelCollectionChanged(pc, isSet);
endTx(pm);
if (close) {
pm.close();
pm = getEm(false, false);
}
// re-retrieve and check set
pc = (LRSPCIntf) pm.getObjectId(oid);
assertRelCollectionChanged(pc, isSet);
pm.close();
}
private void assertRelCollectionChanged(LRSPCIntf pc, boolean isSet) {
Collection set = isSet ? pc.getRelSet() : pc.getRelCollection();
assertEquals(3, set.size());
Collection ordered = new TreeSet();
Iterator itr = set.iterator();
ordered.add(itr.next());
ordered.add(itr.next());
ordered.add(itr.next());
assertTrue(!itr.hasNext());
//FIXME
//KodoJDOHelper.close(itr);
itr = ordered.iterator();
LRSPCIntf set2 = (LRSPCIntf) itr.next();
if (!isSet) {
LRSPCIntf set3 = (LRSPCIntf) itr.next();
LRSPCIntf set5 = (LRSPCIntf) itr.next();
assertEquals("set2", set2.getStringField());
assertEquals("set3", set3.getStringField());
assertEquals("set5", set5.getStringField());
}
assertTrue(set.contains(set2));
assertFalse(set.contains(pc));
}
public void testRelMap() {
relMapTest(_oid, true);
relMapTest(_coid, true);
}
public void testRelMapRetain() {
relMapTest(_oid, false);
relMapTest(_coid, false);
}
private void relMapTest(Object oid, boolean close) {
OpenJPAEntityManager pm = getEm(!close, !close);
startTx(pm);
LRSPCIntf pc = (LRSPCIntf) pm.getObjectId(oid);
// check that orig values are correct
Map map = pc.getRelMap();
assertEquals(3, map.size());
LRSPCIntf map1 = (LRSPCIntf) map.get("key1");
LRSPCIntf map2 = (LRSPCIntf) map.get("key2");
LRSPCIntf map3 = (LRSPCIntf) map.get("key3");
assertEquals("map1", map1.getStringField());
assertEquals("map2", map2.getStringField());
assertEquals("map3", map3.getStringField());
assertTrue(map.containsKey("key1"));
assertFalse(map.containsKey("key4"));
assertTrue(map.containsValue(map1));
assertFalse(map.containsValue(pc));
// do some mods to try to confuse the proxy
LRSPCIntf map1a = pc.newInstance("map1a");
map.put("key1", map1a);
LRSPCIntf map1b = pc.newInstance("map1b");
map.put("key1", map1b);
map.remove("key2");
map.put("key4", pc.newInstance("map4"));
map.remove("key4");
map.remove("foo");
map.put("key5", pc.newInstance("map5"));
assertRelMapChanged(pc);
endTx(pm);
if (close) {
pm.close();
pm = getEm(false, false);
}
// re-retrieve and check map
pc = (LRSPCIntf) pm.getObjectId(oid);
assertRelMapChanged(pc);
pm.close();
}
private void assertRelMapChanged(LRSPCIntf pc) {
Map map = pc.getRelMap();
assertEquals(3, map.size());
LRSPCIntf map1b = (LRSPCIntf) map.get("key1");
LRSPCIntf map3 = (LRSPCIntf) map.get("key3");
LRSPCIntf map5 = (LRSPCIntf) map.get("key5");
assertEquals("map1b", map1b.getStringField());
assertEquals("map3", map3.getStringField());
assertEquals("map5", map5.getStringField());
assertTrue(map.containsKey("key1"));
assertFalse(map.containsKey("key2"));
assertTrue(map.containsValue(map1b));
assertFalse(map.containsValue(pc));
Iterator itr = map.entrySet().iterator();
Map.Entry entry;
int count = 0;
for (; itr.hasNext(); count++) {
entry = (Map.Entry) itr.next();
if (entry.getKey().equals("key1"))
assertEquals(map1b, entry.getValue());
else if (entry.getKey().equals("key3"))
assertEquals(map3, entry.getValue());
else if (entry.getKey().equals("key5"))
assertEquals(map5, entry.getValue());
else
fail("Bad key: " + entry.getKey());
}
assertEquals(3, count);
//FIXME
//KodoJDOHelper.close(itr);
}
public void testTransfer() {
// cannot transfer an lrs from one field to another
OpenJPAEntityManager pm = getEm(true, true);
LRSPC pc = (LRSPC) pm.getObjectId(_oid);
LRSPC map1 = (LRSPC) pc.getRelMap().get("key1");
assertNotNull(map1);
startTx(pm);
Map map = pc.getRelMap();
pc.setRelMap(null);
map1.setRelMap(map);
try {
endTx(pm);
fail("Allowed transfer of lrs field");
} catch (Exception jue) {
}
if (pm.getTransaction().isActive())
pm.getTransaction().rollback();
pm.close();
}
public void testShare() {
OpenJPAEntityManager pm = getEm(true, true);
LRSPC pc = (LRSPC) pm.getObjectId(_oid);
LRSPC map1 = (LRSPC) pc.getRelMap().get("key1");
assertNotNull(map1);
startTx(pm);
Map map = pc.getRelMap();
map1.setRelMap(map);
endTx(pm);
assertTrue(pc.getRelMap() != map1.getRelMap());
assertEquals(3, map1.getRelMap().size());
assertTrue(map1.getRelMap().containsValue(map1));
pm.close();
// make sure it sticks
pm = getEm(true, true);
pc = (LRSPC) pm.getObjectId(_oid);
map1 = (LRSPC) pc.getRelMap().get("key1");
assertEquals(map1, map1.getRelMap().get("key1"));
pm.close();
}
public void testRollback() {
//FIXME
//PersistenceManagerFactory factory = getPMFactory(new String[]{
// "openjpa.RestoreMutableValues", "true",
//});
OpenJPAEntityManagerFactory factory =null;
OpenJPAEntityManager pm = factory.createEntityManager();
LRSPC pc = (LRSPC) pm.getObjectId(_oid);
startTx(pm);
pc.getStringCollection().remove("val2");
pc.getStringCollection().add("val4");
rollbackTx(pm);
assertTrue(pc.getStringCollection().contains("val2"));
assertFalse(pc.getStringCollection().contains("val4"));
pm.close();
factory.close();
}
public void testReplace() {
OpenJPAEntityManager pm = getEm(false, false);
startTx(pm);
LRSPC pc = (LRSPC) pm.getObjectId(_oid);
// totally replace set
Collection set = new HashSet();
set.add("new");
pc.setStringCollection(set);
endTx(pm);
pm.close();
// re-retrieve and check set
pm = getEm(false, false);
pc = (LRSPC) pm.getObjectId(_oid);
set = pc.getStringCollection();
assertEquals(1, set.size());
assertTrue(set.contains("new"));
pm.close();
}
public void testAdd()
throws Exception {
/*
//FIXME
//KodoPersistenceManagerFactory pmf = getPMFactory(new String []{
// "openjpa.jdbc.JDBCListeners", Listener.class.getName(),
//});
OpenJPAEntityManagerFactory pmf =null;
JDBCConfiguration conf = (JDBCConfiguration) pmf.getConfiguration();
//FIXME need to fix inner class
//Listener l = (Listener) conf.getJDBCListenerInstances()[0];
OpenJPAEntityManager pm = pmf.createEntityManager();
try {
startTx(pm);
LRSPC pc = (LRSPC) pm.getObjectId(_oid);
l.count = 0;
pc.getStringCollection().add("testAddStringValue");
endTx(pm);
assertEquals(3, l.count);
} catch (Exception e) {
if (pm.getTransaction().isActive())
pm.getTransaction().rollback();
throw e;
} finally {
pm.close();
}
*/
}
private OpenJPAEntityManager getEm(boolean optimistic,boolean retainValues) {
OpenJPAEntityManager em = (OpenJPAEntityManager)currentEntityManager();
em.setNontransactionalRead(true);
em.setRetainState(retainValues);
em.setOptimistic(optimistic);
return em;
}
//FIXME - could not find AbstractJDBCListener because of package imports in source file
/*
public static class Listener extends AbstractJDBCListener {
public int count = 0;
public void afterExecuteStatement(JDBCEvent ev) {
count++;
}
}
*/
}