1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.tobago.internal.config;
21
22 import org.apache.commons.digester.Digester;
23 import org.apache.commons.io.IOUtils;
24 import org.apache.myfaces.tobago.context.ThemeImpl;
25 import org.apache.myfaces.tobago.context.ThemeResources;
26 import org.apache.myfaces.tobago.context.ThemeScript;
27 import org.apache.myfaces.tobago.context.ThemeStyle;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30 import org.xml.sax.SAXException;
31
32 import javax.faces.FacesException;
33 import java.io.IOException;
34 import java.io.InputStream;
35 import java.net.URL;
36
37 public class TobagoConfigParser {
38
39 private static final Logger LOG = LoggerFactory.getLogger(TobagoConfigParser.class);
40
41 private static final String TOBAGO_CONFIG_DTD_1_0 = "/org/apache/myfaces/tobago/config/tobago-config_1_0.dtd";
42 private static final String TOBAGO_CONFIG_DTD_1_0_29 = "/org/apache/myfaces/tobago/config/tobago-config-1.0.29.dtd";
43 private static final String TOBAGO_CONFIG_DTD_1_0_30 = "/org/apache/myfaces/tobago/config/tobago-config-1.0.30.dtd";
44 private static final String TOBAGO_CONFIG_DTD_1_0_34 = "/org/apache/myfaces/tobago/config/tobago-config-1.0.34.dtd";
45 private static final String TOBAGO_CONFIG_XSD_1_5 = "/org/apache/myfaces/tobago/config/tobago-config-1.5.xsd";
46 private static final String TOBAGO_CONFIG_XSD_1_6 = "/org/apache/myfaces/tobago/config/tobago-config-1.6.xsd";
47
48 private Digester digester;
49
50 public TobagoConfigParser() {
51 digester = new Digester();
52 digester.setUseContextClassLoader(true);
53 configure();
54 registerDtds();
55 }
56
57 public TobagoConfigFragment parse(URL url) throws IOException, SAXException, FacesException {
58
59 if (LOG.isInfoEnabled()) {
60 LOG.info("Parsing configuration file: '{}'", url);
61 }
62
63 TobagoConfigFragment tobagoConfig = new TobagoConfigFragment();
64 digester.push(tobagoConfig);
65 InputStream inputStream = null;
66 try {
67 configureValidation(url);
68 inputStream = url.openStream();
69 digester.parse(inputStream);
70 } finally {
71 IOUtils.closeQuietly(inputStream);
72 }
73 return tobagoConfig;
74 }
75
76 private void configureValidation(URL url) {
77
78 try {
79 final String xml = IOUtils.toString(url.openStream());
80 if (xml.indexOf("tobago-config-1.5.xsd") > 0 || xml.indexOf("tobago-config-1.6.xsd") > 0) {
81 digester.setValidating(false);
82 return;
83 }
84 } catch (Exception e) {
85 LOG.warn("Error while checking: '" + url + "'", e);
86 }
87 digester.setValidating(true);
88 }
89
90 private Digester configure() {
91
92
93 digester.addCallMethod("tobago-config/name", "setName", 0);
94 digester.addCallMethod("tobago-config/ordering/before/name", "addBefore", 0);
95 digester.addCallMethod("tobago-config/ordering/after/name", "addAfter", 0);
96
97
98 digester.addCallMethod("tobago-config/theme-config/default-theme", "setDefaultThemeName", 0);
99 digester.addCallMethod("tobago-config/theme-config/supported-theme", "addSupportedThemeName", 0);
100
101
102 digester.addCallMethod("tobago-config/resource-dir", "addResourceDir", 0);
103
104
105 digester.addCallMethod("tobago-config/ajax-enabled", "setAjaxEnabled", 0);
106
107
108 digester.addCallMethod("tobago-config/fix-resource-order", "setFixResourceOrder", 0);
109
110
111 digester.addCallMethod("tobago-config/fix-layout-transparency", "setFixLayoutTransparency", 0);
112
113
114 digester.addCallMethod("tobago-config/create-session-secret", "setCreateSessionSecret", 0);
115 digester.addCallMethod("tobago-config/check-session-secret", "setCheckSessionSecret", 0);
116
117
118 digester.addBeanPropertySetter("tobago-config/prevent-frame-attacks", "preventFrameAttacks");
119
120
121 digester.addCallMethod("tobago-config/content-security-policy/directive", "addContentSecurityPolicy", 0);
122
123
124 digester.addObjectCreate("tobago-config/renderers", RenderersConfigImpl.class);
125 digester.addSetNext("tobago-config/renderers", "setRenderersConfig");
126 digester.addObjectCreate("tobago-config/renderers/renderer", RendererConfig.class);
127 digester.addSetNext("tobago-config/renderers/renderer", "addRenderer");
128 digester.addCallMethod("tobago-config/renderers/renderer/name", "setName", 0);
129 digester.addCallMethod("tobago-config/renderers/renderer/supported-markup/markup", "addSupportedMarkup", 0);
130
131
132 digester.addObjectCreate("tobago-config/theme-definitions/theme-definition", ThemeImpl.class);
133 digester.addSetNext("tobago-config/theme-definitions/theme-definition", "addThemeDefinition");
134 digester.addCallMethod("tobago-config/theme-definitions/theme-definition/name", "setName", 0);
135 digester.addCallMethod("tobago-config/theme-definitions/theme-definition/deprecated-name", "setDeprecatedName", 0);
136 digester.addCallMethod("tobago-config/theme-definitions/theme-definition/display-name", "setDisplayName", 0);
137 digester.addCallMethod("tobago-config/theme-definitions/theme-definition/resource-path", "setResourcePath", 0);
138 digester.addCallMethod("tobago-config/theme-definitions/theme-definition/fallback", "setFallbackName", 0);
139 digester.addBeanPropertySetter("tobago-config/theme-definitions/theme-definition/versioned",
140 "versioned");
141 digester.addObjectCreate("tobago-config/theme-definitions/theme-definition/renderers", RenderersConfigImpl.class);
142 digester.addSetNext("tobago-config/theme-definitions/theme-definition/renderers", "setRenderersConfig");
143 digester.addObjectCreate(
144 "tobago-config/theme-definitions/theme-definition/renderers/renderer", RendererConfig.class);
145 digester.addSetNext("tobago-config/theme-definitions/theme-definition/renderers/renderer", "addRenderer");
146 digester.addCallMethod("tobago-config/theme-definitions/theme-definition/renderers/renderer/name", "setName", 0);
147 digester.addCallMethod(
148 "tobago-config/theme-definitions/theme-definition/renderers/renderer/supported-markup/markup",
149 "addSupportedMarkup", 0);
150 digester.addObjectCreate("tobago-config/theme-definitions/theme-definition/resources", ThemeResources.class);
151 digester.addSetProperties("tobago-config/theme-definitions/theme-definition/resources");
152 digester.addSetNext("tobago-config/theme-definitions/theme-definition/resources", "addResources");
153 digester.addObjectCreate("tobago-config/theme-definitions/theme-definition/resources/script", ThemeScript.class);
154 digester.addSetProperties("tobago-config/theme-definitions/theme-definition/resources/script");
155 digester.addSetNext("tobago-config/theme-definitions/theme-definition/resources/script", "addScript");
156 digester.addObjectCreate("tobago-config/theme-definitions/theme-definition/resources/style", ThemeStyle.class);
157 digester.addSetProperties("tobago-config/theme-definitions/theme-definition/resources/style");
158 digester.addSetNext("tobago-config/theme-definitions/theme-definition/resources/style", "addStyle");
159
160 return digester;
161 }
162
163 private void registerDtds() {
164 registerDtd("-//Atanion GmbH//DTD Tobago Config 1.0//EN", TOBAGO_CONFIG_DTD_1_0);
165 registerDtd("-//The Apache Software Foundation//DTD Tobago Config 1.0//EN", TOBAGO_CONFIG_DTD_1_0);
166 registerDtd("-//The Apache Software Foundation//DTD Tobago Config 1.0.29//EN", TOBAGO_CONFIG_DTD_1_0_29);
167 registerDtd("-//The Apache Software Foundation//DTD Tobago Config 1.0.30//EN", TOBAGO_CONFIG_DTD_1_0_30);
168 registerDtd("-//The Apache Software Foundation//DTD Tobago Config 1.0.34//EN", TOBAGO_CONFIG_DTD_1_0_34);
169
170
171
172 }
173
174 private void registerDtd(String publicId, String entityUrl) {
175 URL url = TobagoConfigParser.class.getResource(entityUrl);
176 if (LOG.isDebugEnabled()) {
177 LOG.debug("Registering dtd: url='{}'", url);
178 }
179 if (null != url) {
180 digester.register(publicId, url.toString());
181 } else {
182 LOG.warn("Unable to retrieve local DTD '" + entityUrl + "'; trying external URL");
183 }
184 }
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200 }