/** * 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 org.apache.isis.viewer.restfulobjects.rendering; import java.util.Date; import javax.ws.rs.core.EntityTag; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.joda.time.DateTime; import org.joda.time.format.ISODateTimeFormat; import org.apache.isis.core.metamodel.adapter.version.Version; import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation; import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse; import org.apache.isis.viewer.restfulobjects.rendering.util.JsonWriterUtil; public final class Responses { private Responses(){} public static Response.ResponseBuilder ofNoContent() { return of(RestfulResponse.HttpStatusCode.NO_CONTENT); } public static Response.ResponseBuilder ofOk( final ReprRenderer<?, ?> renderer, final Caching caching) { return ofOk(renderer, caching, null, null); } /** * @param rootRepresentationIfAny - if specified, is used for entity; otherwise the renderer is used. The idea is that the renderer will be set up to render to some sub-node of root representation */ public static Response.ResponseBuilder ofOk( final ReprRenderer<?, ?> renderer, final Caching caching, final JsonRepresentation rootRepresentationIfAny) { return ofOk(renderer, caching, null, rootRepresentationIfAny); } public static Response.ResponseBuilder ofOk( final ReprRenderer<?, ?> renderer, final Caching caching, final Version version) { return ofOk(renderer, caching, version, null); } /** * @param rootRepresentationIfAny - if specified, is used for entity; otherwise the renderer is used. The idea is that the renderer will be set up to render to some sub-node of root representation */ public static Response.ResponseBuilder ofOk( final ReprRenderer<?, ?> renderer, final Caching caching, final Version version, final JsonRepresentation rootRepresentationIfAny) { final JsonRepresentation representation = renderer.render(); // if a rootRepresentation is provided, then the assumption is that the rendered // will be rendering to some submap of the rootRepresentation final JsonRepresentation entityRepresentation = rootRepresentationIfAny != null? rootRepresentationIfAny : representation; final MediaType mediaType = renderer.getMediaType(); final Response.ResponseBuilder response = of(RestfulResponse.HttpStatusCode.OK) .type(mediaType) .cacheControl(caching.getCacheControl()) .entity(JsonWriterUtil.jsonFor(entityRepresentation)); return addLastModifiedAndETagIfAvailable(response, version); } protected static Response.ResponseBuilder of(final RestfulResponse.HttpStatusCode httpStatusCode) { return Response.status(httpStatusCode.getJaxrsStatusType()).type(MediaType.APPLICATION_JSON_TYPE); } public static Response.ResponseBuilder mediaType( final Response.ResponseBuilder responseBuilder, final MediaType mediaType) { responseBuilder.type(mediaType); return responseBuilder; } public static Response.ResponseBuilder addLastModifiedAndETagIfAvailable( final Response.ResponseBuilder responseBuilder, final Version version) { if (version != null && version.getTime() != null) { final Date time = version.getTime(); responseBuilder.lastModified(time); responseBuilder.tag(asETag(time)); } return responseBuilder; } private static EntityTag asETag(final Date time) { final String utcTime = ISODateTimeFormat.basicDateTime().print(new DateTime(time)); return new EntityTag(utcTime, true); } }