View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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      // TODO: validating is turned of in case of a schema
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      // ordering
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      // theme-config
98      digester.addCallMethod("tobago-config/theme-config/default-theme", "setDefaultThemeName", 0);
99      digester.addCallMethod("tobago-config/theme-config/supported-theme", "addSupportedThemeName", 0);
100 
101     // resource dirs
102     digester.addCallMethod("tobago-config/resource-dir", "addResourceDir", 0);
103 
104     // enable ajax
105     digester.addCallMethod("tobago-config/ajax-enabled", "setAjaxEnabled", 0);
106 
107     // see bug TOBAGO-912
108     digester.addCallMethod("tobago-config/fix-resource-order", "setFixResourceOrder", 0);
109 
110     // see bug TOBAGO-916
111     digester.addCallMethod("tobago-config/fix-layout-transparency", "setFixLayoutTransparency", 0);
112 
113     // session secret
114     digester.addCallMethod("tobago-config/create-session-secret", "setCreateSessionSecret", 0);
115     digester.addCallMethod("tobago-config/check-session-secret", "setCheckSessionSecret", 0);
116 
117     // frame attacks
118     digester.addBeanPropertySetter("tobago-config/prevent-frame-attacks", "preventFrameAttacks");
119 
120     // content-security-policy
121     digester.addCallMethod("tobago-config/content-security-policy/directive", "addContentSecurityPolicy", 0);
122 
123     // renderer config
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     // theme definition
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     // todo: find a way to register the schema
170     //    registerDtd("http://myfaces.apache.org/tobago/tobago-config", TOBAGO_CONFIG_XSD_1_5);
171     //    registerXsd("http://myfaces.apache.org/tobago/tobago-config", TOBAGO_CONFIG_XSD_1_5);
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   private void registerXsd(String publicId, String entityUrl) {
188     URL url = TobagoConfigParser.class.getResource(entityUrl);
189     if (LOG.isDebugEnabled()) {
190       LOG.debug("Registering dtd: url='{}'", url);
191     }
192     if (null != url) {
193       digester.setSchema(publicId);
194     //  digester.setSchemaLanguage();
195     } else {
196       LOG.warn("Unable to retrieve local DTD '" + entityUrl + "'; trying external URL");
197     }
198   }
199 */
200 }