/*
* Copyright(c) 2005 Center for E-Commerce Infrastructure Development, The
* University of Hong Kong (HKU). All Rights Reserved.
*
* This software is licensed under the GNU GENERAL PUBLIC LICENSE Version 2.0 [1]
*
* [1] http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
*/
package hk.hku.cecid.ebms.spa.util;
import hk.hku.cecid.ebms.spa.EbmsProcessor;
import hk.hku.cecid.ebms.spa.dao.MessageDAO;
import hk.hku.cecid.ebms.spa.dao.MessageDVO;
import hk.hku.cecid.ebms.spa.dao.OutboxDAO;
import hk.hku.cecid.ebms.spa.dao.OutboxDVO;
import hk.hku.cecid.ebms.spa.handler.MessageClassifier;
import hk.hku.cecid.piazza.commons.dao.DAOException;
import hk.hku.cecid.piazza.commons.dao.DAOFactory;
import hk.hku.cecid.piazza.commons.dao.ds.DataSourceDAO;
import hk.hku.cecid.piazza.commons.dao.ds.DataSourceProcess;
import hk.hku.cecid.piazza.commons.dao.ds.DataSourceTransaction;
/**
* Reverse message status for message redownload and resend
*
* @author franz
*
*/
public class EbmsMessageStatusReverser {
private DAOFactory daoFactory = EbmsProcessor.core.dao;
/**
* Reverse <b>OUTBOX</b> message status back to <b>PENDING</b>. Hence, the
* message can be resent again.
*
* @param messageId
* - Message Id of the message to be resent
* @return MessageDVO of the message to be resent
* @throws Exception
*/
public MessageDVO updateToSend(final String messageId) throws Exception {
final MessageDAO messageDao = (MessageDAO) daoFactory
.createDAO(MessageDAO.class);
// Prepare Search Criteria
final MessageDVO criteriaDVO = (MessageDVO) messageDao.createDVO();
criteriaDVO.setMessageId(messageId);
criteriaDVO.setMessageBox(MessageClassifier.MESSAGE_BOX_OUTBOX);
criteriaDVO.setMessageType(MessageClassifier.MESSAGE_TYPE_ORDER);
// Retrieve DAO
boolean isFound = messageDao.retrieve(criteriaDVO);
if (!isFound) {
throw new Exception("Message [" + messageId
+ "] is not found in database");
}
String status = criteriaDVO.getStatus();
if (!MessageClassifier.INTERNAL_STATUS_DELIVERY_FAILURE
.equalsIgnoreCase(status)) {
throw new Exception("Message [" + messageId
+ "] is not available for re-send");
}
DataSourceProcess process = new DataSourceProcess(
(DataSourceDAO) messageDao) {
protected void doTransaction(DataSourceTransaction tx)
throws DAOException {
messageDao.setTransaction(tx);
criteriaDVO.setStatus(MessageClassifier.INTERNAL_STATUS_PENDING);
criteriaDVO.setStatusDescription(null);
messageDao.persist(criteriaDVO);
// Delete acknowledgement
MessageDVO response = (MessageDVO) messageDao.createDVO();
response.setRefToMessageId(messageId);
response.setMessageBox(MessageClassifier.MESSAGE_BOX_INBOX);
response
.setMessageType(MessageClassifier.MESSAGE_TYPE_ACKNOWLEDGEMENT);
if (messageDao.findRefToMessage(response)) {
messageDao.remove(response);
}
// Delete error
response.setRefToMessageId(messageId);
response.setMessageBox(MessageClassifier.MESSAGE_BOX_INBOX);
response.setMessageType(MessageClassifier.MESSAGE_TYPE_ERROR);
if (messageDao.findRefToMessage(response)) {
messageDao.remove(response);
}
// Add outbox record
OutboxDAO outboxDAO = (OutboxDAO) daoFactory
.createDAO(OutboxDAO.class);
outboxDAO.setTransaction(tx);
OutboxDVO outboxDVO = (OutboxDVO) outboxDAO.createDVO();
outboxDVO.setMessageId(messageId);
outboxDVO.setRetried(0);
outboxDAO.addOutbox(outboxDVO);
}
};
process.start();
EbmsProcessor.core.log.info("Message [" + messageId
+ "] is prepared for resend");
return criteriaDVO;
}
public void updateToDownload(String messageId) throws Exception {
if(messageId == null ||
messageId.trim().equalsIgnoreCase("")){
throw new Exception(
"MessageId is empty, No message can be query.");
}
MessageDAO dao = (MessageDAO) daoFactory.createDAO(MessageDAO.class);
// Prepare Search Criteria
MessageDVO criteriaDVO = (MessageDVO) dao.createDVO();
criteriaDVO.setMessageId(messageId);
criteriaDVO.setMessageBox(MessageClassifier.MESSAGE_BOX_INBOX);
// Retrieve DAO
boolean isFound = dao.retrieve(criteriaDVO);
if (!isFound) {
throw new Exception("Message [" + messageId
+ "] is not found in database");
}
String status = criteriaDVO.getStatus();
if (!MessageClassifier.INTERNAL_STATUS_DELIVERED
.equalsIgnoreCase(status)) {
throw new Exception("Message [" + messageId
+ "] is not available for re-download");
}
criteriaDVO.setStatus(MessageClassifier.INTERNAL_STATUS_PROCESSED);
dao.persist(criteriaDVO);
EbmsProcessor.core.log.info("Message [" + messageId
+ "] is prepared for redownload");
}
}