package hk.hku.cecid.ebms.spa.service; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.soap.SOAPElement; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; 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.handler.MessageClassifier; import hk.hku.cecid.piazza.commons.dao.DAOException; import hk.hku.cecid.piazza.commons.soap.SOAPRequest; import hk.hku.cecid.piazza.commons.soap.SOAPRequestException; import hk.hku.cecid.piazza.commons.soap.SOAPResponse; import hk.hku.cecid.piazza.commons.soap.WebServicesAdaptor; import hk.hku.cecid.piazza.commons.soap.WebServicesRequest; import hk.hku.cecid.piazza.commons.soap.WebServicesResponse; public class EbmsMessageHistoryService extends WebServicesAdaptor{ public static int MAX_NUMBER = 2147483647; public static String NAMESPACE = "http://service.ebms.edi.cecid.hku.hk/"; public void serviceRequested(WebServicesRequest request, WebServicesResponse response) throws SOAPRequestException, DAOException{ Element[] bodies = request.getBodies(); String msgId = getText(bodies, "messageId"); String msgBox = getText(bodies, "messageBox"); String convId = getText(bodies, "conversationId"); String cpaId = getText(bodies, "cpaId"); String service = getText(bodies, "service"); String action = getText(bodies, "action"); String status = getText(bodies, "status"); String limit = getText(bodies, "limit"); EbmsProcessor.core.log .info("Message History Query received request - "+ "MessageID : " + (msgId ==null?"NULL":msgId) + ", MessageBox: " + (msgBox ==null?"NULL":msgBox) + ", CovID: " + (convId ==null?"NULL":convId) + ", CpaID: " + (cpaId ==null?"NULL":cpaId) + ", Service: " + (service ==null?"NULL":service) + ", Action: " + (action ==null?"NULL":action) + ", Status: " + (status ==null?"NULL":status) +", Number of Messages: " + (limit ==null?"NULL":limit)); int resultLimit = -1; try{ resultLimit = Integer.parseInt(limit); if(resultLimit < 1 ){ resultLimit = MAX_NUMBER; } }catch (NumberFormatException e) { resultLimit = MAX_NUMBER; } try{ MessageDAO msgDAO = (MessageDAO)EbmsProcessor.core.dao.createDAO(MessageDAO.class); MessageDVO criteriaDVO = (MessageDVO)msgDAO.createDVO(); criteriaDVO.setMessageId(msgId); criteriaDVO.setMessageBox(checkMessageBox(msgBox)); criteriaDVO.setConvId(convId); criteriaDVO.setCpaId(cpaId); criteriaDVO.setService(service); criteriaDVO.setAction(action); criteriaDVO.setStatus(checkMessageStatus(status)); List results = msgDAO.findMessagesByHistory(criteriaDVO, resultLimit, 0); generateReply(response, results); }catch(DAOException daoExp){ throw new DAOException("Unable to query the repository", daoExp); } catch (SOAPRequestException e) { throw e; } } private String checkMessageStatus(String input)throws SOAPRequestException{ if(input !=null && !(input.equalsIgnoreCase(MessageClassifier.INTERNAL_STATUS_RECEIVED) || input.equalsIgnoreCase(MessageClassifier.INTERNAL_STATUS_PENDING) || input.equalsIgnoreCase(MessageClassifier.INTERNAL_STATUS_PROCESSING) || input.equalsIgnoreCase(MessageClassifier.INTERNAL_STATUS_PROCESSED) || input.equalsIgnoreCase(MessageClassifier.INTERNAL_STATUS_PROCESSED_ERROR) || input.equalsIgnoreCase(MessageClassifier.INTERNAL_STATUS_DELIVERED) || input.equalsIgnoreCase(MessageClassifier.INTERNAL_STATUS_DELIVERY_FAILURE))){ String errMsg = "No such message status, you have entered ["+input+"]"; throw new SOAPRequestException(errMsg); }else{ return (input==null?input:input.toUpperCase()); } } private String checkMessageBox(String input)throws SOAPRequestException{ if(input !=null && !(input.equalsIgnoreCase(MessageClassifier.MESSAGE_BOX_INBOX) || input.equalsIgnoreCase(MessageClassifier.MESSAGE_BOX_OUTBOX))){ String errMsg = "Wrong Message Box entered, you have entered: ["+ input+"]"; throw new SOAPRequestException(errMsg); }else{ return (input==null?input:input.toLowerCase()); } } /** * * @param response * @param messageList * @throws SOAPRequestException */ private void generateReply(WebServicesResponse response, List messageList) throws SOAPRequestException { try { SOAPElement rootElement = createElement("messageList", "", NAMESPACE, "MessageList"); Iterator messagesIterator = messageList.iterator(); for (int i = 0; messagesIterator.hasNext(); i++) { MessageDVO currentMessage = (MessageDVO) messagesIterator.next(); // Create Message Element and append Value of MessageID and MessageBox SOAPElement msgElement = createElement("messageElement", "", NAMESPACE, "MessageElement") ; SOAPElement childElement_MsgId = createText("messageId", currentMessage.getMessageId(), NAMESPACE); SOAPElement childElement_MsgBox = createText("messageBox", currentMessage.getMessageBox(), NAMESPACE); msgElement.addChildElement(childElement_MsgId); msgElement.addChildElement(childElement_MsgBox); rootElement.addChildElement(msgElement); } response.setBodies(new SOAPElement[] { rootElement }); } catch (Exception e) { throw new SOAPRequestException("Unable to generate reply message", e); } } }