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

    Copyright (c) 2010, 2019 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="uris-and-links">
    <title>URIs and Links</title>

    <section>
        <title>Building URIs</title>

        <para>
            A very important aspect of REST is hyperlinks, URIs, in representations that clients can use to transition the
            Web service to new application states (this is otherwise known as "hypermedia as the engine of application state").
            HTML forms present a good example of this in practice.
        </para>

        <para>
            Building URIs and building them safely is not easy with &jdk6.URI;, which is why JAX-RS has the
            &jaxrs.core.UriBuilder; class that makes it simple and easy to build URIs safely.
            &lit.jaxrs.core.UriBuilder; can be used to build new URIs or build from existing URIs. For resource
            classes it is more than likely that URIs will be built from the base URI the web service is deployed at
            or from the request URI. The class &jaxrs.core.UriInfo; provides such information (in addition to further
            information, see next section).
        </para>

        <para>The following example shows URI building with &lit.jaxrs.core.UriInfo; and &lit.jaxrs.core.UriBuilder;
            from the bookmark example:

            <example>
                <title>URI building</title>
                <programlisting language="java" linenumbering="numbered">@Path("/users/")
public class UsersResource {

    @Context
    UriInfo uriInfo;

    ...

    @GET
    @Produces("application/json")
    public JSONArray getUsersAsJsonArray() {
        JSONArray uriArray = new JSONArray();
        for (UserEntity userEntity : getUsers()) {
            UriBuilder ub = uriInfo.getAbsolutePathBuilder();
            URI userUri = ub.
                    path(userEntity.getUserId()).
                    build();
            uriArray.put(userUri.toASCIIString());
        }
        return uriArray;
    }
}</programlisting>
            </example>

            &lit.jaxrs.core.UriInfo; is obtained using the @Context annotation, and in this particular example injection onto
            the field of the root resource class is performed, previous examples showed the use of @Context on resource method
            parameters.
        </para>

        <para>
            &lit.jaxrs.core.UriInfo; can be used to obtain URIs and associated &lit.jaxrs.core.UriBuilder; instances for
            the following URIs: the base URI the application is deployed at; the request URI; and the absolute path URI, which
            is the request URI minus any query components.
        </para>

        <para>
            The <literal>getUsersAsJsonArray</literal> method constructs a <literal>JSONArrray</literal>, where each element
            is a URI identifying a specific user resource. The URI is built from the absolute path of the request URI by
            calling
            <link xlink:href="&jaxrs.javadoc.uri;/core/UriInfo.html#getAbsolutePathBuilder()">UriInfo.getAbsolutePathBuilder()</link>.
            A new path segment is added, which is the user ID, and then the URI is built. Notice that it is not necessary to
            worry about the inclusion of <literal>'/'</literal> characters or that the user ID may contain characters that need
            to be percent encoded. &lit.jaxrs.core.UriBuilder; takes care of such details.
        </para>

        <para>&lit.jaxrs.core.UriBuilder; can be used to build/replace query or matrix parameters. URI templates can also be
            declared, for example the following will build the URI <literal>"http://localhost/segment?name=value"</literal>:

            <example>
                <title>Building URIs using query parameters</title>
                <programlisting language="java" linenumbering="numbered">UriBuilder.fromUri("http://localhost/")
    .path("{a}")
    .queryParam("name", "{value}")
    .build("segment", "value");</programlisting>
            </example>
        </para>
    </section>

    <section>
        <title>Resolve and Relativize</title>

        <para>JAX-RS 2.0 introduced additional URI resolution and relativization methods in the &lit.jaxrs.core.UriBuilder;:

            <itemizedlist>
                <listitem><para><link xlink:href="&jaxrs.javadoc.uri;/core/UriInfo.html#resolve(java.net.URI)">UriInfo.resolve(java.net.URI)</link></para></listitem>
                <listitem><para><link xlink:href="&jaxrs.javadoc.uri;/core/UriInfo.html#relativize(java.net.URI)">UriInfo.relativize(java.net.URI)</link></para></listitem>
                <listitem><para><link xlink:href="&jaxrs.javadoc.uri;/core/UriBuilder.html#resolveTemplate(java.lang.String, java.lang.Object)">UriBuilder.resolveTemplate(...)</link> (various arguments)</para></listitem>
            </itemizedlist>

            Resolve and relativize methods in &jaxrs.core.UriInfo; are essentially counterparts to the methods listed above -
            <link xlink:href="&jaxrs.javadoc.uri;/core/UriInfo.html#resolve(java.net.URI)">UriInfo.resolve(java.net.URI)</link>
            resolves given relative URI to an absolute URI using application context URI as the base URI;
            <link xlink:href="&jaxrs.javadoc.uri;/core/UriInfo.html#relativize(java.net.URI)">UriInfo.relativize(java.net.URI)</link>
            then transforms an absolute URI to a relative one, using again the applications context URI as the base URI.
        </para>

        <para>
            &lit.jaxrs.core.UriBuilder; also introduces a set of methods that provide ways of resolving URI templates by replacing
            individual templates with a provided value(s). A short example:

            <programlisting language="java" linenumbering="numbered">final URI uri = UriBuilder.fromUri("http://{host}/{path}?q={param}")
    .resolveTemplate("host", "localhost")
    .resolveTemplate("path", "myApp")
    .resolveTemplate("param", "value").build();

uri.toString(); // returns "http://localhost/myApp?q=value"</programlisting>

            See the &jaxrs.core.UriBuilder; javadoc for more details.
        </para>
    </section>

    <section>
        <title>Link</title>

        <para>
            JAX-RS 2.0 introduces &jaxrs.core.Link; class, which serves as a representation of Web Link defined in
            <link xlink:href="http://tools.ietf.org/html/rfc5988">RFC 5988</link>.
            The JAX-RS &lit.jaxrs.core.Link; class adds API support for providing additional metadata in HTTP messages,
            for example, if you are consuming a REST interface of a public library, you might have a resource returning
            description of a single book. Then you can include links to related resources, such as a book category,
            author, etc. to make the produced response concise but complete at the same time. Clients are then able to
            query all the additional information they are interested in and are not forced to consume details they are
            not interested in. At the same time, this approach relieves the server resources as only the information that
            is truly requested is being served to the clients.
        </para>

        <para>
            A &lit.jaxrs.core.Link; can be serialized to an HTTP message (tyically a response) as additional HTTP header
            (there might be multiple &lit.jaxrs.core.Link; headers provided, thus multiple links can be served in a single
            message). Such HTTP header may look like:
            <screen language="text" linenumbering="unnumbered">Link: &lt;http://example.com/TheBook/chapter2&gt;; rel="prev"; title="previous chapter"</screen>
        </para>

        <para>
            Producing and consuming Links with JAX-RS API is demonstrated in the following example:

            <programlisting language="java" linenumbering="unnumbered">// server side - adding links to a response:
Response r = Response.ok().
    link("http://oracle.com", "parent").
    link(new URI("http://eclipse-ee4j.github.io/jersey"), "framework").
    build();

...

// client-side processing:
final Response response = target.request().get();

URI u = response.getLink("parent").getUri();
URI u = response.getLink("framework").getUri();</programlisting>
        </para>
        <para>
            Instances of &lit.jaxrs.core.Link; can be also created directly by invoking one of the factory methods on the
            &jaxrs.core.Link; API that returns a &jaxrs.core.Link.Builder; that can be used to configure and produce new
            links.
        </para>
    </section>
</chapter>
