|
@@ -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);
|