/** * */ package hk.hku.cecid.edi.sfrm.handler; import java.util.List; import hk.hku.cecid.edi.sfrm.dao.SFRMMessageDVO; import hk.hku.cecid.edi.sfrm.dao.SFRMMessageSegmentDAO; import hk.hku.cecid.edi.sfrm.dao.SFRMMessageSegmentDVO; import hk.hku.cecid.edi.sfrm.handler.SFRMMessageHandler; import hk.hku.cecid.edi.sfrm.pkg.SFRMConstant; import hk.hku.cecid.edi.sfrm.spa.SFRMComponent; import hk.hku.cecid.edi.sfrm.spa.SFRMException; import hk.hku.cecid.piazza.commons.dao.DAOException; /** * * @author Patrick Yip */ public class SFRMExternalRequestHandler extends SFRMComponent { private static SFRMExternalRequestHandler handler = new SFRMExternalRequestHandler(); public SFRMExternalRequestHandler getInstance(){ return handler; } protected void init() throws Exception{ super.init(); } public synchronized void suspendMessage(String messageId) throws DAOException, SFRMException, InterruptedException{ //TODO: To wait for the message lock to release before to suspend the message SFRMMessageHandler mHandler = this.getMessageHandler(); SFRMMessageSegmentHandler msHandler = this.getMessageSegmentHandler(); //Retrieve the message from outbox only, it mean that suspend operation can only be done on sender side SFRMMessageDVO mDVO = mHandler.retrieveMessage(messageId, SFRMConstant.MSGBOX_OUT) ; if(mDVO == null){ throw new DAOException("Message with ID '" + messageId + "' didn't exist"); } //Check if the message status is processing, if it is not, there is no need to make a suspend request // if(!mDVO.getStatus().equals(SFRMConstant.MSGS_PROCESSING) || !mDVO.getStatus().equals(SFRMConstant.MSGS_SEGMENTING)){ if(!mDVO.getStatus().equals(SFRMConstant.MSGS_PROCESSING)){ String logMsg = "Message Id '" + messageId + "' status is not segmenting or processing, no necessary to suspend"; this.getLogger().info(logMsg); throw new SFRMException(logMsg); } if(mDVO.getStatus().equals(SFRMConstant.MSGS_PROCESSING)){ mDVO.setStatus(SFRMConstant.MSGS_PRE_SUSPENDED); mDVO.setStatusDescription(SFRMConstant.getStatusDescription(SFRMConstant.MSGS_PRE_SUSPENDED)); if(mHandler.updateMessage(mDVO) == false){ throw new DAOException("DB Error"); } //Mark the existing message segment to SD status if it status is in PD or DF List segDVOs = msHandler.retrieveMessages(messageId, SFRMConstant.MSGBOX_OUT, SFRMConstant.MSGT_PAYLOAD, new String[]{SFRMConstant.MSGS_PENDING, SFRMConstant.MSGS_DELIVERY_FAILURE}); SFRMMessageSegmentDAO msDAO = (SFRMMessageSegmentDAO) msHandler.getDAOInstance(); for(int i=0 ; segDVOs.size() > i ;i++){ SFRMMessageSegmentDVO msDVO = (SFRMMessageSegmentDVO) segDVOs.get(i); msDVO.setStatus(SFRMConstant.MSGS_SUSPENDED); if(msDAO.persist(msDVO) == false){ throw new DAOException("DB Error"); } } }else if(mDVO.getStatus().equals(SFRMConstant.MSGS_SEGMENTING)){ mDVO.setStatus(SFRMConstant.MSGS_PRE_DELIVERY_FAILED); mDVO.setStatusDescription(SFRMConstant.getStatusDescription(SFRMConstant.MSGS_PRE_DELIVERY_FAILED)); if(mHandler.updateMessage(mDVO) == false){ throw new DAOException("DB Error"); } //Mark the existing message segment to DF status if it status is in PD or DF // List segDVOs = msHandler.retrieveMessages(messageId, SFRMConstant.MSGBOX_OUT, SFRMConstant.MSGT_PAYLOAD, new String[]{SFRMConstant.MSGS_PENDING, SFRMConstant.MSGS_DELIVERY_FAILURE}); SFRMMessageSegmentDAO msDAO = (SFRMMessageSegmentDAO) msHandler.getDAOInstance(); List segDVOs = msHandler.retrieveMessages(messageId, SFRMConstant.MSGBOX_OUT, SFRMConstant.MSGT_PAYLOAD, new String[]{SFRMConstant.MSGS_PENDING, SFRMConstant.MSGS_DELIVERY_FAILURE, SFRMConstant.MSGS_PRE_PROCESSED, SFRMConstant.MSGS_DELIVERED, SFRMConstant.MSGS_PROCESSING}); // SFRMMessageSegmentDVO queryMSDVO = (SFRMMessageSegmentDVO) msDAO.createDVO(); // queryMSDVO.setMessageBox(SFRMConstant.MSGT_PAYLOAD); // queryMSDVO.setMessageId(messageId); for(int i=0 ; segDVOs.size() > i ;i++){ SFRMMessageSegmentDVO msDVO = (SFRMMessageSegmentDVO) segDVOs.get(i); msDVO.setStatus(SFRMConstant.MSGS_DELIVERY_FAILURE); if(msDAO.persist(msDVO) == false){ throw new DAOException("DB Error"); } } } } public synchronized void resumeMessage(String messageId) throws DAOException, SFRMException{ SFRMMessageHandler mHandler = this.getMessageHandler(); SFRMMessageDVO mDVO = mHandler.retrieveMessage(messageId, SFRMConstant.MSGBOX_OUT); if(mDVO == null){ throw new DAOException("Message with ID '" + messageId + "' didn't exist"); } //Check if the message status is suspended, if it is not, no need to resume message if(!mDVO.getStatus().equals(SFRMConstant.MSGS_SUSPENDED)){ String logMsg = "Message Id '" + messageId + "' status is not suspended, no necessary to resume"; this.getLogger().info(logMsg); throw new SFRMException(logMsg); } //Update the message status mDVO.setStatus(SFRMConstant.MSGS_PRE_RESUME); mDVO.setStatusDescription(SFRMConstant.getStatusDescription(SFRMConstant.MSGS_PRE_RESUME)); //Update the message segment status SFRMMessageSegmentHandler msHandler = this.getMessageSegmentHandler(); List segDVOs = msHandler.retrieveMessages(messageId, SFRMConstant.MSGBOX_OUT, SFRMConstant.MSGT_PAYLOAD, new String[]{SFRMConstant.MSGS_SUSPENDED}); SFRMMessageSegmentDAO msDAO = (SFRMMessageSegmentDAO) msHandler.getDAOInstance(); for(int i=0; segDVOs.size() > i;i++){ SFRMMessageSegmentDVO msDVO = (SFRMMessageSegmentDVO) segDVOs.get(i); msDVO.setStatus(SFRMConstant.MSGS_PENDING); if(msDAO.persist(msDVO) == false){ throw new DAOException("DB Error"); } } if(mHandler.updateMessage(mDVO) == false){ throw new DAOException("DB Error"); } } }