
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * ¼Ò½ºÇ°ÁúÀÇ Report Á¦ÃâÀ» À§ÇØ ¸¸µé¾îÁø Utility.
 * ÀÔ·ÂµÈ ´ÙÁß Folder¸¦ ±âÁØÀ¸·Î È®ÀåÀÚ¿¡ ÇØ´çÇÏ´Â FileÀ» Sub Folder ±îÁö Ã£´Â´Ù.
 * 
 * @author Jeong-Hoon, KIM
 * 2008. 03. 04
 */
public class Findir {

	private List directoryList = new ArrayList();
	private int count = 0;
	private String extension = "";
	private int tempListCount = 0;

	/**
	 * Get a Directory List
	 * 
	 * @param directoryList
	 * @return
	 */
	List getDirectoryList(List directoryList) {
		Iterator iter = directoryList.iterator();
		ArrayList arrList = new ArrayList();
		while (iter.hasNext()) {
			arrList.clear(); //µð·ºÅä¸® List¸¦ ´ã´Â Arrylist´Â ÇÑ¹ø µ¹°í clear ÇÑ ÈÄ »õ·Î list¸¦ ´ã´Â´Ù.
			Object objDirectoryPath = iter.next();
//			System.out.println(objDirectoryPath);
			this.setExtension();
			arrList = getArrayList(objDirectoryPath, arrList);
			printOut(directoryList,objDirectoryPath,arrList);
		}
		return arrList;
	}
	
	/**
	 * Get a extension.
	 * @return
	 */
	String getExtension(){
		return extension ;
	}

	/**
	 * Set a extension.
	 * @param extension
	 * @return
	 */
	
	String setExtension() {
		System.out.println("hi");
		if(count%2 == 0){
			this.extension = "java";
			count++;
		} else{
			this.extension = "jsp";
			count++;
		}		
		return this.extension;
	}

	/**
	 * Directory Path¸¦ °¡Áø FileÀ» ¸¸µç´Ù.
	 * @param objDirectoryPath
	 * @param arrList
	 * @return
	 */
	private ArrayList getArrayList(Object objDirectoryPath, ArrayList arrList) {
		File fileDirectoryPath = new File(objDirectoryPath.toString());
		if(fileDirectoryPath.isDirectory()){
			arrList = getFileList(fileDirectoryPath, arrList);
		}
		else{}
		return arrList;
	}

	/**
	 * °¢°¢ÀÇ DirectoryÀÇ file List¸¦ °¡Á®¿Â´Ù.
	 * It is important Logic.
	 * 
	 * @param iter
	 * @param arrList
	 * @return
	 */
	private ArrayList getFileList(File directoryPath, ArrayList arrList) {
		try{
			String[] fileList = directoryPath.list();
			File list = null;
			for (int i = 0; i < fileList.length; i++) {
				list = new File(directoryPath.getAbsolutePath(), fileList[i]);
					if (list.isDirectory()) {
						getArrayList(list, arrList);
					} else if (fileList[i].substring(
							getModifyFileLength(fileList[i], getExtension()),
							fileList[i].length()).toLowerCase().equals(getExtension())) {
						arrList.add(list.getAbsolutePath());
					}	
			}			
		}catch(Exception e){
			System.out.println("µð·ºÅä¸® À§Ä¡ ¿À·ù.");
			e.printStackTrace();
		}
		return arrList;
	}

	/**
	 * It find a start point in a extension.
	 * @param file
	 * @param searchValue
	 * @return
	 */
	private int getModifyFileLength(String file, String searchValue) {
		int beginValue = file.length() - getExtension().length();
		if (beginValue < 0) {
			return 0;
		}
		return beginValue;
	}

	/**
	 * ÀüÃ¼ PathÀÇ Count¸¦ °¡Á®¿Â´Ù.
	 * 
	 * @return
	 */
	int getDirectoryCount(List directoryList) {
		int directoryCount = 0;
		directoryCount = directoryList.size();
		return directoryCount;
	}

	/**
	 * Set paths of directory.
	 * 
	 * @param directoryPath
	 * @return
	 */
	List setSearchOption(String directoryPath) {
		this.setDirectoryList(directoryPath);
		return this.directoryList;
	}
	
	/**
	 * Add a DirectoryList
	 * @param directoryPath
	 * @return
	 */
	String setDirectoryList(String directoryPath){
		this.directoryList.add(directoryPath);
		return directoryPath;
	}
	


	/**
	 * main();
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		Findir dc = new Findir();
		List path = dc.directoryList();
		dc.getDirectoryList(path);
	}

	/**
	 * It define paths of directories.
	 * @return
	 */
	private List directoryList() {
		List path;
		path = setSearchOption("Root");
		return path;
	}

	/**
	 * It print lists.
	 * @param directoryList
	 * @param objDirectoryList
	 * @param list
	 */
	private void printOut(List directoryList,Object objDirectoryList,ArrayList list) {
//		System.out.println("Directory \n" + list);
//		System.out.println("Á¶È¸ÇÒ µð·ºÅä¸® °¹¼ö ["+directoryList.size()+"]\n");
//		System.out.println(objDirectoryList + "\n");
//		System.out.println(convertListToStr(list));
//		System.out.println("Count -> [" + list.size()+"]\n");
		System.out.println(list.size()+"\t"+objDirectoryList);
		this.tempListCount = this.tempListCount + list.size();
		if(this.count%2 == 0){
			System.out.println(this.tempListCount);
			this.tempListCount = 0;
		}
	}

	/**
	 * It make a list of string using List. 
	 * @param list
	 * @return
	 */
	private String convertListToStr(List list) {
		Iterator iter = list.iterator();
		StringBuilder sb = new StringBuilder();
		while(iter.hasNext()){
			sb.append(iter.next());
			sb.append("\n");
		}
		return sb.toString();
	}
}
