1 19 20 package org.netbeans.modules.j2ee.deployment.config; 21 22 import java.io.File ; 23 import java.util.HashMap ; 24 import java.util.Iterator ; 25 import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider; 26 import org.openide.filesystems.FileAttributeEvent; 27 import org.openide.filesystems.FileChangeListener; 28 import org.openide.filesystems.FileEvent; 29 import org.openide.filesystems.FileObject; 30 import org.openide.filesystems.FileRenameEvent; 31 import org.openide.filesystems.FileUtil; 32 33 39 public abstract class AbstractFilesListener { 40 protected J2eeModuleProvider provider; 41 private HashMap fileListeners = new HashMap (); 42 43 private FileChangeListener listener = new FileListener(); 44 45 46 public AbstractFilesListener(J2eeModuleProvider provider) { 47 this.provider = provider; 48 startListening(); 49 } 50 51 protected abstract File [] getTargetFiles(); 52 protected abstract boolean isTarget(FileObject fo); 53 protected abstract boolean isTarget(String fileName); 54 protected abstract void targetCreated(FileObject fo); 55 protected abstract void targetDeleted(FileObject fo); 56 protected abstract void targetChanged(FileObject fo); 57 58 private synchronized void startListening() { 59 File [] targets = getTargetFiles(); 60 for (int i=0; i<targets.length; i++) { 61 startListening(targets[i]); 62 } 63 } 64 public synchronized void stopListening() { 65 for (Iterator i = fileListeners.keySet().iterator(); i.hasNext();) { 66 FileObject fo = (FileObject) i.next(); 67 removeFileListenerFrom(fo); 68 } 69 } 70 private void startListening(File target) { 71 if (!target.isAbsolute()) { 72 return; 75 } 76 FileObject targetFO = FileUtil.toFileObject(target); 77 while (targetFO == null) { 78 target = target.getParentFile(); 79 if (target == null) 80 return; 81 targetFO = FileUtil.toFileObject(target); 82 } 83 if (!fileListeners.containsKey(targetFO)) { 84 addFileListenerTo(targetFO); 85 } 86 } 87 88 private void addFileListenerTo(FileObject fo) { 89 FileChangeListener l = FileUtil.weakFileChangeListener(listener, fo); 90 fileListeners.put(fo, l); 91 fo.addFileChangeListener(l); 92 93 } 94 95 private void removeFileListenerFrom(FileObject fo) { 96 FileChangeListener l = (FileChangeListener)fileListeners.remove(fo); 97 if (l != null) { 98 fo.removeFileChangeListener(l); 99 } 100 } 101 102 private final class FileListener implements FileChangeListener { 103 104 public void fileFolderCreated(FileEvent e) { 105 startListening(); 106 } 107 public void fileDeleted(FileEvent e) { 108 FileObject fo = e.getFile(); 109 if (isTarget(fo)) { 110 synchronized(fileListeners) { 111 removeFileListenerFrom(fo); 112 } 113 targetDeleted(fo); 114 } 115 startListening(); 116 } 117 public void fileDataCreated(FileEvent e) { 118 FileObject fo = e.getFile(); 119 if (isTarget(fo)) { 120 synchronized(fileListeners) { 121 addFileListenerTo(fo); 122 } 123 targetCreated(fo); 124 } 125 } 126 public void fileRenamed(FileRenameEvent e) { 127 FileObject fo = e.getFile(); 128 if (isTarget(fo)) { 129 synchronized(fileListeners) { 130 if (!fileListeners.containsKey(fo)) { 131 addFileListenerTo(fo); 132 } 133 } 134 targetCreated(fo); 135 } else { 136 if (isTarget(e.getName() + "." + e.getExt())) { 137 synchronized(fileListeners) { 138 removeFileListenerFrom(fo); 139 } 140 targetDeleted(fo); 141 } 142 } 143 startListening(); 144 } 145 146 public void fileAttributeChanged(FileAttributeEvent e) {}; 147 148 public void fileChanged(FileEvent e) { 149 FileObject fo = e.getFile(); 150 if (isTarget(fo)) { 151 fo.refresh(true); 152 targetChanged(fo); 153 } 154 } 155 } 156 } 157 | Popular Tags |