blob: e2ea9aa29fdb2a7ffeb8061bab62c5d92405cc9c [file] [log] [blame]
/*
* 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.jdo.tck.models.inheritance;
import java.util.Iterator;
import javax.jdo.Extent;
import javax.jdo.JDOUserException;
import javax.jdo.PersistenceManager;
import javax.jdo.Transaction;
import org.apache.jdo.tck.JDO_Test;
import org.apache.jdo.tck.pc.inheritance.AllPersist4;
import org.apache.jdo.tck.pc.inheritance.Constants;
import org.apache.jdo.tck.util.BatchTestRunner;
/**
*<B>Title:</B> Persistent Fields Are Persistent in SubClasses
*<BR>
*<B>Keywords:</B> inheritance
*<BR>
*<B>Assertion ID:</B> A6.5-4.
*<BR>
*<B>Assertion Description: </B>
Fields identified as persistent in persistence-capable classes
will be persistent in subclasses.
*/
public class PersistentFieldsArePersistentInSubClasses extends TestParts {
/** */
private static final String ASSERTION_FAILED =
"Assertion A6.5-4 (PersistentFieldsArePersistentInSubClasses) failed: ";
/**
* The <code>main</code> is called when the class
* is directly executed from the command line.
* @param args The arguments passed to the program.
*/
public static void main(String[] args) {
BatchTestRunner.run(PersistentFieldsArePersistentInSubClasses.class);
}
/**
* @see org.apache.jdo.tck.JDO_Test#localSetUp()
*/
@Override
protected void localSetUp() {
addTearDownClass(AllPersist4.class);
}
/** */
public void test() {
pm = getPM();
runTest(pm);
pm.close();
pm = null;
}
/** */
void runTest(PersistenceManager pm)
{
Transaction t = pm.currentTransaction();
try {
t.setRestoreValues(true);
t.begin();
AllPersist4 refa = new AllPersist4(Constants.intA_V[1], Constants.doubleB_V[1], Constants.intB_V[1], Constants.charC_V[1], Constants.booleanD_V[1], Constants.floatE_V[1], Constants.shortF_V[1], Constants.shortG_V[1], Constants.intH_V[1]);
pm.makePersistent(refa);
Object objPtrA = pm.getObjectId (refa);
refa.secondObj = new AllPersist4(Constants.intA_V[2], Constants.doubleB_V[2], Constants.intB_V[2], Constants.charC_V[2], Constants.booleanD_V[2], Constants.floatE_V[2], Constants.shortF_V[2], Constants.shortG_V[2], Constants.intH_V[2]);
TestParts.secondObj_V[1] = refa.secondObj;
refa.thirdObj = new AllPersist4(Constants.intA_V[3], Constants.doubleB_V[3], Constants.intB_V[3], Constants.charC_V[3], Constants.booleanD_V[3], Constants.floatE_V[3], Constants.shortF_V[3], Constants.shortG_V[3], Constants.intH_V[3]);
TestParts.thirdObj_V[1] = refa.thirdObj;
pm.makePersistent(refa.thirdObj);
Object objPtrB = pm.getObjectId (refa.thirdObj);
refa.fourthObj = new AllPersist4(Constants.intA_V[4], Constants.doubleB_V[4], Constants.intB_V[4], Constants.charC_V[4], Constants.booleanD_V[4], Constants.floatE_V[4], Constants.shortF_V[4], Constants.shortG_V[4], Constants.intH_V[4]);
TestParts.fourthObj_V[1] = refa.fourthObj;
t.commit();
t.begin();
AllPersist4 a = null;
AllPersist4 b = null;
try { // retrieve object created in previous transaction & store in value array for later comparison
TestParts.thirdObj_V[1] = (AllPersist4)pm.getObjectById(objPtrB, true);
}
catch (JDOUserException e) {
// could not locate persistent object created in previous transaction
fail(ASSERTION_FAILED,
"JDOUserException " + e + " could not reference thirdObj.");
}
try { // retrieve object created in previous transaction
a = (AllPersist4)pm.getObjectById(objPtrA, true);
checkPersistentAreCorrect(ASSERTION_FAILED, persistentAfterCommit, 1, a.doubleB, a.intB, a.shortF, a.thirdObj, a.intH);
// verify referenced persistent object contains correct values
b = a.thirdObj;
if(b != null) { // if previous error caused b to be null, then these tests cannot be performed.
checkPersistentAreCorrect(ASSERTION_FAILED, persistentAfterCommit, 3, b.doubleB, b.intB, b.shortF, b.thirdObj, b.intH);
}
}
catch (JDOUserException e) {
// could not locate persistent object created in previous transaction
fail(ASSERTION_FAILED,
"JDOUserException " + e + " could not reference previously created object.");
}
// set in new values
a.intA = Constants.intA_V[5];
a.charC = Constants.charC_V[5];
a.booleanD = Constants.booleanD_V[5];
a.shortG = Constants.shortG_V[5];
a.fourthObj = new AllPersist4(Constants.intA_V[6], Constants.doubleB_V[6], Constants.intB_V[6], Constants.charC_V[6], Constants.booleanD_V[6], Constants.floatE_V[6], Constants.shortF_V[6], Constants.shortG_V[6], Constants.intH_V[6]);
TestParts.fourthObj_V[5] = a.fourthObj;
a.floatE = Constants.floatE_V[5];
a.secondObj = null;
a.doubleB = Constants.doubleB_V[5];
a.intB = Constants.intB_V[5];
a.shortF = Constants.shortF_V[5];
a.thirdObj = null;
a.intH = Constants.intH_V[5];
b.intA = Constants.intA_V[7];
b.charC = Constants.charC_V[7];
b.booleanD = Constants.booleanD_V[7];
b.shortG = Constants.shortG_V[7];
b.fourthObj = null;
b.floatE = Constants.floatE_V[7];
b.secondObj = null;
b.doubleB = Constants.doubleB_V[7];
b.intB = Constants.intB_V[7];
b.shortF = Constants.shortF_V[7];
b.thirdObj = null;
b.intH = Constants.intH_V[7];
// create new objects and make persistent
AllPersist4 c = new AllPersist4(Constants.intA_V[8], Constants.doubleB_V[8], Constants.intB_V[8], Constants.charC_V[8], Constants.booleanD_V[8], Constants.floatE_V[8], Constants.shortF_V[8], Constants.shortG_V[8], Constants.intH_V[8]);
AllPersist4 d = new AllPersist4(Constants.intA_V[9], Constants.doubleB_V[9], Constants.intB_V[9], Constants.charC_V[9], Constants.booleanD_V[9], Constants.floatE_V[9], Constants.shortF_V[9], Constants.shortG_V[9], Constants.intH_V[9]);
c.thirdObj = d;
c.fourthObj = d;
TestParts.thirdObj_V[8] = d;
TestParts.fourthObj_V[8] = d;
pm.makePersistent(c);
// change values of newly persistent object
c.intA = Constants.intA_V[10];
c.charC = Constants.charC_V[10];
c.booleanD = Constants.booleanD_V[10];
c.shortG = Constants.shortG_V[10];
c.fourthObj = null;
c.floatE = Constants.floatE_V[10];
c.secondObj = null;
c.doubleB = Constants.doubleB_V[10];
c.intB = Constants.intB_V[10];
c.shortF = Constants.shortF_V[10];
c.thirdObj = null;
c.intH = Constants.intH_V[10];
t.rollback();
// verify objects revert back to transient after rollback
checkPersistentAreCorrect(ASSERTION_FAILED, transientAfterRollback, 8, c.doubleB, c.intB, c.shortF, c.thirdObj, c.intH);
t.begin();
// verify rollback lost all persistent changes.
try { // retrieve object created in previous transaction & store in value array for later comparison
TestParts.thirdObj_V[1] = (AllPersist4)pm.getObjectById(objPtrB, true);
}
catch (JDOUserException e) {
// could not locate persistent object created in previous transaction
fail(ASSERTION_FAILED,
"JDOUserException " + e + " could not reference thirdObj.");
}
try { // retrieve object created in previous transaction
a = (AllPersist4)pm.getObjectById(objPtrA, true);
checkPersistentAreCorrect(ASSERTION_FAILED, persistentAfterRollback, 1, a.doubleB, a.intB, a.shortF, a.thirdObj, a.intH);
b = a.thirdObj;
if(b != null) { // if previous error caused b to be null, then these tests cannot be performed.
checkPersistentAreCorrect(ASSERTION_FAILED, persistentAfterRollback, 3, b.doubleB, b.intB, b.shortF, b.thirdObj, b.intH);
}
}
catch (JDOUserException e) {
// could not locate persistent object created in previous transaction
fail(ASSERTION_FAILED,
"JDOUserException " + e + " could not reference previously created object.");
}
t.rollback();
t = null;
}
finally {
if ((t != null) && t.isActive())
t.rollback();
}
}
void removeAllInstances(PersistenceManager pm)
{
AllPersist4 a = new AllPersist4(0, 0.0, 0, '0', false, 0.0f, (short)0, (short)0, 0);
pm.makePersistent(a); // guarantee the class is registered; this will be removed
Extent e = pm.getExtent(AllPersist4.class, true);
Iterator i = e.iterator();
while( i.hasNext() ){
pm.deletePersistent(i.next());
}
}
}