001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one
003: * or more contributor license agreements. See the NOTICE file
004: * distributed with this work for additional information
005: * regarding copyright ownership. The ASF licenses this file
006: * to you under the Apache License, Version 2.0 (the
007: * "License"); you may not use this file except in compliance
008: * with the License. You may obtain a copy of the License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing,
013: * software distributed under the License is distributed on an
014: * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015: * KIND, either express or implied. See the License for the
016: * specific language governing permissions and limitations
017: * under the License.
018: */
019:
020: package org.apache.synapse.transport.mail;
021:
022: import org.apache.synapse.transport.base.BaseUtils;
023: import org.apache.commons.logging.Log;
024: import org.apache.commons.logging.LogFactory;
025: import org.apache.axiom.soap.SOAP12Constants;
026: import org.apache.axiom.soap.SOAP11Constants;
027:
028: import javax.mail.Message;
029: import javax.mail.MessagingException;
030: import javax.mail.Multipart;
031: import javax.mail.internet.MimeMessage;
032: import javax.mail.internet.MimeBodyPart;
033: import java.io.InputStream;
034: import java.io.IOException;
035:
036: public class MailUtils extends BaseUtils {
037:
038: private static final Log log = LogFactory.getLog(MailUtils.class);
039:
040: private static BaseUtils _instance = new MailUtils();
041:
042: public static BaseUtils getInstace() {
043: return _instance;
044: }
045:
046: /**
047: * Get a String property from FileContent message
048: *
049: * @param message the File message
050: * @param property property name
051: * @return property value
052: */
053: public String getProperty(Object message, String property) {
054: try {
055: Object o = ((Message) message).getHeader(property);
056: if (o instanceof String) {
057: return (String) o;
058: } else if (o instanceof String[]
059: && ((String[]) o).length > 0) {
060: return ((String[]) o)[0];
061: }
062: } catch (MessagingException e) {
063: }
064: return null;
065: }
066:
067: public InputStream getInputStream(Object message) {
068: try {
069: if (message instanceof MimeMessage) {
070: MimeMessage msg = (MimeMessage) message;
071: if (msg.getContent() instanceof Multipart) {
072: MimeBodyPart firstTextPart = null;
073:
074: Multipart mp = (Multipart) msg.getContent();
075: for (int i = 0; i < mp.getCount(); i++) {
076: MimeBodyPart mbp = (MimeBodyPart) mp
077: .getBodyPart(i);
078: String contType = mbp.getContentType();
079:
080: if (contType != null
081: && (contType
082: .indexOf(SOAP11Constants.SOAP_11_CONTENT_TYPE) != -1 || contType
083: .indexOf(SOAP12Constants.SOAP_12_CONTENT_TYPE) != -1)) {
084: // this part is a SOAP 11 or 12 payload, treat this as the message
085: return mbp.getInputStream();
086: } else if (mbp != null
087: && (contType.indexOf("plain/text") != -1 || contType
088: .indexOf("text/plain") != -1)) {
089: firstTextPart = mbp;
090: }
091: }
092: // if a soap 11 or soap12 payload was not found, treat first text part as message
093: if (firstTextPart != null) {
094: return firstTextPart.getInputStream();
095: }
096:
097: } else {
098: return ((Message) message).getInputStream();
099: }
100: }
101: } catch (Exception e) {
102: handleException("Error creating an input stream to : "
103: + ((Message) message).getMessageNumber(), e);
104: }
105:
106: return null;
107: }
108:
109: public String getMessageTextPayload(Object message) {
110: try {
111: return new String(getBytesFromInputStream(
112: getInputStream(message), ((Message) message)
113: .getSize()));
114: } catch (Exception e) {
115: if (log.isDebugEnabled()) {
116: log.debug(
117: "Error reading message payload as text for : "
118: + ((Message) message)
119: .getMessageNumber(), e);
120: }
121: }
122: return null;
123: }
124:
125: public byte[] getMessageBinaryPayload(Object message) {
126: try {
127: return getBytesFromInputStream(getInputStream(message),
128: ((Message) message).getSize());
129: } catch (Exception e) {
130: handleException(
131: "Error reading message payload as a byte[] for : "
132: + ((Message) message).getMessageNumber(), e);
133: }
134: return new byte[0];
135: }
136:
137: public static byte[] getBytesFromInputStream(InputStream is,
138: int length) throws IOException {
139:
140: byte[] bytes = new byte[length];
141: int offset = 0;
142: int numRead = 0;
143:
144: try {
145: while (offset < bytes.length
146: && (numRead = is.read(bytes, offset, bytes.length
147: - offset)) >= 0) {
148: offset += numRead;
149: }
150:
151: // Ensure all the bytes have been read in
152: if (offset < bytes.length) {
153: handleException("Could not completely read the stream to conver to a byte[]");
154: }
155: } finally {
156: try {
157: is.close();
158: } catch (IOException ignore) {
159: }
160: }
161: return bytes;
162: }
163:
164: }
|