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 info.magnolia.cms.core.MgnlNodeType;
37 import info.magnolia.jcr.util.MetaDataUtil;
38 import info.magnolia.jcr.util.NodeUtil;
39 import info.magnolia.objectfactory.Components;
40 import info.magnolia.registry.AbstractRegistry;
41 import info.magnolia.registry.RegistrationException;
42 import info.magnolia.rendering.template.TemplateDefinition;
43 import info.magnolia.rendering.template.assignment.TemplateDefinitionAssignment;
44
45 import java.util.ArrayList;
46 import java.util.Collection;
47 import java.util.Collections;
48 import java.util.Map;
49
50 import javax.inject.Inject;
51 import javax.inject.Singleton;
52 import javax.jcr.Node;
53 import javax.jcr.RepositoryException;
54
55 import org.apache.commons.lang.StringUtils;
56 import org.slf4j.Logger;
57 import org.slf4j.LoggerFactory;
58
59
60
61
62
63
64
65 @Singleton
66 public class TemplateDefinitionRegistry extends AbstractRegistry<TemplateDefinition, TemplateDefinitionProvider>{
67
68 private static final Logger log = LoggerFactory.getLogger(TemplateDefinitionRegistry.class);
69
70 private static final String DELETED_PAGE_TEMPLATE = "adminInterface:mgnlDeleted";
71
72 private TemplateAvailability templateAvailability;
73
74 @Inject
75 public TemplateDefinitionRegistry(TemplateAvailability templateAvailability) {
76 this.templateAvailability = templateAvailability;
77 }
78
79 public TemplateDefinition getTemplateDefinition(String id) throws RegistrationException {
80
81 TemplateDefinitionProvider templateDefinitionProvider;
82 Map<String, TemplateDefinitionProvider> providers = getProviders();
83 synchronized (providers) {
84 templateDefinitionProvider = providers.get(id);
85 }
86 if (templateDefinitionProvider == null) {
87 throw new RegistrationException("No TemplateDefinition registered for id: " + id + ", available ids are " + providers.keySet());
88 }
89 TemplateDefinition templateDefinition = templateDefinitionProvider.getDefinition();
90 templateDefinition.setId(id);
91 return templateDefinition;
92 }
93
94
95
96
97 public Collection<TemplateDefinition> getTemplateDefinitions() {
98 final Collection<TemplateDefinition> templateDefinitions = new ArrayList<TemplateDefinition>();
99 final Map<String, TemplateDefinitionProvider> providers = getProviders();
100 synchronized (providers) {
101 for (Map.Entry<String, TemplateDefinitionProvider> entry : providers.entrySet()) {
102 final String id = entry.getKey();
103 final TemplateDefinitionProvider provider = entry.getValue();
104 try {
105 final TemplateDefinition templateDefinition = provider.getDefinition();
106 if (templateDefinition == null) {
107 log.error("Provider's TemplateDefinition is null: " + provider);
108 } else {
109 templateDefinition.setId(id);
110 templateDefinitions.add(templateDefinition);
111 }
112 } catch (RegistrationException e) {
113 log.error("Failed to read template definition from " + provider + ".", e);
114 }
115 }
116 }
117 return templateDefinitions;
118 }
119
120 public Collection<TemplateDefinition> getAvailableTemplates(Node content) {
121
122 try {
123 if (content != null && NodeUtil.hasMixin(content, MgnlNodeType.MIX_DELETED)) {
124 return Collections.singleton(get(DELETED_PAGE_TEMPLATE));
125 }
126 } catch (RepositoryException e) {
127 log.error("Failed to check node for deletion status.", e);
128 } catch (RegistrationException e) {
129 log.error("Deleted content template is not correctly registered.", e);
130 }
131
132 final ArrayList<TemplateDefinition> availableTemplateDefinitions = new ArrayList<TemplateDefinition>();
133 final Collection<TemplateDefinition> templateDefinitions = getTemplateDefinitions();
134 for (TemplateDefinition templateDefinition : templateDefinitions) {
135 if (isAvailable(templateDefinition, content)) {
136 availableTemplateDefinitions.add(templateDefinition);
137 }
138 }
139 return availableTemplateDefinitions;
140 }
141
142 protected boolean isAvailable(TemplateDefinition templateDefinition, Node content) {
143 if (templateDefinition.getId().equals(DELETED_PAGE_TEMPLATE)) {
144 return false;
145 }
146
147
148
149
150
151
152
153
154
155
156
157
158
159 public TemplateDefinition getDefaultTemplate(Node content) {
160
161
162 TemplateDefinition parentTemplate = null;
163 try {
164 parentTemplate = getTemplateDefinition(content.getParent());
165 } catch (RepositoryException e) {
166 log.error("Failed to determine template assigned to parent of node: " + NodeUtil.getNodePathIfPossible(content), e);
167 }
168
169 if (parentTemplate != null && templateAvailability.isAvailable(content, parentTemplate)) {
170 return parentTemplate;
171 }
172
173
174 Collection<TemplateDefinition> templates = getAvailableTemplates(content);
175 if (templates.isEmpty()) {
176 return null;
177 }
178
179 return templates.iterator().next();
180 }
181
182 private TemplateDefinition getTemplateDefinition(Node node) throws RepositoryException {
183 String templateId = MetaDataUtil.getTemplate(node);
184 if (StringUtils.isEmpty(templateId)) {
185 return null;
186 }
187 try {
188
189 TemplateDefinitionAssignment templateDefinitionAssignment = Components.getComponent(TemplateDefinitionAssignment.class);
190 return templateDefinitionAssignment.getAssignedTemplateDefinition(node);
191 } catch (RegistrationException e) {
192 return null;
193 }
194 }
195 }