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.objectfactory.Classes;
40 import info.magnolia.objectfactory.Components;
41 import info.magnolia.objectfactory.MgnlInstantiationException;
42 import org.apache.commons.lang.StringUtils;
43
44 import java.util.Collection;
45 import java.util.Collections;
46 import java.util.Iterator;
47 import java.util.LinkedHashMap;
48 import java.util.Map;
49
50
51
52
53
54 public class ParagraphRendererManager extends ObservedManager {
55
56 public static ParagraphRendererManager getInstance() {
57 return Components.getSingleton(ParagraphRendererManager.class);
58 }
59
60 private final Map paragraphRenderers;
61
62 public ParagraphRendererManager() {
63 paragraphRenderers = Collections.synchronizedMap(new LinkedHashMap());
64 }
65
66 public ParagraphRenderer getRenderer(String name) {
67 final ParagraphRenderer renderer = (ParagraphRenderer) paragraphRenderers.get(name);
68 if (renderer == null) {
69 throw new IllegalArgumentException("No paragraph renderer registered with name " + name);
70 }
71 return renderer;
72 }
73
74
75 public Map getRenderers() {
76 return paragraphRenderers;
77 }
78
79 protected void onRegister(Content node) {
80 final Collection list = node.getChildren(ItemType.CONTENTNODE);
81 final Iterator it = list.iterator();
82 while (it.hasNext()) {
83 final Content paragraphRendererNode = (Content) it.next();
84 String name = paragraphRendererNode.getNodeData("name").getString();
85 String clazz = paragraphRendererNode.getNodeData("class").getString();
86
87 if (StringUtils.isEmpty(name)) {
88 name = paragraphRendererNode.getName();
89 }
90
91 if (StringUtils.isBlank(name) || StringUtils.isBlank(clazz)) {
92 log.warn("Can't register template renderer at {}, missing name or class property.", paragraphRendererNode.getHandle());
93 continue;
94 }
95
96 try {
97 final ParagraphRenderer renderer = Classes.newInstance(clazz);
98 registererParagraphRenderer(name, renderer);
99 log.debug("Registered template render [{}] with name {}.", clazz, name);
100 } catch (MgnlInstantiationException e) {
101 throw newInstanciationException(name, clazz, e);
102 } catch (ClassNotFoundException e) {
103 throw newInstanciationException(name, clazz, e);
104 }
105 }
106 }
107
108 protected void registererParagraphRenderer(String name, ParagraphRenderer renderer) {
109 if (paragraphRenderers.containsKey(name)) {
110 throw new IllegalStateException("Duplicate paragraph name \"" + name + "\"");
111 }
112 paragraphRenderers.put(name, renderer);
113 }
114
115 protected void onClear() {
116 paragraphRenderers.clear();
117 }
118
119 private IllegalStateException newInstanciationException(String name, String clazz, Exception e) {
120 return new IllegalStateException("Can't register paragraph renderer with name [" + name + "] and class [" + clazz + "] : " + e.getClass().getName() + " : " + e.getMessage());
121 }
122 }