1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.vfs2.util;
18
19 import java.lang.ref.WeakReference;
20
21 import org.apache.commons.vfs2.FileChangeEvent;
22 import org.apache.commons.vfs2.FileListener;
23 import org.apache.commons.vfs2.FileName;
24 import org.apache.commons.vfs2.FileObject;
25 import org.apache.commons.vfs2.FileSystem;
26
27
28
29
30
31
32 public class WeakRefFileListener implements FileListener {
33
34 private final FileSystem fs;
35 private final FileName name;
36 private final WeakReference<FileListener> listener;
37
38 protected WeakRefFileListener(final FileObject file, final FileListener listener) {
39 this.fs = file.getFileSystem();
40 this.name = file.getName();
41 this.listener = new WeakReference<>(listener);
42 }
43
44
45
46
47
48
49
50 public static void installListener(final FileObject file, final FileListener listener) {
51 final WeakRefFileListenerener.html#WeakRefFileListener">WeakRefFileListener weakListener = new WeakRefFileListener(file, listener);
52
53 file.getFileSystem().addListener(file, new WeakRefFileListener(file, weakListener));
54 }
55
56
57
58
59
60
61
62
63 protected FileListener getListener() throws Exception {
64 final FileListener listener = this.listener.get();
65 if (listener == null) {
66 try (final FileObject fileObject = fs.resolveFile(name)) {
67 fileObject.getFileSystem().removeListener(fileObject, this);
68 }
69 }
70 return listener;
71 }
72
73
74
75
76
77
78
79 @Override
80 public void fileCreated(final FileChangeEvent event) throws Exception {
81 final FileListener listener = getListener();
82 if (listener == null) {
83 return;
84 }
85 listener.fileCreated(event);
86 }
87
88
89
90
91
92
93
94 @Override
95 public void fileDeleted(final FileChangeEvent event) throws Exception {
96 final FileListener listener = getListener();
97 if (listener == null) {
98 return;
99 }
100 listener.fileDeleted(event);
101 }
102
103
104
105
106
107
108
109
110
111
112 @Override
113 public void fileChanged(final FileChangeEvent event) throws Exception {
114 final FileListener listener = getListener();
115 if (listener == null) {
116 return;
117 }
118 listener.fileChanged(event);
119 }
120 }