// Copyright � 2006-2007 ASERT. Released under the Canoo Webtest license.
package com.canoo.webtest.plugins.emailtest;
import java.io.IOException;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.canoo.webtest.engine.StepFailedException;
import com.canoo.webtest.util.ConversionUtil;
/**
* Stores the value of a header field within a message (or within a message part).
*
* @author Paul King, ASERT
* @webtest.step category="Email"
* name="emailStoreHeader"
* description="Stores the value of a message (or message part) header field into a property."
*/
public class EmailStoreHeader extends AbstractMessageStoreStep
{
private static final Logger LOG = Logger.getLogger(EmailStoreHeader.class);
private String fHeaderName;
private String fPartIndex;
public String getHeaderName() {
return fHeaderName;
}
/**
* Sets the name of the header of interest.
*
* @param headerName The header name
* @webtest.parameter required="yes"
* description="The name of the header of interest."
*/
public void setHeaderName(final String headerName) {
fHeaderName = headerName;
}
public String getPartIndex() {
return fPartIndex;
}
/**
* Sets the part index.
*
* @param partIndex The message part of interest
* @webtest.parameter
* required="no"
* description="The index of the message part of interest. If set for a <em>Simple</em> message, will cause the step to fail. If set for a MIME <em>MultiPart</em> message will retrieve headers related to the message part instead of headers of the message itself."
*/
public void setPartIndex(final String partIndex) {
fPartIndex = partIndex;
}
/**
* Calculate the result.
*
* @param message
* @return The result
*/
protected String performOperation(final Message message) throws MessagingException {
if (StringUtils.isEmpty(getPartIndex())) {
return arrayToString(message.getHeader(getHeaderName()));
}
final Object content;
try {
content = message.getContent();
}
catch (IOException e) {
LOG.error("Error processing email message: ", e);
throw new MessagingException("Error processing email message: " + e.getMessage());
}
if (content instanceof Multipart) {
final Multipart mp = (Multipart) content;
final int part = ConversionUtil.convertToInt(getPartIndex(), 0);
if (part >= mp.getCount()) {
throw new StepFailedException("PartIndex too large.", this);
}
return arrayToString(mp.getBodyPart(part).getHeader(getHeaderName()));
}
throw new StepFailedException("PartIndex supplied for a non-MultiPart message.", this);
}
private static String arrayToString(final String[] values) {
final StringBuffer buf = new StringBuffer();
for (int i = 0; i < values.length; i++) {
buf.append(values[i]);
if (i < values.length - 1) {
buf.append(", ");
}
}
return buf.toString();
}
protected void verifyParameters() {
super.verifyParameters();
nullParamCheck(getHeaderName(), "headerName");
optionalIntegerParamCheck(getPartIndex(), "partIndex", true);
}
}