package ariba.ui.widgets;
import ariba.ui.aribaweb.core.AWComponent;
import ariba.ui.aribaweb.core.AWResponseGenerating;
import ariba.ui.aribaweb.core.AWResponse;
import ariba.ui.aribaweb.core.AWBindingNames;
import ariba.ui.aribaweb.core.AWRequestContext;
import ariba.ui.aribaweb.util.AWContentType;
import ariba.ui.aribaweb.util.AWGenericException;
import ariba.ui.aribaweb.util.AWMimeParsedMessage;
import javax.mail.internet.MimePart;
import javax.mail.internet.MimeMessage;
import javax.mail.MessagingException;
import javax.activation.DataHandler;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
public class MimeMessageView extends AWComponent
{
public String _resourceUrl;
public MimePart _part;
public DataHandler _partDataHandler;
public int _partType;
public AWMimeParsedMessage _parsedMessage;
public boolean _showingQuoted;
public boolean isStateless ()
{
return false;
}
public void renderResponse (AWRequestContext requestContext, AWComponent component)
{
AWMimeParsedMessage parsedMessage = (AWMimeParsedMessage)valueForBinding("parsedMessage");
if (parsedMessage == null) {
MimeMessage message = (MimeMessage)valueForBinding("mimeMessage");
if (message != null) {
parsedMessage = (_parsedMessage != null && _parsedMessage.getMessage() == message)
? _parsedMessage : new AWMimeParsedMessage(message);
}
}
if (_parsedMessage != parsedMessage) {
_parsedMessage = parsedMessage;
_showingQuoted = !booleanValueForBinding("collapseQuoted", false);
}
super.renderResponse(requestContext, component);
}
public List parts ()
{
if (_parsedMessage == null) return null;
return (_showingQuoted) ? _parsedMessage.getTopLevelParts() : _parsedMessage.getNonQuotedParts();
}
public String replacementUrl ()
{
return _resourceUrl.startsWith("cid:") ? null : _resourceUrl;
}
public void setPart (MimePart part)
{
_part = part;
try {
_partDataHandler = part.getDataHandler();
String type = _partDataHandler.getContentType().toUpperCase();
_partType = (type.startsWith("TEXT/PLAIN")) ? 0
: (type.startsWith("TEXT/HTML") ? 1 : 2);
} catch (MessagingException e) {
e.printStackTrace();
}
}
public byte[] partBytes ()
{
return dataHandlerBytes(_partDataHandler);
}
static byte[] dataHandlerBytes (DataHandler dh)
{
ByteArrayOutputStream os = new ByteArrayOutputStream();
try {
dh.writeTo(os);
} catch (IOException e) {
throw new AWGenericException(e);
}
return os.toByteArray();
}
public AWResponseGenerating downloadPart (MimePart part, boolean asFile)
{
AWResponse response = application().createResponse();
try {
DataHandler dh = part.getDataHandler();
AWContentType contentType = AWContentType.contentTypeNamed(dh.getContentType());
String filename = dh.getName();
if (filename != null && asFile) {
Util.setHeadersForDownload (requestContext(), response, filename);
}
response.setContentType(contentType);
response.setContent(dataHandlerBytes(dh));
} catch (MessagingException e) {
throw new AWGenericException(e);
}
return response;
}
public AWResponseGenerating downloadPart ()
{
return downloadPart(_part, true);
}
public AWResponseGenerating resourceResponse ()
{
String contentId = _resourceUrl.substring(4);
MimePart part = _parsedMessage.partForId(contentId);
return downloadPart(part, false);
}
}