001 /*
002 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003 *
004 * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005 *
006 * The contents of this file are subject to the terms of either the GNU
007 * General Public License Version 2 only ("GPL") or the Common
008 * Development and Distribution License("CDDL") (collectively, the
009 * "License"). You may not use this file except in compliance with the
010 * License. You can obtain a copy of the License at
011 * http://www.netbeans.org/cddl-gplv2.html
012 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013 * specific language governing permissions and limitations under the
014 * License. When distributing the software, include this License Header
015 * Notice in each file and include the License file at
016 * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017 * particular file as subject to the "Classpath" exception as provided
018 * by Sun in the GPL Version 2 section of the License file that
019 * accompanied this code. If applicable, add the following below the
020 * License Header, with the fields enclosed by brackets [] replaced by
021 * your own identifying information:
022 * "Portions Copyrighted [year] [name of copyright owner]"
023 *
024 * Contributor(s):
025 *
026 * The Original Software is NetBeans. The Initial Developer of the Original
027 * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028 * Microsystems, Inc. All Rights Reserved.
029 *
030 * If you wish your version of this file to be governed by only the CDDL
031 * or only the GPL Version 2, indicate your decision by adding
032 * "[Contributor] elects to include this software in this distribution
033 * under the [CDDL or GPL Version 2] license." If you do not indicate a
034 * single choice of license, a recipient has the option to distribute
035 * your version of this file under either the CDDL, the GPL Version 2 or
036 * to extend the choice of license to its licensees as provided above.
037 * However, if you add GPL Version 2 code and therefore, elected the GPL
038 * Version 2 license, then the option applies only if the new code is
039 * made subject to such option by the copyright holder.
040 */
041
042 package org.netbeans.modules.j2ee.deployment.config;
043
044 import java.io.File;
045 import java.util.HashMap;
046 import java.util.Iterator;
047 import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider;
048 import org.openide.filesystems.FileAttributeEvent;
049 import org.openide.filesystems.FileChangeListener;
050 import org.openide.filesystems.FileEvent;
051 import org.openide.filesystems.FileObject;
052 import org.openide.filesystems.FileRenameEvent;
053 import org.openide.filesystems.FileUtil;
054
055 /**
056 * Abstract deep directory file listener on list of files, existent or not.
057 *
058 * @author nn136682
059 * @author Andrei Badea
060 */
061 public abstract class AbstractFilesListener {
062 protected J2eeModuleProvider provider;
063 private HashMap fileListeners = new HashMap();
064
065 private FileChangeListener listener = new FileListener();
066
067 /** Creates a new instance of AbstractFilesListener */
068 public AbstractFilesListener(J2eeModuleProvider provider) {
069 this .provider = provider;
070 startListening();
071 }
072
073 protected abstract File[] getTargetFiles();
074
075 protected abstract boolean isTarget(FileObject fo);
076
077 protected abstract boolean isTarget(String fileName);
078
079 protected abstract void targetCreated(FileObject fo);
080
081 protected abstract void targetDeleted(FileObject fo);
082
083 protected abstract void targetChanged(FileObject fo);
084
085 private synchronized void startListening() {
086 File[] targets = getTargetFiles();
087 for (int i = 0; i < targets.length; i++) {
088 startListening(targets[i]);
089 }
090 }
091
092 public synchronized void stopListening() {
093 for (Iterator i = fileListeners.keySet().iterator(); i
094 .hasNext();) {
095 FileObject fo = (FileObject) i.next();
096 removeFileListenerFrom(fo);
097 }
098 }
099
100 private void startListening(File target) {
101 if (!target.isAbsolute()) {
102 // workaround for issue 84872. Should be removed when
103 // issue 85132 is addressed.
104 return;
105 }
106 FileObject targetFO = FileUtil.toFileObject(target);
107 while (targetFO == null) {
108 target = target.getParentFile();
109 if (target == null)
110 return;
111 targetFO = FileUtil.toFileObject(target);
112 }
113 if (!fileListeners.containsKey(targetFO)) {
114 addFileListenerTo(targetFO);
115 }
116 }
117
118 private void addFileListenerTo(FileObject fo) {
119 FileChangeListener l = FileUtil.weakFileChangeListener(
120 listener, fo);
121 fileListeners.put(fo, l);
122 fo.addFileChangeListener(l);
123
124 }
125
126 private void removeFileListenerFrom(FileObject fo) {
127 FileChangeListener l = (FileChangeListener) fileListeners
128 .remove(fo);
129 if (l != null) {
130 fo.removeFileChangeListener(l);
131 }
132 }
133
134 private final class FileListener implements FileChangeListener {
135
136 public void fileFolderCreated(FileEvent e) {
137 startListening();
138 }
139
140 public void fileDeleted(FileEvent e) {
141 FileObject fo = e.getFile();
142 if (isTarget(fo)) {
143 synchronized (fileListeners) {
144 removeFileListenerFrom(fo);
145 }
146 targetDeleted(fo);
147 }
148 startListening();
149 }
150
151 public void fileDataCreated(FileEvent e) {
152 FileObject fo = e.getFile();
153 if (isTarget(fo)) {
154 synchronized (fileListeners) {
155 addFileListenerTo(fo);
156 }
157 targetCreated(fo);
158 }
159 }
160
161 public void fileRenamed(FileRenameEvent e) {
162 FileObject fo = e.getFile();
163 if (isTarget(fo)) {
164 synchronized (fileListeners) {
165 if (!fileListeners.containsKey(fo)) {
166 addFileListenerTo(fo);
167 }
168 }
169 targetCreated(fo);
170 } else {
171 if (isTarget(e.getName() + "." + e.getExt())) {
172 synchronized (fileListeners) {
173 removeFileListenerFrom(fo);
174 }
175 targetDeleted(fo);
176 }
177 }
178 startListening();
179 }
180
181 public void fileAttributeChanged(FileAttributeEvent e) {
182 };
183
184 public void fileChanged(FileEvent e) {
185 FileObject fo = e.getFile();
186 if (isTarget(fo)) {
187 fo.refresh(true);
188 targetChanged(fo);
189 }
190 }
191 }
192 }
|