Procházet zdrojové kódy

Merge pull request #595 from csmith/plugins

Tidy up plugin refreshing.
pull/598/merge
Shane Mc Cormack před 9 roky
rodič
revize
ecc1e488ed

+ 10
- 10
src/com/dmdirc/plugins/PluginFileHandler.java Zobrazit soubor

@@ -32,10 +32,11 @@ import java.io.IOException;
32 32
 import java.nio.file.FileVisitOption;
33 33
 import java.nio.file.Files;
34 34
 import java.nio.file.Path;
35
-import java.util.ArrayList;
36 35
 import java.util.Collection;
37 36
 import java.util.Collections;
37
+import java.util.HashSet;
38 38
 import java.util.Map;
39
+import java.util.Set;
39 40
 import java.util.concurrent.CopyOnWriteArrayList;
40 41
 import java.util.function.Function;
41 42
 import java.util.stream.Collectors;
@@ -71,16 +72,16 @@ public class PluginFileHandler {
71 72
      * @param manager The plugin manager to pass to new metadata instances.
72 73
      * @return Collection of valid plugins.
73 74
      */
74
-    public Collection<PluginMetaData> refresh(final PluginManager manager) {
75
+    public Set<PluginMetaData> refresh(final PluginManager manager) {
75 76
         applyUpdates();
76 77
 
77
-        final Collection<PluginMetaData> metadata = findAllPlugins(manager);
78
+        final Set<PluginMetaData> metadata = findAllPlugins(manager);
78 79
 
79 80
         // Deal with plugins that had errors
80 81
         metadata.stream().filter(PluginMetaData::hasErrors).forEach(this::reportErrors);
81 82
         metadata.removeIf(PluginMetaData::hasErrors);
82 83
 
83
-        final Collection<PluginMetaData> newPlugins = getValidPlugins(metadata);
84
+        final Set<PluginMetaData> newPlugins = getValidPlugins(metadata);
84 85
 
85 86
         knownPlugins.clear();
86 87
         knownPlugins.addAll(newPlugins);
@@ -133,16 +134,16 @@ public class PluginFileHandler {
133 134
      * @param manager The plugin manager to pass to new metadata instances.
134 135
      * @return Collection of all plugins with loadable metadata.
135 136
      */
136
-    private Collection<PluginMetaData> findAllPlugins(final PluginManager manager) {
137
+    private Set<PluginMetaData> findAllPlugins(final PluginManager manager) {
137 138
         try {
138 139
             return Files.walk(directory, FileVisitOption.FOLLOW_LINKS)
139 140
                     .filter(p -> p.getFileName().toString().endsWith(".jar"))
140 141
                     .map(Path::toAbsolutePath)
141 142
                     .map(path -> getMetaData(path, manager))
142
-                    .collect(Collectors.toList());
143
+                    .collect(Collectors.toSet());
143 144
         } catch (IOException ex) {
144 145
             LOG.error(USER_ERROR, "Unable to read plugin directory.", ex);
145
-            return Collections.emptyList();
146
+            return Collections.emptySet();
146 147
         }
147 148
     }
148 149
 
@@ -203,8 +204,7 @@ public class PluginFileHandler {
203 204
      * @param metadata The collection of metadata to validate.
204 205
      * @return The collection of metadata that passed validation.
205 206
      */
206
-    private Collection<PluginMetaData> getValidPlugins(
207
-            final Collection<PluginMetaData> metadata) {
207
+    private Set<PluginMetaData> getValidPlugins(final Collection<PluginMetaData> metadata) {
208 208
         // Collect a map by name
209 209
         final Map<String, PluginMetaData> metaDataByName = metadata.stream()
210 210
                 .collect(Collectors.toMap(PluginMetaData::getName, Function.identity()));
@@ -213,7 +213,7 @@ public class PluginFileHandler {
213 213
         final Multimap<String, String> services = getServices(metadata);
214 214
 
215 215
         // Validate each in turn
216
-        final Collection<PluginMetaData> res = new ArrayList<>();
216
+        final Set<PluginMetaData> res = new HashSet<>();
217 217
         for (PluginMetaData target : metadata) {
218 218
             final PluginMetaDataValidator validator = new PluginMetaDataValidator(target);
219 219
             final Collection<String> results = validator.validate(metaDataByName, services);

+ 28
- 16
src/com/dmdirc/plugins/PluginManager.java Zobrazit soubor

@@ -28,6 +28,8 @@ import com.dmdirc.interfaces.config.IdentityController;
28 28
 import com.dmdirc.updater.components.PluginComponent;
29 29
 import com.dmdirc.updater.manager.UpdateManager;
30 30
 
31
+import com.google.common.collect.Sets;
32
+
31 33
 import java.io.File;
32 34
 import java.nio.file.Paths;
33 35
 import java.util.ArrayList;
@@ -36,6 +38,7 @@ import java.util.HashMap;
36 38
 import java.util.HashSet;
37 39
 import java.util.List;
38 40
 import java.util.Map;
41
+import java.util.Set;
39 42
 
40 43
 import org.slf4j.Logger;
41 44
 import org.slf4j.LoggerFactory;
@@ -50,10 +53,12 @@ import static com.dmdirc.util.LogUtils.USER_ERROR;
50 53
 public class PluginManager {
51 54
 
52 55
     private static final Logger LOG = LoggerFactory.getLogger(PluginManager.class);
56
+
53 57
     /** List of known plugins' file names to their corresponding {@link PluginInfo} objects. */
54 58
     private final Map<String, PluginInfo> knownPlugins = new HashMap<>();
55 59
     /** Set of known plugins' metadata. */
56
-    private final Collection<PluginMetaData> plugins = new HashSet<>();
60
+    private final Set<PluginMetaData> plugins = new HashSet<>();
61
+    /** File handler to use for disk-based functions. */
57 62
     private final PluginFileHandler fileHandler;
58 63
     /** Directory where plugins are stored. */
59 64
     private final String directory;
@@ -291,25 +296,32 @@ public class PluginManager {
291 296
      * Refreshes the list of known plugins.
292 297
      */
293 298
     public void refreshPlugins() {
294
-        final Collection<PluginMetaData> newPlugins = fileHandler.refresh(this);
295
-
296
-        for (PluginMetaData plugin : newPlugins) {
297
-            addPlugin(plugin.getRelativeFilename());
298
-        }
299
+        final Set<PluginMetaData> newPlugins = fileHandler.refresh(this);
299 300
 
300
-        // Update our list of plugins
301
-        synchronized (plugins) {
302
-            plugins.removeAll(newPlugins);
301
+        Sets.difference(plugins, newPlugins).forEach(this::handlePluginDeleted);
302
+        Sets.difference(newPlugins, plugins).forEach(this::handleNewPluginFound);
303 303
 
304
-            for (PluginMetaData oldPlugin : new HashSet<>(plugins)) {
305
-                delPlugin(oldPlugin.getRelativeFilename());
306
-            }
304
+        eventBus.publishAsync(new PluginRefreshEvent());
305
+    }
307 306
 
308
-            plugins.clear();
309
-            plugins.addAll(newPlugins);
310
-        }
307
+    /**
308
+     * Called when a new plugin has been located on disk.
309
+     *
310
+     * @param metaData The metadata of the new plugin.
311
+     */
312
+    private void handleNewPluginFound(final PluginMetaData metaData) {
313
+        plugins.add(metaData);
314
+        addPlugin(metaData.getRelativeFilename());
315
+    }
311 316
 
312
-        eventBus.publishAsync(new PluginRefreshEvent());
317
+    /**
318
+     * Called when an existing plugin has gone missing from disk.
319
+     *
320
+     * @param metaData The metadata of the deleted plugin.
321
+     */
322
+    private void handlePluginDeleted(final PluginMetaData metaData) {
323
+        plugins.remove(metaData);
324
+        delPlugin(metaData.getRelativeFilename());
313 325
     }
314 326
 
315 327
     /**

Načítá se…
Zrušit
Uložit