/*******************************************************************************
* 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.binding.jaxb;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.activation.DataHandler;
import javax.mail.internet.InternetHeaders;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimePartDataSource;
import javax.xml.bind.attachment.AttachmentMarshaller;
import org.apache.axiom.om.util.UUIDGenerator;
import org.apache.axis2.transport.http.HTTPConstants;
import org.ebayopensource.turmeric.runtime.common.impl.utils.LogManager;
import org.ebayopensource.turmeric.runtime.common.pipeline.OutboundMessage;
/**
* @author wdeng
*
*/
public class MIMEAttachmentMarshaller extends AttachmentMarshaller {
private static final Logger s_logger = LogManager
.getInstance(MIMEAttachmentMarshaller.class);
private final static String APPLICATION_OCTET = "application/octet-stream";
private OutboundMessage m_message;
public MIMEAttachmentMarshaller(OutboundMessage message) {
this.m_message = message;
}
@Override
public String addMtomAttachment(byte[] data, int offset, int length,
String mimeType, String namespace, String localPart) {
if (s_logger.isLoggable(Level.INFO)) {
s_logger.log(Level.INFO, "Add byte[] attachment for " + "{"
+ namespace + "}" + localPart);
}
if (mimeType == null || mimeType.isEmpty()) {
mimeType = APPLICATION_OCTET;
}
String contentId = null;
try {
InternetHeaders ih = new InternetHeaders();
ih.setHeader(HTTPConstants.HEADER_CONTENT_TYPE, mimeType);
MimeBodyPart mbp = new MimeBodyPart(ih, data);
DataHandler dataHandler = new DataHandler(new MimePartDataSource(mbp));
contentId = addDataHandler(dataHandler);
mbp.setHeader(HTTPConstants.HEADER_CONTENT_ID, contentId);
}
catch (Throwable t) {
throw new RuntimeException("Unable to byte array attachment");
}
return appendCid(contentId);
}
@Override
public String addMtomAttachment(DataHandler data, String namespace,
String localPart) {
String contentId = addDataHandler(data);
if (s_logger.isLoggable(Level.INFO)) {
s_logger.log(Level.INFO,
"Add MTOM/XOP DataHandler attachment for: " + "{"
+ namespace + "}" + localPart);
}
return appendCid(contentId);
}
@Override
public String addSwaRefAttachment(DataHandler data) {
if (s_logger.isLoggable(Level.INFO)) {
s_logger.log(Level.INFO, "Add SWA attachment");
}
String contentId = addDataHandler(data);
return appendCid(contentId);
}
private String addDataHandler(DataHandler dh) {
String contentId = UUIDGenerator.getUUID();
if (s_logger.isLoggable(Level.INFO)) {
s_logger.log(Level.INFO, "content id = " + contentId);
s_logger.log(Level.INFO, "DataHandler = " + dh);
}
// Remember the attachment on the message.
m_message.addDataHandler(dh, contentId);
return appendCid(contentId);
}
private String appendCid(String contentId) {
return "cid:" + contentId;
}
// TODO: add the support for SWA.
@Override
public boolean isXOPPackage() {
return true;
}
}