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