/******************************************************************************* * Copyright (c) 2004 Ferenc Hechler - ferenc_hechler@users.sourceforge.net * * This file is part of the Fat Jar Eclipse Plug-In * * The Fat Jar Eclipse Plug-In is free software; * you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. * * The Fat Jar Eclipse Plug-In is distributed * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with the Fat Jar Eclipse Plug-In; * if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * *******************************************************************************/ package net.sf.fjep.fatjar.builder; import java.io.File; import java.util.Enumeration; import java.util.Stack; /** * enumerate over a file/folder structure */ public class NativeFileSystemSource extends AbstractFileSystemSource { private String relFolder; private Stack folderEnumStack; private FolderEnum currentFolderEnum; private Stack relFolderStack; private String currentRelFolder; private Stack folderStack; private File folder; private Stack elementStack; /** * enumerate over the elements in a folder */ private class FolderEnum implements Enumeration { private String[] folderInfo; private int index; public FolderEnum(File folder) { folderInfo = folder.list(); index = 0; } public FolderEnum(String[] folderInfo) { this.folderInfo = folderInfo; index = 0; } public boolean hasMoreElements() { boolean result = false; if (folderInfo != null) result = (index < folderInfo.length); return result; } public Object nextElement() { String result = folderInfo[index]; index += 1; return result; } public String toString() { StringBuffer result = new StringBuffer(); for (int i=0; i<folderInfo.length; i++) { if (i>0) result.append(','); if (i==index) result.append("(*)"); result.append(folderInfo[i]); } return result.toString(); } } /** * */ public NativeFileSystemSource(File folder, String relFolder) { this.folder = folder; this.relFolder = relFolder; description = "native " + relFolder; folderEnumStack = new Stack(); currentFolderEnum = new FolderEnum(folder); relFolderStack = new Stack(); currentRelFolder = relFolder; folderStack = new Stack(); if (folder.isFile()) { System.out.println("SPECIAL handling for file instead of folder!"); String name = folder.getName(); if (relFolder.equals(name)) { this.relFolder = ""; this.currentRelFolder = this.relFolder; } else if (relFolder.replace('\\', '/').endsWith('/' + name)) { this.relFolder = relFolder.substring(0, relFolder.replace('\\', '/').lastIndexOf('/')); this.currentRelFolder = this.relFolder; } this.folder = folder.getParentFile(); currentFolderEnum = new FolderEnum(new String[]{name}); } } public IFileSystemElement nextUnqueuedElement() { IFileSystemElement result = null; String name = null; if (currentFolderEnum.hasMoreElements()) name = (String) currentFolderEnum.nextElement(); while ((name == null) && !folderStack.isEmpty()) { currentRelFolder = (String) relFolderStack.pop(); folder = (File) folderStack.pop(); currentFolderEnum = (FolderEnum) folderEnumStack.pop(); if (currentFolderEnum.hasMoreElements()) name = (String) currentFolderEnum.nextElement(); } if (name != null) { File f = new File(folder, name); if (f.isDirectory()) { folderEnumStack.push(currentFolderEnum); currentFolderEnum = new FolderEnum(f); folderStack.push(folder); folder = f; relFolderStack.push(currentRelFolder); if (currentRelFolder.equals("")) currentRelFolder = name; else currentRelFolder += File.separatorChar + name; if (currentFolderEnum.hasMoreElements()) result = nextUnqueuedElement(); else result = new NativeFileSystemElement(folder, currentRelFolder, null); } else { result = new NativeFileSystemElement(folder, currentRelFolder, name); } } return result; } }