This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit cdf7692731f78462a552a761fa2fa0b336a3d509 Author: Benoit Tellier <[email protected]> AuthorDate: Thu Apr 4 13:35:23 2019 +0700 JAMES-2323 Remove MBoxMailRepository Removal of this deprecated class was advertised after 3.2.0 release. We passed this date, and no maintainer arose. --- .../mailrepository/file/MBoxMailRepository.java | 710 --------------------- .../mailrepository/MBoxMailRepositoryTest.java | 86 --- 2 files changed, 796 deletions(-) diff --git a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java b/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java deleted file mode 100755 index 337c945..0000000 --- a/server/data/data-file/src/main/java/org/apache/james/mailrepository/file/MBoxMailRepository.java +++ /dev/null @@ -1,710 +0,0 @@ -/**************************************************************** - * 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. * - ****************************************************************/ - -/* TODO: - * - * 1. Currently, iterating through the message collection does not - * preserve the order in the file. Change this with some form of - * OrderedMap. There is a suitable class in Jakarta Commons - * Collections. - * - * 2. Optimize the remove operation. - * - * 3. Don't load entire message into memory. This would mean computing - * the hash during I/O streaming, rather than loading entire message - * into memory, and using a MimeMessageWrapper with a suitable data - * source. As a strawman, the interface to MessageAction would - * carry the hash, along with a size-limited stream providing the - * message body. - * - * 4. Decide what to do when there are IDENTICAL messages in the file. - * Right now only the last one will ever be processed, due to key - * collissions. - * - * 5. isComplete() - DONE. - * - * 6. Buffered I/O. - Partially done, and optional. - * - */ - -package org.apache.james.mailrepository.file; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collection; -import java.util.Collections; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.Locale; -import java.util.Properties; -import java.util.regex.Pattern; -import java.util.regex.PatternSyntaxException; - -import javax.mail.MessagingException; -import javax.mail.Session; -import javax.mail.internet.MimeMessage; - -import org.apache.commons.configuration.ConfigurationException; -import org.apache.commons.configuration.HierarchicalConfiguration; -import org.apache.commons.io.FileUtils; -import org.apache.james.lifecycle.api.Configurable; -import org.apache.james.mailrepository.api.MailKey; -import org.apache.james.mailrepository.api.MailRepository; -import org.apache.james.server.core.MailImpl; -import org.apache.mailet.Mail; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.github.fge.lambdas.Throwing; -import com.google.common.collect.ImmutableList; -import com.google.common.hash.Hashing; - -/** - * Implementation of a MailRepository using UNIX mbox files. - * - * <p> - * Requires a configuration element in the .conf.xml file of the form: - * - * <pre> - * <repository destinationURL="mbox://<directory>" - * type="MAIL"/> - * </pre> - * - * <directory> is where the individual mbox files are read from/written to. - * </p> - * <p> - * Type can ONLY be MAIL (SPOOL is NOT supported) - * </p> - * - * <p> - * Requires a logger called MailRepository. - * - * <p> - * Implementation notes: - * <p> - * This class keeps an internal store of the mbox file When the internal mbox - * file is updated (added/deleted) then the file will be re-read from disk and - * then written back. This is a bit inefficent but means that the file on disk - * should be correct. - * <p> - * The mbox store is mainly meant to be used as a one-way street. Storing new - * emails is very fast (append to file) whereas reading them (via POP3) is - * slower (read from disk and parse). Therefore this implementation is best - * suited to people who wish to use the mbox format for taking data out of James - * and into something else (IMAP server or mail list displayer) - * - * @Deprecated: See JAMES-2323 - * - * Will be removed in James 3.2.0 upcoming release. - * - * Use a modern, maintained MailRepository instead. For instead FileMailRepository. - */ -@Deprecated -public class MBoxMailRepository implements MailRepository, Configurable { - private static final Logger LOGGER = LoggerFactory.getLogger(MBoxMailRepository.class); - - static final SimpleDateFormat dy = new SimpleDateFormat("EE MMM dd HH:mm:ss yyyy", Locale.US); - static final String LOCKEXT = ".lock"; - static final String WORKEXT = ".work"; - static final int LOCKSLEEPDELAY = 2000; // 2 second back off in the event of a problem with the lock file - static final int MAXSLEEPTIMES = 100; // - // The hash table will be loaded with a initial capacity of filelength/MLISTPRESIZEFACTOR - static final long MLISTPRESIZEFACTOR = 10 * 1024; - // Set up a hashtable to have a meaningful default - static final long DEFAULTMLISTCAPACITY = 20; - - /** - * Whether line buffering is turned used. - */ - private static boolean BUFFERING = true; - - /** - * The internal list of emails. - * The key is an adapted SHA-256 fingerprint of the email body. - */ - private Hashtable<String, Long> mList = null; - /** - * The filename to read & write the mbox from/to - */ - private String mboxFile; - - private boolean fifo; - - /** - * A callback used when a message is read from the mbox file - */ - public interface MessageAction { - boolean isComplete(); // *** Not valid until AFTER each call to messageAction(...)! - - MimeMessage messageAction(String messageSeparator, String bodyText, long messageStart); - } - - @Override - public void configure(HierarchicalConfiguration configuration) throws ConfigurationException { - /* - The repository configuration - */ - String destination; - this.mList = null; - BUFFERING = configuration.getBoolean("[@BUFFERING]", true); - fifo = configuration.getBoolean("[@FIFO]", false); - destination = configuration.getString("[@destinationURL]"); - if (destination.charAt(destination.length() - 1) == '/') { - // Remove the trailing / as well as the protocol marker - mboxFile = destination.substring("mbox://".length(), destination.lastIndexOf("/")); - } else { - mboxFile = destination.substring("mbox://".length()); - } - - LOGGER.debug("MBoxMailRepository.destinationURL: {}", destination); - - String checkType = configuration.getString("[@type]"); - if (!(checkType.equals("MAIL") || checkType.equals("SPOOL"))) { - String exceptionString = "Attempt to configure MboxMailRepository as " + checkType; - LOGGER.warn(exceptionString); - throw new ConfigurationException(exceptionString); - } - } - - /** - * Convert a MimeMessage into raw text - * - * @param mc - * The mime message to convert - * @return A string representation of the mime message - * @throws IOException - * @throws MessagingException - */ - private String getRawMessage(MimeMessage mc) throws IOException, MessagingException { - - ByteArrayOutputStream rawMessage = new ByteArrayOutputStream(); - mc.writeTo(rawMessage); - return rawMessage.toString(); - } - - /** - * Parse a text block as an email and convert it into a mime message - * - * @param emailBody - * The headers and body of an email. This will be parsed into a - * mime message and stored - */ - private MimeMessage convertTextToMimeMessage(String emailBody) { - // this.emailBody = emailBody; - MimeMessage mimeMessage = null; - // Parse the mime message as we have the full message now (in string - // format) - ByteArrayInputStream mb = new ByteArrayInputStream(emailBody.getBytes()); - Properties props = System.getProperties(); - Session session = Session.getDefaultInstance(props); - try { - mimeMessage = new MimeMessage(session, mb); - - } catch (MessagingException e) { - LOGGER.error("Unable to parse mime message!", e); - } - - if (mimeMessage == null) { - LOGGER.debug("Mime message is null"); - } - - return mimeMessage; - } - - /** - * Generate a hex representation of a SHA-256 checksum on the email body - */ - private String generateKeyValue(String emailBody) { - return Hashing.sha256().hashUnencodedChars(emailBody).toString(); - } - - /** - * Parse the mbox file. - * - * @param ins - * The random access file to load. Note that the file may or may - * not start at offset 0 in the file - * @param messAct - * The action to take when a message is found - */ - private MimeMessage parseMboxFile(RandomAccessFile ins, MessageAction messAct) { - LOGGER.debug("Start parsing {}", mboxFile); - try { - - Pattern sepMatchPattern = Pattern.compile("^From (.*) (.*):(.*):(.*)$"); - - int c; - boolean inMessage = false; - StringBuffer messageBuffer = new StringBuffer(); - String previousMessageSeparator = null; - boolean foundSep; - - long prevMessageStart = ins.getFilePointer(); - if (BUFFERING) { - String line; - while ((line = ins.readLine()) != null) { - foundSep = sepMatchPattern.matcher(line).matches(); - - if (foundSep && inMessage) { - MimeMessage endResult = messAct.messageAction(previousMessageSeparator, messageBuffer.toString(), prevMessageStart); - if (messAct.isComplete()) { - // I've got what I want so just exit - return endResult; - } - previousMessageSeparator = line; - prevMessageStart = ins.getFilePointer() - line.length(); - messageBuffer = new StringBuffer(); - inMessage = true; - } - // Only done at the start (first header) - if (foundSep && !inMessage) { - previousMessageSeparator = line; - inMessage = true; - } - if (!foundSep && inMessage) { - messageBuffer.append(line).append("\n"); - } - } - } else { - StringBuffer line = new StringBuffer(); - while ((c = ins.read()) != -1) { - if (c == 10) { - foundSep = sepMatchPattern.matcher(line).matches(); - if (foundSep && inMessage) { - MimeMessage endResult = messAct.messageAction(previousMessageSeparator, messageBuffer.toString(), prevMessageStart); - if (messAct.isComplete()) { - // I've got what I want so just exit - return endResult; - } - previousMessageSeparator = line.toString(); - prevMessageStart = ins.getFilePointer() - line.length(); - messageBuffer = new StringBuffer(); - inMessage = true; - } - // Only done at the start (first header) - if (foundSep && !inMessage) { - previousMessageSeparator = line.toString(); - inMessage = true; - } - if (!foundSep) { - messageBuffer.append(line).append((char) c); - } - line = new StringBuffer(); // Reset buffer - } else { - line.append((char) c); - } - } - } - - if (messageBuffer.length() != 0) { - // process last message - return messAct.messageAction(previousMessageSeparator, messageBuffer.toString(), prevMessageStart); - } - } catch (IOException ioEx) { - LOGGER.error("Unable to write file (General I/O problem) {}", mboxFile, ioEx); - } catch (PatternSyntaxException e) { - LOGGER.error("Bad regex passed {}", mboxFile, e); - } finally { - LOGGER.debug("Finished parsing {}", mboxFile); - } - return null; - } - - /** - * Find a given message<br> - * This method will first use selectMessage(key) to see if the key/offset - * combination allows us to skip parts of the file and only load the message - * we are interested in - * - * @param key - * The key of the message to find - */ - private MimeMessage findMessage(String key) { - MimeMessage foundMessage; - - // See if we can get the message by using the cache position first - foundMessage = selectMessage(key); - if (foundMessage == null) { - // If the message is not found something has changed from - // the cache. The cache may have been invalidated by - // another method, or the file may have been replaced from - // underneath us. Reload the cache, and try again. - mList = null; - loadKeys(); - foundMessage = selectMessage(key); - } - return foundMessage; - } - - /** - * Quickly find a message by using the stored message offsets - * - * @param key - * The key of the message to find - */ - private MimeMessage selectMessage(final String key) { - MimeMessage foundMessage = null; - // Can we find the key first - if (mList == null || !mList.containsKey(key)) { - // Not initiailised so no point looking - LOGGER.debug("mList - key not found {}", mboxFile); - return foundMessage; - } - long messageStart = mList.get(key); - LOGGER.debug("Load message starting at offset {} from file {}", messageStart, mboxFile); - // Now try and find the position in the file - RandomAccessFile ins = null; - try { - ins = new RandomAccessFile(mboxFile, "r"); - if (messageStart != 0) { - ins.seek(messageStart - 1); - } - MessageAction op = new MessageAction() { - @Override - public boolean isComplete() { - return true; - } - - @Override - public MimeMessage messageAction(String messageSeparator, String bodyText, long messageStart) { - if (key.equals(generateKeyValue(bodyText))) { - LOGGER.debug("{} Located message. Returning MIME message", this.getClass().getName()); - return convertTextToMimeMessage(bodyText); - } - return null; - } - }; - foundMessage = this.parseMboxFile(ins, op); - } catch (FileNotFoundException e) { - LOGGER.error("Unable to save(open) file (File not found) {}", mboxFile, e); - } catch (IOException e) { - LOGGER.error("Unable to write file (General I/O problem) {}", mboxFile, e); - } finally { - if (foundMessage == null) { - LOGGER.debug("select - message not found {}", mboxFile); - } - if (ins != null) { - try { - ins.close(); - } catch (IOException e) { - LOGGER.error("Unable to close file (General I/O problem) {}", mboxFile, e); - } - } - } - return foundMessage; - } - - /** - * Load the message keys and file pointer offsets from disk - */ - private synchronized void loadKeys() { - if (mList != null) { - return; - } - RandomAccessFile ins = null; - try { - ins = new RandomAccessFile(mboxFile, "r"); - long initialCapacity = (ins.length() > MLISTPRESIZEFACTOR ? ins.length() / MLISTPRESIZEFACTOR : 0); - if (initialCapacity < DEFAULTMLISTCAPACITY) { - initialCapacity = DEFAULTMLISTCAPACITY; - } - if (initialCapacity > Integer.MAX_VALUE) { - initialCapacity = Integer.MAX_VALUE - 1; - } - this.mList = new Hashtable<>((int) initialCapacity); - this.parseMboxFile(ins, new MessageAction() { - @Override - public boolean isComplete() { - return false; - } - - @Override - public MimeMessage messageAction(String messageSeparator, String bodyText, long messageStart) { - String key = generateKeyValue(bodyText); - mList.put(key, messageStart); - LOGGER.debug("Key {} at {}", key, messageStart); - - return null; - } - }); - // System.out.println("Done Load keys!"); - } catch (FileNotFoundException e) { - LOGGER.error("Unable to save(open) file (File not found) {}", mboxFile, e); - this.mList = new Hashtable<>((int) DEFAULTMLISTCAPACITY); - } catch (IOException e) { - LOGGER.error("Unable to write file (General I/O problem) {}", mboxFile, e); - } finally { - if (ins != null) { - try { - ins.close(); - } catch (IOException e) { - LOGGER.error("Unable to close file (General I/O problem) {}", mboxFile, e); - } - } - } - } - - @Override - public MailKey store(Mail mc) { - LOGGER.debug("Will store message to file {}", mboxFile); - - this.mList = null; - // Now make up the from header - String fromHeader = null; - String message = null; - try { - message = getRawMessage(mc.getMessage()); - // check for nullsender - if (mc.getMessage().getFrom() == null) { - fromHeader = "From " + dy.format(Calendar.getInstance().getTime()); - } else { - fromHeader = "From " + mc.getMessage().getFrom()[0] + " " + dy.format(Calendar.getInstance().getTime()); - } - - } catch (IOException | MessagingException e) { - LOGGER.error("Unable to parse mime message for {}", mboxFile, e); - } - // And save only the new stuff to disk - RandomAccessFile saveFile; - try { - saveFile = new RandomAccessFile(mboxFile, "rw"); - saveFile.seek(saveFile.length()); // Move to the end - saveFile.writeBytes((fromHeader + "\n")); - saveFile.writeBytes((message + "\n")); - saveFile.close(); - } catch (FileNotFoundException e) { - LOGGER.error("Unable to save(open) file (File not found) {}", mboxFile, e); - } catch (IOException e) { - LOGGER.error("Unable to write file (General I/O problem) {}", mboxFile, e); - } - return MailKey.forMail(mc); - } - - @Override - public Iterator<MailKey> list() { - ArrayList<String> keys = loadKeysAsArray(); - - if (!keys.isEmpty()) { - // find the first message. This is a trick to make sure that if - // the file is changed out from under us, we will detect it and - // correct for it BEFORE we return the iterator. - findMessage(keys.iterator().next()); - } - - LOGGER.debug("{} keys to be iterated over.", keys.size()); - if (fifo) { - Collections.sort(keys); // Keys is a HashSet; impose FIFO for apps that need it - } - return keys.stream() - .map(MailKey::new) - .iterator(); - } - - private ArrayList<String> loadKeysAsArray() { - loadKeys(); - return new ArrayList<>(mList.keySet()); - } - - @Override - public Mail retrieve(MailKey key) throws MessagingException { - - loadKeys(); - - MimeMessage foundMessage = findMessage(key.asString()); - if (foundMessage == null) { - LOGGER.error("found message is null!"); - return null; - } - MailImpl res = MailImpl.builder() - .name(key.asString()) - .mimeMessage(foundMessage) - .build(); - LOGGER.debug("Retrieving entry for key {}", key); - return res; - } - - @Override - public void remove(Mail mail) { - ArrayList<Mail> remArray = new ArrayList<>(); - remArray.add(mail); - remove(remArray); - } - - /** - * Attempt to get a lock on the mbox by creating the file mboxname.lock - * - * @throws Exception - */ - private void lockMBox() throws Exception { - // Create the lock file (if possible) - String lockFileName = mboxFile + LOCKEXT; - int sleepCount = 0; - File mBoxLock = new File(lockFileName); - if (!mBoxLock.createNewFile()) { - // This is not good, somebody got the lock before me - // So wait for a file - while (!mBoxLock.createNewFile() && sleepCount < MAXSLEEPTIMES) { - try { - LOGGER.debug("Waiting for lock on file {}", mboxFile); - - Thread.sleep(LOCKSLEEPDELAY); - sleepCount++; - } catch (InterruptedException e) { - LOGGER.error("File lock wait for {} interrupted!", mboxFile, e); - - } - } - if (sleepCount >= MAXSLEEPTIMES) { - throw new Exception("Unable to get lock on file " + mboxFile); - } - } - } - - /** - * Unlock a previously locked mbox file - */ - private void unlockMBox() { - // Just delete the MBOX file - String lockFileName = mboxFile + LOCKEXT; - File mBoxLock = new File(lockFileName); - try { - FileUtils.forceDelete(mBoxLock); - } catch (IOException e) { - LOGGER.error("{} Failed to delete lock file {}", getClass().getName(), lockFileName); - } - } - - @Override - public void remove(final Collection<Mail> mails) { - LOGGER.debug("Removing entry for key {}", mails); - // The plan is as follows: - // Attempt to locate the message in the file - // by reading through the - // once we've done that then seek to the file - try { - RandomAccessFile ins = new RandomAccessFile(mboxFile, "r"); // The source - final RandomAccessFile outputFile = new RandomAccessFile(mboxFile + WORKEXT, "rw"); // The destination - parseMboxFile(ins, new MessageAction() { - @Override - public boolean isComplete() { - return false; - } - - @Override - public MimeMessage messageAction(String messageSeparator, String bodyText, long messageStart) { - // Write out the messages as we go, until we reach the key - // we want - try { - String currentKey = generateKeyValue(bodyText); - boolean foundKey = false; - Iterator<Mail> mailList = mails.iterator(); - String key; - while (mailList.hasNext()) { - // Attempt to find the current key in the array - key = mailList.next().getName(); - if (key.equals(currentKey)) { - // Don't write the message to disk - foundKey = true; - break; - } - } - if (!foundKey) { - // We didn't find the key in the array so we will - // keep it - outputFile.writeBytes(messageSeparator + "\n"); - outputFile.writeBytes(bodyText); - - } - } catch (IOException e) { - LOGGER.error("Unable to write file (General I/O problem) {}", mboxFile, e); - } - return null; - } - }); - ins.close(); - outputFile.close(); - // Delete the old mbox file - File mbox = new File(mboxFile); - FileUtils.forceDelete(mbox); - // And rename the lock file to be the new mbox - mbox = new File(mboxFile + WORKEXT); - if (!mbox.renameTo(new File(mboxFile))) { - throw new IOException("Failed to rename file " + mbox + " -> " + mboxFile); - } - - // Now delete the keys in mails from the main hash - Iterator<Mail> mailList = mails.iterator(); - String key; - while (mailList.hasNext()) { - // Attempt to find the current key in the array - key = mailList.next().getName(); - mList.remove(key); - } - - } catch (FileNotFoundException e) { - LOGGER.error("Unable to save(open) file (File not found) {}", mboxFile, e); - } catch (IOException e) { - LOGGER.error("Unable to write file (General I/O problem) {}", mboxFile, e); - } - } - - @Override - public void remove(MailKey key) throws MessagingException { - loadKeys(); - try { - lockMBox(); - } catch (Exception e) { - LOGGER.error("Lock failed!", e); - return; // No lock, so exit - } - ArrayList<Mail> keys = new ArrayList<>(); - keys.add(retrieve(key)); - - this.remove(keys); - unlockMBox(); - } - - @Override - public boolean lock(MailKey key) { - return false; - } - - @Override - public boolean unlock(MailKey key) { - return false; - } - - @Override - public long size() { - return loadKeysAsArray().size(); - } - - @Override - public void removeAll() throws MessagingException { - ImmutableList.copyOf(list()) - .forEach(Throwing.<MailKey>consumer(this::remove).sneakyThrow()); - } -} diff --git a/server/data/data-file/src/test/java/org/apache/james/mailrepository/MBoxMailRepositoryTest.java b/server/data/data-file/src/test/java/org/apache/james/mailrepository/MBoxMailRepositoryTest.java deleted file mode 100644 index 97c1085..0000000 --- a/server/data/data-file/src/test/java/org/apache/james/mailrepository/MBoxMailRepositoryTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************** - * 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.mailrepository; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.File; -import java.util.Iterator; - -import org.apache.commons.configuration.DefaultConfigurationBuilder; -import org.apache.james.filesystem.api.mock.MockFileSystem; -import org.apache.james.mailrepository.api.MailKey; -import org.apache.james.mailrepository.api.MailRepository; -import org.apache.james.mailrepository.file.MBoxMailRepository; -import org.junit.Test; - -/** - * NOTE this test *WAS* disabled because MBoxMailRepository does not currently - * support most simple operations for the MailRepository interface. - * - * NOTE this previously extended AbstractMailRepositoryTest to run all of the - * common mail repository tests on the MBox implementation. - * - * @Deprecated: See JAMES-2323 - * - * Will be removed in James 3.2.0 upcoming release. - * - * Use a modern, maintained MailRepository instead. For instead FileMailRepository. - */ -@Deprecated -public class MBoxMailRepositoryTest { - - protected MailRepository getMailRepository() throws Exception { - MBoxMailRepository mr = new MBoxMailRepository(); - - DefaultConfigurationBuilder defaultConfiguration = new DefaultConfigurationBuilder(); - - File fInbox = new MockFileSystem().getFile("file://conf/org/apache/james/mailrepository/testdata/Inbox"); - String mboxPath = "mbox://" + fInbox.toURI().toString().substring(new File("").toURI().toString().length()); - - defaultConfiguration.addProperty("[@destinationURL]", mboxPath); - defaultConfiguration.addProperty("[@type]", "MAIL"); - mr.configure(defaultConfiguration); - - return mr; - } - - // Try to write a unit test for JAMES-744. At the moment it seems that we - // cannot reproduce it. - @Test - public void testReadMboxrdFile() throws Exception { - MailRepository mr = getMailRepository(); - - Iterator<MailKey> keys = mr.list(); - - assertThat(keys.hasNext()).describedAs("Two messages in list").isTrue(); - keys.next(); - - assertThat(keys.hasNext()).describedAs("One messages in list").isTrue(); - keys.next(); - - assertThat(keys.hasNext()).describedAs("No messages").isFalse(); - } - - /* - * public void runBare() throws Throwable { - * System.err.println("TEST DISABLED!"); // Decomment this or remove this - * method to re-enable the MBoxRepository testing // super.runBare(); } - */ -} --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
