<?xml version="1.0"?>
<!--

    Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.

    This program and the accompanying materials are made available under the
    terms of the Eclipse Public License v. 2.0, which is available at
    http://www.eclipse.org/legal/epl-2.0.

    This Source Code may also be made available under the following Secondary
    Licenses when the conditions for such availability set forth in the
    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
    version 2 with the GNU Classpath Exception, which is available at
    https://www.gnu.org/software/classpath/license.html.

    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<!DOCTYPE chapter [<!ENTITY % ents SYSTEM "jersey.ent" > %ents; ]>
<chapter xmlns="http://docbook.org/ns/docbook"
         version="5.0"
         xml:lang="en"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:xi="http://www.w3.org/2001/XInclude"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xsi:schemaLocation="http://docbook.org/ns/docbook http://docbook.org/xml/5.0/xsd/docbook.xsd
                             http://www.w3.org/1999/xlink http://www.w3.org/1999/xlink.xsd"
         xml:id="representations">
    <title>Representations and Responses</title>

    <section xml:id="reps-and-types">
        <title>Representations and Java Types</title>
        <para>Previous sections on &jaxrs.Produces; and &jaxrs.Consumes; annotations
            referred to media type of an entity representation. Examples above depicted resource
            methods that could consume and/or produce String Java type for a number of
	    different media types. This approach is easy to understand and relatively
	    straightforward when applied to simple use cases.
	    </para>

	    <para>To cover also other cases, handling non-textual data for example or handling data stored in the file system, etc.,
            JAX-RS implementations are required to support also other kinds of media type
            conversions where additional, non-String, Java types are being utilized. Following is a short listing of the Java types
            that are supported out of the box with respect to supported media type:
            <itemizedlist>
            	<listitem>All media types (<literal>*/*</literal>)
            		<itemizedlist>
            			<listitem><literal>byte[]</literal></listitem>
				<listitem><literal>java.lang.String</literal></listitem>
				<listitem><literal>java.io.Reader</literal> (inbound only)</listitem>
				<listitem><literal>java.io.File</literal></listitem>
				<listitem><literal>javax.activation.DataSource</literal></listitem>
				<listitem><literal>jakarta.ws.rs.core.StreamingOutput</literal> (outbound only)</listitem>
            		</itemizedlist>
		</listitem>
            	<listitem>XML media types (<literal>text/xml</literal>, <literal>application/xml</literal> and <literal>application/...+xml</literal>)
            		<itemizedlist>
            			<listitem><literal>javax.xml.transform.Source</literal></listitem>
            			<listitem><literal>jakarta.xml.bind.JAXBElement</literal></listitem>
            			<listitem>Application supplied JAXB classes (types annotated with
	    <link xlink:href="http://docs.oracle.com/javase/6/docs/api/jakarta.xml.bind/annotation/XmlRootElement.html">@XmlRootElement</link>
	    or<link xlink:href="http://docs.oracle.com/javase/6/docs/api/jakarta.xml.bind/annotation/XmlType.html">@XmlType</link>)</listitem>
             		</itemizedlist>
            	</listitem>
                <listitem>Form content (<literal>application/x-www-form-urlencoded</literal>)
                        <itemizedlist>
                          <listitem><literal>MultivaluedMap&lt;String,String&gt;</literal></listitem>
                        </itemizedlist>
                 </listitem>
                 <listitem>Plain text (<literal>text/plain</literal>)
                        <itemizedlist>
                          <listitem><literal>java.lang.Boolean</literal></listitem>
                          <listitem><literal>java.lang.Character</literal></listitem>
                          <listitem><literal>java.lang.Number</literal></listitem>
                        </itemizedlist>
                </listitem>
            </itemizedlist>
        </para>

        <para>Unlike method parameters that are associated with the extraction of
            request parameters, the method parameter associated with the
            representation being consumed does not require annotating. In other words the
            representation (entity) parameter does not require a specific 'entity' annotation. A method parameter
            without an annotation is an entity. A maximum of
            one such unannotated method parameter may exist since there may only be a
            maximum of one such representation sent in a request.
        </para>

        <para>The representation being produced corresponds to what is returned by
            the resource method. For example JAX-RS makes it simple to produce images
            that are instance of
            <literal>File</literal>
            as follows:
        </para>

        <para>
            <example>
                <title>Using
                    <code>File</code>
                    with a specific media type to produce a response
                </title>
                <programlisting language="java" linenumbering="numbered">@GET
@Path("/images/{image}")
@Produces("image/*")
public Response getImage(@PathParam("image") String image) {
  File f = new File(image);

  if (!f.exists()) {
    throw new WebApplicationException(404);
  }

  String mt = new MimetypesFileTypeMap().getContentType(f);
  return Response.ok(f, mt).build();
}</programlisting>
            </example>
        </para>

        <para>The
            <literal>File</literal> type can also be used when consuming a representation (request entity).
            In that case a temporary file will be created from the incoming request entity and passed as a
            parameter to the resource method.
        </para>

        <para>
            The <literal>Content-Type</literal> response header
            (if not set programmatically as described in the next section)
            will be automatically set based on the media types declared by &jaxrs.Produces; annotation.
 Given the following method, the most acceptable media type is used when multiple output media types are allowed:
        </para>
        <para>
            <programlisting language="java" linenumbering="numbered">@GET
@Produces({"application/xml", "application/json"})
public String doGetAsXmlOrJson() {
  ...
}</programlisting>

            If <literal>application/xml</literal> is the most acceptable media type defined
            by the request (e.g. by header <literal>Accept: application/xml</literal>), then the
            <literal>Content-Type</literal> response header
            will be set to <literal>application/xml</literal>.
        </para>
    </section>

    <section>
        <title>Building Responses</title>

        <para>Sometimes it is necessary to return additional
            information in response to a HTTP request. Such information may be built
            and returned using &jaxrs.core.Response; and &jaxrs.core.Response.ResponseBuilder;.
            For example, a common RESTful pattern for the creation of a new resource
            is to support a POST request that returns a 201 (Created) status code and
            a
            <literal>Location</literal>
            header whose value is the URI to the newly
            created resource. This may be achieved as follows:
        </para>

        <para>
            <example>
                <title>Returning 201 status code and adding
                    <literal>Location</literal>
                    header in response to POST request
                </title>
                <programlisting language="java" linenumbering="numbered">@POST
@Consumes("application/xml")
public Response post(String content) {
  URI createdUri = ...
  create(content);
  return Response.created(createdUri).build();
}</programlisting>
            </example>
        </para>

        <para>In the above no representation produced is returned, this can be
            achieved by building an entity as part of the response as follows:
        </para>

        <para>
            <example>
                <title>Adding an entity body to a custom response</title>
                <programlisting language="java" linenumbering="numbered">@POST
@Consumes("application/xml")
public Response post(String content) {
  URI createdUri = ...
  String createdContent = create(content);
  return Response.created(createdUri).entity(Entity.text(createdContent)).build();
}</programlisting>
            </example>
        </para>

        <para>Response building provides other functionality such as setting the
            entity tag and last modified date of the representation.
        </para>
    </section>

    <section>
        <title>WebApplicationException and Mapping Exceptions to Responses</title>

        <para>Previous section shows how to return HTTP responses,
              that are built up programmatically.
            It is possible to use the very same mechanism
            to return HTTP errors directly,
            e.g. when handling exceptions in a try-catch block.
            However, to better align with the Java programming model,
            JAX-RS allows to define direct mapping of Java exceptions to HTTP error responses.
        </para>

        <para>The following example shows throwing
            <literal>CustomNotFoundException</literal>
            from a resource method in order to return an error HTTP response to the client:
        </para>

        <para>
            <example>
                <title>Throwing exceptions to control response</title>
                <programlisting language="java" linenumbering="numbered">@Path("items/{itemid}/")
public Item getItem(@PathParam("itemid") String itemid) {
  Item i = getItems().get(itemid);
  if (i == null) {
    throw new CustomNotFoundException("Item, " + itemid + ", is not found");
  }

  return i;
}</programlisting>
            </example>
        </para>

        <para>This exception is an application specific exception that extends &jaxrs.WebApplicationException;
            and builds a HTTP response with the 404 status code and an optional
            message as the body of the response:
        </para>

        <para>
            <example>
                <title>Application specific exception implementation</title>
                <programlisting language="java" linenumbering="numbered">public class CustomNotFoundException extends WebApplicationException {

  /**
  * Create a HTTP 404 (Not Found) exception.
  */
  public CustomNotFoundException() {
    super(Responses.notFound().build());
  }

  /**
  * Create a HTTP 404 (Not Found) exception.
  * @param message the String that is the entity of the 404 response.
  */
  public CustomNotFoundException(String message) {
    super(Response.status(Responses.NOT_FOUND).
    entity(message).type("text/plain").build());
  }
}</programlisting>
            </example>
        </para>

        <para>In other cases it may not be appropriate to throw instances of &jaxrs.WebApplicationException;,
            or classes that extend &jaxrs.WebApplicationException;, and instead it may be preferable to map an existing exception to a
            response. For such cases it is possible to use a custom exception mapping provider. The provider must implement
            the &jaxrs.ext.ExceptionMapper; interface. For example, the following
            maps the
            <link xlink:href="http://docs.oracle.com/javaee/5/api/jakarta.persistence/EntityNotFoundException.html">EntityNotFoundException</link>
            to a HTTP 404 (Not Found) response:
        </para>

        <para>
            <example>
                <title>Mapping generic exceptions to responses</title>
                <programlisting language="java" linenumbering="numbered">@Provider
