/*
* SARetrieveTransactionActionImpl
*
* 01/03/2003
*
* Copyright:
* Licensed Materials - Property of IBM
* "Restricted Materials of IBM"
* 5724-AEF
* (C) Copyright IBM Corp. 2003.
*
* %W% %E%
*/
package com.ibm.retail.AEF.action;
import com.ibm.retail.AEF.automation.*;
import com.ibm.retail.AEF.util.*;
import com.ibm.retail.si.util.*;
import com.ibm.retail.si.Copyright;
import com.ibm.retail.AEF.thread.*;
import com.ibm.retail.AEF.data.*;
import java.util.*;
import java.rmi.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* SARetrieveTransactionActionImpl is a class which the POSAutomationProvider
* uses to retrieve a transaction in the SA application.
*
*/
public class SARetrieveTransactionActionImpl extends SAActionImpl
{
static String copyright()
{ return com.ibm.retail.si.Copyright.IBM_COPYRIGHT_SHORT; }
private static AEFPerfTrace perfTrace = AEFPerfTrace.getInstance();
/**
* Constructor
*
* @param request The ActionRequest which contains a HashMap of arguments.
* @exception com.ibm.retail.AEF.util.AEFException
* AEFException error codes:
*
AEFConst.CONFIG_ERROR, AEFConst.FACTORY_ERROR
*
AEFConst.PROCEDURE_NOT_ALLOWED, AEFConst.NO_SUCH_SUSPENDED_TRANSACTION
*/
public SARetrieveTransactionActionImpl(ActionRequest request) throws AEFException
{
super(request);
if (log.isTraceEnabled())
{
tempAEFMessage.setMessage("+Enter SARetrieveTransactionActionImpl.SARetrieveTransactionActionImpl().");
log.trace(tempAEFMessage);
}
String temp = null;
terminal = (String)(request.getArguments().get("terminal"));
transaction = (String)(request.getArguments().get("transaction"));
if (terminal == null || terminal.length() == 0 || transaction == null || transaction.length() == 0)
{
String tempString = "SARetrieveTransactionActionImpl.constructor(): Transaction " + transaction + " for terminal " + terminal + " is not valid.";
AEFException tempException = new AEFException(AEFConst.PROCEDURE_NOT_ALLOWED, AEFConst.NO_SUCH_SUSPENDED_TRANSACTION, tempString);
tempAEFMessage.setMessage(tempString);
log.error(tempAEFMessage, tempException);
throw tempException;
}
// Initialize the state and sub-state variables.
initializeStates();
initializeSubStates();
if (log.isTraceEnabled())
{
tempAEFMessage.setMessage("-Exit SARetrieveTransactionActionImpl.SARetrieveTransactionActionImpl().");
log.trace(tempAEFMessage);
}
}
/**
* Perform the retrieve transaction action.
*
* @return Object That is Null.
* @exception AEFException
* AEFException error codes:
*
AEFConst.CONFIG_ERROR, AEFConst.FACTORY_ERROR
*
AEFConst.APPLICATION_NOT_IN_PROPER_STATE, AEFConst.NONE
*
AEFConst.PROCEDURE_NOT_ALLOWED, AEFConst.TRANSACTION_ALREADY_IN_PROGRESS
*/
public Object performAction() throws AEFException
{
if (log.isTraceEnabled())
{
tempAEFMessage.setMessage("+Enter SARetrieveTransactionActionImpl.performAction().");
log.trace(tempAEFMessage);
}
super.performAction();
String currentState = null;
String currentSubState = null;
String displayLine1 = null;
String displayLine2 = null;
String autoMgrOverride = null;
try
{
if (log.isDebugEnabled())
{
log.debug("SARetrieveTransactionActionImp.performAction Started.");
}
if (getBooleanProviderProperty(WorkstationStatusProperties.CATEGORY, WorkstationStatusProperties.SALES_TRANSACTION_IN_PROGRESS) == false)
{
currentState = getCurrentState();
if (currentState.equalsIgnoreCase(mainState))
{
sendRetriveSequence();
}
else
{
String tempString = "SARetrieveTransactionActionImpl.performAction(): POS application not in proper state to retrieve a transaction.\n Application is in state " + currentState + ".";
AEFException tempException = new AEFException(AEFConst.APPLICATION_NOT_IN_PROPER_STATE, 0, tempString);
tempAEFMessage.setMessage(tempString);
log.error(tempAEFMessage, tempException);
throw tempException;
}
}
else
{
String tempString = "SARetrieveTransactionActionImpl.performAction(): Cannot retrieve the transaction because another transaction is in progress.";
AEFException tempException = new AEFException(AEFConst.PROCEDURE_NOT_ALLOWED, AEFConst.TRANSACTION_ALREADY_IN_PROGRESS, tempString);
tempAEFMessage.setMessage(tempString);
log.error(tempAEFMessage, tempException);
throw tempException;
}
}
catch (RemoteException e)
{
// Should never get here!
tempAEFMessage.setMessage("There was a remote exception thrown in SARetrieveTransactionActionImpl.performAction().");
log.error(tempAEFMessage, e);
}
if (log.isTraceEnabled())
{
tempAEFMessage.setMessage("-Exit SARetrieveTransactionActionImpl.performAction().");
log.trace(tempAEFMessage);
}
return null;
}
/**
* Send the retrieve sequence to the terminal.
*
* @return int 0 means that we are in sub-state 1002.
* @exception AEFException
* AEFException error codes:
*
AEFConst.CONFIG_ERROR, AEFConst.FACTORY_ERROR
*/
public int sendRetriveSequence() throws AEFException
{
if (log.isTraceEnabled())
{
tempAEFMessage.setMessage("+Enter SARetrieveTransactionActionImpl.sendRetriveSequence().");
log.trace(tempAEFMessage);
}
int retVal = -1;
ConditionLock lock = null;
AEFAction keySequenceAction = null;
AEFErrorHandler errorHandler = null;
args.clear();
args.put("%0", terminal);
args.put("%1", transaction);
args.put("SEQUENCE_ID", "retrieveTransaction");
keySequenceAction = (AEFAction)(actionFactory.makeAction(new ActionRequest("SimpleKeySequenceAction", args)));
AbstractPropertyCondition[] goodConditions =
{
new PropertyEqualsCondition(POSDeviceProperties.CATEGORY,
POSDeviceProperties.POS_SUB_STATE,
changeBalanceSubState),
};
lock = new ConditionLock();
if (perfTrace.isEnabled(AEFPerfTrace. COARSE))
{
perfTrace.reportTimer(AEFPerfTrace. COARSE,
sessionID,
"retrieveTransaction",
">>>Sending retrieve key sequence to application.");
}
retVal = lock.performActionAndWait("wait-for-retrieve-transaction-complete",keySequenceAction, goodConditions, BadConditionsImpl.getInstance().getBadConditions(), getTimeout());
if (retVal < 0)
{
errorHandler = new AEFErrorHandler("Send Retrieve Sequence Error");
retVal = errorHandler.handleError(lock,
keySequenceAction,
goodConditions,
BadConditionsImpl.getInstance().getBadConditions(),
getTimeout(),
retVal);
if (retVal < 0)
{
tempAEFMessage.setMessage("Send Retrieve Sequence Error");
log.error(tempAEFMessage, errorHandler.getAllExceptions());
throw errorHandler.getAllExceptions();
}
}
if (perfTrace.isEnabled(AEFPerfTrace. COARSE))
{
perfTrace.reportTimer(AEFPerfTrace. COARSE,
sessionID,
"retrieveTransaction",
"<<