1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.seasar.cubby.plugin;
17
18 import static org.seasar.cubby.internal.util.LogMessages.format;
19
20 import java.util.HashMap;
21 import java.util.HashSet;
22 import java.util.Map;
23 import java.util.Set;
24
25 import javax.servlet.ServletContextEvent;
26
27 import org.seasar.cubby.spi.Provider;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31
32
33
34
35
36 public class PluginRegistry {
37
38
39 private static final Logger logger = LoggerFactory
40 .getLogger(PluginRegistry.class);
41
42
43 private static final PluginRegistry INSTANCE = new PluginRegistry();
44
45
46 private Set<Plugin> plugins = new HashSet<Plugin>();
47
48
49 private Map<Class<? extends Provider>, Plugin> serviceToPlugins = new HashMap<Class<? extends Provider>, Plugin>();
50
51
52
53
54 private PluginRegistry() {
55 }
56
57
58
59
60
61
62 public static PluginRegistry getInstance() {
63 return INSTANCE;
64 }
65
66
67
68
69 public synchronized void clear() {
70 this.plugins.clear();
71 this.serviceToPlugins.clear();
72 }
73
74
75
76
77
78
79
80 public synchronized void register(final Plugin plugin) {
81 this.plugins.add(plugin);
82 for (final Class<? extends Provider> service : plugin
83 .getSupportedServices()) {
84 this.serviceToPlugins.put(service, plugin);
85 if (logger.isInfoEnabled()) {
86 logger.info(format("ICUB0001", plugin, service));
87 }
88 }
89 }
90
91
92
93
94
95
96
97
98
99
100
101
102 public <S extends Provider> S getProvider(final Class<S> service) {
103 if (this.serviceToPlugins == null) {
104 throw new IllegalStateException(format("ECUB0053"));
105 }
106 final Plugin plugin = this.serviceToPlugins.get(service);
107 if (plugin == null) {
108 throw new IllegalArgumentException(format("ECUB0054", service));
109 }
110 final S provider = service.cast(plugin.getProvider(service));
111 if (provider == null) {
112 throw new NullPointerException("provider");
113 }
114 return provider;
115 }
116
117
118
119
120
121
122 public Set<Plugin> getPlugins() {
123 return plugins;
124 }
125
126
127
128
129
130
131
132
133
134
135
136
137
138 public <T extends Plugin> T getPlugin(final Class<T> pluginType) {
139 for (final Plugin plugin : plugins) {
140 if (plugin.getClass().equals(pluginType)) {
141 return pluginType.cast(plugin);
142 }
143 }
144 return null;
145 }
146
147 }