| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.apache.axis2.transport.mail; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.util.Arrays; |
| |
| import javax.mail.Flags; |
| import javax.mail.Folder; |
| import javax.mail.Message; |
| import javax.mail.MessagingException; |
| import javax.mail.Session; |
| import javax.mail.Store; |
| import javax.mail.internet.ContentType; |
| import javax.mail.internet.InternetAddress; |
| import javax.mail.internet.MimeMessage; |
| |
| import junit.framework.Assert; |
| |
| import org.apache.axis2.transport.testkit.client.ClientOptions; |
| import org.apache.axis2.transport.testkit.client.RequestResponseTestClient; |
| import org.apache.axis2.transport.testkit.message.IncomingMessage; |
| import org.apache.axis2.transport.testkit.tests.Setup; |
| import org.apache.axis2.transport.testkit.tests.TearDown; |
| import org.apache.axis2.transport.testkit.tests.Transient; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| public class MailRequestResponseClient extends MailClient implements RequestResponseTestClient<byte[],byte[]> { |
| private static final Log log = LogFactory.getLog(MailRequestResponseClient.class); |
| |
| private @Transient MailChannel channel; |
| private @Transient Store store; |
| |
| public MailRequestResponseClient(MessageLayout layout) { |
| super(layout); |
| } |
| |
| @Setup @SuppressWarnings("unused") |
| private void setUp(MailTestEnvironment env, MailChannel channel) throws MessagingException { |
| this.channel = channel; |
| Session session = channel.getReplySession(); |
| session.setDebug(log.isTraceEnabled()); |
| store = session.getStore(env.getProtocol()); |
| MailTestEnvironment.Account sender = channel.getSender(); |
| store.connect(sender.getLogin(), sender.getPassword()); |
| } |
| |
| @TearDown @SuppressWarnings("unused") |
| private void tearDown() throws MessagingException { |
| store.close(); |
| } |
| |
| public IncomingMessage<byte[]> sendMessage(ClientOptions options, ContentType contentType, byte[] message) throws Exception { |
| String msgId = sendMessage(contentType, message); |
| Message reply = waitForReply(msgId); |
| Assert.assertNotNull("No response received", reply); |
| Assert.assertEquals(channel.getSender().getAddress(), |
| ((InternetAddress)reply.getRecipients(Message.RecipientType.TO)[0]).getAddress()); |
| Assert.assertEquals(channel.getRecipient().getAddress(), |
| ((InternetAddress)reply.getFrom()[0]).getAddress()); |
| ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
| reply.getDataHandler().writeTo(baos); |
| return new IncomingMessage<byte[]>(new ContentType(reply.getContentType()), baos.toByteArray()); |
| } |
| |
| private Message waitForReply(String msgId) throws Exception { |
| Thread.yield(); |
| Thread.sleep(100); |
| |
| Message reply = null; |
| boolean replyNotFound = true; |
| int retryCount = 50; |
| while (replyNotFound) { |
| log.debug("Checking for response ... with MessageID : " + msgId); |
| reply = getMessage(msgId); |
| if (reply != null) { |
| replyNotFound = false; |
| } else { |
| if (retryCount-- > 0) { |
| Thread.sleep(100); |
| } else { |
| break; |
| } |
| } |
| } |
| return reply; |
| } |
| |
| private Message getMessage(String requestMsgId) throws Exception { |
| MimeMessage response = null; |
| Folder folder = store.getFolder(MailConstants.DEFAULT_FOLDER); |
| folder.open(Folder.READ_WRITE); |
| Message[] msgs = folder.getMessages(); |
| log.debug(msgs.length + " messages in mailbox"); |
| loop: for (Message m : msgs) { |
| MimeMessage mimeMessage = (MimeMessage)m; |
| String[] inReplyTo = mimeMessage.getHeader(MailConstants.MAIL_HEADER_IN_REPLY_TO); |
| log.debug("Found message " + mimeMessage.getMessageID() + " in reply to " + Arrays.toString(inReplyTo)); |
| if (inReplyTo != null && inReplyTo.length > 0) { |
| for (int j=0; j<inReplyTo.length; j++) { |
| if (requestMsgId.equals(inReplyTo[j])) { |
| log.debug("Identified message " + mimeMessage.getMessageID() + " as the response to " + requestMsgId + "; retrieving it from the store"); |
| // We need to create a copy so that we can delete the original and close the folder |
| response = new MimeMessage(mimeMessage); |
| log.debug("Flagging message " + mimeMessage.getMessageID() + " for deletion"); |
| mimeMessage.setFlag(Flags.Flag.DELETED, true); |
| break loop; |
| } |
| } |
| } |
| log.warn("Don't know what to do with message " + mimeMessage.getMessageID() + "; skipping"); |
| } |
| folder.close(true); |
| return response; |
| } |
| } |