/* * 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.jmeter.protocol.mail.sampler; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Store; import javax.mail.URLName; public class MailFileFolder extends Folder { private static final String FILENAME_FORMAT = "%d.msg"; private static final String FILENAME_REGEX = "\\d+\\.msg"; private boolean isOpen; private final File folderPath;// Parent folder (or single message file) private final boolean isFile; private static final FilenameFilter FILENAME_FILTER = (dir, name) -> name.matches(FILENAME_REGEX); public MailFileFolder(Store store, String path) { super(store); String base = store.getURLName().getHost(); // == ServerName from mail sampler File parentFolder = new File(base); isFile = parentFolder.isFile(); if (isFile){ folderPath = new File(base); } else { folderPath = new File(base,path); } } public MailFileFolder(Store store, URLName path) { this(store, path.getFile()); } @Override public void appendMessages(Message[] messages) throws MessagingException { throw new MessagingException("Not supported"); } @Override public void close(boolean expunge) throws MessagingException { this.store.close(); isOpen = false; } @Override public boolean create(int type) throws MessagingException { return false; } @Override public boolean delete(boolean recurse) throws MessagingException { return false; } @Override public boolean exists() throws MessagingException { return true; } @Override public Message[] expunge() throws MessagingException { return new Message[0]; } @Override public Folder getFolder(String name) throws MessagingException { return this; } @Override public String getFullName() { return this.toString(); } @Override public Message getMessage(int index) throws MessagingException { File f; if (isFile) { f = folderPath; } else { f = new File(folderPath,String.format(FILENAME_FORMAT, Integer.valueOf(index))); } try (InputStream fis = new FileInputStream(f); InputStream bis = new BufferedInputStream(fis)) { return new MailFileMessage(this, bis, index); } catch (IOException e) { throw new MessagingException( "Cannot open folder: " + e.getMessage(), e); } } @Override public int getMessageCount() throws MessagingException { if (!isOpen) { return -1; } if (isFile) { return 1; } File[] listFiles = folderPath.listFiles(FILENAME_FILTER); return listFiles != null ? listFiles.length : 0; } @Override public String getName() { return this.toString(); } @Override public Folder getParent() throws MessagingException { return null; } @Override public Flags getPermanentFlags() { return null; } @Override public char getSeparator() throws MessagingException { return '/'; } @Override public int getType() throws MessagingException { return HOLDS_MESSAGES; } @Override public boolean hasNewMessages() throws MessagingException { return false; } @Override public boolean isOpen() { return isOpen; } @Override public Folder[] list(String pattern) throws MessagingException { return new Folder[]{this}; } @Override public void open(int mode) throws MessagingException { if (mode != READ_ONLY) { throw new MessagingException("Implementation only supports read-only access"); } this.mode = mode; isOpen = true; } @Override public boolean renameTo(Folder newName) throws MessagingException { return false; } }