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}