001package org.javasimon.console;
002
003import java.io.IOException;
004import java.io.OutputStream;
005import java.io.PrintWriter;
006import java.nio.charset.Charset;
007import java.util.ArrayList;
008import java.util.Collection;
009import java.util.EnumSet;
010import javax.servlet.http.HttpServletRequest;
011import javax.servlet.http.HttpServletResponse;
012
013import org.javasimon.Manager;
014import org.javasimon.SimonManager;
015
016/**
017 * Action context wraps both HTTP request and response to make unit testing easier.
018 *
019 * @author gquintana
020 */
021public class ActionContext {
022
023        /** HTTP Request. */
024        private final HttpServletRequest request;
025        /** HTTP Response. */
026        private final HttpServletResponse response;
027        /** Request Path. */
028        private String path;
029        /** Simon manager to use. */
030        private Manager manager = SimonManager.manager();
031        /** Simon console plugin manager. */
032        private SimonConsolePluginManager pluginManager;
033
034        public ActionContext(HttpServletRequest request, HttpServletResponse response, String path) {
035                this.request = request;
036                this.response = response;
037                this.path = path;
038        }
039
040        public HttpServletRequest getRequest() {
041                return request;
042        }
043
044        public String getCharacterEncoding() {
045                String encoding = getRequest().getCharacterEncoding();
046                return encoding == null ? Charset.defaultCharset().name() : encoding;
047        }
048
049        public HttpServletResponse getResponse() {
050                return response;
051        }
052
053        public String getPath() {
054                return path;
055        }
056
057        public void setPath(String path) {
058                this.path = path;
059        }
060
061        /** Set content type of response. */
062        public void setContentType(String contentType) {
063                getResponse().setContentType(contentType);
064        }
065
066        /** Get response output stream. */
067        public OutputStream getOutputStream() throws IOException {
068                return getResponse().getOutputStream();
069        }
070
071        /** Get response writer. */
072        public PrintWriter getWriter() throws IOException {
073                return getResponse().getWriter();
074        }
075
076        /** Get Simon {@link org.javasimon.Manager}. */
077        public Manager getManager() {
078                return manager;
079        }
080
081        public void setManager(Manager manager) {
082                this.manager = manager;
083        }
084
085        protected String getParameter(String name) {
086                return getRequest().getParameter(name);
087        }
088
089        protected String[] getParameters(String name) {
090                return getRequest().getParameterValues(name);
091        }
092
093        /**
094         * Transform empty string (only white spaces) into null, handles null.
095         */
096        private static String blankToNull(String value) {
097                if (value != null) {
098                        value = value.trim();
099                        if (value.equals("")) {
100                                value = null;
101                        }
102                }
103                return value;
104        }
105
106        /** Returns default value when value is null. */
107        private static <T> T defaultValue(T value, T defaultValue) {
108                return value == null ? defaultValue : value;
109        }
110
111        /**
112         * Get request parameter as a String.
113         *
114         * @param name Parameter name
115         * @param defaultValue Parameter default value (can be null)
116         * @return Parameter value
117         */
118        public String getParameterAsString(String name, String defaultValue) {
119                return defaultValue(blankToNull(getParameter(name)), defaultValue);
120        }
121
122        /** Transform a string into an boolean. */
123        private static Boolean stringToBoolean(String value) {
124                final String s = blankToNull(value);
125                return s == null ? null : Boolean.valueOf(s);
126        }
127
128        /**
129         * Get request parameter as a Boolean.
130         *
131         * @param name Parameter name
132         * @param defaultValue Parameter default value
133         */
134        public boolean getParameterAsBoolean(String name, Boolean defaultValue) {
135                return defaultValue(stringToBoolean(getParameter(name)), defaultValue);
136        }
137
138        /**
139         * Transform a string into an enum (using its name which is supposed to be
140         * uppercase, handles null values.
141         */
142        private static <T extends Enum<T>> T stringToEnum(String value, Class<T> type) {
143                final String s = blankToNull(value);
144                return value == null ? null : Enum.valueOf(type, s.toUpperCase());
145        }
146
147        /**
148         * Get request parameter as a Enum.
149         *
150         * @param name Parameter name
151         * @param type Enum type
152         * @param defaultValue Parameter default value (can be null)
153         * @return Parameter value
154         */
155        public <T extends Enum<T>> T getParameterAsEnum(String name, Class<T> type, T defaultValue) {
156                return defaultValue(stringToEnum(getParameter(name), type), defaultValue);
157        }
158
159        /**
160         * Get multiple request parameters as Enums.
161         *
162         * @param name Parameter name
163         * @return Parameter values as an Enum Set.
164         */
165        public <T extends Enum<T>> EnumSet<T> getParametersAsEnums(String name, Class<T> type, EnumSet<T> defaultValue) {
166                String[] enumNames = getParameters(name);
167                if (enumNames == null) {
168                        return defaultValue;
169                } else {
170                        Collection<T> enums = new ArrayList<>();
171                        for (String enumName : enumNames) {
172                                T enumValue = stringToEnum(blankToNull(enumName), type);
173                                if (enumValue != null) {
174                                        enums.add(enumValue);
175                                }
176                        }
177                        return enums.isEmpty() ? defaultValue : EnumSet.copyOf(enums);
178                }
179        }
180
181        public SimonConsolePluginManager getPluginManager() {
182                return pluginManager;
183        }
184
185        public void setPluginManager(SimonConsolePluginManager pluginManager) {
186                this.pluginManager = pluginManager;
187        }
188}