/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 *******************************************************************************/ package org.ebayopensource.turmeric.runtime.common.impl.attachment; import java.io.IOException; import java.io.OutputStream; import javax.mail.MessagingException; import javax.mail.internet.MimeBodyPart; import org.apache.axiom.om.OMException; import org.apache.axiom.om.impl.MIMEOutputUtils; public final class SOAMimeUtils extends MIMEOutputUtils { public static void complete(OutputStream outStream, String payload, OutboundMessageAttachments attachments) { try { OutputFormat format = attachments.getOutputFormat(); String boundary = format.getMimeBoundary(); String contentId = format.getRootContentId(); String charSetEncoding = format.getCharSetEncoding(); String payloadContentType = getPayloadContectType(format); String contentType = "application/xop+xml; charset=" + charSetEncoding + "; type=\"" + payloadContentType + "\""; startWritingMime(outStream, boundary); javax.activation.DataHandler dh = new javax.activation.DataHandler( payload, "text/xml; charset=" + charSetEncoding); MimeBodyPart rootMimeBodyPart = new MimeBodyPart(); rootMimeBodyPart.setDataHandler(dh); rootMimeBodyPart.addHeader("Content-Type", contentType); rootMimeBodyPart.addHeader("Content-Transfer-Encoding", "binary"); rootMimeBodyPart.addHeader("Content-ID", "<" + contentId + ">"); writeBodyPart(outStream, rootMimeBodyPart, boundary); for(String cid: attachments.getAllContentIds()) { dh = attachments.getDataHandler(cid); writeBodyPart(outStream, createMimeBodyPart(cid, dh), boundary); } finishWritingMime(outStream); outStream.flush(); } catch (IOException e) { throw new OMException("Error while writing to the OutputStream.", e); } catch (MessagingException e) { throw new OMException("Problem writing Mime Parts.", e); } } private static String getPayloadContectType(OutputFormat format) { String payloadContentType = format.getPayloadContentType(); if (payloadContentType.indexOf(";") != -1) { payloadContentType = payloadContentType.substring(0, payloadContentType.indexOf(";")); } return payloadContentType; } public static String getContentTypeForMime(String boundary, String contentId, String charSetEncoding, String soapContentType) { StringBuffer sb = new StringBuffer(); sb.append("multipart/related").append(";"); sb.append("boundary=").append(boundary).append(";"); sb.append("type=\"application/xop+xml\"").append(";"); sb.append("start=\"<" + contentId + ">\"").append(";"); int index = soapContentType.indexOf(";"); // Removes the encoding part as a workaround of the problem that servlet // rewrite content type with encoding into unbalanced quoted string. if (index > 0) { soapContentType = soapContentType.substring(0, index); } sb.append("start-info=\"" + soapContentType + "\""); return sb.toString(); } }