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