| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package javax.ws.rs.core; |
| |
| import java.net.URI; |
| import java.util.Collections; |
| import java.util.Date; |
| import java.util.List; |
| import java.util.Locale; |
| |
| import javax.ws.rs.ext.RuntimeDelegate; |
| |
| public abstract class Response { |
| |
| private final static RuntimeDelegate delegate = RuntimeDelegate.getInstance(); |
| |
| public abstract static class ResponseBuilder { |
| protected ResponseBuilder() { |
| // do nothing |
| } |
| |
| public abstract Response build(); |
| |
| public abstract Response.ResponseBuilder cacheControl(CacheControl value); |
| |
| @Override |
| public abstract Response.ResponseBuilder clone(); |
| |
| public abstract Response.ResponseBuilder contentLocation(URI value); |
| |
| public abstract Response.ResponseBuilder cookie(NewCookie... values); |
| |
| public abstract Response.ResponseBuilder entity(Object value); |
| |
| public abstract Response.ResponseBuilder expires(Date value); |
| |
| public abstract Response.ResponseBuilder header(String name, Object value); |
| |
| public abstract Response.ResponseBuilder language(Locale value); |
| |
| public abstract Response.ResponseBuilder language(String value); |
| |
| public abstract Response.ResponseBuilder lastModified(Date value); |
| |
| public abstract Response.ResponseBuilder location(URI value); |
| |
| protected static Response.ResponseBuilder newInstance() { |
| return delegate.createResponseBuilder(); |
| } |
| |
| public abstract Response.ResponseBuilder status(int value); |
| |
| public Response.ResponseBuilder status(Response.Status value) { |
| return delegate.createResponseBuilder().status(value.getStatusCode()); |
| } |
| |
| public Response.ResponseBuilder status(Response.StatusType status) { |
| return delegate.createResponseBuilder().status(status.getStatusCode()); |
| } |
| |
| public abstract Response.ResponseBuilder tag(EntityTag value); |
| |
| public abstract Response.ResponseBuilder tag(String value); |
| |
| public abstract Response.ResponseBuilder type(MediaType value); |
| |
| public abstract Response.ResponseBuilder type(String type); |
| |
| public abstract Response.ResponseBuilder variant(Variant value); |
| |
| public abstract Response.ResponseBuilder variants(List<Variant> values); |
| |
| } |
| |
| public static enum Status implements StatusType { |
| OK(Family.SUCCESSFUL, 200, "OK"), |
| CREATED(Family.SUCCESSFUL, 201, "Created"), |
| ACCEPTED(Family.SUCCESSFUL, 202, "Accepted"), |
| NO_CONTENT(Family.SUCCESSFUL, 204, "No Content"), |
| MOVED_PERMANENTLY(Family.REDIRECTION, 301, "Moved Permanently"), |
| SEE_OTHER(Family.REDIRECTION, 303, "See Other"), |
| NOT_MODIFIED(Family.REDIRECTION, 304, "Not Modified"), |
| TEMPORARY_REDIRECT(Family.REDIRECTION, 307, "Temporary Redirect"), |
| BAD_REQUEST(Family.CLIENT_ERROR, 400,"Bad Request"), |
| UNAUTHORIZED(Family.CLIENT_ERROR, 401, "Unauthorized"), |
| FORBIDDEN(Family.CLIENT_ERROR, 403, "Forbidden"), |
| NOT_FOUND(Family.CLIENT_ERROR, 404, "Not Found"), |
| NOT_ACCEPTABLE(Family.CLIENT_ERROR, 406, "Not Acceptable"), |
| CONFLICT(Family.CLIENT_ERROR, 409, "Conflict"), |
| GONE(Family.CLIENT_ERROR, 410, "Gone"), |
| PRECONDITION_FAILED(Family.CLIENT_ERROR, 412, "Precondition Failed"), |
| UNSUPPORTED_MEDIA_TYPE(Family.CLIENT_ERROR, 415, "Unsupported Media Type"), |
| INTERNAL_SERVER_ERROR(Family.SERVER_ERROR, 500, "Internal Server Error"), |
| SERVICE_UNAVAILABLE(Family.SERVER_ERROR, 503, "Service Unavailable"), ; |
| |
| private final Family family; |
| private final int statusCode; |
| private final String reasonPhrase; |
| |
| private Status(Family family, int statusCode, String reasonPhrase) { |
| this.family = family; |
| this.statusCode = statusCode; |
| this.reasonPhrase = reasonPhrase; |
| } |
| |
| public static enum Family { |
| INFORMATIONAL, |
| SUCCESSFUL, |
| REDIRECTION, |
| CLIENT_ERROR, |
| SERVER_ERROR, |
| OTHER |
| } |
| |
| public static Status fromStatusCode(int statusCode) { |
| for (Status s : values()) { |
| if (s.getStatusCode() == statusCode) { |
| return s; |
| } |
| } |
| return null; |
| } |
| |
| public int getStatusCode() { |
| return statusCode; |
| } |
| |
| public Response.Status.Family getFamily() { |
| return family; |
| } |
| |
| @Override |
| public String toString() { |
| return reasonPhrase; |
| } |
| |
| public String getReasonPhrase() { |
| return reasonPhrase; |
| } |
| } |
| |
| public interface StatusType { |
| public Response.Status.Family getFamily(); |
| |
| public String getReasonPhrase(); |
| |
| public int getStatusCode(); |
| } |
| |
| protected Response() { |
| // do nothing |
| } |
| |
| public static Response.ResponseBuilder created(java.net.URI location) { |
| if (location == null) { |
| throw new IllegalArgumentException(); |
| } |
| return status(Status.CREATED).location(location); |
| } |
| |
| public static Response.ResponseBuilder fromResponse(Response response) { |
| ResponseBuilder builder = delegate.createResponseBuilder(); |
| builder.status(response.getStatus()); |
| builder.entity(response.getEntity()); |
| MultivaluedMap<String, Object> metadata = response.getMetadata(); |
| for (String key : metadata.keySet()) { |
| List<Object> values = metadata.get(key); |
| for (Object value : values) { |
| builder.header(key, value); |
| } |
| } |
| return builder; |
| } |
| |
| public abstract Object getEntity(); |
| |
| public abstract MultivaluedMap<String, Object> getMetadata(); |
| |
| public abstract int getStatus(); |
| |
| public static Response.ResponseBuilder noContent() { |
| return status(Status.NO_CONTENT); |
| } |
| |
| public static Response.ResponseBuilder notAcceptable(List<Variant> values) { |
| ResponseBuilder builder = status(Status.NOT_ACCEPTABLE); |
| if (values == null) { |
| return builder.variants(Collections.EMPTY_LIST); |
| } |
| return builder.variants(values); |
| } |
| |
| public static Response.ResponseBuilder notModified() { |
| return status(Status.NOT_MODIFIED); |
| } |
| |
| public static Response.ResponseBuilder notModified(EntityTag value) { |
| if (value == null) { |
| throw new IllegalArgumentException(); |
| } |
| return status(Status.NOT_MODIFIED).tag(value); |
| } |
| |
| public static Response.ResponseBuilder notModified(String value) { |
| if (value == null) { |
| throw new IllegalArgumentException(); |
| } |
| return status(Status.NOT_MODIFIED).tag(value); |
| } |
| |
| public static Response.ResponseBuilder ok() { |
| return status(Status.OK); |
| } |
| |
| public static Response.ResponseBuilder ok(Object entity) { |
| return status(Status.OK).entity(entity); |
| } |
| |
| public static Response.ResponseBuilder ok(Object entity, MediaType mediaType) { |
| return status(Status.OK).entity(entity).type(mediaType); |
| } |
| |
| public static Response.ResponseBuilder ok(Object entity, String mediaType) { |
| return status(Status.OK).entity(entity).type(mediaType); |
| } |
| |
| public static Response.ResponseBuilder ok(Object entity, Variant variant) { |
| return status(Status.OK).entity(entity).variant(variant); |
| } |
| |
| public static Response.ResponseBuilder seeOther(URI location) { |
| if (location == null) { |
| throw new IllegalArgumentException(); |
| } |
| return status(Status.SEE_OTHER).location(location); |
| } |
| |
| public static Response.ResponseBuilder serverError() { |
| return status(Status.INTERNAL_SERVER_ERROR); |
| } |
| |
| public static Response.ResponseBuilder status(int status) { |
| if (status < 100 || status > 599) { |
| throw new IllegalArgumentException(); |
| } |
| return ResponseBuilder.newInstance().status(status); |
| } |
| |
| public static Response.ResponseBuilder status(Response.Status status) { |
| if (status == null) { |
| throw new IllegalArgumentException(); |
| } |
| return ResponseBuilder.newInstance().status(status); |
| } |
| |
| public static Response.ResponseBuilder status(Response.StatusType status) { |
| if (status == null) { |
| throw new IllegalArgumentException(); |
| } |
| return ResponseBuilder.newInstance().status(status); |
| } |
| |
| public static Response.ResponseBuilder temporaryRedirect(URI location) { |
| return status(Status.TEMPORARY_REDIRECT).location(location); |
| } |
| } |