/******************************************************************************* * Copyright (c) 2011 - 2012 Siamak Haschemi & Benjamin Haupt * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package de.bht.fpa.mail.s000000.common.mail.testdata; import static com.google.common.collect.Collections2.filter; import static com.google.common.collect.Collections2.transform; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newLinkedList; import java.io.File; import java.io.FilenameFilter; import java.util.Collection; import javax.xml.bind.JAXB; import com.google.common.base.Function; import com.google.common.base.Predicate; import de.bht.fpa.mail.s000000.common.mail.model.Message; /** * This class provides its user with a number of {@link Message} objects for * testing purposes. It reads the contents of a file-system directory.<br/> * <br/> * For example, to generate 20 {@link Message}s, do: <br/> * {@code MessageTestDataProvider provider = new MessageTestDataProvider();}<br/> * {@code provider.setTestDataProvider(new RandomTestDataProvider("/my/cool/place"));} * <br/> * {@code List<Message> messages = provider.getMessages();} * * * @author Siamak Haschemi */ public class FileSystemTestDataProvider implements ITestDataProvider { private final File basePath; public FileSystemTestDataProvider(File basePath) { if (!basePath.exists()) { throw new IllegalArgumentException("Directory '" + basePath.getAbsolutePath() + " does not exist."); } this.basePath = basePath; } @Override public Collection<Message> getMessages() { // @formatter:off return filter( transform( getXMLFilesIn(basePath), toParsedXMLMessages() ), byNonNullEntries() ); // @formatter:on } private Collection<File> getXMLFilesIn(File basePath2) { File[] xmlFiles = basePath2.listFiles(filteredByXMLFiles()); if (xmlFiles == null || xmlFiles.length == 0) { return newLinkedList(); } return newArrayList(xmlFiles); } private FilenameFilter filteredByXMLFiles() { return new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith("xml"); } }; } private Predicate<Message> byNonNullEntries() { return new Predicate<Message>() { @Override public boolean apply(Message input) { return input != null; } }; } private Function<File, Message> toParsedXMLMessages() { return new Function<File, Message>() { @Override public Message apply(File file) { try { return JAXB.unmarshal(file, Message.class); } catch (Exception e) { return null; } } }; } }