001 package org.nanocontainer.deployer;
002
003 import org.apache.commons.vfs.FileObject;
004 import org.apache.commons.vfs.FileSystemException;
005 import org.apache.commons.vfs.FileSystemManager;
006 import org.apache.commons.vfs.FileType;
007
008 import java.util.ArrayList;
009 import java.util.Arrays;
010 import java.util.Iterator;
011 import java.util.List;
012
013 /**
014 * @author Aslak Hellesøy
015 * @version $Revision: 2343 $
016 */
017 public class DifferenceAnalysingFolderContentHandler implements FolderContentHandler {
018 private final FileObject folder;
019 private final FileSystemManager fileSystemManager;
020
021 private FileObject[] lastChildren = new FileObject[0];
022
023 public DifferenceAnalysingFolderContentHandler(FileObject folder, FileSystemManager fileSystemManager) {
024 this.folder = folder;
025 this.fileSystemManager = fileSystemManager;
026 }
027
028 public void setCurrentChildren(FileObject[] currentChildren) {
029 List current = Arrays.asList(currentChildren);
030 List last = Arrays.asList(lastChildren);
031
032 fireFolderAddedMaybe(current, last);
033 fireFolderRemovedMaybe(current, last);
034
035 lastChildren = currentChildren;
036 }
037
038 private void fireFolderAddedMaybe(List current, List last) {
039 current = new ArrayList(current);
040 last = new ArrayList(last);
041
042 current.removeAll(last);
043 for (Iterator iterator = current.iterator(); iterator.hasNext();) {
044 FileObject fileObject = (FileObject) iterator.next();
045 FileObject folderObject = convertToFolder(fileObject);
046 if (folderObject != null && folderListener != null) {
047 folderListener.folderAdded(folderObject);
048 }
049 }
050 }
051
052 private void fireFolderRemovedMaybe(List current, List last) {
053 current = new ArrayList(current);
054 last = new ArrayList(last);
055
056 last.removeAll(current);
057 for (Iterator iterator = last.iterator(); iterator.hasNext();) {
058 FileObject fileObject = (FileObject) iterator.next();
059 FileObject folderObject = convertToFolder(fileObject);
060 if (folderObject != null && folderListener != null) {
061 folderListener.folderRemoved(fileObject);
062 }
063 }
064 }
065
066 private FileObject convertToFolder(FileObject fileObject) {
067 FileObject result = null;
068 try {
069 if (fileObject.getType().equals(FileType.FOLDER)) {
070 result = fileObject;
071 } else if (fileObject.getType().equals(FileType.FILE)) {
072 String extension = fileObject.getName().getExtension();
073 if (extension.equals("zip") || extension.equals("jar")) {
074 String url = "zip:" + fileObject.getURL().getFile();
075 result = fileSystemManager.resolveFile(url);
076 }
077 }
078 } catch (FileSystemException ignore) {
079 }
080 return result;
081 }
082
083 public FileObject getFolder() {
084 return folder;
085 }
086
087 private FolderListener folderListener;
088
089 public void addFolderListener(FolderListener folderListener) {
090 if (this.folderListener != null) {
091 throw new IllegalStateException(FolderListener.class.getName() + " already added");
092 }
093 this.folderListener = folderListener;
094 }
095
096 public void removeFolderListener(DeployingFolderListener deployingFolderListener) {
097 this.folderListener = null;
098 }
099 }