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: ****************************************************************/package org.apache.james.transport.mailets;
019:
020: import java.util.Enumeration;
021: import javax.mail.MessagingException;
022: import javax.mail.internet.MimeMessage;
023:
024: import org.apache.james.core.MailImpl;
025: import org.apache.mailet.GenericMailet;
026: import org.apache.mailet.Mail;
027:
028: import java.io.InputStream;
029: import java.lang.StringBuffer;
030:
031: /**
032: * Logs Message Headers and/or Body.
033: * If the "passThrough" in confs is true the mail will be left untouched in
034: * the pipe. If false will be destroyed. Default is true.
035: *
036: * @version This is $Revision: 1.8.4.2 $
037: */
038: public class LogMessage extends GenericMailet {
039:
040: /**
041: * Whether this mailet should allow mails to be processed by additional mailets
042: * or mark it as finished.
043: */
044: private boolean passThrough = true;
045: private boolean headers = true;
046: private boolean body = true;
047: private int bodyMax = 0;
048: private String comment = null;
049:
050: /**
051: * Initialize the mailet, loading configuration information.
052: */
053: public void init() {
054: try {
055: passThrough = (getInitParameter("passThrough") == null) ? true
056: : new Boolean(getInitParameter("passThrough"))
057: .booleanValue();
058: headers = (getInitParameter("headers") == null) ? true
059: : new Boolean(getInitParameter("headers"))
060: .booleanValue();
061: body = (getInitParameter("body") == null) ? true
062: : new Boolean(getInitParameter("body"))
063: .booleanValue();
064: bodyMax = (getInitParameter("maxBody") == null) ? 0
065: : Integer.parseInt(getInitParameter("maxBody"));
066: comment = getInitParameter("comment");
067: } catch (Exception e) {
068: // Ignore exception, default to true
069: }
070: }
071:
072: /**
073: * Log a particular message
074: *
075: * @param mail the mail to process
076: */
077: public void service(Mail genericmail) {
078: MailImpl mail = (MailImpl) genericmail;
079: log(new StringBuffer(160).append("Logging mail ").append(
080: mail.getName()).toString());
081: if (comment != null)
082: log(comment);
083: try {
084: if (headers)
085: log(getMessageHeaders(mail.getMessage()));
086: if (body) {
087: int len = bodyMax > 0 ? bodyMax : mail.getMessage()
088: .getSize();
089: StringBuffer text = new StringBuffer(len);
090: InputStream is = mail.getMessage().getRawInputStream();
091: byte[] buf = new byte[1024];
092: int read = 0;
093: while (text.length() < len
094: && (read = is.read(buf)) > -1) {
095: text.append(new String(buf, 0, Math.min(read, len
096: - text.length())));
097: }
098: log(text.toString());
099: }
100: } catch (MessagingException e) {
101: log("Error logging message.", e);
102: } catch (java.io.IOException e) {
103: log("Error logging message.", e);
104: }
105: if (!passThrough) {
106: mail.setState(Mail.GHOST);
107: }
108: }
109:
110: /**
111: * Utility method for obtaining a string representation of a
112: * Message's headers
113: */
114: private String getMessageHeaders(MimeMessage message)
115: throws MessagingException {
116: Enumeration heads = message.getAllHeaderLines();
117: StringBuffer headBuffer = new StringBuffer(1024).append("\n");
118: while (heads.hasMoreElements()) {
119: headBuffer.append(heads.nextElement().toString()).append(
120: "\n");
121: }
122: return headBuffer.toString();
123: }
124:
125: /**
126: * Return a string describing this mailet.
127: *
128: * @return a string describing this mailet
129: */
130: public String getMailetInfo() {
131: return "LogHeaders Mailet";
132: }
133: }
|