1 package com.atlassian.plugin.manager;
2
3 import com.atlassian.plugin.ModuleDescriptor;
4 import com.atlassian.plugin.PluginController;
5 import com.google.common.base.Function;
6 import com.google.common.base.Predicates;
7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory;
9
10 import javax.annotation.Nullable;
11
12 import static com.google.common.collect.Iterables.filter;
13 import static com.google.common.collect.Iterables.transform;
14
15
16
17
18
19
20
21 public class SafeModuleExtractor {
22 private static final Logger log = LoggerFactory.getLogger(SafeModuleExtractor.class);
23
24 private final PluginController pluginController;
25
26 public SafeModuleExtractor(PluginController pluginController) {
27 this.pluginController = pluginController;
28 }
29
30
31
32
33
34 public <M> Iterable<M> getModules(final Iterable<? extends ModuleDescriptor<M>> moduleDescriptors) {
35 return filter(
36 transform(
37 moduleDescriptors,
38 new Function<ModuleDescriptor<M>, M>() {
39 @Override
40 public M apply(@Nullable ModuleDescriptor<M> descriptor) {
41 if (descriptor == null || descriptor.isBroken()) {
42 return null;
43 }
44
45 try {
46 return descriptor.getModule();
47 } catch (final RuntimeException ex) {
48 final String pluginKey = descriptor.getPlugin().getKey();
49
50 log.error("Exception when retrieving plugin module {}, disabling plugin {}",
51 descriptor.getCompleteKey(), pluginKey, ex);
52
53 descriptor.setBroken();
54
55
56 pluginController.disablePluginWithoutPersisting(pluginKey);
57 return null;
58 }
59 }
60 }),
61 Predicates.notNull());
62 }
63 }