/* | |
* TestRetainValuesInOptimistic.java | |
* | |
* Created on October 16, 2006, 10:18 AM | |
* | |
* 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 java.util.HashMap; | |
import java.util.Locale; | |
import java.util.Map; | |
import org.apache.openjpa.persistence.kernel.common.apps.RuntimeTest1; | |
import org.apache.openjpa.persistence.OpenJPAEntityManager; | |
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory; | |
public class TestRetainValuesInOptimistic extends BaseKernelTest { | |
private Object _oid = null; | |
/** | |
* Creates a new instance of TestRetainValuesInOptimistic | |
*/ | |
public TestRetainValuesInOptimistic() { | |
} | |
public TestRetainValuesInOptimistic(String test) { | |
super(test); | |
} | |
public void setUp() | |
throws Exception { | |
super.setUp(); | |
deleteAll(RuntimeTest1.class); | |
OpenJPAEntityManager pm = getPM(); | |
startTx(pm); | |
RuntimeTest1 pc = new RuntimeTest1("str1", 1); | |
pm.persist(pc); | |
endTx(pm); | |
_oid = pm.getObjectId(pc); | |
endEm(pm); | |
} | |
public void testRetain() { | |
clearTest(true); | |
optLockTest(true); | |
} | |
public void testNotRetain() { | |
clearTest(false); | |
optLockTest(false); | |
} | |
private void clearTest(boolean retain) { | |
OpenJPAEntityManager pm = getPM(retain); | |
OpenJPAEntityManagerFactory pmf = pm.getEntityManagerFactory(); | |
RuntimeTest1 pc = (RuntimeTest1) pm.find(RuntimeTest1.class, _oid); | |
OpenJPAEntityManager pm2 = getPM(); | |
RuntimeTest1 pc2 = (RuntimeTest1) pm2.find(RuntimeTest1.class, _oid); | |
startTx(pm2); | |
pc2.setStringField("str2"); | |
pc2.setIntField1(2); | |
endTx(pm2); | |
endEm(pm2); | |
startTx(pm); | |
// tickle the object so that it enters the transaction | |
pc.setLocaleField(Locale.CHINA); | |
assertEquals((retain) ? "str1" : "str2", pc.getStringField()); | |
assertEquals((retain) ? 1 : 2, pc.getIntField1()); | |
try { | |
endTx(pm); | |
if (retain) | |
fail("Should have caused OL violation"); | |
} | |
catch (RuntimeException re) { | |
if (!retain) | |
throw re; | |
} | |
catch (Exception e) { | |
// | |
} | |
endEm(pm); | |
// make sure everything stuck | |
if (!retain) { | |
pm = getPM(); | |
pc = (RuntimeTest1) pm.find(RuntimeTest1.class, _oid); | |
assertEquals("str2", pc.getStringField()); | |
assertEquals(2, pc.getIntField1()); | |
endEm(pm); | |
try { | |
pmf.close(); | |
} catch (Exception e) { | |
// consumme exceptions ... other PMs might be open and | |
// active on this PMF. | |
} | |
} | |
} | |
private void optLockTest(boolean retain) { | |
OpenJPAEntityManager pm1 = getPM(retain); | |
OpenJPAEntityManagerFactory pmf = pm1.getEntityManagerFactory(); | |
startTx(pm1); | |
RuntimeTest1 pc1 = (RuntimeTest1) pm1.find(RuntimeTest1.class, _oid); | |
endTx(pm1); | |
OpenJPAEntityManager pm2 = getPM(retain); | |
startTx(pm2); | |
RuntimeTest1 pc2 = (RuntimeTest1) pm2.find(RuntimeTest1.class, _oid); | |
pc2.setStringField("str3"); | |
pc2.setIntField1(3); | |
endTx(pm2); | |
startTx(pm1); | |
pc1.setStringField("str4"); | |
pc1.setIntField1(4); | |
try { | |
endTx(pm1); | |
if (retain) | |
fail("Expected opt lock error."); | |
} catch (Exception jove) { | |
if (!retain) | |
fail("Caught opt lock error."); | |
} | |
pm1.close(); | |
endEm(pm2); | |
if (retain) { | |
try { | |
pmf.close(); | |
} catch (Exception e) { | |
// maybe other PMs are open... | |
} | |
} | |
} | |
private OpenJPAEntityManager getPM(boolean retain) { | |
OpenJPAEntityManager pm; | |
Map props = new HashMap(); | |
props.put("openjpa.AutoClear", "all"); | |
if (retain) | |
pm = getPM(true, true); | |
else { | |
OpenJPAEntityManagerFactory pmf = getEmf(props); | |
pm = (OpenJPAEntityManager) pmf.createEntityManager(); | |
pm.setOptimistic(true); | |
pm.setRetainState(true); | |
} | |
return pm; | |
} | |
} |