/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. * See the copyright.txt in the distribution for a * full listing of individual contributors. * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * (C) 2005-2006, * @author JBoss Inc. */ /* * Created by IntelliJ IDEA. * User: peter craddock * Date: 11-Mar-02 * Time: 11:40:43 */ package org.jboss.jbossts.qa.ArjunaCore.AbstractRecord.impl; import com.arjuna.ats.arjuna.AtomicAction; import com.arjuna.ats.arjuna.coordinator.AddOutcome; import org.jboss.jbossts.qa.ArjunaCore.Utils.qautil; /** * This service class is the container that we will use to emulate * how abstract records are to be used by the transaction servcie. */ public class Service01 { /** * Constructor that will set up the number of abstract records that are going to ber used * in each transaction. */ public Service01(int i) { mNumberOfResources = i; } /** * simple method used to create the abstract records and enlist them into the current running * transaction. if no transaction is running the method will start a new one. */ public void setupOper() { setupOper(false); } /** * passing in true to this operation will force the records to be enlisted into a new transaction * nesting the new transaction within any other running transaction. */ public void setupOper(boolean nest) { //create abstract records mTransaction = (AtomicAction) AtomicAction.Current(); if (nest || mTransaction == null) { mTransaction = new AtomicAction(); mTransaction.begin(); } qautil.qadebug("createing abstract records and enlisting them"); mAbstractRecordList = new BasicAbstractRecord[mNumberOfResources]; //set up abstract records for (int i = 0; i < mNumberOfResources; i++) { mAbstractRecordList[i] = new BasicAbstractRecord(); if (mTransaction.add(mAbstractRecordList[i]) != AddOutcome.AR_ADDED) { qautil.debug("Error when adding: " + i + " to atomic action"); mCorrect = false; } } mNest = nest; } /** * main body of work will be performed here and any sub transactions that are currently * running will be commited on completion. */ public void doWork(int workcount) { for (int j = 0; j < mNumberOfResources; j++) { for (int i = 0; i < workcount; i++) { mAbstractRecordList[j].increase(); } } if (mTransaction != null && mNest) { mTransaction.commit(); } mMaxIteration = workcount; } /** * convenience method for checking counters after test has run */ public boolean checkAbortOper() { qautil.qadebug("running check abort"); for (int i = 0; i < mNumberOfResources; i++) { //first test to see if increases have been run if (mAbstractRecordList[i].getValue() != mMaxIteration) { qautil.debug("whilst checking the " + i + " resource the getvalue was: " + mAbstractRecordList[i].getValue() + " and we expected: " + mMaxIteration); return false; } if (mNest) { qautil.qadebug("nested check"); if (mAbstractRecordList[i].getTLA() != 1) { qautil.debug("value check wrong on resource " + i); return false; } if (mAbstractRecordList[i].getNC() != 1) { qautil.debug("nested commit value is wrong in resource " + i); return false; } } else { qautil.qadebug("normal check"); if (mAbstractRecordList[i].getTLA() != 1 && mAbstractRecordList[i].getTLC() != 1) { qautil.debug("value check wrong on resource " + i); return false; } if (mAbstractRecordList[i].getNC() != 0) { qautil.debug("nested commit value is wrong in resource " + i); return false; } } } return mCorrect; } /** * convenience method for checking counters after test has run */ public boolean checkCommitOper() { qautil.qadebug("running check commit"); for (int i = 0; i < mNumberOfResources; i++) { //first test to see if increases have been run if (mAbstractRecordList[i].getValue() != mMaxIteration) { qautil.debug("whilst checking the " + i + " resource the getvalue was: " + mAbstractRecordList[i].getValue() + " and we expected: " + mMaxIteration); return false; } if (mNumberOfResources > 1 && mAbstractRecordList[i].getStateCounter() != 1) { qautil.debug("save state has not been called on resource " + i); return false; } if (mNest) { qautil.qadebug("nested check"); if (mAbstractRecordList[i].getTLA() != 1 && mAbstractRecordList[i].getTLC() != 1) { qautil.debug("value check wrong on resource " + i); return false; } if (mAbstractRecordList[i].getNC() != 1) { qautil.debug("nested commit value is wrong in resource " + i + " " + mAbstractRecordList[i].getNC()); return false; } } else { qautil.qadebug("normal check"); if (mAbstractRecordList[i].getTLA() != 1 && mAbstractRecordList[i].getTLC() != 1) { qautil.debug("value check wrong on resource " + i); return false; } if (mAbstractRecordList[i].getNC() != 0) { qautil.debug("nested commit value is wrong in resource " + i); return false; } } } return mCorrect; } public void storeUIDs(String uniquePrefix) { for (int j = 0; j < mNumberOfResources; j++) { String key = uniquePrefix + "resource_" + j; try { qautil.storeUid(key, mAbstractRecordList[j].get_uid()); } catch (Exception e) { qautil.debug("Error when creating ior store", e); mCorrect = false; } } } public void restoreUIDs(String uniquePrefix) { mAbstractRecordList = new BasicAbstractRecord[mNumberOfResources]; for (int j = 0; j < mNumberOfResources; j++) { String key = uniquePrefix + "resource_" + j; try { mAbstractRecordList[j] = new BasicAbstractRecord(qautil.loadUid(key)); } catch (Exception e) { qautil.debug("Error when reading ior store", e); mCorrect = false; } } } public void clearUIDs(String uniquePrefix) { for (int j = 0; j < mNumberOfResources; j++) { String key = uniquePrefix + "resource_" + j; try { qautil.clearUid(key); } catch (Exception e) { qautil.debug("Error when reading ior store", e); mCorrect = false; } } } public boolean checkRestore() { for (int j = 0; j < mNumberOfResources; j++) { //we dont expect the value to be saved with abstract records if (mAbstractRecordList[j].getValue() != 0) { qautil.debug("the value has not been retored: " + mAbstractRecordList[j].getValue()); return false; } } return mCorrect; } private int mNumberOfResources = 0; private int mMaxIteration = 0; private boolean mCorrect = true; private boolean mNest = false; private BasicAbstractRecord[] mAbstractRecordList; private AtomicAction mTransaction = null; }