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 public Collection<TemplateDefinition> getTemplateDefinitions() {
95 Collection<TemplateDefinition> templateDefinitions = new ArrayList<TemplateDefinition>();
96 Map<String, TemplateDefinitionProvider> providers = getProviders();
97 synchronized (providers) {
98 for (Map.Entry<String, TemplateDefinitionProvider> entry : providers.entrySet()) {
99 String id = entry.getKey();
100 TemplateDefinitionProvider provider = entry.getValue();
101 try {
102 TemplateDefinition templateDefinition = provider.getDefinition();
103 templateDefinition.setId(id);
104 templateDefinitions.add(templateDefinition);
105 } catch (RegistrationException e) {
106
107 log.error("Failed to read template definition from " + provider + ".", e);
108 }
109 }
110 }
111 return templateDefinitions;
112 }
113
114 public Collection<TemplateDefinition> getAvailableTemplates(Node content) {
115
116 try {
117 if (content != null && NodeUtil.hasMixin(content, MgnlNodeType.MIX_DELETED)) {
118 return Collections.singleton(get(DELETED_PAGE_TEMPLATE));
119 }
120 } catch (RepositoryException e) {
121 log.error("Failed to check node for deletion status.", e);
122 } catch (RegistrationException e) {
123 log.error("Deleted content template is not correctly registered.", e);
124 }
125
126 final ArrayList<TemplateDefinition> availableTemplateDefinitions = new ArrayList<TemplateDefinition>();
127 final Collection<TemplateDefinition> templateDefinitions = getTemplateDefinitions();
128 for (TemplateDefinition templateDefinition : templateDefinitions) {
129 if (isAvailable(templateDefinition, content)) {
130 availableTemplateDefinitions.add(templateDefinition);
131 }
132 }
133 return availableTemplateDefinitions;
134 }
135
136 protected boolean isAvailable(TemplateDefinition templateDefinition, Node content) {
137 if (templateDefinition.getId().equals(DELETED_PAGE_TEMPLATE)) {
138 return false;
139 }
140
141
142
143
144
145
146
147
148
149
150
151
152
153 public TemplateDefinition getDefaultTemplate(Node content) {
154
155
156 TemplateDefinition parentTemplate = null;
157 try {
158 parentTemplate = getTemplateDefinition(content.getParent());
159 } catch (RepositoryException e) {
160 log.error("Failed to determine template assigned to parent of node: " + NodeUtil.getNodePathIfPossible(content), e);
161 }
162
163 if (parentTemplate != null && templateAvailability.isAvailable(content, parentTemplate)) {
164 return parentTemplate;
165 }
166
167
168 Collection<TemplateDefinition> templates = getAvailableTemplates(content);
169 if (templates.isEmpty()) {
170 return null;
171 }
172
173 return templates.iterator().next();
174 }
175
176 private TemplateDefinition getTemplateDefinition(Node node) throws RepositoryException {
177 String templateId = MetaDataUtil.getTemplate(node);
178 if (StringUtils.isEmpty(templateId)) {
179 return null;
180 }
181 try {
182
183 TemplateDefinitionAssignment templateDefinitionAssignment = Components.getComponent(TemplateDefinitionAssignment.class);
184 return templateDefinitionAssignment.getAssignedTemplateDefinition(node);
185 } catch (RegistrationException e) {
186 return null;
187 }
188 }
189 }