blob: 99891b33d2891a78b9ddf5ccb07b21e5ee7d5c89 [file] [log] [blame]
/*
* TestStateManagerImplData.java
*
* Created on October 13, 2006, 5:40 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.kernel;
import org.apache.openjpa.persistence.kernel.common.apps.ModRuntimeTest1;
import org.apache.openjpa.kernel.OpenJPAStateManager;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
public class TestStateManagerImplData extends BaseKernelTest {
ClassMetaData _meta;
Boolean _f1;
Boolean _f3;
/**
* Creates a new instance of TestStateManagerImplData
*/
public TestStateManagerImplData() {
}
public TestStateManagerImplData(String test) {
super(test);
}
public void setUpMetaData(ClassMetaData meta) {
_meta = meta;
_f1 = _meta.getField(1).usesImplData();
_f3 = _meta.getField(3).usesImplData();
_meta.getField(1).setUsesImplData(Boolean.TRUE);
_meta.getField(3).setUsesImplData(null);
}
public void tearDownMetaData() {
_meta.getField(1).setUsesImplData(_f1);
_meta.getField(3).setUsesImplData(_f3);
}
public void testImplData() {
ModRuntimeTest1 pc = new ModRuntimeTest1();
OpenJPAEntityManager pm = getPM(false, false);
startTx(pm);
pm.persist(pc);
OpenJPAStateManager sm = getStateManager(pc, pm);
setUpMetaData(sm.getMetaData());
try {
// test instance level
Object inst = new Object();
assertNull(sm.getImplData());
assertNull(sm.setImplData(inst, true));
assertEquals(inst, sm.getImplData());
assertTrue(sm.isImplDataCacheable());
assertEquals(inst, sm.setImplData(null, false));
assertNull(sm.getImplData());
assertFalse(sm.isImplDataCacheable());
sm.setImplData(inst, false);
assertFalse(sm.isImplDataCacheable());
// test field level
Object f1 = new Object();
Object f3 = new Object();
assertNull(sm.getImplData(1));
assertFalse(sm.isImplDataCacheable(1));
assertNull(sm.setImplData(1, f1));
assertEquals(f1, sm.getImplData(1));
assertTrue(!sm.isImplDataCacheable(1));
assertEquals(f1, sm.setImplData(1, null));
assertNull(sm.getImplData(1));
assertFalse(sm.isImplDataCacheable(1));
sm.setImplData(1, f1);
assertNull(sm.setImplData(3, f3));
assertEquals(f3, sm.getImplData(3));
assertTrue(sm.isImplDataCacheable(3));
assertEquals(f1, sm.getImplData(1));
// this should clear field data
endTx(pm);
assertEquals(inst, sm.getImplData());
assertNull(sm.getImplData(1));
assertNull(sm.getImplData(3));
endEm(pm);
} finally {
tearDownMetaData();
}
}
public void testNotClearedIfRetainValues() {
deleteAll(ModRuntimeTest1.class);
notClearedIfRetainValuesTest(true);
notClearedIfRetainValuesTest(false);
}
private void notClearedIfRetainValuesTest(boolean optimistic) {
ModRuntimeTest1 pc = new ModRuntimeTest1("pc", 1);
int key = 1;
Object value = new Object();
// make instance persistent
OpenJPAEntityManager pm = getPM(optimistic, true);
startTx(pm);
pm.persist(pc);
Object oid = pm.getObjectId(pc);
OpenJPAStateManager sm = getStateManager(pc, pm);
assertNotNull(sm);
setUpMetaData(sm.getMetaData());
try {
// set impl data
sm.setImplData(key, value);
assertEquals(value, sm.getImplData(key));
endTx(pm);
// test in nontransactional setting
assertEquals(value, sm.getImplData(key));
// test in next transaction
startTx(pm);
pc = (ModRuntimeTest1) pm.find(ModRuntimeTest1.class, oid);
sm = getStateManager(pc, pm);
assertNotNull(sm);
if (pm.getOptimistic())
assertEquals(value, sm.getImplData(key));
else
assertNull(sm.getImplData(key));
endTx(pm);
endEm(pm);
} finally {
tearDownMetaData();
}
// test in another pm for good measure
pm = getPM(optimistic, true);
pc = (ModRuntimeTest1) pm.find(ModRuntimeTest1.class, oid);
sm = getStateManager(pc, pm);
assertNotNull(sm);
setUpMetaData(sm.getMetaData());
try {
sm.setImplData(key, value);
assertEquals(value, sm.getImplData(key));
// test in transaction; re-lookup pc to be sure it enters the trans
startTx(pm);
pc = (ModRuntimeTest1) pm.find(ModRuntimeTest1.class, oid);
if (pm.getOptimistic())
assertEquals(value, sm.getImplData(key));
else {
assertNull(sm.getImplData(key));
sm.setImplData(key, value);
}
endTx(pm);
// test outside of transaction
assertEquals(value, sm.getImplData(key));
endEm(pm);
} finally {
tearDownMetaData();
}
}
}