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.templating.elements;
35
36 import info.magnolia.cms.beans.config.ServerConfiguration;
37 import info.magnolia.context.MgnlContext;
38 import info.magnolia.context.WebContext;
39 import info.magnolia.rendering.context.RenderingContext;
40 import info.magnolia.rendering.engine.RenderException;
41
42 import java.util.HashMap;
43 import java.util.Map;
44 import java.util.Map.Entry;
45
46 import javax.jcr.Node;
47 import javax.jcr.RepositoryException;
48
49 import org.apache.commons.lang.StringUtils;
50
51
52
53
54
55
56 public abstract class AbstractContentTemplatingElement extends AbstractTemplatingElement {
57
58
59 private Node content;
60 private String workspace;
61 private String nodeIdentifier;
62 private String path;
63 private final Map<String, Object> savedCtxAttributes = new HashMap<String, Object>();
64
65 public AbstractContentTemplatingElement(ServerConfiguration server, RenderingContext renderingContext) {
66 super(server, renderingContext);
67 }
68
69 protected String getNodePath(Node node) throws RenderException {
70 try {
71 return node.getSession().getWorkspace().getName() + ":" + node.getPath();
72 } catch (RepositoryException e) {
73 throw new RenderException("Can't construct node path for node " + node);
74 }
75 }
76
77
78
79
80 protected Node getPassedContent() throws RenderException {
81
82
83
84
85
86
87 if (content != null) {
88 return content;
89 }
90 if (StringUtils.isNotEmpty(workspace)) {
91 if (StringUtils.isNotEmpty(nodeIdentifier)) {
92 try {
93 return MgnlContext.getJCRSession(workspace).getNodeByIdentifier(nodeIdentifier);
94 } catch (RepositoryException e) {
95 throw new RenderException("Can't read content from workspace [" + workspace + "] with identifier [" + nodeIdentifier + "].");
96 }
97 }
98 if (StringUtils.isNotEmpty(path)) {
99 try {
100 return MgnlContext.getJCRSession(workspace).getNode(path);
101 } catch (RepositoryException e) {
102 throw new RenderException("Can't read content from workspace [" + workspace + "] with path [" + path + "].");
103 }
104 }
105 throw new IllegalArgumentException("Need to specify either uuid or path in combination with workspace");
106 }
107
108 return null;
109 }
110
111 public Node getContent() {
112 return content;
113 }
114
115 public void setContent(Node node) {
116 this.content = node;
117 }
118
119 public String getWorkspace() {
120 return workspace;
121 }
122
123 public void setWorkspace(String workspace) {
124 this.workspace = workspace;
125 }
126
127 public String getNodeIdentifier() {
128 return nodeIdentifier;
129 }
130
131 public void setNodeIdentifier(String nodeIdentifier) {
132 this.nodeIdentifier = nodeIdentifier;
133 }
134
135 public String getPath() {
136 return path;
137 }
138
139 public void setPath(String path) {
140 this.path = path;
141 }
142
143
144
145
146
147
148
149 protected void setAttributesInWebContext(final Map<String, Object> attributes, int scope) {
150 if (attributes == null) {
151 return;
152 }
153 switch (scope) {
154 case WebContext.APPLICATION_SCOPE:
155 case WebContext.SESSION_SCOPE:
156 case WebContext.LOCAL_SCOPE:
157 break;
158 default:
159 throw new IllegalArgumentException("Scope is not valid. Use one of the scopes defined in info.magnolia.context.WebContext");
160 }
161 final WebContext webContext = MgnlContext.getWebContext();
162 for (Entry<String, Object> entry : attributes.entrySet()) {
163 final String key = entry.getKey();
164 if (webContext.containsKey(key)) {
165 savedCtxAttributes.put(key, webContext.get(key));
166 }
167 webContext.setAttribute(key, entry.getValue(), scope);
168 }
169 }
170
171
172
173
174
175
176 protected void restoreAttributesInWebContext(final Map<String, Object> attributes, int scope) {
177 if (attributes == null) {
178 return;
179 }
180 switch (scope) {
181 case WebContext.APPLICATION_SCOPE:
182 case WebContext.SESSION_SCOPE:
183 case WebContext.LOCAL_SCOPE:
184 break;
185 default:
186 throw new IllegalArgumentException("Scope is not valid. Use one of the scopes defined in info.magnolia.context.WebContext");
187 }
188 final WebContext webContext = MgnlContext.getWebContext();
189
190 for (Entry<String, Object> entry : attributes.entrySet()) {
191 final String key = entry.getKey();
192 if (webContext.containsKey(key) && savedCtxAttributes.get(key) != null) {
193 webContext.setAttribute(key, savedCtxAttributes.get(key), scope);
194 continue;
195 }
196 webContext.removeAttribute(key, scope);
197 }
198 }
199
200
201
202
203 protected boolean renderComments() {
204 return isAdmin();
205 }
206 }