1 package org.nanocontainer.deployer; 2 3 import org.apache.commons.vfs.FileObject; 4 import org.apache.commons.vfs.FileSystemException; 5 import org.apache.commons.vfs.FileSystemManager; 6 import org.apache.commons.vfs.FileType; 7 8 import java.util.ArrayList ; 9 import java.util.Arrays ; 10 import java.util.Iterator ; 11 import java.util.List ; 12 13 17 public class DifferenceAnalysingFolderContentHandler implements FolderContentHandler { 18 private final FileObject folder; 19 private final FileSystemManager fileSystemManager; 20 21 private FileObject[] lastChildren = new FileObject[0]; 22 23 public DifferenceAnalysingFolderContentHandler(FileObject folder, FileSystemManager fileSystemManager) { 24 this.folder = folder; 25 this.fileSystemManager = fileSystemManager; 26 } 27 28 public void setCurrentChildren(FileObject[] currentChildren) { 29 List current = Arrays.asList(currentChildren); 30 List last = Arrays.asList(lastChildren); 31 32 fireFolderAddedMaybe(current, last); 33 fireFolderRemovedMaybe(current, last); 34 35 lastChildren = currentChildren; 36 } 37 38 private void fireFolderAddedMaybe(List current, List last) { 39 current = new ArrayList (current); 40 last = new ArrayList (last); 41 42 current.removeAll(last); 43 for (Iterator iterator = current.iterator(); iterator.hasNext();) { 44 FileObject fileObject = (FileObject) iterator.next(); 45 FileObject folderObject = convertToFolder(fileObject); 46 if (folderObject != null && folderListener != null) { 47 folderListener.folderAdded(folderObject); 48 } 49 } 50 } 51 52 private void fireFolderRemovedMaybe(List current, List last) { 53 current = new ArrayList (current); 54 last = new ArrayList (last); 55 56 last.removeAll(current); 57 for (Iterator iterator = last.iterator(); iterator.hasNext();) { 58 FileObject fileObject = (FileObject) iterator.next(); 59 FileObject folderObject = convertToFolder(fileObject); 60 if (folderObject != null && folderListener != null) { 61 folderListener.folderRemoved(fileObject); 62 } 63 } 64 } 65 66 private FileObject convertToFolder(FileObject fileObject) { 67 FileObject result = null; 68 try { 69 if (fileObject.getType().equals(FileType.FOLDER)) { 70 result = fileObject; 71 } else if (fileObject.getType().equals(FileType.FILE)) { 72 String extension = fileObject.getName().getExtension(); 73 if (extension.equals("zip") || extension.equals("jar")) { 74 String url = "zip:" + fileObject.getURL().getFile(); 75 result = fileSystemManager.resolveFile(url); 76 } 77 } 78 } catch (FileSystemException ignore) { 79 } 80 return result; 81 } 82 83 public FileObject getFolder() { 84 return folder; 85 } 86 87 private FolderListener folderListener; 88 89 public void addFolderListener(FolderListener folderListener) { 90 if (this.folderListener != null) { 91 throw new IllegalStateException (FolderListener.class.getName() + " already added"); 92 } 93 this.folderListener = folderListener; 94 } 95 96 public void removeFolderListener(DeployingFolderListener deployingFolderListener) { 97 this.folderListener = null; 98 } 99 } | Popular Tags |