/* * 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.edi.as2.service; import hk.hku.cecid.edi.as2.AS2Processor; import hk.hku.cecid.edi.as2.dao.MessageDAO; import hk.hku.cecid.edi.as2.dao.MessageDVO; import hk.hku.cecid.edi.as2.module.PayloadCache; import hk.hku.cecid.edi.as2.module.PayloadRepository; import hk.hku.cecid.piazza.commons.activation.ByteArrayDataSource; import hk.hku.cecid.piazza.commons.dao.DAOException; import hk.hku.cecid.piazza.commons.io.IOHandler; import hk.hku.cecid.piazza.commons.soap.SOAPFaultException; 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; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.util.Iterator; import java.util.List; import java.util.zip.DeflaterOutputStream; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.xml.soap.AttachmentPart; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPMessage; import org.w3c.dom.Element; /** * AS2MessageReceiverListService * * @author Donahue Sze * */ public class AS2MessageReceiverService extends WebServicesAdaptor { public void serviceRequested(WebServicesRequest request, WebServicesResponse response) throws SOAPRequestException, DAOException { Element[] bodies = request.getBodies(); String messageId = getText(bodies, "messageId"); if (messageId == null) { throw new SOAPFaultException(SOAPFaultException.SOAP_FAULT_CLIENT, "Missing request information"); } AS2Processor.core.log.info("Message Receiver received download request - Message ID: " + messageId); SOAPResponse soapResponse = (SOAPResponse) response.getTarget(); SOAPMessage soapResponseMessage = soapResponse.getMessage(); MessageDAO messageDao = (MessageDAO) AS2Processor.core.dao .createDAO(MessageDAO.class); MessageDVO messageDvo = (MessageDVO) messageDao.createDVO(); messageDvo.setMessageId(messageId); messageDvo.setMessageBox(MessageDVO.MSGBOX_IN); messageDvo.setAs2From("%"); messageDvo.setAs2To("%"); messageDvo.setPrincipalId("%"); messageDvo.setStatus(MessageDVO.STATUS_PROCESSED); List messagesList = messageDao.findMessagesByHistory(messageDvo, 1, 0); Iterator messagesIterator = messagesList.iterator(); while (messagesIterator.hasNext()) { MessageDVO targetMessageDvo = (MessageDVO) messagesIterator.next(); PayloadRepository repository = AS2Processor .getIncomingPayloadRepository(); Iterator payloadCachesIterator = repository.getPayloadCaches() .iterator(); while (payloadCachesIterator.hasNext()) { PayloadCache cache = (PayloadCache) payloadCachesIterator .next(); String cacheMessageID = cache.getMessageID(); if (cacheMessageID.equals(targetMessageDvo.getMessageId())) { try { FileInputStream fis = new FileInputStream(cache .getCache()); DataSource ds = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); if (getParameters().getProperty("is_compress") .equals("true")) { DeflaterOutputStream dos = new DeflaterOutputStream( baos); IOHandler.pipe(fis, dos); dos.finish(); ds = new ByteArrayDataSource(baos.toByteArray(), "application/deflate"); } else { IOHandler.pipe(fis, baos); ds = new ByteArrayDataSource(baos.toByteArray(), cache.getContentType()); } DataHandler dh = new DataHandler(ds); AttachmentPart attachmentPart = soapResponseMessage .createAttachmentPart(); attachmentPart.setContentId(messageId); attachmentPart.setDataHandler(dh); soapResponseMessage.addAttachmentPart(attachmentPart); MessageDAO dao = (MessageDAO) AS2Processor.core.dao .createDAO(MessageDAO.class); targetMessageDvo.setStatus(MessageDVO.STATUS_DELIVERED); dao.persist(targetMessageDvo); } catch (Exception e) { AS2Processor.core.log.error( "Error in collecting message", e); } } } } generateReply(response, soapResponseMessage .countAttachments()>0); } private void generateReply(WebServicesResponse response, boolean isReturned) throws SOAPRequestException { try { SOAPElement responseElement = createText( "hasMessage", Boolean.toString(isReturned), "http://service.as2.edi.cecid.hku.hk/"); response.setBodies(new SOAPElement[] { responseElement }); } catch (Exception e) { throw new SOAPRequestException("Unable to generate reply message", e); } } protected boolean isCacheEnabled() { return false; } /** * @param parameter * @return */ /* private String checkStarAndConvertToPercent(String parameter) { if (parameter.equals("")) { return new String("%"); } return parameter.replace('*', '%'); } */ }