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