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    }