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.freemarker.models;
35
36 import info.magnolia.jcr.util.ContentMap;
37 import info.magnolia.jcr.util.NodeUtil;
38
39 import java.util.ArrayList;
40 import java.util.Collection;
41
42 import javax.jcr.Node;
43 import javax.jcr.RepositoryException;
44
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
47
48 import freemarker.template.AdapterTemplateModel;
49 import freemarker.template.ObjectWrapper;
50 import freemarker.template.SimpleCollection;
51 import freemarker.template.TemplateCollectionModel;
52 import freemarker.template.TemplateHashModelEx;
53 import freemarker.template.TemplateModel;
54 import freemarker.template.TemplateModelException;
55 import freemarker.template.TemplateNodeModel;
56 import freemarker.template.TemplateScalarModel;
57 import freemarker.template.TemplateSequenceModel;
58
59
60
61
62 public class ContentMapModel implements TemplateHashModelEx, TemplateNodeModel, TemplateScalarModel, AdapterTemplateModel {
63
64 private static final Logger log = LoggerFactory.getLogger(ContentMapModel.class);
65
66 static final MagnoliaModelFactory FACTORY = new MagnoliaModelFactory() {
67 @Override
68 public Class factoryFor() {
69 return ContentMap.class;
70 }
71
72 @Override
73 public AdapterTemplateModel create(Object object, ObjectWrapper wrapper) {
74 return new ContentMapModel((ContentMap) object, (MagnoliaObjectWrapper) wrapper);
75 }
76 };
77
78 private final ContentMap content;
79 private final MagnoliaObjectWrapper wrapper;
80
81 ContentMapModel(ContentMap content, MagnoliaObjectWrapper wrapper) {
82 this.content = content;
83 this.wrapper = wrapper;
84 }
85
86 @Override
87 public String getAsString() {
88 return (String) content.get("@name");
89 }
90
91 @Override
92 public TemplateModel get(String key) throws TemplateModelException {
93 return wrapper.wrap(content.get(key));
94 }
95
96 @Override
97 public boolean isEmpty() throws TemplateModelException {
98 return (size() == 0);
99 }
100
101 @Override
102 public int size() throws TemplateModelException {
103 return content.size();
104 }
105
106 @Override
107 public TemplateCollectionModel keys() throws TemplateModelException {
108 return new SimpleCollection(content.keySet().iterator());
109 }
110
111 @Override
112 public TemplateCollectionModel values() throws TemplateModelException {
113 return (TemplateCollectionModel) wrapper.wrap(content.values().iterator());
114 }
115
116 @Override
117 public TemplateNodeModel getParentNode() throws TemplateModelException {
118 try {
119
120
121 final ContentMap parent = new ContentMap(content.getJCRNode().getParent());
122 return (TemplateNodeModel) wrapper.wrap(parent);
123 } catch (RepositoryException e) {
124 throw new TemplateModelException("Can't get parent of " + content + ":" + e.getMessage(), e);
125 }
126 }
127
128
129
130
131 @Override
132 public TemplateSequenceModel getChildNodes() throws TemplateModelException {
133 Collection<Node> children;
134 try {
135 children = NodeUtil.asList(NodeUtil.getNodes(content.getJCRNode()));
136 } catch (RepositoryException e) {
137 log.error("Failed to read children of {}", content.getJCRNode(), e);
138 children = new ArrayList<Node>();
139 }
140 return (TemplateSequenceModel) wrapper.wrap(children);
141 }
142
143 @Override
144 public String getNodeName() throws TemplateModelException {
145 return (String) content.get("@name");
146 }
147
148 @Override
149 public String getNodeType() throws TemplateModelException {
150 return content.get("@nodeType").toString();
151 }
152
153 @Override
154 public String getNodeNamespace() throws TemplateModelException {
155 return null;
156 }
157
158 @Override
159 public Object getAdaptedObject(Class hint) {
160 return this.content;
161 }
162
163 public Node getJCRNode() {
164 return content.getJCRNode();
165 }
166 }