public class EntityNotFoundMapper implements ExceptionMapper&lt;jakarta.persistence.EntityNotFoundException&gt; {
  public Response toResponse(jakarta.persistence.EntityNotFoundException ex) {
    return Response.status(404).
      entity(ex.getMessage()).
      type("text/plain").
      build();
  }
}</programlisting>
            </example>
        </para>

        <para>The above class is annotated with &jaxrs.ext.Provider;, this declares that the class is of interest to the JAX-RS runtime. Such a
            class may be added to the set of classes of the &jaxrs.core.Application; instance that is configured. When an application throws an
            <link xlink:href="http://docs.oracle.com/javaee/6/api/jakarta.persistence/EntityNotFoundException.html">EntityNotFoundException</link>
            the
            <literal>toResponse</literal>
            method of the
            <literal>EntityNotFoundMapper</literal>
            instance will be invoked.
        </para>

        <para>
            Jersey supports extension of the exception mappers. These extended mappers must implement
            the <literal>org.glassfish.jersey.spi.ExtendedExceptionMapper</literal> interface. This interface additionally
            defines method <literal>isMappable(Throwable)</literal> which will be invoked by the Jersey runtime
            when exception is thrown and this provider is considered as mappable based on the exception type. Using this
            method the provider can reject mapping of the exception before the method <literal>toResponse</literal>
            is invoked. The provider can for example check the exception parameters and based on them return false
            and let other provider to be chosen for the exception mapping.
        </para>

    </section>

    <section>
        <title>Conditional GETs and Returning 304 (Not Modified) Responses</title>

        <para>Conditional GETs are a great way to reduce bandwidth, and
            potentially improve on the server-side performance, depending on how the information used
            to determine conditions is calculated. A well-designed web site may for example return
            304 (Not Modified) responses for many of static images it serves.
        </para>

        <para>JAX-RS provides support for conditional GETs using the contextual interface &jaxrs.core.Request;.
        </para>

        <para>The following example shows conditional GET support:</para>

        <para>
            <example>
                <title>Conditional GET support</title>
                <programlisting language="java" linenumbering="numbered">public SparklinesResource(
  @QueryParam("d") IntegerList data,
  @DefaultValue("0,100") @QueryParam("limits") Interval limits,
  @Context Request request,
  @Context UriInfo ui) {
  if (data == null) {
    throw new WebApplicationException(400);
  }

  this.data = data;
  this.limits = limits;

  if (!limits.contains(data)) {
    throw new WebApplicationException(400);
  }

  this.tag = computeEntityTag(ui.getRequestUri());

  if (request.getMethod().equals("GET")) {
    Response.ResponseBuilder rb = request.evaluatePreconditions(tag);
    if (rb != null) {
      throw new WebApplicationException(rb.build());
    }
  }
}</programlisting>
            </example>
        </para>

        <para>The constructor of the
            <literal>SparklinesResouce</literal>
            root
            resource class computes an entity tag from the request URI and then calls
            the
            <link xlink:href="&jaxrs.javadoc.uri;/core/Request.html#evaluatePreconditions(jakarta.ws.rs.core.EntityTag)">request.evaluatePreconditions</link>
            with that entity tag. If a client request contains an
            <literal>If-None-Match</literal>
            header with a value that contains the
            same entity tag that was calculated then the
            <link xlink:href="&jaxrs.javadoc.uri;/core/Request.html#evaluatePreconditions(jakarta.ws.rs.core.EntityTag)">evaluatePreconditions</link>
            returns a pre-filled out response, with the 304 status code and entity tag
            set, that may be built and returned. Otherwise,
            <link xlink:href="&jaxrs.javadoc.uri;/core/Request.html#evaluatePreconditions(jakarta.ws.rs.core.EntityTag)">evaluatePreconditions</link>
            returns
            <literal>null</literal>
            and the normal response can be
            returned.
        </para>

        <para>Notice that in this example the constructor of a resource class is used
            to perform actions that may otherwise have to be duplicated to
            be invoked for each resource method. The life cycle of resource classes is per-request
            which means that the resource instance is created for each request and therefore
            can work with request parameters and for example make changes to the request processing by
            throwing an exception as it is shown in this example.
        </para>
    </section>
</chapter>
