KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > netbeans > modules > j2ee > sun > share > 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.sun.share.config;
21
22 import java.io.File JavaDoc;
23 import java.util.HashMap JavaDoc;
24 import java.util.Iterator JavaDoc;
25
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 import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider;
34
35
36 /**
37  * Abstract deep directory file listener on list of files, existent or not.
38  *
39  * @author nn136682
40  * @author Andrei Badea
41  */

42 public abstract class AbstractFilesListener {
43     protected J2eeModuleProvider provider;
44     private HashMap JavaDoc fileListeners = new HashMap JavaDoc();
45     
46     private FileChangeListener listener = new FileListener();
47     
48     /** Creates a new instance of AbstractFilesListener */
49     public AbstractFilesListener(J2eeModuleProvider provider) {
50         this.provider = provider;
51         startListening();
52     }
53     
54     protected abstract File JavaDoc[] getTargetFiles();
55     protected abstract boolean isTarget(FileObject fo);
56     protected abstract boolean isTarget(String JavaDoc fileName);
57     protected abstract void targetCreated(FileObject fo);
58     protected abstract void targetDeleted(FileObject fo);
59     protected abstract void targetChanged(FileObject fo);
60     
61     private synchronized void startListening() {
62         File JavaDoc[] targets = getTargetFiles();
63         for (int i=0; i<targets.length; i++) {
64             startListening(targets[i]);
65         }
66     }
67     public synchronized void stopListening() {
68         for (Iterator JavaDoc i = fileListeners.keySet().iterator(); i.hasNext();) {
69             FileObject fo = (FileObject) i.next();
70             removeFileListenerFrom(fo);
71         }
72     }
73     private void startListening(File JavaDoc target) {
74         FileObject targetFO = FileUtil.toFileObject(target);
75         while (targetFO == null) {
76             target = target.getParentFile();
77             if (target == null)
78                 return;
79             targetFO = FileUtil.toFileObject(target);
80         }
81         if (!fileListeners.containsKey(targetFO)) {
82             addFileListenerTo(targetFO);
83         }
84     }
85     
86     private void addFileListenerTo(FileObject fo) {
87         FileChangeListener l = FileUtil.weakFileChangeListener(listener, fo);
88         fileListeners.put(fo, l);
89         fo.addFileChangeListener(l);
90         
91     }
92     
93     private void removeFileListenerFrom(FileObject fo) {
94         FileChangeListener l = (FileChangeListener)fileListeners.remove(fo);
95         if (l != null) {
96             fo.removeFileChangeListener(l);
97         }
98     }
99     
100     private final class FileListener implements FileChangeListener {
101         
102         public void fileFolderCreated(FileEvent e) {
103             startListening();
104         }
105         public void fileDeleted(FileEvent e) {
106             FileObject fo = e.getFile();
107             if (isTarget(fo)) {
108                 synchronized(fileListeners) {
109                     removeFileListenerFrom(fo);
110                 }
111                 targetDeleted(fo);
112             }
113             startListening();
114         }
115         
116         public void fileDataCreated(FileEvent e) {
117             FileObject fo = e.getFile();
118             
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
149         public void fileChanged(FileEvent e) {
150             FileObject fo = e.getFile();
151             if (isTarget(fo)) {
152                 fo.refresh(true);
153                 targetChanged(fo);
154             }
155         }
156     }
157 }
158
Popular Tags