You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ba...@apache.org on 2006/05/12 19:38:01 UTC
svn commit: r405805 - in /james/server/trunk/src/test/org/apache/james:
smtpserver/SMTPServerTest.java test/mock/james/InMemorySpoolRepository.java
test/mock/mailet/MockMailContext.java
Author: bago
Date: Fri May 12 10:38:01 2006
New Revision: 405805
URL: http://svn.apache.org/viewcvs?rev=405805&view=rev
Log:
Tests fixes for the dnsServer change thing, added to SMTPServerTest example code to test 7bit/8bit mime stuff (unfortunately still bugged in javamail 1.4)
Added:
james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java (with props)
Modified:
james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java
james/server/trunk/src/test/org/apache/james/test/mock/mailet/MockMailContext.java
Modified: james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java?rev=405805&r1=405804&r2=405805&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java (original)
+++ james/server/trunk/src/test/org/apache/james/smtpserver/SMTPServerTest.java Fri May 12 10:38:01 2006
@@ -17,8 +17,11 @@
package org.apache.james.smtpserver;
import org.apache.avalon.cornerstone.services.sockets.SocketManager;
+import org.apache.avalon.cornerstone.services.store.Store;
import org.apache.avalon.cornerstone.services.threads.ThreadManager;
import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.james.Constants;
+import org.apache.james.core.MailImpl;
import org.apache.james.services.DNSServer;
import org.apache.james.services.JamesConnectionManager;
import org.apache.james.services.MailServer;
@@ -26,10 +29,14 @@
import org.apache.james.test.mock.avalon.MockLogger;
import org.apache.james.test.mock.avalon.MockServiceManager;
import org.apache.james.test.mock.avalon.MockSocketManager;
+import org.apache.james.test.mock.avalon.MockStore;
import org.apache.james.test.mock.avalon.MockThreadManager;
+import org.apache.james.test.mock.james.InMemorySpoolRepository;
import org.apache.james.test.mock.james.MockMailServer;
import org.apache.james.test.mock.mailet.MockMailContext;
+import org.apache.james.test.mock.mailet.MockMailetConfig;
import org.apache.james.test.util.Util;
+import org.apache.james.transport.mailets.RemoteDelivery;
import org.apache.james.userrepository.MockUsersRepository;
import org.apache.james.util.Base64;
import org.apache.james.util.connection.SimpleConnectionManager;
@@ -45,10 +52,13 @@
import org.columba.ristretto.smtp.SMTPProtocol;
import org.columba.ristretto.smtp.SMTPResponse;
+import javax.mail.MessagingException;
+import javax.mail.Session;
import javax.mail.internet.MimeMessage;
-import javax.mail.internet.ParseException;
import javax.mail.util.SharedByteArrayInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
@@ -58,6 +68,7 @@
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
+import java.util.Properties;
import junit.framework.TestCase;
@@ -75,7 +86,7 @@
super("SMTPServerTest");
}
- public void verifyLastMail(String sender, String recipient, MimeMessage msg) throws ParseException {
+ public void verifyLastMail(String sender, String recipient, MimeMessage msg) throws IOException, MessagingException {
Object[] mailData = m_mailServer.getLastMail();
assertNotNull("mail received by mail server", mailData);
@@ -83,13 +94,21 @@
if (sender != null) assertEquals("sender verfication", sender, ((MailAddress)mailData[0]).toString());
if (recipient != null) assertTrue("recipient verfication", ((Collection) mailData[1]).contains(new MailAddress(recipient)));
- if (msg != null) assertEquals("message verification", msg, ((MimeMessage) mailData[2]));
+ if (msg != null) {
+ ByteArrayOutputStream bo1 = new ByteArrayOutputStream();
+ msg.writeTo(bo1);
+ ByteArrayOutputStream bo2 = new ByteArrayOutputStream();
+ ((MimeMessage) mailData[2]).writeTo(bo2);
+ assertEquals(bo1.toString(),bo2.toString());
+ assertEquals("message verification", msg, ((MimeMessage) mailData[2]));
+ }
}
protected void setUp() throws Exception {
m_smtpServer = new SMTPServer();
ContainerUtil.enableLogging(m_smtpServer,new MockLogger());
- ContainerUtil.service(m_smtpServer, setUpServiceManager());
+ m_serviceManager = setUpServiceManager();
+ ContainerUtil.service(m_smtpServer, m_serviceManager);
m_testConfiguration = new SMTPTestConfiguration(m_smtpListenerPort);
}
@@ -101,16 +120,16 @@
}
private MockServiceManager setUpServiceManager() throws Exception {
- MockServiceManager serviceManager = new MockServiceManager();
+ m_serviceManager = new MockServiceManager();
SimpleConnectionManager connectionManager = new SimpleConnectionManager();
ContainerUtil.enableLogging(connectionManager, new MockLogger());
- serviceManager.put(JamesConnectionManager.ROLE, connectionManager);
- serviceManager.put("org.apache.mailet.MailetContext", new MockMailContext());
+ m_serviceManager.put(JamesConnectionManager.ROLE, connectionManager);
+ m_serviceManager.put("org.apache.mailet.MailetContext", new MockMailContext());
m_mailServer = new MockMailServer();
- serviceManager.put(MailServer.ROLE, m_mailServer);
- serviceManager.put(UsersRepository.ROLE, m_usersRepository);
- serviceManager.put(SocketManager.ROLE, new MockSocketManager(m_smtpListenerPort));
- serviceManager.put(ThreadManager.ROLE, new MockThreadManager());
+ m_serviceManager.put(MailServer.ROLE, m_mailServer);
+ m_serviceManager.put(UsersRepository.ROLE, m_usersRepository);
+ m_serviceManager.put(SocketManager.ROLE, new MockSocketManager(m_smtpListenerPort));
+ m_serviceManager.put(ThreadManager.ROLE, new MockThreadManager());
// Mock DNS Server
DNSServer dns = new DNSServer() {
@@ -132,20 +151,21 @@
public InetAddress[] getAllByName(String host) throws UnknownHostException
{
- // TODO Add the right values
- return null;
+ return new InetAddress[] {getByName(host)};
+// throw new UnsupportedOperationException("getByName not implemented in mock for host: "+host);
}
public InetAddress getByName(String host) throws UnknownHostException
{
- // TODO Add the right values
- return null;
+ return InetAddress.getByName(host);
+// throw new UnsupportedOperationException("getByName not implemented in mock for host: "+host);
}
};
- serviceManager.put(DNSServer.ROLE, dns);
- return serviceManager;
+ m_serviceManager.put(DNSServer.ROLE, dns);
+ m_serviceManager.put(Store.ROLE, new MockStore());
+ return m_serviceManager;
}
private LocalMimePart createMail() {
@@ -872,6 +892,69 @@
smtpProtocol2.openPort();
assertEquals("second connection not taken", SMTPProtocol.NOT_CONNECTED, smtpProtocol2.getState());
+ }
+
+ // RemoteDelivery tests.
+
+ InMemorySpoolRepository outgoingSpool;
+ private MockServiceManager m_serviceManager;
+
+ private Properties getStandardParameters() {
+ Properties parameters = new Properties();
+ parameters.put("delayTime", "500 msec, 500 msec, 500 msec"); // msec, sec, minute, hour
+ parameters.put("maxRetries", "3");
+ parameters.put("deliveryThreads", "1");
+ parameters.put("debug", "true");
+ parameters.put("sendpartial", "false");
+ parameters.put("bounceProcessor", "bounce");
+ parameters.put("outgoing", "mocked://outgoing/");
+ return parameters;
+ }
+
+
+
+ /**
+ * This is useful code to run tests on javamail bugs
+ * http://issues.apache.org/jira/browse/JAMES-52
+ *
+ * This
+ * @throws Exception
+ */
+ public void test8bitmimeFromStream() throws Exception {
+ finishSetUp(m_testConfiguration);
+ outgoingSpool = new InMemorySpoolRepository();
+ ((MockStore) m_serviceManager.lookup(Store.ROLE)).add("outgoing", outgoingSpool);
+
+ RemoteDelivery rd = new RemoteDelivery();
+
+ MockMailContext mmc = new MockMailContext();
+ mmc.setAttribute(Constants.AVALON_COMPONENT_MANAGER,m_serviceManager);
+ mmc.setAttribute(Constants.HELLO_NAME,"localhost");
+ MockMailetConfig mci = new MockMailetConfig("Test",mmc,getStandardParameters());
+ mci.setProperty("gateway","127.0.0.1");
+ mci.setProperty("gatewayPort",""+m_smtpListenerPort);
+ rd.init(mci);
+
+ String sources = "Content-Type: text/plain;\r\nContent-Transfer-Encoding: quoted-printable\r\nSubject: test\r\n\r\nBody=80\r\n";
+ //String sources = "Content-Type: text/plain; charset=iso-8859-15\r\nContent-Transfer-Encoding: quoted-printable\r\nSubject: test\r\n\r\nBody=80\r\n";
+ //String sources = "Content-Type: text/plain; charset=iso-8859-15\r\nContent-Transfer-Encoding: 8bit\r\nSubject: test\r\n\r\nBody\u20AC\r\n";
+ String sender = "test@localhost";
+ String recipient = "test@localhost";
+ MimeMessage mm = new MimeMessage(Session.getDefaultInstance(new Properties()),new ByteArrayInputStream(sources.getBytes()));
+ MailImpl mail = new MailImpl("name",new MailAddress(sender),Arrays.asList(new MailAddress[] {new MailAddress(recipient)}),mm);
+
+ rd.service(mail);
+
+ while (outgoingSpool.size() > 0) {
+ Thread.sleep(1000);
+ }
+
+ // verifyLastMail(sender, recipient, mm);
+ verifyLastMail(sender, recipient, null);
+
+ // THIS WOULD FAIL BECAUSE OF THE JAVAMAIL BUG
+ // assertEquals(mm.getContent(),((MimeMessage) m_mailServer.getLastMail()[2]).getContent());
+
}
Added: james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java?rev=405805&view=auto
==============================================================================
--- james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java (added)
+++ james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java Fri May 12 10:38:01 2006
@@ -0,0 +1,418 @@
+/***********************************************************************
+ * Copyright (c) 2006 The Apache Software Foundation. *
+ * All rights reserved. *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.test.mock.james;
+
+import org.apache.james.services.SpoolRepository;
+import org.apache.james.test.mock.avalon.MockLogger;
+import org.apache.james.util.Lock;
+import org.apache.mailet.Mail;
+
+import javax.mail.MessagingException;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.ConcurrentModificationException;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+/**
+ * Implementation of a MailRepository on a FileSystem.
+ *
+ * Requires a configuration element in the .conf.xml file of the form:
+ * <repository destinationURL="file://path-to-root-dir-for-repository"
+ * type="MAIL"
+ * model="SYNCHRONOUS"/>
+ * Requires a logger called MailRepository.
+ *
+ * @version 1.0.0, 24/04/1999
+ */
+public class InMemorySpoolRepository
+ implements SpoolRepository {
+
+ /**
+ * Whether 'deep debugging' is turned on.
+ */
+ protected final static boolean DEEP_DEBUG = true;
+ private Lock lock;
+ private MockLogger logger;
+ private Hashtable spool;
+
+ private MockLogger getLogger() {
+ if (logger == null) {
+ logger = new MockLogger();
+ }
+ return logger;
+ }
+
+ /**
+ * Releases a lock on a message identified by a key
+ *
+ * @param key the key of the message to be unlocked
+ *
+ * @return true if successfully released the lock, false otherwise
+ */
+ public boolean unlock(String key) {
+ if (lock.unlock(key)) {
+ if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+ StringBuffer debugBuffer =
+ new StringBuffer(256)
+ .append("Unlocked ")
+ .append(key)
+ .append(" for ")
+ .append(Thread.currentThread().getName())
+ .append(" @ ")
+ .append(new java.util.Date(System.currentTimeMillis()));
+ getLogger().debug(debugBuffer.toString());
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Obtains a lock on a message identified by a key
+ *
+ * @param key the key of the message to be locked
+ *
+ * @return true if successfully obtained the lock, false otherwise
+ */
+ public boolean lock(String key) {
+ if (lock.lock(key)) {
+ if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+ StringBuffer debugBuffer =
+ new StringBuffer(256)
+ .append("Locked ")
+ .append(key)
+ .append(" for ")
+ .append(Thread.currentThread().getName())
+ .append(" @ ")
+ .append(new java.util.Date(System.currentTimeMillis()));
+ getLogger().debug(debugBuffer.toString());
+ }
+// synchronized (this) {
+// notifyAll();
+// }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Stores a message in this repository. Shouldn't this return the key
+ * under which it is stored?
+ *
+ * @param mc the mail message to store
+ */
+ public void store(Mail mc) throws MessagingException {
+ try {
+ String key = mc.getName();
+ //Remember whether this key was locked
+ boolean wasLocked = true;
+ synchronized (this) {
+ wasLocked = lock.isLocked(key);
+
+ if (!wasLocked) {
+ //If it wasn't locked, we want a lock during the store
+ lock(key);
+ }
+ }
+ try {
+ spool.put(key,mc);
+ } finally {
+ if (!wasLocked) {
+ // If it wasn't locked, we need to unlock now
+ unlock(key);
+ synchronized (this) {
+ notify();
+ }
+ }
+ }
+
+ if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+ StringBuffer logBuffer =
+ new StringBuffer(64)
+ .append("Mail ")
+ .append(key)
+ .append(" stored.");
+ getLogger().debug(logBuffer.toString());
+ }
+
+ } catch (Exception e) {
+ getLogger().error("Exception storing mail: " + e);
+ throw new MessagingException("Exception caught while storing Message Container: ",e);
+ }
+ }
+
+ /**
+ * Retrieves a message given a key. At the moment, keys can be obtained
+ * from list() in superinterface Store.Repository
+ *
+ * @param key the key of the message to retrieve
+ * @return the mail corresponding to this key, null if none exists
+ */
+ public Mail retrieve(String key) throws MessagingException {
+ if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+ getLogger().debug("Retrieving mail: " + key);
+ }
+ try {
+ Mail mc = null;
+ try {
+ mc = (Mail) spool.get(key);
+ }
+ catch (RuntimeException re){
+ StringBuffer exceptionBuffer = new StringBuffer(128);
+ if(re.getCause() instanceof Error){
+ exceptionBuffer.append("Error when retrieving mail, not deleting: ")
+ .append(re.toString());
+ }else{
+ exceptionBuffer.append("Exception retrieving mail: ")
+ .append(re.toString())
+ .append(", so we're deleting it.");
+ remove(key);
+ }
+ getLogger().warn(exceptionBuffer.toString());
+ return null;
+ }
+ return mc;
+ } catch (Exception me) {
+ getLogger().error("Exception retrieving mail: " + me);
+ throw new MessagingException("Exception while retrieving mail: " + me.getMessage());
+ }
+ }
+
+ /**
+ * Removes a specified message
+ *
+ * @param mail the message to be removed from the repository
+ */
+ public void remove(Mail mail) throws MessagingException {
+ remove(mail.getName());
+ }
+
+
+ /**
+ * Removes a Collection of mails from the repository
+ * @param mails The Collection of <code>MailImpl</code>'s to delete
+ * @throws MessagingException
+ * @since 2.2.0
+ */
+ public void remove(Collection mails) throws MessagingException {
+ Iterator delList = mails.iterator();
+ while (delList.hasNext()) {
+ remove((Mail)delList.next());
+ }
+ }
+
+ /**
+ * Removes a message identified by key.
+ *
+ * @param key the key of the message to be removed from the repository
+ */
+ public void remove(String key) throws MessagingException {
+ if (lock(key)) {
+ try {
+ if (spool != null) spool.remove(key);
+ } finally {
+ unlock(key);
+ }
+ } else {
+ StringBuffer exceptionBuffer =
+ new StringBuffer(64)
+ .append("Cannot lock ")
+ .append(key)
+ .append(" to remove it");
+ throw new MessagingException(exceptionBuffer.toString());
+ }
+ }
+
+ /**
+ * List string keys of messages in repository.
+ *
+ * @return an <code>Iterator</code> over the list of keys in the repository
+ *
+ */
+ public Iterator list() {
+ // Fix ConcurrentModificationException by cloning
+ // the keyset before getting an iterator
+ final ArrayList clone;
+ synchronized(spool) {
+ clone = new ArrayList(spool.keySet());
+ }
+ return clone.iterator();
+ }
+
+
+ /**
+ * <p>Returns an arbitrarily selected mail deposited in this Repository.
+ * Usage: SpoolManager calls accept() to see if there are any unprocessed
+ * mails in the spool repository.</p>
+ *
+ * <p>Synchronized to ensure thread safe access to the underlying spool.</p>
+ *
+ * @return the mail
+ */
+ public synchronized Mail accept() throws InterruptedException {
+ if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+ getLogger().debug("Method accept() called");
+ }
+ return accept(new SpoolRepository.AcceptFilter () {
+ public boolean accept (String _, String __, long ___, String ____) {
+ return true;
+ }
+
+ public long getWaitTime () {
+ return 0;
+ }
+ });
+ }
+
+ /**
+ * <p>Returns an arbitrarily selected mail deposited in this Repository that
+ * is either ready immediately for delivery, or is younger than it's last_updated plus
+ * the number of failed attempts times the delay time.
+ * Usage: RemoteDeliverySpool calls accept() with some delay and should block until an
+ * unprocessed mail is available.</p>
+ *
+ * <p>Synchronized to ensure thread safe access to the underlying spool.</p>
+ *
+ * @return the mail
+ */
+ public synchronized Mail accept(final long delay) throws InterruptedException
+ {
+ if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+ getLogger().debug("Method accept(delay) called");
+ }
+ return accept(new SpoolRepository.AcceptFilter () {
+ long youngest = 0;
+
+ public boolean accept (String key, String state, long lastUpdated, String errorMessage) {
+ if (state.equals(Mail.ERROR)) {
+ //Test the time...
+ long timeToProcess = delay + lastUpdated;
+
+ if (System.currentTimeMillis() > timeToProcess) {
+ //We're ready to process this again
+ return true;
+ } else {
+ //We're not ready to process this.
+ if (youngest == 0 || youngest > timeToProcess) {
+ //Mark this as the next most likely possible mail to process
+ youngest = timeToProcess;
+ }
+ return false;
+ }
+ } else {
+ //This mail is good to go... return the key
+ return true;
+ }
+ }
+
+ public long getWaitTime () {
+ if (youngest == 0) {
+ return 0;
+ } else {
+ long duration = youngest - System.currentTimeMillis();
+ youngest = 0; //get ready for next round
+ return duration <= 0 ? 1 : duration;
+ }
+ }
+ });
+ }
+
+
+ /**
+ * Returns an arbitrarily select mail deposited in this Repository for
+ * which the supplied filter's accept method returns true.
+ * Usage: RemoteDeliverySpool calls accept(filter) with some a filter which determines
+ * based on number of retries if the mail is ready for processing.
+ * If no message is ready the method will block until one is, the amount of time to block is
+ * determined by calling the filters getWaitTime method.
+ *
+ * <p>Synchronized to ensure thread safe access to the underlying spool.</p>
+ *
+ * @return the mail
+ */
+ public synchronized Mail accept(SpoolRepository.AcceptFilter filter) throws InterruptedException {
+ if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+ getLogger().debug("Method accept(Filter) called");
+ }
+ while (!Thread.currentThread().isInterrupted()) try {
+ for (Iterator it = list(); it.hasNext(); ) {
+ String s = it.next().toString();
+ if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+ StringBuffer logBuffer =
+ new StringBuffer(64)
+ .append("Found item ")
+ .append(s)
+ .append(" in spool.");
+ getLogger().debug(logBuffer.toString());
+ }
+ if (lock(s)) {
+ if ((DEEP_DEBUG) && (getLogger().isDebugEnabled())) {
+ getLogger().debug("accept(Filter) has locked: " + s);
+ }
+ try {
+ Mail mail = retrieve(s);
+ // Retrieve can return null if the mail is no longer on the spool
+ // (i.e. another thread has gotten to it first).
+ // In this case we simply continue to the next key
+ if (mail == null || !filter.accept (mail.getName(),
+ mail.getState(),
+ mail.getLastUpdated().getTime(),
+ mail.getErrorMessage())) {
+ unlock(s);
+ continue;
+ }
+ return mail;
+ } catch (javax.mail.MessagingException e) {
+ unlock(s);
+ getLogger().error("Exception during retrieve -- skipping item " + s, e);
+ }
+ }
+ }
+
+ //We did not find any... let's wait for a certain amount of time
+ wait (filter.getWaitTime());
+ } catch (InterruptedException ex) {
+ throw ex;
+ } catch (ConcurrentModificationException cme) {
+ // Should never get here now that list methods clones keyset for iterator
+ getLogger().error("CME in spooler - please report to http://james.apache.org", cme);
+ }
+ throw new InterruptedException();
+ }
+
+ /**
+ *
+ */
+ public InMemorySpoolRepository() {
+ spool = new Hashtable();
+ lock = new Lock();
+ }
+
+ public int size() {
+ return spool.size();
+ }
+
+ public void clear() {
+ spool.clear();
+ }
+
+}
Propchange: james/server/trunk/src/test/org/apache/james/test/mock/james/InMemorySpoolRepository.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: james/server/trunk/src/test/org/apache/james/test/mock/mailet/MockMailContext.java
URL: http://svn.apache.org/viewcvs/james/server/trunk/src/test/org/apache/james/test/mock/mailet/MockMailContext.java?rev=405805&r1=405804&r2=405805&view=diff
==============================================================================
--- james/server/trunk/src/test/org/apache/james/test/mock/mailet/MockMailContext.java (original)
+++ james/server/trunk/src/test/org/apache/james/test/mock/mailet/MockMailContext.java Fri May 12 10:38:01 2006
@@ -23,9 +23,12 @@
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Collection;
+import java.util.HashMap;
import java.util.Iterator;
public class MockMailContext implements MailetContext {
+
+ HashMap attributes = new HashMap();
public void bounce(Mail mail, String message) throws MessagingException {
// trivial implementation
@@ -44,11 +47,11 @@
}
public Object getAttribute(String name) {
- return null; // trivial implementation
+ return attributes.get(name);
}
public Iterator getAttributeNames() {
- return null; // trivial implementation
+ return attributes.keySet().iterator();
}
public int getMajorVersion() {
@@ -60,7 +63,7 @@
}
public String getServerInfo() {
- return null; // trivial implementation
+ return "Mock Server";
}
public boolean isLocalServer(String serverName) {
@@ -101,7 +104,7 @@
}
public void setAttribute(String name, Object object) {
- // trivial implementation
+ attributes.put(name,object);
}
public void storeMail(MailAddress sender, MailAddress recipient, MimeMessage msg) throws MessagingException {
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org