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