Author: berndf Date: Wed Sep 6 02:01:59 2006 New Revision: 440660 URL: http://svn.apache.org/viewvc?view=rev&rev=440660 Log: implements POSTAGE-5: validate received test mails
Added: james/postage/trunk/src/main/java/org/apache/james/postage/classloading/ james/postage/trunk/src/main/java/org/apache/james/postage/classloading/CachedInstanceFactory.java james/postage/trunk/src/main/java/org/apache/james/postage/mail/DefaultMailValidator.java james/postage/trunk/src/main/java/org/apache/james/postage/mail/MailValidator.java Modified: james/postage/trunk/src/main/java/org/apache/james/postage/client/POP3Client.java james/postage/trunk/src/main/java/org/apache/james/postage/mail/DefaultMailFactory.java james/postage/trunk/src/main/java/org/apache/james/postage/mail/HeaderConstants.java james/postage/trunk/src/main/java/org/apache/james/postage/mail/MailMatchingUtils.java james/postage/trunk/src/main/java/org/apache/james/postage/result/MailProcessingRecord.java james/postage/trunk/src/main/java/org/apache/james/postage/result/PostageRunnerResult.java james/postage/trunk/src/main/java/org/apache/james/postage/result/PostageRunnerResultImpl.java james/postage/trunk/src/main/java/org/apache/james/postage/smtpserver/SimpleMailServer.java Added: james/postage/trunk/src/main/java/org/apache/james/postage/classloading/CachedInstanceFactory.java URL: http://svn.apache.org/viewvc/james/postage/trunk/src/main/java/org/apache/james/postage/classloading/CachedInstanceFactory.java?view=auto&rev=440660 ============================================================================== --- james/postage/trunk/src/main/java/org/apache/james/postage/classloading/CachedInstanceFactory.java (added) +++ james/postage/trunk/src/main/java/org/apache/james/postage/classloading/CachedInstanceFactory.java Wed Sep 6 02:01:59 2006 @@ -0,0 +1,58 @@ +/**************************************************************** + * 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.james.postage.classloading; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class CachedInstanceFactory { + + private static Log log = LogFactory.getLog(CachedInstanceFactory.class); + + private final static Map m_classes = new HashMap(); + + public static Object createInstance(String classname) { + Object object = null; + + Class clazz = null; + // class is configured, but not yet loaded + if (classname != null && m_classes.get(classname) == null) { + try { + clazz = Class.forName(classname); + } catch (ClassNotFoundException e) { + log.error("failed to load class " + classname, e); + } + } + + // create instance, if custom class is given + if (clazz != null) { + try { + object = clazz.newInstance(); + } catch (Exception e) { + log.error("failed to create instance of class " + classname, e); + } + } + + return object; + } + +} Modified: james/postage/trunk/src/main/java/org/apache/james/postage/client/POP3Client.java URL: http://svn.apache.org/viewvc/james/postage/trunk/src/main/java/org/apache/james/postage/client/POP3Client.java?view=diff&rev=440660&r1=440659&r2=440660 ============================================================================== --- james/postage/trunk/src/main/java/org/apache/james/postage/client/POP3Client.java (original) +++ james/postage/trunk/src/main/java/org/apache/james/postage/client/POP3Client.java Wed Sep 6 02:01:59 2006 @@ -209,19 +209,24 @@ log.info("failed to process mail. remains on server"); return; } finally { - matchMails(mailProcessingRecord); + MailProcessingRecord matchedAndMergedRecord = matchMails(mailProcessingRecord); + if (matchedAndMergedRecord != null) { + MailMatchingUtils.validateMail(message, matchedAndMergedRecord); + } } } - private void matchMails(MailProcessingRecord mailProcessingRecord) { - boolean matched = m_results.matchMailRecord(mailProcessingRecord); - if (!matched) { + private MailProcessingRecord matchMails(MailProcessingRecord mailProcessingRecord) { + MailProcessingRecord matchedAndMergedRecord = m_results.matchMailRecord(mailProcessingRecord); + if (matchedAndMergedRecord == null) { + // (but only do this if sure this is a Postage test mail for this runner) String oldMailId = mailProcessingRecord.getMailId(); String newMailId = MailProcessingRecord.getNextId(); mailProcessingRecord.setMailId(newMailId); log.info("changed mail id from " + oldMailId + " to " + newMailId); m_results.addNewMailRecord(mailProcessingRecord); } + return matchedAndMergedRecord; } private int getPartSize(MimeMultipart parts, String mimeType) { Modified: james/postage/trunk/src/main/java/org/apache/james/postage/mail/DefaultMailFactory.java URL: http://svn.apache.org/viewvc/james/postage/trunk/src/main/java/org/apache/james/postage/mail/DefaultMailFactory.java?view=diff&rev=440660&r1=440659&r2=440660 ============================================================================== --- james/postage/trunk/src/main/java/org/apache/james/postage/mail/DefaultMailFactory.java (original) +++ james/postage/trunk/src/main/java/org/apache/james/postage/mail/DefaultMailFactory.java Wed Sep 6 02:01:59 2006 @@ -54,6 +54,7 @@ try { message.addHeader("Mime-Version", "1.0"); message.addHeader(HeaderConstants.JAMES_POSTAGE_HEADER, "This is a test mail sent by James Postage"); + message.addHeader(HeaderConstants.JAMES_POSTAGE_VALIDATORCLASSNAME_HEADER, "org.apache.james.postage.mail.DefaultMailValidator"); message.setSubject(mailSender.getSubject()); message.addHeader("Message-ID", "Postage-" + System.currentTimeMillis()); mailProcessingRecord.setSubject(mailSender.getSubject()); Added: james/postage/trunk/src/main/java/org/apache/james/postage/mail/DefaultMailValidator.java URL: http://svn.apache.org/viewvc/james/postage/trunk/src/main/java/org/apache/james/postage/mail/DefaultMailValidator.java?view=auto&rev=440660 ============================================================================== --- james/postage/trunk/src/main/java/org/apache/james/postage/mail/DefaultMailValidator.java (added) +++ james/postage/trunk/src/main/java/org/apache/james/postage/mail/DefaultMailValidator.java Wed Sep 6 02:01:59 2006 @@ -0,0 +1,31 @@ +/**************************************************************** + * 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.james.postage.mail; + +import javax.mail.Message; + +import org.apache.james.postage.result.MailProcessingRecord; + +public class DefaultMailValidator implements MailValidator { + + public boolean validate(Message message, MailProcessingRecord record) { + return true; + } + +} Modified: james/postage/trunk/src/main/java/org/apache/james/postage/mail/HeaderConstants.java URL: http://svn.apache.org/viewvc/james/postage/trunk/src/main/java/org/apache/james/postage/mail/HeaderConstants.java?view=diff&rev=440660&r1=440659&r2=440660 ============================================================================== --- james/postage/trunk/src/main/java/org/apache/james/postage/mail/HeaderConstants.java (original) +++ james/postage/trunk/src/main/java/org/apache/james/postage/mail/HeaderConstants.java Wed Sep 6 02:01:59 2006 @@ -26,6 +26,7 @@ public class HeaderConstants { public static final String MAIL_ID_HEADER = "X-James-Postage-Count"; public static final String JAMES_POSTAGE_HEADER = "X-James-Postage"; + public static final String JAMES_POSTAGE_VALIDATORCLASSNAME_HEADER = "X-James-Validator"; public static final String JAMES_POSTAGE_STARTUPCHECK_HEADER_ID = "PROFORMA"; } Modified: james/postage/trunk/src/main/java/org/apache/james/postage/mail/MailMatchingUtils.java URL: http://svn.apache.org/viewvc/james/postage/trunk/src/main/java/org/apache/james/postage/mail/MailMatchingUtils.java?view=diff&rev=440660&r1=440659&r2=440660 ============================================================================== --- james/postage/trunk/src/main/java/org/apache/james/postage/mail/MailMatchingUtils.java (original) +++ james/postage/trunk/src/main/java/org/apache/james/postage/mail/MailMatchingUtils.java Wed Sep 6 02:01:59 2006 @@ -20,6 +20,8 @@ import org.apache.james.postage.PostageRunner; import org.apache.james.postage.PostageRuntimeException; +import org.apache.james.postage.classloading.CachedInstanceFactory; +import org.apache.james.postage.result.MailProcessingRecord; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -105,5 +107,17 @@ } if (MailMatchingUtils.isPostageStartupCheckMail(message)) return false; return true; + } + + public static boolean validateMail(MimeMessage message, MailProcessingRecord mailProcessingRecord) { + String classname = getUniqueHeader(message, HeaderConstants.JAMES_POSTAGE_VALIDATORCLASSNAME_HEADER); + MailValidator validator = (MailValidator)CachedInstanceFactory.createInstance(classname); + if (validator == null) return false; + + boolean isValid = validator.validate(message, mailProcessingRecord); + if (isValid) mailProcessingRecord.setValid(); + else log.warn("failed to validate mail"); + + return isValid; } } Added: james/postage/trunk/src/main/java/org/apache/james/postage/mail/MailValidator.java URL: http://svn.apache.org/viewvc/james/postage/trunk/src/main/java/org/apache/james/postage/mail/MailValidator.java?view=auto&rev=440660 ============================================================================== --- james/postage/trunk/src/main/java/org/apache/james/postage/mail/MailValidator.java (added) +++ james/postage/trunk/src/main/java/org/apache/james/postage/mail/MailValidator.java Wed Sep 6 02:01:59 2006 @@ -0,0 +1,32 @@ +/**************************************************************** + * 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.james.postage.mail; + +import javax.mail.Message; + +import org.apache.james.postage.result.MailProcessingRecord; + +/** + * implementations validate matched and received messages by checking for the expected properties. + * for example, they could check for spam-marking headers or mime parts. + * most commonly, each MailValidator implementation matches one corresponding MailFactory. + */ +public interface MailValidator { + public boolean validate(Message message, MailProcessingRecord record); +} Modified: james/postage/trunk/src/main/java/org/apache/james/postage/result/MailProcessingRecord.java URL: http://svn.apache.org/viewvc/james/postage/trunk/src/main/java/org/apache/james/postage/result/MailProcessingRecord.java?view=diff&rev=440660&r1=440659&r2=440660 ============================================================================== --- james/postage/trunk/src/main/java/org/apache/james/postage/result/MailProcessingRecord.java (original) +++ james/postage/trunk/src/main/java/org/apache/james/postage/result/MailProcessingRecord.java Wed Sep 6 02:01:59 2006 @@ -31,6 +31,7 @@ private static int m_messageId = 1; boolean matchedSentAndReceived = false; + boolean isReceivedValid = false; long timeConnectStart; String mailId; @@ -62,6 +63,14 @@ public boolean isMatchedSentAndReceived() { return matchedSentAndReceived; } + + public void setValid() { + isReceivedValid = true; + } + + public boolean isReceivedValid() { + return isReceivedValid; + } public long getTimeConnectStart() { return timeConnectStart; @@ -256,6 +265,7 @@ if (timeFetchEnd == 0) timeFetchEnd = anotherRecord.timeFetchEnd; if (timeServerReceived == 0) timeServerReceived = anotherRecord.timeServerReceived; if (receivingQueue == null) receivingQueue = anotherRecord.receivingQueue; + if (anotherRecord.isReceivedValid) isReceivedValid = anotherRecord.isReceivedValid; } public static StringBuffer writeHeader() { @@ -282,6 +292,7 @@ stringBuffer.append("timeFetchEnd").append(SEPARATOR); stringBuffer.append("timeServerReceived").append(SEPARATOR); stringBuffer.append("receivingQueue").append(SEPARATOR); + stringBuffer.append("valid").append(SEPARATOR); stringBuffer.append("\r\n"); return stringBuffer; @@ -311,6 +322,7 @@ stringBuffer.append(timeFetchEnd).append(SEPARATOR); stringBuffer.append(timeServerReceived).append(SEPARATOR); stringBuffer.append(receivingQueue).append(SEPARATOR); + stringBuffer.append(isReceivedValid).append(SEPARATOR); stringBuffer.append("\r\n"); return stringBuffer; Modified: james/postage/trunk/src/main/java/org/apache/james/postage/result/PostageRunnerResult.java URL: http://svn.apache.org/viewvc/james/postage/trunk/src/main/java/org/apache/james/postage/result/PostageRunnerResult.java?view=diff&rev=440660&r1=440659&r2=440660 ============================================================================== --- james/postage/trunk/src/main/java/org/apache/james/postage/result/PostageRunnerResult.java (original) +++ james/postage/trunk/src/main/java/org/apache/james/postage/result/PostageRunnerResult.java Wed Sep 6 02:01:59 2006 @@ -28,7 +28,12 @@ void addNewMailRecord(MailProcessingRecord mailProcessingRecord); - boolean matchMailRecord(MailProcessingRecord mailProcessingRecord); + /** + * + * @param mailProcessingRecord record for whom a match is searched + * @return null, if no match is found or matching and merged record otherwise + */ + MailProcessingRecord matchMailRecord(MailProcessingRecord mailProcessingRecord); void addJVMResult(JVMResourcesRecord jvmResourcesRecord); Modified: james/postage/trunk/src/main/java/org/apache/james/postage/result/PostageRunnerResultImpl.java URL: http://svn.apache.org/viewvc/james/postage/trunk/src/main/java/org/apache/james/postage/result/PostageRunnerResultImpl.java?view=diff&rev=440660&r1=440659&r2=440660 ============================================================================== --- james/postage/trunk/src/main/java/org/apache/james/postage/result/PostageRunnerResultImpl.java (original) +++ james/postage/trunk/src/main/java/org/apache/james/postage/result/PostageRunnerResultImpl.java Wed Sep 6 02:01:59 2006 @@ -66,10 +66,10 @@ } } - public synchronized boolean matchMailRecord(MailProcessingRecord mailProcessingRecord) { - if (mailProcessingRecord == null) return false; + public synchronized MailProcessingRecord matchMailRecord(MailProcessingRecord mailProcessingRecord) { + if (mailProcessingRecord == null) return null; String mailId = mailProcessingRecord.getMailId(); - if (mailId == null) return false; + if (mailId == null) return null; if (m_unmatchedMailResults.containsKey(mailId)) { // merge both mail result objects into one and move it to matched list @@ -80,14 +80,14 @@ m_matchedMailResults.put(mailId, match); m_matchedMailCounter++; - return true; + return match; } else if (m_matchedMailResults.containsKey(mailId)) { log.warn("mail already matched for mailId = " + mailId); } else { log.warn("mail match candidate has unknown (purged?) mailId = " + mailId); } - return false; + return null; } public void addJVMResult(JVMResourcesRecord jvmResourcesRecord) { Modified: james/postage/trunk/src/main/java/org/apache/james/postage/smtpserver/SimpleMailServer.java URL: http://svn.apache.org/viewvc/james/postage/trunk/src/main/java/org/apache/james/postage/smtpserver/SimpleMailServer.java?view=diff&rev=440660&r1=440659&r2=440660 ============================================================================== --- james/postage/trunk/src/main/java/org/apache/james/postage/smtpserver/SimpleMailServer.java (original) +++ james/postage/trunk/src/main/java/org/apache/james/postage/smtpserver/SimpleMailServer.java Wed Sep 6 02:01:59 2006 @@ -51,20 +51,20 @@ private int m_counter = 0; private PostageRunnerResult m_results; - public void sendMail(MailAddress sender, Collection recipients, MimeMessage msg) throws MessagingException { + public void sendMail(MailAddress sender, Collection recipients, MimeMessage message) throws MessagingException { //log.info("start processing incoming mail having id = " + msg.getMessageID()); MailProcessingRecord mailProcessingRecord = new MailProcessingRecord(); mailProcessingRecord.setReceivingQueue("smtpOutbound"); mailProcessingRecord.setTimeFetchStart(System.currentTimeMillis()); - mailProcessingRecord.setByteReceivedTotal(msg.getSize()); + mailProcessingRecord.setByteReceivedTotal(message.getSize()); try { - if (!MailMatchingUtils.isMatchCandidate(msg)) return; + if (!MailMatchingUtils.isMatchCandidate(message)) return; - String id = MailMatchingUtils.getMailIdHeader(msg); + String id = MailMatchingUtils.getMailIdHeader(message); mailProcessingRecord.setMailId(id); - String[] subjectHeader = msg.getHeader("Subject"); + String[] subjectHeader = message.getHeader("Subject"); if (subjectHeader != null && subjectHeader.length > 0) { mailProcessingRecord.setSubject(subjectHeader[0]); } @@ -77,10 +77,13 @@ log.error("error processing incoming mail: " + e.getMessage()); throw e; // rethrow after logging } finally{ - boolean matched = m_results.matchMailRecord(mailProcessingRecord); - if (!matched) { + MailProcessingRecord matchedAndMergedRecord = m_results.matchMailRecord(mailProcessingRecord); + if (matchedAndMergedRecord == null) { if (mailProcessingRecord.getMailId() == null) mailProcessingRecord.setMailId(MailProcessingRecord.getNextId()); m_results.addNewMailRecord(mailProcessingRecord); + } + else { + MailMatchingUtils.validateMail(message, matchedAndMergedRecord); } } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]