001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *   http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing,
013     * software distributed under the License is distributed on an
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     * KIND, either express or implied.  See the License for the
016     * specific language governing permissions and limitations
017     * under the License.
018     */
019    
020    package org.apache.myfaces.tobago.config;
021    
022    import org.apache.commons.logging.Log;
023    import org.apache.commons.logging.LogFactory;
024    import org.apache.myfaces.tobago.context.RenderersConfig;
025    import org.apache.myfaces.tobago.context.Theme;
026    import org.apache.myfaces.tobago.util.Deprecation;
027    
028    import javax.faces.context.FacesContext;
029    import javax.servlet.ServletContext;
030    import java.util.ArrayList;
031    import java.util.Collections;
032    import java.util.Iterator;
033    import java.util.List;
034    import java.util.Map;
035    
036    public class TobagoConfig {
037      private static final Log LOG = LogFactory.getLog(TobagoConfig.class);
038    
039      public static final String TOBAGO_CONFIG
040          = "org.apache.myfaces.tobago.config.TobagoConfig";
041    
042      private List<Theme> supportedThemes;
043      private List<String> supportedThemeNames;
044      private Theme defaultTheme;
045      private String defaultThemeName;
046      private List<String> resourceDirs;
047      private List<MappingRule> mappingRules;
048      private boolean ajaxEnabled;
049      private boolean fixResourceOrder;
050      private boolean fixLayoutTransparency;
051      private boolean createSessionSecret;
052      private boolean checkSessionSecret;
053      private Map<String, Theme> availableTheme;
054      private RenderersConfig renderersConfig;
055    
056    
057      public TobagoConfig() {
058        supportedThemeNames = new ArrayList<String>();
059        supportedThemes = new ArrayList<Theme>();
060        resourceDirs = new ArrayList<String>();
061        ajaxEnabled = true;
062        fixResourceOrder = false;
063        fixLayoutTransparency = false;
064        createSessionSecret = false;
065        checkSessionSecret = false;
066      }
067    
068      public void addMappingRule(MappingRule mappingRule) {
069        Deprecation.LOG.warn("mapping rules are deprecated");
070        if (LOG.isDebugEnabled()) {
071          LOG.debug("addMappingRule: {" + mappingRule + "}");
072        }
073    
074        if (mappingRules == null) {
075          mappingRules = new ArrayList<MappingRule>();
076        }
077        mappingRules.add(mappingRule);
078      }
079    
080      public void addSupportedThemeName(String name) {
081        supportedThemeNames.add(name);
082      }
083    
084      public void resolveThemes() {
085    
086        defaultTheme = availableTheme.get(defaultThemeName);
087        checkThemeIsAvailable(defaultThemeName, defaultTheme);
088        if (LOG.isDebugEnabled()) {
089          LOG.debug("name = '" + defaultThemeName + "'");
090          LOG.debug("defaultTheme = '" + defaultTheme + "'");
091        }
092    
093        for (String name : supportedThemeNames) {
094          Theme theme = availableTheme.get(name);
095          checkThemeIsAvailable(name, theme);
096          supportedThemes.add(theme);
097          if (LOG.isDebugEnabled()) {
098            LOG.debug("name = '" + name + "'");
099            LOG.debug("supportedThemes.last() = '" + supportedThemes.get(supportedThemes.size() - 1) + "'");
100          }
101        }
102      }
103    
104      private void checkThemeIsAvailable(String name, Theme theme) {
105        if (theme == null) {
106          String error = "Theme not found! name: '" + name + "'. "
107              + "Please ensure you have a tobago-theme.xml file in your "
108              + "theme jar. Found the following themes: " + availableTheme.keySet();
109          LOG.error(error);
110          throw new RuntimeException(error);
111        }
112      }
113    
114    
115      public static TobagoConfig getInstance(FacesContext facesContext) {
116        return (TobagoConfig) facesContext.getExternalContext().getApplicationMap().get(TOBAGO_CONFIG);
117      }
118    
119      public static TobagoConfig getInstance(ServletContext servletContext) {
120        return (TobagoConfig) servletContext.getAttribute(TOBAGO_CONFIG);
121      }
122    
123      public MappingRule getMappingRule(String requestUri) {
124        for (Iterator i = getMappingRules(); i.hasNext();) {
125          MappingRule rule = (MappingRule) i.next();
126          if (rule.getRequestUri().equals(requestUri)) {
127            return rule;
128          }
129        }
130        return null;
131      }
132    
133      public Iterator<MappingRule> getMappingRules() {
134        if (mappingRules == null) {
135          List<MappingRule> objects = Collections.emptyList();
136          return objects.iterator();
137        } else {
138          return mappingRules.iterator();
139        }
140      }
141    
142      public Theme getTheme(String name) {
143        if (name == null) {
144          LOG.debug("searching theme: null");
145          return defaultTheme;
146        }
147        if (defaultTheme.getName().equals(name)) {
148          return defaultTheme;
149        }
150        for (Theme theme : supportedThemes) {
151          if (theme.getName().equals(name)) {
152            return theme;
153          }
154        }
155        LOG.debug("searching theme '" + name + "' not found. "
156            + "Using default: " + defaultTheme);
157        return defaultTheme;
158      }
159    
160      public void setDefaultThemeName(String defaultThemeName) {
161        this.defaultThemeName = defaultThemeName;
162      }
163    
164      public List<Theme> getSupportedThemes() {
165        return Collections.unmodifiableList(supportedThemes);
166      }
167    
168      public void addResourceDir(String resourceDir) {
169        if (!resourceDirs.contains(resourceDir)) {
170          if (LOG.isInfoEnabled()) {
171            LOG.info("adding resourceDir = '" + resourceDir + "'");
172          }
173          resourceDirs.add(resourceDir);
174        }
175      }
176    
177      public List<String> getResourceDirs() {
178        return resourceDirs;
179      }
180    
181      public boolean isAjaxEnabled() {
182        return ajaxEnabled;
183      }
184    
185      public void setAjaxEnabled(String value) {
186        this.ajaxEnabled = Boolean.valueOf(value);
187      }
188    
189      public boolean isFixResourceOrder() {
190        return fixResourceOrder;
191      }
192    
193      public void setFixResourceOrder(String fixResourceOrder) {
194        this.fixResourceOrder = Boolean.valueOf(fixResourceOrder);
195      }
196    
197      public boolean isFixLayoutTransparency() {
198        return fixLayoutTransparency;
199      }
200    
201      public void setFixLayoutTransparency(String fixLayoutTransparency) {
202        this.fixLayoutTransparency = Boolean.valueOf(fixLayoutTransparency);
203      }
204    
205      public boolean isCreateSessionSecret() {
206        return createSessionSecret;
207      }
208    
209      public void setCreateSessionSecret(String createSessionSecret) {
210        this.createSessionSecret = Boolean.valueOf(createSessionSecret);
211      }
212    
213      public boolean isCheckSessionSecret() {
214        return checkSessionSecret;
215      }
216    
217      public void setCheckSessionSecret(String checkSessionSecret) {
218        this.checkSessionSecret = Boolean.valueOf(checkSessionSecret);
219      }
220    
221      @Deprecated
222      public void setLoadThemesFromClasspath(String loadThemesFromClasspath) {
223        Deprecation.LOG.error("Deprecated: setting load-theme-resources-from-classpath is "
224            + "no longer supported");
225      }
226    
227      public Theme getDefaultTheme() {
228        return defaultTheme;
229      }
230    
231      public void setAvailableThemes(Map<String, Theme> availableTheme) {
232        this.availableTheme = availableTheme;
233      }
234    
235      public RenderersConfig getRenderersConfig() {
236        return renderersConfig;
237      }
238    
239      public void setRenderersConfig(RenderersConfig renderersConfig) {
240        this.renderersConfig = renderersConfig;
241      }
242    }
243