Kaynağa Gözat

Merge pull request #595 from csmith/plugins

Tidy up plugin refreshing.
pull/598/merge
Shane Mc Cormack 9 yıl önce
ebeveyn
işleme
ecc1e488ed

+ 10
- 10
src/com/dmdirc/plugins/PluginFileHandler.java Dosyayı Görüntüle

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

+ 28
- 16
src/com/dmdirc/plugins/PluginManager.java Dosyayı Görüntüle

28
 import com.dmdirc.updater.components.PluginComponent;
28
 import com.dmdirc.updater.components.PluginComponent;
29
 import com.dmdirc.updater.manager.UpdateManager;
29
 import com.dmdirc.updater.manager.UpdateManager;
30
 
30
 
31
+import com.google.common.collect.Sets;
32
+
31
 import java.io.File;
33
 import java.io.File;
32
 import java.nio.file.Paths;
34
 import java.nio.file.Paths;
33
 import java.util.ArrayList;
35
 import java.util.ArrayList;
36
 import java.util.HashSet;
38
 import java.util.HashSet;
37
 import java.util.List;
39
 import java.util.List;
38
 import java.util.Map;
40
 import java.util.Map;
41
+import java.util.Set;
39
 
42
 
40
 import org.slf4j.Logger;
43
 import org.slf4j.Logger;
41
 import org.slf4j.LoggerFactory;
44
 import org.slf4j.LoggerFactory;
50
 public class PluginManager {
53
 public class PluginManager {
51
 
54
 
52
     private static final Logger LOG = LoggerFactory.getLogger(PluginManager.class);
55
     private static final Logger LOG = LoggerFactory.getLogger(PluginManager.class);
56
+
53
     /** List of known plugins' file names to their corresponding {@link PluginInfo} objects. */
57
     /** List of known plugins' file names to their corresponding {@link PluginInfo} objects. */
54
     private final Map<String, PluginInfo> knownPlugins = new HashMap<>();
58
     private final Map<String, PluginInfo> knownPlugins = new HashMap<>();
55
     /** Set of known plugins' metadata. */
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
     private final PluginFileHandler fileHandler;
62
     private final PluginFileHandler fileHandler;
58
     /** Directory where plugins are stored. */
63
     /** Directory where plugins are stored. */
59
     private final String directory;
64
     private final String directory;
291
      * Refreshes the list of known plugins.
296
      * Refreshes the list of known plugins.
292
      */
297
      */
293
     public void refreshPlugins() {
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
     /**

Loading…
İptal
Kaydet