KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > j2ee > deployment > config > AbstractFilesListener


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 package org.netbeans.modules.j2ee.deployment.config;
21
22 import java.io.File JavaDoc;
23 import java.util.HashMap JavaDoc;
24 import java.util.Iterator JavaDoc;
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 /**
34  * Abstract deep directory file listener on list of files, existent or not.
35  *
36  * @author nn136682
37  * @author Andrei Badea
38  */

39 public abstract class AbstractFilesListener {
40     protected J2eeModuleProvider provider;
41     private HashMap JavaDoc fileListeners = new HashMap JavaDoc();
42     
43     private FileChangeListener listener = new FileListener();
44     
45     /** Creates a new instance of AbstractFilesListener */
46     public AbstractFilesListener(J2eeModuleProvider provider) {
47         this.provider = provider;
48         startListening();
49     }
50     
51     protected abstract File JavaDoc[] getTargetFiles();
52     protected abstract boolean isTarget(FileObject fo);
53     protected abstract boolean isTarget(String JavaDoc 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 JavaDoc[] 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 JavaDoc i = fileListeners.keySet().iterator(); i.hasNext();) {
66             FileObject fo = (FileObject) i.next();
67             removeFileListenerFrom(fo);
68         }
69     }
70     private void startListening(File JavaDoc target) {
71         if (!target.isAbsolute()) {
72             // workaround for issue 84872. Should be removed when
73
// issue 85132 is addressed.
74
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