package com.levelup.java.io;

import static org.junit.Assert.assertTrue;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.regex.Pattern;

import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;

import com.google.common.io.PatternFilenameFilter;

/**
 * This java example will demonstrate how to filter
 * files by extension.
 * 
 * @author Justin Musgrove
 * @see <a href='http://www.leveluplunch.com/java/examples/filter-files-by-extension/'>Filter files by extension</a>
 * 
 */
public class FilterFilesByExtension {

	private static final Logger logger = Logger.getLogger(FilterFilesByExtension.class);

	private URI sourceFileURI;

	@Before
	public void setUp() throws URISyntaxException {
		sourceFileURI = this.getClass().getClassLoader().getResource("com/levelup/java/io").toURI();
	}
	
	@Test
	public void find_files_by_extension_java () {

		File dir = new File(sourceFileURI);
		File[] files = dir.listFiles(new FilenameFilter() {
		    public boolean accept(File dir, String name) {
		        return name.toLowerCase().endsWith(".txt");
		    }
		});
		
		logger.info(Arrays.toString(files));
		
		assertTrue(files.length >= 4);
	}
	
	@Test
	public void find_files_by_extension_guava () {

		Pattern pattern = Pattern.compile("^.*.txt");
		
		FilenameFilter filterByExtension = new PatternFilenameFilter(pattern);
		
		File dir = new File(sourceFileURI);
		File[] files = dir.listFiles(filterByExtension);

		logger.info(Arrays.toString(files));
		
		assertTrue(files.length >= 4);
	}
	
	@Test
	public void filter_files_by_extension () {

		File dir = new File(sourceFileURI);
		FileFilter fileFilter = new WildcardFileFilter("*.txt");
		File[] files = dir.listFiles(fileFilter);

		logger.info(Arrays.toString(files));

		assertTrue(files.length >= 4);
	}
	
	
}