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.template.registry;
35
36 import java.util.ArrayList;
37 import java.util.Collection;
38 import java.util.Set;
39 import javax.inject.Singleton;
40
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
43
44 import info.magnolia.registry.RegistrationException;
45 import info.magnolia.registry.RegistryMap;
46 import info.magnolia.rendering.template.TemplateDefinition;
47
48
49
50
51
52 @Singleton
53 public class TemplateDefinitionRegistry {
54
55 private static final Logger log = LoggerFactory.getLogger(TemplateDefinitionRegistry.class);
56
57 private final RegistryMap<String, TemplateDefinitionProvider> registry = new RegistryMap<String, TemplateDefinitionProvider>() {
58
59 @Override
60 protected String keyFromValue(TemplateDefinitionProvider provider) {
61 return provider.getId();
62 }
63 };
64
65 public TemplateDefinition getTemplateDefinition(String id) throws RegistrationException {
66
67 TemplateDefinitionProvider templateDefinitionProvider;
68 try {
69 templateDefinitionProvider = registry.getRequired(id);
70 } catch (RegistrationException e) {
71 throw new RegistrationException("No template definition registered for id: " + id, e);
72 }
73
74 return templateDefinitionProvider.getTemplateDefinition();
75 }
76
77
78
79
80 public Collection<TemplateDefinition> getTemplateDefinitions() {
81 final Collection<TemplateDefinition> templateDefinitions = new ArrayList<TemplateDefinition>();
82 for (TemplateDefinitionProvider provider : registry.values()) {
83 try {
84 final TemplateDefinition templateDefinition = provider.getTemplateDefinition();
85 if (templateDefinition == null) {
86 log.error("Provider's TemplateDefinition is null: " + provider);
87 } else {
88 templateDefinitions.add(templateDefinition);
89 }
90 } catch (RegistrationException e) {
91 log.error("Failed to read template definition from " + provider + ".", e);
92 }
93 }
94 return templateDefinitions;
95 }
96
97 public void register(TemplateDefinitionProvider provider) {
98 registry.put(provider);
99 }
100
101 public void unregister(String id) {
102 registry.remove(id);
103 }
104
105 public Set<String> unregisterAndRegister(Collection<String> registeredIds, Collection<TemplateDefinitionProvider> providers) {
106 return registry.removeAndPutAll(registeredIds, providers);
107 }
108 }