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.assignment;
35
36 import java.util.ArrayList;
37 import java.util.Collection;
38 import java.util.Collections;
39 import java.util.Comparator;
40 import javax.inject.Inject;
41 import javax.inject.Singleton;
42 import javax.jcr.Node;
43 import javax.jcr.RepositoryException;
44 import javax.jcr.Session;
45
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48
49 import info.magnolia.cms.core.MgnlNodeType;
50 import info.magnolia.cms.i18n.Messages;
51 import info.magnolia.cms.i18n.MessagesManager;
52 import info.magnolia.cms.security.PermissionUtil;
53 import info.magnolia.context.MgnlContext;
54 import info.magnolia.jcr.util.MetaDataUtil;
55 import info.magnolia.jcr.util.NodeUtil;
56 import info.magnolia.registry.RegistrationException;
57 import info.magnolia.rendering.template.TemplateAvailability;
58 import info.magnolia.rendering.template.TemplateDefinition;
59 import info.magnolia.rendering.template.registry.TemplateDefinitionRegistry;
60
61
62
63
64
65
66
67 @Singleton
68 public class MetaDataBasedTemplateDefinitionAssignment implements TemplateDefinitionAssignment {
69
70 private static final String DELETED_PAGE_TEMPLATE = "adminInterface:mgnlDeleted";
71
72 private static final Logger log = LoggerFactory.getLogger(MetaDataBasedTemplateDefinitionAssignment.class);
73
74 private TemplateDefinitionRegistry templateDefinitionRegistry;
75
76 @Inject
77 public MetaDataBasedTemplateDefinitionAssignment(TemplateDefinitionRegistry templateDefinitionRegistry) {
78 this.templateDefinitionRegistry = templateDefinitionRegistry;
79 }
80
81 @Override
82 public TemplateDefinition getAssignedTemplateDefinition(Node content) throws RegistrationException {
83 final String templateId = MetaDataUtil.getMetaData(content).getTemplate();
84 return templateDefinitionRegistry.getTemplateDefinition(templateId);
85 }
86
87
88
89
90 @Override
91 public TemplateDefinition getDefaultTemplate(Node content) {
92
93
94 TemplateDefinition parentTemplate = null;
95 try {
96 parentTemplate = getAssignedTemplateDefinition(content.getParent());
97 } catch (RepositoryException e) {
98 log.error("Failed to determine template assigned to parent of node: " + NodeUtil.getNodePathIfPossible(content), e);
99 } catch (RegistrationException e) {
100
101 }
102
103 if (parentTemplate != null && isAvailable(content, parentTemplate)) {
104 return parentTemplate;
105 }
106
107
108 Collection<TemplateDefinition> templates = getAvailableTemplates(content);
109 if (templates.isEmpty()) {
110 return null;
111 }
112
113 return templates.iterator().next();
114 }
115
116 @Override
117 public Collection<TemplateDefinition> getAvailableTemplates(Node content) {
118
119 try {
120 if (content != null && NodeUtil.hasMixin(content, MgnlNodeType.MIX_DELETED)) {
121 return Collections.singleton(templateDefinitionRegistry.getTemplateDefinition(DELETED_PAGE_TEMPLATE));
122 }
123 } catch (RepositoryException e) {
124 log.error("Failed to check node for deletion status.", e);
125 } catch (RegistrationException e) {
126 log.error("Deleted content template is not correctly registered.", e);
127 }
128
129 final ArrayList<TemplateDefinition> availableTemplateDefinitions = new ArrayList<TemplateDefinition>();
130 final Collection<TemplateDefinition> templateDefinitions = templateDefinitionRegistry.getTemplateDefinitions();
131 for (TemplateDefinition templateDefinition : templateDefinitions) {
132 if (isTemplateAvailable(content, templateDefinition)) {
133 availableTemplateDefinitions.add(templateDefinition);
134 }
135 }
136
137 Collections.sort(availableTemplateDefinitions, new Comparator<TemplateDefinition>() {
138
139 @Override
140 public int compare(TemplateDefinition lhs, TemplateDefinition rhs) {
141 return getI18nTitle(lhs).compareTo(getI18nTitle(rhs));
142 }
143
144 private String getI18nTitle(TemplateDefinition templateDefinition) {
145 Messages messages = MessagesManager.getMessages(templateDefinition.getI18nBasename());
146 return messages.getWithDefault(templateDefinition.getTitle(), templateDefinition.getTitle());
147 }
148 });
149
150 return availableTemplateDefinitions;
151 }
152
153 protected boolean isTemplateAvailable(Node content, TemplateDefinition templateDefinition) {
154 return hasReadAccess(content) &&
155 isVisible(templateDefinition) &&
156 isAvailable(content, templateDefinition);
157 }
158
159 protected boolean isVisible(TemplateDefinition templateDefinition) {
160 return templateDefinition.getVisible() == null || templateDefinition.getVisible();
161 }
162
163 protected boolean isAvailable(Node content, TemplateDefinition templateDefinition) {
164 TemplateAvailability templateAvailability = templateDefinition.getTemplateAvailability();
165 return templateAvailability == null || templateAvailability.isAvailable(content, templateDefinition);
166 }
167
168 protected boolean hasReadAccess(Node content) {
169 try {
170
171
172 return PermissionUtil.isGranted(
173 MgnlContext.getJCRSession(content.getSession().getWorkspace().getName()),
174 content.getPath(),
175 Session.ACTION_READ);
176 } catch (RepositoryException e) {
177 return false;
178 }
179 }
180 }