1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.rendering.renderer.registry;
35
36 import info.magnolia.objectfactory.Classes;
37 import info.magnolia.registry.RegistrationException;
38 import info.magnolia.registry.RegistryMap;
39 import info.magnolia.rendering.context.RenderingListener;
40 import info.magnolia.rendering.renderer.Renderer;
41
42 import java.util.ArrayList;
43 import java.util.List;
44 import java.util.Set;
45
46 import javax.inject.Singleton;
47
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50
51
52
53
54 @Singleton
55 public class RendererRegistry {
56
57 private static final Logger log = LoggerFactory.getLogger(RendererRegistry.class);
58
59 private final List<Class<RenderingListener>> listeners = new ArrayList<Class<RenderingListener>>();
60
61 private final RegistryMap<String, RendererProvider> registry = new RegistryMap<String, RendererProvider>() {
62
63 @Override
64 protected String keyFromValue(RendererProvider provider) {
65 return provider.getType();
66 }
67 };
68
69 public Renderer getRenderer(String type) throws RegistrationException {
70
71 RendererProvider provider;
72 try {
73 provider = registry.getRequired(type);
74 } catch (RegistrationException e) {
75 throw new RegistrationException("No renderer registered for type: " + type, e);
76 }
77
78 return provider.getRenderer();
79 }
80
81 public void register(RendererProvider rendererProvider) {
82 registry.put(rendererProvider.getType(), rendererProvider);
83 }
84
85 public void unregister(String type) {
86 registry.remove(type);
87 }
88
89 public Set<String> unregisterAndRegister(Set<String> registeredTypes, List<RendererProvider> providers) {
90 return registry.removeAndPutAll(registeredTypes, providers);
91 }
92
93 public void registerListener(final String listenerClassName) {
94 Class<RenderingListener> listenerClass;
95 try {
96 listenerClass = Classes.getClassFactory().forName(listenerClassName);
97 if (!listeners.contains(listenerClassName)) {
98 getListeners().add(listenerClass);
99 }
100 } catch (ClassNotFoundException e) {
101 log.error("{} was not found.", listenerClassName);
102 }
103 }
104
105 public List<Class<RenderingListener>> getListeners() {
106 return listeners;
107 }
108 }