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.module.templating;
35
36 import info.magnolia.cms.core.Content;
37 import info.magnolia.cms.core.ItemType;
38 import info.magnolia.cms.beans.config.ObservedManager;
39 import info.magnolia.content2bean.Content2BeanException;
40 import info.magnolia.content2bean.Content2BeanUtil;
41 import info.magnolia.objectfactory.Components;
42
43 import javax.jcr.RepositoryException;
44 import java.util.ArrayList;
45 import java.util.Collection;
46 import java.util.Hashtable;
47 import java.util.Iterator;
48 import java.util.List;
49 import java.util.Map;
50
51
52
53
54
55
56 public class TemplateManager extends ObservedManager {
57
58
59
60
61 private Map<String, Template> cachedContent = new Hashtable<String, Template>();
62
63
64
65
66 private List<Template> visibleTemplates = new ArrayList<Template>();
67
68
69
70
71 protected void onRegister(Content node) {
72 try {
73 log.info("Loading Template info from {}", node.getHandle());
74
75
76 Collection<Content> children = collectChildren(node);
77
78 if ((children != null) && !(children.isEmpty())) {
79 Iterator<Content> templates = children.iterator();
80 cacheContent(templates);
81 }
82
83 log.debug("Template info loaded from {}", node.getHandle());
84 }
85 catch (Exception re) {
86 log.error("Failed to load Template info from " + node.getHandle() + ": " + re.getMessage(), re);
87 }
88
89 }
90
91 protected void onClear() {
92 this.cachedContent.clear();
93 this.visibleTemplates.clear();
94 }
95
96
97
98
99
100
101
102
103
104
105
106
107 public Template getInfo(String key) {
108 return getTemplateDefinition(key);
109 }
110
111
112
113
114
115
116
117
118
119
120
121 public Template getTemplateDefinition(String key) {
122 return cachedContent.get(key);
123 }
124
125
126
127
128
129
130
131
132
133
134
135 public Template getInfo(String key, String extension) {
136 Template template = cachedContent.get(key);
137
138 if (template == null) {
139 return null;
140 }
141 Template subtemplate = template.getSubTemplate(extension);
142 if (subtemplate != null) {
143 return subtemplate;
144 }
145
146 return template;
147 }
148
149
150
151
152
153
154 private void addTemplatesToCache(Iterator<Content> templates, List<Template> visibleTemplates) {
155 while (templates.hasNext()) {
156 Content c = templates.next();
157
158 try {
159 Template ti = (Template) Content2BeanUtil.toBean(c, true, Template.class);
160 cachedContent.put(ti.getName(), ti);
161 if (ti.isVisible()) {
162 visibleTemplates.add(ti);
163 }
164
165 log.debug("Registering template [{}]", ti.getName());
166 }
167 catch (Content2BeanException e) {
168 log.error("Can't register template ["+c.getName()+"]",e);
169 }
170
171 }
172 }
173
174
175
176
177
178 private void cacheContent(Iterator<Content> templates) {
179 if (templates != null) {
180 addTemplatesToCache(templates, visibleTemplates);
181 }
182 }
183
184
185
186
187
188
189
190 private Collection<Content> collectChildren(Content cnt) {
191
192 Collection<Content> children = cnt.getChildren(ItemType.CONTENTNODE);
193
194
195 Collection<Content> subFolders = cnt.getChildren(ItemType.CONTENT);
196 if ((subFolders != null) && !(subFolders.isEmpty())) {
197
198 for (Content subCnt : subFolders) {
199 Collection<Content> grandChildren = collectChildren(subCnt);
200
201 if ((grandChildren != null) && !(grandChildren.isEmpty())) {
202 children.addAll(grandChildren);
203 }
204 }
205
206 }
207
208 return children;
209 }
210
211 public Iterator<Template> getAvailableTemplates(Content node) {
212 List<Template> templateList = new ArrayList<Template>();
213 for (Template template : visibleTemplates) {
214
215 if (template.isAvailable(node)) {
216 templateList.add(template);
217 }
218 }
219 return templateList.iterator();
220 }
221
222
223
224
225
226 public Iterator<Template> getAvailableTemplates() {
227 return visibleTemplates.iterator();
228 }
229
230 public Template getDefaultTemplate(Content node) {
231 Template tmpl;
232 try {
233
234 tmpl = this.getTemplateDefinition(node.getParent().getTemplate());
235 if(tmpl != null && tmpl.isAvailable(node)){
236 return tmpl;
237 }
238
239 else{
240 Iterator<Template> templates = getAvailableTemplates(node);
241 if (templates.hasNext()) {
242 return templates.next();
243 }
244 }
245 }
246 catch (RepositoryException e) {
247 log.error("Can't resolve default template for node " + node.getHandle(), e);
248 }
249 return null;
250 }
251
252
253
254
255 public static TemplateManager getInstance() {
256 return Components.getSingleton(TemplateManager.class);
257 }
258
259 }