PageRenderTime 76ms CodeModel.GetById 31ms RepoModel.GetById 1ms app.codeStats 0ms

/geronimo-jaxrs_2.0_spec/src/main/java/javax/ws/rs/core/Response.java

https://github.com/apache/geronimo-specs
Java | 515 lines | 261 code | 235 blank | 19 comment | 9 complexity | 9f5595490227b4226765b81f0bb05e74 MD5 | raw file
Possible License(s): Apache-2.0
  1. /*
  2. * #%L
  3. * Apache Geronimo JAX-RS Spec 2.0
  4. * %%
  5. * Copyright (C) 2003 - 2014 The Apache Software Foundation
  6. * %%
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. * #L%
  19. */
  20. package javax.ws.rs.core;
  21. import javax.ws.rs.ext.RuntimeDelegate;
  22. import java.lang.annotation.Annotation;
  23. import java.net.URI;
  24. import java.util.Date;
  25. import java.util.List;
  26. import java.util.Locale;
  27. import java.util.Map;
  28. import java.util.Set;
  29. public abstract class Response {
  30. protected Response() {
  31. }
  32. public abstract int getStatus();
  33. public abstract StatusType getStatusInfo();
  34. public abstract Object getEntity();
  35. public abstract <T> T readEntity(Class<T> entityType);
  36. public abstract <T> T readEntity(GenericType<T> entityType);
  37. public abstract <T> T readEntity(Class<T> entityType, Annotation[] annotations);
  38. public abstract <T> T readEntity(GenericType<T> entityType, Annotation[] annotations);
  39. public abstract boolean hasEntity();
  40. public abstract boolean bufferEntity();
  41. public abstract void close();
  42. public abstract MediaType getMediaType();
  43. public abstract Locale getLanguage();
  44. public abstract int getLength();
  45. public abstract Set<String> getAllowedMethods();
  46. public abstract Map<String, NewCookie> getCookies();
  47. public abstract EntityTag getEntityTag();
  48. public abstract Date getDate();
  49. public abstract Date getLastModified();
  50. public abstract URI getLocation();
  51. public abstract Set<Link> getLinks();
  52. public abstract boolean hasLink(String relation);
  53. public abstract Link getLink(String relation);
  54. public abstract Link.Builder getLinkBuilder(String relation);
  55. public abstract MultivaluedMap<String, Object> getMetadata();
  56. public MultivaluedMap<String, Object> getHeaders() {
  57. return getMetadata();
  58. }
  59. public abstract MultivaluedMap<String, String> getStringHeaders();
  60. public abstract String getHeaderString(String name);
  61. public static ResponseBuilder fromResponse(Response response) {
  62. ResponseBuilder b = status(response.getStatus());
  63. if (response.hasEntity()) {
  64. b.entity(response.getEntity());
  65. }
  66. for (String headerName : response.getHeaders().keySet()) {
  67. List<Object> headerValues = response.getHeaders().get(headerName);
  68. for (Object headerValue : headerValues) {
  69. b.header(headerName, headerValue);
  70. }
  71. }
  72. return b;
  73. }
  74. public static ResponseBuilder status(StatusType status) {
  75. return ResponseBuilder.newInstance().status(status);
  76. }
  77. public static ResponseBuilder status(Status status) {
  78. return status((StatusType) status);
  79. }
  80. public static ResponseBuilder status(int status) {
  81. return ResponseBuilder.newInstance().status(status);
  82. }
  83. public static ResponseBuilder ok() {
  84. return status(Status.OK);
  85. }
  86. public static ResponseBuilder ok(Object entity) {
  87. ResponseBuilder b = ok();
  88. b.entity(entity);
  89. return b;
  90. }
  91. public static ResponseBuilder ok(Object entity, MediaType type) {
  92. return ok().entity(entity).type(type);
  93. }
  94. public static ResponseBuilder ok(Object entity, String type) {
  95. return ok().entity(entity).type(type);
  96. }
  97. public static ResponseBuilder ok(Object entity, Variant variant) {
  98. return ok().entity(entity).variant(variant);
  99. }
  100. public static ResponseBuilder serverError() {
  101. return status(Status.INTERNAL_SERVER_ERROR);
  102. }
  103. public static ResponseBuilder created(URI location) {
  104. return status(Status.CREATED).location(location);
  105. }
  106. public static ResponseBuilder accepted() {
  107. return status(Status.ACCEPTED);
  108. }
  109. public static ResponseBuilder accepted(Object entity) {
  110. return accepted().entity(entity);
  111. }
  112. public static ResponseBuilder noContent() {
  113. return status(Status.NO_CONTENT);
  114. }
  115. public static ResponseBuilder notModified() {
  116. return status(Status.NOT_MODIFIED);
  117. }
  118. public static ResponseBuilder notModified(EntityTag tag) {
  119. return notModified().tag(tag);
  120. }
  121. @SuppressWarnings("HtmlTagCanBeJavadocTag")
  122. public static ResponseBuilder notModified(String tag) {
  123. return notModified().tag(tag);
  124. }
  125. public static ResponseBuilder seeOther(URI location) {
  126. return status(Status.SEE_OTHER).location(location);
  127. }
  128. public static ResponseBuilder temporaryRedirect(URI location) {
  129. return status(Status.TEMPORARY_REDIRECT).location(location);
  130. }
  131. public static ResponseBuilder notAcceptable(List<Variant> variants) {
  132. return status(Status.NOT_ACCEPTABLE).variants(variants);
  133. }
  134. public static abstract class ResponseBuilder {
  135. protected ResponseBuilder() {
  136. }
  137. protected static ResponseBuilder newInstance() {
  138. return RuntimeDelegate.getInstance().createResponseBuilder();
  139. }
  140. public abstract Response build();
  141. @Override
  142. @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
  143. public abstract ResponseBuilder clone();
  144. public abstract ResponseBuilder status(int status);
  145. public ResponseBuilder status(StatusType status) {
  146. if (status == null) {
  147. throw new IllegalArgumentException();
  148. }
  149. return status(status.getStatusCode());
  150. }
  151. public ResponseBuilder status(Status status) {
  152. return status((StatusType) status);
  153. }
  154. public abstract ResponseBuilder entity(Object entity);
  155. public abstract ResponseBuilder entity(Object entity, Annotation[] annotations);
  156. public abstract ResponseBuilder allow(String... methods);
  157. public abstract ResponseBuilder allow(Set<String> methods);
  158. public abstract ResponseBuilder cacheControl(CacheControl cacheControl);
  159. public abstract ResponseBuilder encoding(String encoding);
  160. public abstract ResponseBuilder header(String name, Object value);
  161. public abstract ResponseBuilder replaceAll(MultivaluedMap<String, Object> headers);
  162. public abstract ResponseBuilder language(String language);
  163. public abstract ResponseBuilder language(Locale language);
  164. public abstract ResponseBuilder type(MediaType type);
  165. public abstract ResponseBuilder type(String type);
  166. public abstract ResponseBuilder variant(Variant variant);
  167. public abstract ResponseBuilder contentLocation(URI location);
  168. public abstract ResponseBuilder cookie(NewCookie... cookies);
  169. public abstract ResponseBuilder expires(Date expires);
  170. public abstract ResponseBuilder lastModified(Date lastModified);
  171. public abstract ResponseBuilder location(URI location);
  172. public abstract ResponseBuilder tag(EntityTag tag);
  173. @SuppressWarnings("HtmlTagCanBeJavadocTag")
  174. public abstract ResponseBuilder tag(String tag);
  175. public abstract ResponseBuilder variants(Variant... variants);
  176. public abstract ResponseBuilder variants(List<Variant> variants);
  177. public abstract ResponseBuilder links(Link... links);
  178. public abstract ResponseBuilder link(URI uri, String rel);
  179. public abstract ResponseBuilder link(String uri, String rel);
  180. }
  181. public interface StatusType {
  182. public int getStatusCode();
  183. public Status.Family getFamily();
  184. public String getReasonPhrase();
  185. }
  186. public enum Status implements StatusType {
  187. OK(200, "OK"),
  188. CREATED(201, "Created"),
  189. ACCEPTED(202, "Accepted"),
  190. NO_CONTENT(204, "No Content"),
  191. RESET_CONTENT(205, "Reset Content"),
  192. PARTIAL_CONTENT(206, "Partial Content"),
  193. MOVED_PERMANENTLY(301, "Moved Permanently"),
  194. FOUND(302, "Found"),
  195. SEE_OTHER(303, "See Other"),
  196. NOT_MODIFIED(304, "Not Modified"),
  197. USE_PROXY(305, "Use Proxy"),
  198. TEMPORARY_REDIRECT(307, "Temporary Redirect"),
  199. BAD_REQUEST(400, "Bad Request"),
  200. UNAUTHORIZED(401, "Unauthorized"),
  201. PAYMENT_REQUIRED(402, "Payment Required"),
  202. FORBIDDEN(403, "Forbidden"),
  203. NOT_FOUND(404, "Not Found"),
  204. METHOD_NOT_ALLOWED(405, "Method Not Allowed"),
  205. NOT_ACCEPTABLE(406, "Not Acceptable"),
  206. PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required"),
  207. REQUEST_TIMEOUT(408, "Request Timeout"),
  208. CONFLICT(409, "Conflict"),
  209. GONE(410, "Gone"),
  210. LENGTH_REQUIRED(411, "Length Required"),
  211. PRECONDITION_FAILED(412, "Precondition Failed"),
  212. REQUEST_ENTITY_TOO_LARGE(413, "Request Entity Too Large"),
  213. REQUEST_URI_TOO_LONG(414, "Request-URI Too Long"),
  214. UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"),
  215. REQUESTED_RANGE_NOT_SATISFIABLE(416, "Requested Range Not Satisfiable"),
  216. EXPECTATION_FAILED(417, "Expectation Failed"),
  217. INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
  218. NOT_IMPLEMENTED(501, "Not Implemented"),
  219. BAD_GATEWAY(502, "Bad Gateway"),
  220. SERVICE_UNAVAILABLE(503, "Service Unavailable"),
  221. GATEWAY_TIMEOUT(504, "Gateway Timeout"),
  222. HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version Not Supported");
  223. private final int code;
  224. private final String reason;
  225. private final Family family;
  226. public enum Family {
  227. INFORMATIONAL,
  228. SUCCESSFUL,
  229. REDIRECTION,
  230. CLIENT_ERROR,
  231. SERVER_ERROR,
  232. OTHER;
  233. public static Family familyOf(final int statusCode) {
  234. switch (statusCode / 100) {
  235. case 1:
  236. return Family.INFORMATIONAL;
  237. case 2:
  238. return Family.SUCCESSFUL;
  239. case 3:
  240. return Family.REDIRECTION;
  241. case 4:
  242. return Family.CLIENT_ERROR;
  243. case 5:
  244. return Family.SERVER_ERROR;
  245. default:
  246. return Family.OTHER;
  247. }
  248. }
  249. }
  250. Status(final int statusCode, final String reasonPhrase) {
  251. this.code = statusCode;
  252. this.reason = reasonPhrase;
  253. this.family = Family.familyOf(statusCode);
  254. }
  255. @Override
  256. public Family getFamily() {
  257. return family;
  258. }
  259. @Override
  260. public int getStatusCode() {
  261. return code;
  262. }
  263. @Override
  264. public String getReasonPhrase() {
  265. return toString();
  266. }
  267. @Override
  268. public String toString() {
  269. return reason;
  270. }
  271. public static Status fromStatusCode(final int statusCode) {
  272. for (Status s : Status.values()) {
  273. if (s.code == statusCode) {
  274. return s;
  275. }
  276. }
  277. return null;
  278. }
  279. }
  280. }