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