001 /**
002 * GRANITE DATA SERVICES
003 * Copyright (C) 2006-2013 GRANITE DATA SERVICES S.A.S.
004 *
005 * This file is part of the Granite Data Services Platform.
006 *
007 * Granite Data Services is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * Granite Data Services is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
015 * General Public License for more details.
016 *
017 * You should have received a copy of the GNU Lesser General Public
018 * License along with this library; if not, write to the Free Software
019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
020 * USA, or see <http://www.gnu.org/licenses/>.
021 */
022 package org.granite.util;
023
024 import java.util.Enumeration;
025
026 import javax.servlet.FilterConfig;
027 import javax.servlet.ServletConfig;
028 import javax.servlet.ServletContext;
029
030 import org.granite.logging.Logger;
031
032 /**
033 * @author Franck WOLFF
034 */
035 public class ServletParams {
036
037 private static final Logger log = Logger.getLogger(ServletParams.class);
038
039 public static <T> T get(final ServletContext context, final String name, Class<T> clazz, T defaultValue) {
040 return get(context, name, clazz, defaultValue, false, true);
041 }
042 public static <T> T get(final ServletConfig config, final String name, Class<T> clazz, T defaultValue) {
043 return get(config, name, clazz, defaultValue, false, true);
044 }
045 public static <T> T get(final FilterConfig config, final String name, Class<T> clazz, T defaultValue) {
046 return get(config, name, clazz, defaultValue, false, true);
047 }
048
049 public static <T> T get(final ServletContext context, final String name, Class<T> clazz, T defaultValue, boolean required, boolean warn) {
050 ParamGetter getter = new ParamGetter() {
051
052 public Enumeration<String> getNames() {
053 return context.getInitParameterNames();
054 }
055
056 public String getName() {
057 return name;
058 }
059
060 public String getValue() {
061 return context.getInitParameter(name);
062 }
063 };
064 return getInitParameter(getter, clazz, defaultValue, required, warn);
065 }
066
067 public static <T> T get(final ServletConfig config, final String name, Class<T> clazz, T defaultValue, boolean required, boolean warn) {
068 ParamGetter getter = new ParamGetter() {
069
070 public Enumeration<String> getNames() {
071 return config.getInitParameterNames();
072 }
073
074 public String getName() {
075 return name;
076 }
077
078 public String getValue() {
079 return config.getInitParameter(name);
080 }
081 };
082 return getInitParameter(getter, clazz, defaultValue, required, warn);
083 }
084
085 public static <T> T get(final FilterConfig config, final String name, Class<T> clazz, T defaultValue, boolean required, boolean warn) {
086 ParamGetter getter = new ParamGetter() {
087
088 public Enumeration<String> getNames() {
089 return config.getInitParameterNames();
090 }
091
092 public String getName() {
093 return name;
094 }
095
096 public String getValue() {
097 return config.getInitParameter(name);
098 }
099 };
100 return getInitParameter(getter, clazz, defaultValue, required, warn);
101 }
102
103 public static boolean contains(FilterConfig config, String name) {
104 boolean found = false;
105 Enumeration<String> e = config.getInitParameterNames();
106 while (e.hasMoreElements()) {
107 String n = e.nextElement();
108 if (name.equals(n)) {
109 found = true;
110 break;
111 }
112 }
113 return found;
114 }
115
116 public static boolean contains(ServletConfig config, String name) {
117 boolean found = false;
118 Enumeration<String> e = config.getInitParameterNames();
119 while (e.hasMoreElements()) {
120 String n = e.nextElement();
121 if (name.equals(n)) {
122 found = true;
123 break;
124 }
125 }
126 return found;
127 }
128
129 public static boolean contains(ServletContext context, String name) {
130 boolean found = false;
131 Enumeration<String> e = context.getInitParameterNames();
132 while (e.hasMoreElements()) {
133 String n = e.nextElement();
134 if (name.equals(n)) {
135 found = true;
136 break;
137 }
138 }
139 return found;
140 }
141
142 private static <T> T getInitParameter(ParamGetter getter, Class<T> clazz, T defaultValue, boolean required, boolean warn) {
143
144 if (required) {
145 boolean found = false;
146 Enumeration<String> e = getter.getNames();
147 while (e.hasMoreElements()) {
148 String name = e.nextElement();
149 if (name.equals(getter.getName())) {
150 found = true;
151 break;
152 }
153 }
154 if (!found)
155 throw new RuntimeException("Init parameter " + getter.getName() + " is required in web.xml");
156 }
157
158 String sValue = getter.getValue();
159 Object oValue = defaultValue;
160
161 boolean unsupported = false;
162 if (sValue != null) {
163 try {
164 if (clazz == String.class)
165 oValue = sValue;
166 else if (clazz == Integer.class || clazz == Integer.TYPE)
167 oValue = Integer.valueOf(sValue);
168 else if (clazz == Long.class || clazz == Long.TYPE)
169 oValue = Long.valueOf(sValue);
170 else if (clazz == Boolean.class || clazz == Boolean.TYPE) {
171 if (!Boolean.TRUE.toString().equalsIgnoreCase(sValue) && !Boolean.FALSE.toString().equalsIgnoreCase(sValue))
172 throw new NumberFormatException(sValue);
173 oValue = Boolean.valueOf(sValue);
174 }
175 else if (clazz == Double.class || clazz == Double.TYPE)
176 oValue = Double.valueOf(sValue);
177 else if (clazz == Float.class || clazz == Float.TYPE)
178 oValue = Float.valueOf(sValue);
179 else if (clazz == Short.class || clazz == Short.TYPE)
180 oValue = Short.valueOf(sValue);
181 else if (clazz == Byte.class || clazz == Byte.TYPE)
182 oValue = Byte.valueOf(sValue);
183 else
184 unsupported = true;
185 }
186 catch (Exception e) {
187 if (warn)
188 log.warn(e, "Illegal %s value for %s: %s (using default: %s)", clazz.getSimpleName(), getter.getName(), sValue, defaultValue);
189 }
190 }
191
192 if (unsupported)
193 throw new UnsupportedOperationException("Unsupported value type: " + clazz.getName());
194
195 @SuppressWarnings("unchecked")
196 T tValue = (T)oValue;
197
198 return tValue;
199 }
200
201 private static interface ParamGetter {
202
203 public Enumeration<String> getNames();
204 public String getName();
205 public String getValue();
206 }
207 }