/* * 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.AS2PlusProcessor; import hk.hku.cecid.edi.as2.dao.MessageDAO; import hk.hku.cecid.edi.as2.dao.MessageDVO; import hk.hku.cecid.edi.as2.dao.RepositoryDAO; import hk.hku.cecid.edi.as2.dao.RepositoryDVO; import hk.hku.cecid.edi.as2.pkg.AS2Message; import hk.hku.cecid.edi.as2.util.AS2Util; 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.ByteArrayInputStream; import java.io.ByteArrayOutputStream; 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"); } AS2PlusProcessor.getInstance().getLogger().info("Message Receiver received download request - Message ID: " + messageId); SOAPResponse soapResponse = (SOAPResponse) response.getTarget(); SOAPMessage soapResponseMessage = soapResponse.getMessage(); MessageDAO messageDao = (MessageDAO) AS2PlusProcessor.getInstance().getDAOFactory() .createDAO(MessageDAO.class); MessageDVO messageDvo = (MessageDVO) messageDao.createDVO(); messageDvo.setMessageId(messageId); messageDvo.setMessageBox(MessageDVO.MSGBOX_IN); messageDvo.setAs2From("%"); messageDvo.setAs2To("%"); messageDvo.setStatus(MessageDVO.STATUS_PROCESSED); List messagesList = messageDao.findMessagesByHistory(messageDvo, 1, 0); Iterator messagesIterator = messagesList.iterator(); while (messagesIterator.hasNext()) { MessageDVO targetMessageDvo = (MessageDVO) messagesIterator.next(); RepositoryDAO repoDao = (RepositoryDAO) AS2PlusProcessor.getInstance().getDAOFactory().createDAO(RepositoryDAO.class); RepositoryDVO repoDvo = (RepositoryDVO) repoDao.createDVO(); repoDvo.setMessageId(targetMessageDvo.getMessageId()); repoDvo.setMessageBox(targetMessageDvo.getMessageBox()); if(!repoDao.retrieve(repoDvo)){ throw new DAOException("Unable to collect payload content in databse."); } ByteArrayInputStream ins = new ByteArrayInputStream(repoDvo.getContent()); try { // MimeBodyPart contentPart = new MimeBodyPart(new InternetHeaders(ins), repoDvo.getContent()); AS2Message as2Msg = new AS2Message(ins); // Retrieve Filename from MIME Header String[] values = as2Msg.getBodyPart().getHeader("Content-Disposition"); String filename = AS2Util.getFileNameFromMIMEHeader(values); //Debug Message // AS2PlusProcessor.getInstance().getLogger().debug( // "AS2Plus Filename found? " + (filename ==null?"Not found":filename)); //Check if compression is needed DataSource ds = null; ByteArrayOutputStream baos = new ByteArrayOutputStream(); if (getParameters().getProperty("is_compress") .equals("true")) { DeflaterOutputStream dos = new DeflaterOutputStream( baos); IOHandler.pipe(as2Msg.getBodyPart().getInputStream(), dos); dos.finish(); ds = new ByteArrayDataSource(baos.toByteArray(), "application/deflate"); } else { IOHandler.pipe(as2Msg.getBodyPart().getInputStream(), baos); ds = new ByteArrayDataSource(baos.toByteArray(), as2Msg.getBodyPart().getContentType()); } DataHandler dh = new DataHandler(ds); //Create AttachmentPart and add to SOAP Message AttachmentPart attachmentPart = soapResponseMessage.createAttachmentPart(); attachmentPart.setContentId(as2Msg.getBodyPart().getContentID()); attachmentPart.setContentType(as2Msg.getBodyPart().getContentType()); try{ //Set Filename if filename value is valid and received if(filename != null && !filename.trim().equalsIgnoreCase("")){ //Validate Filename value char[] filenameChars = filename.toCharArray(); for(char charValue : filenameChars){ if(charValue >= 128){ throw new Exception( "Filename contains Non-ASCII characters in Message: "+as2Msg.getMessageID()); } } attachmentPart.addMimeHeader( "Content-Disposition", "attachment; filename="+filename); } }catch(Exception exp){ //If there is any abnormal value of MimeHeader // and caused Exception the filename will be replaced with default value. AS2PlusProcessor.getInstance().getLogger().error( "Default Filename Value applied on Message["+as2Msg.getMessageID()+"]", exp); attachmentPart.addMimeHeader( "Content-Disposition", "attachment; filename="+ "as2." +as2Msg.getMessageID()+".Payload.0"); } attachmentPart.setDataHandler(dh); soapResponseMessage.addAttachmentPart(attachmentPart); targetMessageDvo.setStatus(MessageDVO.STATUS_DELIVERED); messageDao.persist(targetMessageDvo); } catch (Exception e) { AS2PlusProcessor.getInstance().getLogger().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('*', '%'); } */ }