001 /*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2014 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * SonarQube is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * SonarQube is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public License
017 * along with this program; if not, write to the Free Software Foundation,
018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
019 */
020 package org.sonar.api.server.ws;
021
022 import com.google.common.base.Splitter;
023 import com.google.common.collect.Lists;
024 import org.apache.commons.lang.StringUtils;
025 import org.sonar.api.utils.DateUtils;
026 import org.sonar.api.utils.SonarException;
027
028 import javax.annotation.CheckForNull;
029 import java.util.Date;
030 import java.util.List;
031
032 /**
033 * @since 4.2
034 */
035 public abstract class Request {
036
037 /**
038 * Returns the name of the HTTP method with which this request was made. Possible
039 * values are GET and POST. Others are not supported.
040 */
041 public abstract String method();
042
043 /**
044 * Returns a non-null value. To be used when parameter is required or has a default value.
045 *
046 * @throws java.lang.IllegalArgumentException is value is null or blank
047 */
048 public String mandatoryParam(String key) {
049 String value = param(key);
050 if (value == null) {
051 throw new IllegalArgumentException(String.format("Parameter '%s' is missing", key));
052 }
053 return value;
054 }
055
056 /**
057 * Returns a boolean value. To be used when parameter is required or has a default value.
058 *
059 * @throws java.lang.IllegalArgumentException is value is null or blank
060 */
061 public boolean mandatoryParamAsBoolean(String key) {
062 String s = mandatoryParam(key);
063 return Boolean.parseBoolean(s);
064 }
065
066 /**
067 * Returns an int value. To be used when parameter is required or has a default value.
068 *
069 * @throws java.lang.IllegalArgumentException is value is null or blank
070 */
071 public int mandatoryParamAsInt(String key) {
072 String s = mandatoryParam(key);
073 return Integer.parseInt(s);
074 }
075
076 /**
077 * Returns a long value. To be used when parameter is required or has a default value.
078 *
079 * @throws java.lang.IllegalArgumentException is value is null or blank
080 */
081 public long mandatoryParamAsLong(String key) {
082 String s = mandatoryParam(key);
083 return Long.parseLong(s);
084 }
085
086 public <E extends Enum<E>> E mandatoryParamAsEnum(String key, Class<E> enumClass) {
087 return Enum.valueOf(enumClass, mandatoryParam(key));
088 }
089
090 public List<String> mandatoryParamAsStrings(String key) {
091 List<String> values = paramAsStrings(key);
092 if (values == null) {
093 throw new IllegalArgumentException(String.format("Parameter '%s' is missing", key));
094 }
095 return values;
096 }
097
098 @CheckForNull
099 public List<String> paramAsStrings(String key) {
100 String value = param(key);
101 if (value == null) {
102 return null;
103 }
104 return Lists.newArrayList(Splitter.on(',').omitEmptyStrings().trimResults().split(value));
105 }
106
107 @CheckForNull
108 public abstract String param(String key);
109
110 /**
111 * @deprecated to be dropped in 4.4. Default values are declared in ws metadata
112 */
113 @CheckForNull
114 @Deprecated
115 public String param(String key, @CheckForNull String defaultValue) {
116 return StringUtils.defaultString(param(key), defaultValue);
117 }
118
119 /**
120 * @deprecated to be dropped in 4.4. Default values must be declared in {@link org.sonar.api.server.ws.WebService} then
121 * this method can be replaced by {@link #mandatoryParamAsBoolean(String)}.
122 */
123 @Deprecated
124 public boolean paramAsBoolean(String key, boolean defaultValue) {
125 String s = param(key);
126 return s == null ? defaultValue : Boolean.parseBoolean(s);
127 }
128
129 /**
130 * @deprecated to be dropped in 4.4. Default values must be declared in {@link org.sonar.api.server.ws.WebService} then
131 * this method can be replaced by {@link #mandatoryParamAsInt(String)}.
132 */
133 @Deprecated
134 public int paramAsInt(String key, int defaultValue) {
135 String s = param(key);
136 return s == null ? defaultValue : Integer.parseInt(s);
137 }
138
139 /**
140 * @deprecated to be dropped in 4.4. Default values must be declared in {@link org.sonar.api.server.ws.WebService} then
141 * this method can be replaced by {@link #mandatoryParamAsLong(String)}.
142 */
143 @Deprecated
144 public long paramAsLong(String key, long defaultValue) {
145 String s = param(key);
146 return s == null ? defaultValue : Long.parseLong(s);
147 }
148
149
150 @CheckForNull
151 public Boolean paramAsBoolean(String key) {
152 String s = param(key);
153 return s == null ? null : Boolean.parseBoolean(s);
154 }
155
156 @CheckForNull
157 public Integer paramAsInt(String key) {
158 String s = param(key);
159 return s == null ? null : Integer.parseInt(s);
160 }
161
162 @CheckForNull
163 public Long paramAsLong(String key) {
164 String s = param(key);
165 return s == null ? null : Long.parseLong(s);
166 }
167
168 @CheckForNull
169 public <E extends Enum<E>> E paramAsEnum(String key, Class<E> enumClass) {
170 String s = param(key);
171 return s == null ? null : Enum.valueOf(enumClass, s);
172 }
173
174 @CheckForNull
175 public <E extends Enum<E>> List<E> paramAsEnums(String key, Class<E> enumClass) {
176 String value = param(key);
177 if (value == null) {
178 return null;
179 }
180 Iterable<String> values = Splitter.on(',').omitEmptyStrings().trimResults().split(value);
181 List<E> result = Lists.newArrayList();
182 for (String s : values) {
183 result.add(Enum.valueOf(enumClass, s));
184 }
185 return result;
186 }
187
188 @CheckForNull
189 public Date paramAsDateTime(String key) {
190 String s = param(key);
191 if (s != null) {
192 try {
193 return DateUtils.parseDateTime(s);
194 } catch(SonarException notDateTime) {
195 try {
196 return DateUtils.parseDate(s);
197 } catch (SonarException notDateEither) {
198 throw new SonarException(String.format("'%s' cannot be parsed as either a date or date+time", s));
199 }
200 }
201 }
202 return null;
203 }
204
205 @CheckForNull
206 public Date paramAsDate(String key) {
207 String s = param(key);
208 if (s != null) {
209 return DateUtils.parseDate(s);
210 }
211 return null;
212 }
213 }