/* * SAItemReturnActionImpl * * 05/01/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.factory.*; import com.ibm.retail.AEF.thread.*; import com.ibm.retail.AEF.data.*; import com.ibm.retail.AEF.session.*; import java.util.*; import java.rmi.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * SAItemReturnActionImpl is a class which the POSAutomationProvider uses to return * an item in a transaction on the POS application. * */ public class SAItemReturnActionImpl 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 AEFException */ public SAItemReturnActionImpl(ActionRequest request) throws AEFException { super(request); if (log.isTraceEnabled()) { tempAEFMessage.setMessage("+Enter SAItemReturnActionImpl.SAItemReturnActionImpl()."); log.trace(tempAEFMessage); } // validSubstates contains a list of all the substates for which // an item may be returned. This is a class static, so it is only // initialized once. if (validSubstates == null) { validSubstates = new Vector(); validSubstates.addElement(Substate.getSubstate("SELECT_PROCEDURE")); validSubstates.addElement(Substate.getSubstate("EXPECTING_ITEM")); validSubstates.addElement(Substate.getSubstate("TRANS_TOTALLED")); validSubstates.addElement(Substate.getSubstate("CHANGE_OR_BAL_DUE")); validSubstates.addElement(Substate.getSubstate("TRAINING_MODE")); } itemID = (ItemIdentifier)(request.getArguments().get("id")); if (log.isTraceEnabled()) { tempAEFMessage.setMessage("-Exit SAItemReturnActionImpl.SAItemReturnActionImpl()."); log.trace(tempAEFMessage); } } /** * Perform the action represented by the ActionRequest and return an ActionResult. * * * @param request The ActionRequest which contains the classname and arguments. * @return Object The Item instance. * @exception AEFException * Among the possible error codes are: * <br><a href="../commonerrorcodes.html">Common Errors</a> */ public Object performAction() throws AEFException { if (log.isTraceEnabled()) { tempAEFMessage.setMessage("+Enter SAItemReturnActionImpl.performAction()."); log.trace(tempAEFMessage); } Object retVal = null; // If app is in secured state, and options are set to automatically do a special // signon, then create the logon action to do the special signon first. checkForSpecialSignon(); int seqResult = -1; detector = ((DetectorAccess)(SessionContext.getSession())).getLineItemDetector(); //Check precondition that app is in one of the substates which is valid for item void. //If not, throw exception. String currentSubstate = getCurrentSubstate(); if (validSubstates.contains(currentSubstate)) { // Application is in correct substate to RETURN the item. seqResult = sendItemReturnSequence(); if (seqResult>=0) { retVal = waitForItem(); } } else { // Not in valid state for item void. String tempString = "SAItemReturnActionImpl.performAction(): POS application not in proper substate to perform item return.\n Application substate is " + currentSubstate + "."; AEFException tempException = new AEFException(AEFConst.APPLICATION_NOT_IN_PROPER_STATE, 0, tempString); tempAEFMessage.setMessage(tempString); log.error(tempAEFMessage, tempException); throw tempException; } if (log.isTraceEnabled()) { tempAEFMessage.setMessage("-Exit SAItemReturnActionImpl.performAction()."); log.trace(tempAEFMessage); } return retVal; } /** * Sends the key sequence which will cause the item to be returned. * * * @return int An integer value representing the result of the key sequence. * @exception AEFException */ public int sendItemReturnSequence() throws AEFException { if (log.isTraceEnabled()) { tempAEFMessage.setMessage("+Enter SAItemReturnActionImpl.sendItemReturnSequence()."); log.trace(tempAEFMessage); } String itemCodeType = itemID.getItemCodeType(); int retVal = -1; args.clear(); args.put("%0", itemID.getItemCode()); if (itemCodeType.equals(AEFConst.SCAN_LABEL) || itemCodeType.equals(AEFConst.KEYED_LABEL)) { args.put("SEQUENCE_ID", "itemReturnScanned"); } else { args.put("SEQUENCE_ID", "itemReturn"); } theKeySequenceAction = (AEFAction) (actionFactory.makeAction(new ActionRequest("SimpleKeySequenceAction", args))); Condition[] goodConditions = { new PropertyEqualsCondition(POSDeviceProperties.CATEGORY, POSDeviceProperties.POS_SUB_STATE, Substate.getSubstate("EXPECTING_ITEM")), // 0 = Success }; lock = new ConditionLock(); // Save any current item instance number so we are sure to only get an item // created after this key sequence is sent. instanceNumber = detector.getInstanceNumber(); if (perfTrace.isEnabled(AEFPerfTrace. COARSE)) { perfTrace.reportTimer(AEFPerfTrace. COARSE, sessionID, "returnItem", ">>>Sending item return key sequence to application."); } retVal = lock.performActionAndWait("wait-for-expecting-item-substate", theKeySequenceAction, goodConditions, BadConditionsImpl.getInstance().getBadConditions(), getTimeout()); if (retVal < 0) { AEFErrorHandler errorHandler = new AEFErrorHandler("Send Item Return Sequence Error"); retVal = errorHandler.handleError(lock, theKeySequenceAction, goodConditions, BadConditionsImpl.getInstance().getBadConditions(), getTimeout(), retVal); } if (perfTrace.isEnabled(AEFPerfTrace. COARSE)) { perfTrace.reportTimer(AEFPerfTrace. COARSE, sessionID, "returnItem", "<<<Item return key sequence processed by application."); } if (log.isTraceEnabled()) { tempAEFMessage.setMessage("-Exit SAItemReturnActionImpl.sendItemReturnSequence()."); log.trace(tempAEFMessage); } return retVal; } /** * Sends the key sequence which will cause the item to be sold. * * * @return ArrayList An array of LineItems created by the action. * @exception AEFException */ public ArrayList waitForItem() throws AEFException { if (log.isTraceEnabled()) { tempAEFMessage.setMessage("+Enter SAItemReturnActionImpl.waitForItem()."); log.trace(tempAEFMessage); } ArrayList retVal = null; // Successfully got item returned. Wait for the array of LineItems to be created. ObjectDetectorLock objLock = new ObjectDetectorLock(); retVal = (ArrayList)(objLock.waitForNewObject("wait-for-item-array",detector, instanceNumber, getTimeout())); if (log.isTraceEnabled()) { tempAEFMessage.setMessage("-Exit SAItemReturnActionImpl.waitForItem()."); log.trace(tempAEFMessage); } return retVal; } /* Instance Variables */ protected AEFAction theKeySequenceAction; protected ItemIdentifier itemID; protected String qty = null; protected String price = null; protected Weight weight; protected ConditionLock lock; protected ObjectDetector detector; protected int instanceNumber; protected String expectingItemSubstate; protected static Vector validSubstates; private static Log log = LogFactory.getLog(SAItemReturnActionImpl.class); }