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.templatingcomponents.jsp;
35
36 import info.magnolia.cms.beans.config.ServerConfiguration;
37 import info.magnolia.cms.core.AggregationState;
38 import info.magnolia.context.MgnlContext;
39 import info.magnolia.module.templatingcomponents.AuthoringUiComponent;
40 import org.apache.commons.collections.EnumerationUtils;
41
42 import javax.servlet.jsp.JspException;
43 import javax.servlet.jsp.tagext.JspFragment;
44 import javax.servlet.jsp.tagext.SimpleTagSupport;
45 import java.io.IOException;
46 import java.util.ArrayList;
47 import java.util.Arrays;
48 import java.util.Collection;
49 import java.util.Collections;
50 import java.util.List;
51 import java.util.StringTokenizer;
52
53
54
55
56
57 public abstract class AbstractTag extends SimpleTagSupport {
58
59 public void doTag() throws JspException, IOException {
60 final ServerConfiguration serverConfiguration = ServerConfiguration.getInstance();
61 final AggregationState aggregationState = MgnlContext.getAggregationState();
62 final AuthoringUiComponent uiComp = prepareUIComponent(serverConfiguration, aggregationState);
63
64 uiComp.render(getJspContext().getOut());
65
66 try {
67 doBody();
68 } finally {
69 uiComp.postRender();
70 }
71 }
72
73 protected void doBody() throws JspException, IOException {
74 final JspFragment body = getJspBody();
75 if (body != null) {
76 body.invoke(null);
77 }
78 }
79
80
81
82
83 protected abstract AuthoringUiComponent prepareUIComponent(ServerConfiguration serverCfg, AggregationState aggState) throws JspException, IOException;
84
85
86
87
88
89
90 protected List<String> mandatoryStringList(Object attrValue, String attributeName) throws JspException {
91 if (attrValue == null) {
92 throw new JspException(attributeName + " is mandatory and must a comma-separated String or a Collection<String> instance. No value passed, or passed value was null.");
93 }
94 if (attrValue instanceof String) {
95 return split((String) attrValue);
96 } else if (attrValue instanceof Collection) {
97 return new ArrayList<String>((Collection) attrValue);
98 } else if (attrValue instanceof String[]) {
99 return Arrays.asList((String[]) attrValue);
100 }
101
102 throw new JspException(attributeName + " must a comma-separated String or a Collection<String> instance. Passed value was a " + attrValue.getClass().getSimpleName() + ".");
103 }
104
105 protected List<String> split(String s) {
106 if (s == null) {
107 return Collections.emptyList();
108 }
109 final StringTokenizer st = new StringTokenizer(s, ",");
110 return EnumerationUtils.toList(st);
111 }
112 }