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

    Copyright (c) 2012, 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="wadl">

    <title>WADL Support</title>
    <section>
        <title>WADL introduction</title>
        <para>
            Jersey contains support for
            <link xlink:href='https://javaee.github.io/wadl/'>Web Application Description Language (WADL)</link>. WADL is
            a XML description of a deployed RESTful web application. It contains model of the deployed resources, their
            structure, supported media types, HTTP methods and so on. In a sense, WADL is a similar to the WSDL
            (Web Service Description Language) which describes SOAP web services. WADL is however specifically designed
            to describe RESTful Web resources.
        </para>
        <important>
            <para>
                Since Jersey 2.5.1 the WADL generated by default is WADL in shorter form without
                additional extension resources (OPTIONS methods, WADL resource).
                In order to get full WADL use the query parameter <literal>detail=true</literal>.
            </para>
        </important>
        <para>
            Let's start with the simple WADL example. In the example there is a simple <literal>CountryResource</literal>
            deployed and we request a wadl of this resource. The context root path of the application is
            <literal>http://localhost:9998</literal>.
            <example>
                <title>A simple WADL example - JAX-RS resource definition</title>
                <programlisting language="java" linenumbering="numbered">@Path("country/{id}")
public static class CountryResource {

    private CountryService countryService;

    public CountryResource() {
        // init countryService
    }

    @GET
    @Produces(MediaType.APPLICATION_XML)
    public Country getCountry(@PathParam("countryId") int countryId) {
        return countryService.getCountry(countryId);
    }
}</programlisting>
            </example>



            The WADL of a Jersey application that contains the resource above can be requested by a
            HTTP &lit.http.GET; request to <literal>http://localhost:9998/application.wadl</literal>.
            The Jersey will return a response with a WADL content similar to the one in the following example:
            <programlisting language="xml" linenumbering="numbered"><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application xmlns="http://wadl.dev.java.net/2009/02">
    <doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 2.5-SNAPSHOT 2013-12-20 17:14:21"/>
    <grammars/>
    <resources base="http://localhost:9998/">
        <resource path="country/{id}">
            <param xmlns:xs="http://www.w3.org/2001/XMLSchema" type="xs:int" style="template" name="countryId"/>
            <method name="GET" id="getCountry">
                <response>
                    <representation mediaType="application/xml"/>
                </response>
            </method>
        </resource>
    </resources>
</application>]]></programlisting>
        </para>
        <para>
            The returned WADL is a XML that contains element <literal>resource</literal>
            with path <literal>country/{id}</literal>. This resource has one inner <literal>method</literal> element
            with http method as attribute, name of java method and its produced representation. This description
            corresponds to defined java resource. Now let's look at more complex example.
        </para>

        <para>
            The previous WADL does not actually contain all resources exposed in our API. There are other
            resources that are available and are hidden in the previous WADL. The previous WADL shows only resources
            that are provided by the user. In the following example, the WADL
            is generated using query parameter <literal>detail</literal>:
            <literal>http://localhost:9998/application.wadl?detail</literal>. Note that usage of
            <literal>http://localhost:9998/application.wadl?detail=true</literal> is also valid.
            This will produce the WADL with all resource available in the application:
        </para>

        <example>
            <title>A simple WADL example - WADL content</title>
            <programlisting language="xml" linenumbering="numbered"><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application xmlns="http://wadl.dev.java.net/2009/02">
    <doc xmlns:jersey="http://jersey.java.net/" jersey:generatedBy="Jersey: 2.5-SNAPSHOT 2013-12-20 17:14:21"/>
    <doc xmlns:jersey="http://jersey.java.net/" jersey:hint="To get simplified WADL with user's resources only use the query parameter 'simple=true'. Link: http://localhost:9998/application.wadl?detail=true&amp;simple=true"/>
    <grammars/>
    <resources base="http://localhost:9998/">
        <resource path="country/{id}">
            <param xmlns:xs="http://www.w3.org/2001/XMLSchema" type="xs:int" style="template" name="countryId"/>
            <method name="GET" id="getCountry">
                <response>
                    <representation mediaType="application/xml"/>
                </response>
            </method>
            <method name="OPTIONS" id="apply">
                <request>
                    <representation mediaType="*/*"/>
                </request>
                <response>
                    <representation mediaType="application/vnd.sun.wadl+xml"/>
                </response>
                <jersey:extended xmlns:jersey="http://jersey.java.net/">true</jersey:extended>
            </method>
            <method name="OPTIONS" id="apply">
                <request>
                    <representation mediaType="*/*"/>
                </request>
                <response>
                    <representation mediaType="text/plain"/>
                </response>
                <jersey:extended xmlns:jersey="http://jersey.java.net/">true</jersey:extended>
            </method>
            <method name="OPTIONS" id="apply">
                <request>
                    <representation mediaType="*/*"/>
                </request>
                <response>
                    <representation mediaType="*/*"/>
                </response>
                <jersey:extended xmlns:jersey="http://jersey.java.net/">true</jersey:extended>
            </method>
        </resource>
        <resource path="application.wadl">
            <method name="GET" id="getWadl">
                <response>
                    <representation mediaType="application/vnd.sun.wadl+xml"/>
                    <representation mediaType="application/xml"/>
                </response>
                <jersey:extended xmlns:jersey="http://jersey.java.net/">true</jersey:extended>
            </method>
            <method name="OPTIONS" id="apply">
                <request>
                    <representation mediaType="*/*"/>
                </request>
                <response>
                    <representation mediaType="text/plain"/>
                </response>
                <jersey:extended xmlns:jersey="http://jersey.java.net/">true</jersey:extended>
            </method>
            <method name="OPTIONS" id="apply">
                <request>
                    <representation mediaType="*/*"/>
                </request>
                <response>
                    <representation mediaType="*/*"/>
                </response>
                <jersey:extended xmlns:jersey="http://jersey.java.net/">true</jersey:extended>
            </method>
            <resource path="{path}">
                <param xmlns:xs="http://www.w3.org/2001/XMLSchema" type="xs:string" style="template" name="path"/>
                <method name="GET" id="geExternalGrammar">
                    <response>
                        <representation mediaType="application/xml"/>
                    </response>
                    <jersey:extended xmlns:jersey="http://jersey.java.net/">true</jersey:extended>
                </method>
                <method name="OPTIONS" id="apply">
                    <request>
                        <representation mediaType="*/*"/>
                    </request>
                    <response>
                        <representation mediaType="text/plain"/>
                    </response>
                    <jersey:extended xmlns:jersey="http://jersey.java.net/">true</jersey:extended>
                </method>
                <method name="OPTIONS" id="apply">
                    <request>
                        <representation mediaType="*/*"/>
                    </request>
                    <response>
                        <representation mediaType="*/*"/>
                    </response>
                    <jersey:extended xmlns:jersey="http://jersey.java.net/">true</jersey:extended>
                </method>
                <jersey:extended xmlns:jersey="http://jersey.java.net/">true</jersey:extended>
            </resource>
            <jersey:extended xmlns:jersey="http://jersey.java.net/">true</jersey:extended>
        </resource>
    </resources>
</application>
]]></programlisting>
            </example>
        <para>
            In the example above the returned application WADL is shown in full. WADL schema is defined by the
            WADL specification, so let's look at it in more details. The root WADL document element is
            the <literal>application</literal>. It contains global
            information about the deployed JAX-RS application. Under this element there is a nested element
            <literal>resources</literal> which contains zero or more <literal>resource</literal> elements. Each
            <literal>resource</literal> element describes a single deployed resource. In our example, there are only two root
            resources - <literal>"country/{id}"</literal> and <literal>"application.wadl"</literal>. The
            <literal>"application.wadl"</literal> resource is the resource that was just requested in order to receive the
            application WADL document. Even though WADL support is an additional feature in Jersey it is still
            a resource deployed in the resource model and therefore it is itself present in the returned WADL document.
            The first resource element with the <literal>path="country/{id}"</literal> is the element that describes our
            custom deployed resource.
            This resource contains a &lit.http.GET; method and three &lit.http.OPTIONS; methods.
            The &lit.http.GET; method is our getCountry() method defined in the sample. There is a method name
            in the <literal>id</literal> attribute and &jaxrs.Produces; is described in the
            <literal>response/representation</literal> WADL element. &lit.http.OPTIONS; methods are the methods that
            are automatically added by Jersey to each resource. There is an &lit.http.OPTIONS; method
            returning <literal>"text/plain"</literal> media type, that will return a response with a string entity containing
            the list of methods deployed on this resource (this means that instead of WADL you can use this &lit.http.OPTIONS;
            method to get similar information in a textual representation).
            Another &lit.http.OPTIONS; method returning <literal>*/*</literal> will return a response with no entity
            and <literal>Allow</literal> header that will contain list of methods as a String.
            The last &lit.http.OPTIONS; method producing <literal>"application/vnd.sun.wadl+xml"</literal> returns a
            WADL description of the resource <literal>"country/{id}"</literal>. As you can see, all &lit.http.OPTIONS; methods
            return information about the resource to which the HTTP &lit.http.OPTIONS; request is made.
        </para>
        <para>
            Second resource with a path "application.wadl" has, again, similar &lit.http.OPTIONS; methods
            and one &lit.http.GET; method which return this WADL. There is also
            a sub-resource with a path defined by path param <literal>{path}</literal>. This means that you can request
            a resource on the URI <literal>http://localhost:9998/application.wadl/something</literal>.
            This is used only to return an external grammar if there is any attached. Such a external grammar can be
            for example an <literal>XSD</literal> schema of the response entity which if the response entity is a JAXB bean.
            An external grammar support via Jersey <emphasis>extended WADL support</emphasis> is described in sections below.
        </para>
        <para>
            All resource that were added in this second example into the WADL contains
            element <literal>extended</literal>. This means that this resource is not a part of a core RESTful API and
            is rather a helper resource. If you need to mark any your own resource are extended, annotate
            is with &jersey.server.ExtendedResource;. Note that there might be methods visible in the default simple
            WADL even the user has not added them. This is for example the case of MVC added methods which were added
            by &jersey.server.ModelProcessor; but are still intended to be used by the client to achieve their
            primary use case of getting formatted data.
        </para>
        <para>
            Let's now send an HTTP &lit.http.OPTIONS; request to <literal>"country/{id}"</literal> resource using the the
            <literal>curl</literal> command:
            <programlisting linenumbering="unnumbered">curl -X OPTIONS -H "Allow: application/vnd.sun.wadl+xml" \
    -v http://localhost:9998/country/15</programlisting>

            We should see a WADL returned similar to this one:

            <example>
                <title>OPTIONS method returning WADL</title>

                <programlisting language="xml" linenumbering="numbered">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;application xmlns="http://wadl.dev.java.net/2009/02"&gt;
    &lt;doc xmlns:jersey="http://jersey.java.net/"
        jersey:generatedBy="Jersey: 2.0-SNAPSHOT ${buildNumber}"/&gt;
    &lt;grammars/&gt;
    &lt;resources base="http://localhost:9998/"&gt;
        &lt;resource path="country/15"&gt;
            &lt;method name="GET" id="getCountry"&gt;
                &lt;response&gt;
                    &lt;representation mediaType="application/xml"/&gt;
                &lt;/response&gt;
            &lt;/method&gt;
            &lt;method name="OPTIONS" id="apply"&gt;
                &lt;request&gt;
                    &lt;representation mediaType="*/*"/&gt;
                &lt;/request&gt;
                &lt;response&gt;
                    &lt;representation mediaType="application/vnd.sun.wadl+xml"/&gt;
                &lt;/response&gt;
            &lt;/method&gt;
            &lt;method name="OPTIONS" id="apply"&gt;
                &lt;request&gt;
                    &lt;representation mediaType="*/*"/&gt;
                &lt;/request&gt;
                &lt;response&gt;
                    &lt;representation mediaType="text/plain"/&gt;
                &lt;/response&gt;
            &lt;/method&gt;
            &lt;method name="OPTIONS" id="apply"&gt;
                &lt;request&gt;
                    &lt;representation mediaType="*/*"/&gt;
                &lt;/request&gt;
                &lt;response&gt;
                    &lt;representation mediaType="*/*"/&gt;
                &lt;/response&gt;
            &lt;/method&gt;
        &lt;/resource&gt;
    &lt;/resources&gt;
&lt;/application&gt;</programlisting>
            </example>
            The returned WADL document has the standard WADL structure that we saw in the WADL document returned for the
            whole Jersey application earlier. The main difference here is that the only <literal>resource</literal> is the
            resource to which the &lit.http.OPTIONS; HTTP request was sent. The resource has now path
            <literal>"country/15"</literal> and not <literal>"country/{id}"</literal> as the path parameter
            <literal>{id}</literal> was already specified in the request to this concrete resource.
        </para>

        <para>
            Another, a more complex WADL example is shown in the next example.

            <example>
                <title>More complex WADL example - JAX-RS resource definition</title>

                <programlisting language="java" linenumbering="numbered">@Path("customer/{id}")
public static class CustomerResource {
    private CustomerService customerService;

    @GET
    public Customer get(@PathParam("id") int id) {
        return customerService.getCustomerById(id);
    }

    @PUT
    public Customer put(Customer customer) {
        return customerService.updateCustomer(customer);
    }

    @Path("address")
    public CustomerAddressSubResource getCustomerAddress(@PathParam("id") int id) {
        return new CustomerAddressSubResource(id);
    }

    @Path("additional-info")
    public Object getAdditionalInfoSubResource(@PathParam("id") int id) {
        return new CustomerAddressSubResource(id);
    }

}


public static class CustomerAddressSubResource {
    private final int customerId;
    private CustomerService customerService;

    public CustomerAddressSubResource(int customerId) {
        this.customerId = customerId;
        this.customerService = null; // init customer service here
    }

    @GET
    public String getAddress() {
        return customerService.getAddressForCustomer(customerId);
    }

    @PUT
    public void updateAddress(String address) {
        customerService.updateAddressForCustomer(customerId, address);
    }

    @GET
    @Path("sub")
    public String getDeliveryAddress() {
        return customerService.getDeliveryAddressForCustomer(customerId);
    }
}</programlisting>
            </example>

            The &lit.http.GET; request to <literal>http://localhost:9998/application.wadl</literal> will
            return the following WADL document:

            <example>
                <title>More complex WADL example - WADL content</title>
                <programlisting language="xml" linenumbering="numbered">&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
&lt;application xmlns="http://wadl.dev.java.net/2009/02"&gt;
    &lt;doc xmlns:jersey="http://jersey.java.net/"
        jersey:generatedBy="Jersey: 2.0-SNAPSHOT ${buildNumber}"/&gt;
    &lt;grammars/&gt;
    &lt;resources base="http://localhost:9998/"&gt;
        &lt;resource path="customer/{id}"&gt;
            &lt;param xmlns:xs="http://www.w3.org/2001/XMLSchema"
                type="xs:int" style="template" name="id"/&gt;
            &lt;method name="GET" id="get"&gt;
                &lt;response/&gt;
            &lt;/method&gt;
            &lt;method name="PUT" id="put"&gt;
                &lt;response/&gt;
            &lt;/method&gt;
            &lt;method name="OPTIONS" id="apply"&gt;
                &lt;request&gt;
                    &lt;representation mediaType="*/*"/&gt;
                &lt;/request&gt;
                &lt;response&gt;
                    &lt;representation mediaType="application/vnd.sun.wadl+xml"/&gt;
                &lt;/response&gt;
            &lt;/method&gt;
            &lt;method name="OPTIONS" id="apply"&gt;
                &lt;request&gt;
                    &lt;representation mediaType="*/*"/&gt;
                &lt;/request&gt;
                &lt;response&gt;
                    &lt;representation mediaType="text/plain"/&gt;
                &lt;/response&gt;
            &lt;/method&gt;
            &lt;method name="OPTIONS" id="apply"&gt;
                &lt;request&gt;
                    &lt;representation mediaType="*/*"/&gt;
                &lt;/request&gt;
                &lt;response&gt;
                    &lt;representation mediaType="*/*"/&gt;
                &lt;/response&gt;
            &lt;/method&gt;
            &lt;resource path="additional-info"&gt;
                &lt;param xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    type="xs:int" style="template" name="id"/&gt;
            &lt;/resource&gt;
            &lt;resource path="address"&gt;
                &lt;param xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    type="xs:int" style="template" name="id"/&gt;
                &lt;method name="GET" id="getAddress"&gt;
                    &lt;response/&gt;
                &lt;/method&gt;
                &lt;method name="PUT" id="updateAddress"/&gt;
                &lt;resource path="sub"&gt;
                    &lt;method name="GET" id="getDeliveryAddress"&gt;
                        &lt;response/&gt;
                    &lt;/method&gt;
                &lt;/resource&gt;
            &lt;/resource&gt;
        &lt;/resource&gt;
        &lt;resource path="application.wadl"&gt;
            &lt;method name="GET" id="getWadl"&gt;
                &lt;response&gt;
                    &lt;representation mediaType="application/vnd.sun.wadl+xml"/&gt;
                    &lt;representation mediaType="application/xml"/&gt;
                &lt;/response&gt;
            &lt;/method&gt;
            &lt;method name="OPTIONS" id="apply"&gt;
                &lt;request&gt;
                    &lt;representation mediaType="*/*"/&gt;
                &lt;/request&gt;
                &lt;response&gt;
                    &lt;representation mediaType="text/plain"/&gt;
                &lt;/response&gt;
            &lt;/method&gt;
            &lt;method name="OPTIONS" id="apply"&gt;
                &lt;request&gt;
                    &lt;representation mediaType="*/*"/&gt;
                &lt;/request&gt;
                &lt;response&gt;
                    &lt;representation mediaType="*/*"/&gt;
                &lt;/response&gt;
            &lt;/method&gt;
            &lt;resource path="{path}"&gt;
                &lt;param xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    type="xs:string" style="template" name="path"/&gt;
                &lt;method name="GET" id="geExternalGrammar"&gt;
                    &lt;response&gt;
                        &lt;representation mediaType="application/xml"/&gt;
                    &lt;/response&gt;
                &lt;/method&gt;
                &lt;method name="OPTIONS" id="apply"&gt;
                    &lt;request&gt;
                        &lt;representation mediaType="*/*"/&gt;
                    &lt;/request&gt;
                    &lt;response&gt;
                        &lt;representation mediaType="text/plain"/&gt;
                    &lt;/response&gt;
                &lt;/method&gt;
                &lt;method name="OPTIONS" id="apply"&gt;
                    &lt;request&gt;
                        &lt;representation mediaType="*/*"/&gt;
                    &lt;/request&gt;
                    &lt;response&gt;
                        &lt;representation mediaType="*/*"/&gt;
                    &lt;/response&gt;
                &lt;/method&gt;
            &lt;/resource&gt;
        &lt;/resource&gt;
    &lt;/resources&gt;
&lt;/application&gt;</programlisting>
            </example>

            The <literal>resource</literal> with <literal>path="customer/{id}"</literal> is similar to the
            country resource from the previous example. There is a path parameter which identifies the customer
            by <literal>id</literal>. The resource contains 2 user-declared methods and again auto-generated
            &lit.http.OPTIONS; methods added by Jersey. THe resource declares 2 sub-resource locators which are
            represented in the returned WADL document as nested <literal>resource</literal> elements. Note that the sub-resource
            locator <literal>getCustomerAddress()</literal> returns a type CustomerAddressSubResource in the
            method declaration and also in the WADL there is a <literal>resource</literal> element for such
            a sub resource with full internal description. The second method
            <literal>getAdditionalInfoSubResource()</literal> returns only an <literal>Object</literal> in the method declaration.
            While this is correct from the JAX-RS perspective as the real returned type can be computed from a request
            information, it creates a problem for WADL generator because WADL is generated based on the static configuration
            of the JAX-RS application resources. The WADL generator does not know what type would be actually returned to
            a request at run time.
            That is the reason why the nested <literal>resource</literal> element with <literal>path="additional-info"</literal>
            does not contain any information about the supported resource representations.
        </para>
        <para>
            The <literal>CustomerAddressSubResource</literal> sub-resource described in the nested element
            <literal>&lt;resource path="address"&gt;</literal> does not contain an &lit.http.OPTIONS; method.
            While these methods are in fact generated by Jersey for the sub-resource, Jersey WADL generator does not currently
            support adding these methods to the sub-resource description. This should be addressed in the near future.
            Still, there are two user-defined resource methods handling HTTP &lit.http.GET; and &lit.http.PUT; requests.
            The sub-resource method <literal>getDeliveryAddress()</literal> is represented as a separate nested resource with
            <literal>path="sub"</literal>. Should there be more sub-resource methods defined with <literal>path="sub"</literal>,
            then all these method descriptions would be placed into the same <literal>resource</literal> element.
            In other words, sub-resource methods are grouped in WADL as sub-resources based on their <literal>path</literal>
            value.
        </para>
    </section>

    <section>
        <title>Configuration</title>

        <para>
            WADL generation is enabled in Jersey by default. This means that &lit.http.OPTIONS;
            methods are added by default to each resource and an auto-generated <literal>/application.wadl</literal>
            resource is deployed too. To override this default behavior and disable WADL generation in Jersey, setup the
            configuration property in your application:

            <programlisting>jersey.config.server.wadl.disableWadl=true</programlisting>

            This property can be setup in a <literal>web.xml</literal> if the Jersey application is deployed
            in the servlet with <literal>web.xml</literal> or the property can be returned from the &jaxrs.core.Application;.
            <literal>getProperties()</literal>. See <link linkend="deployment">Deployment chapter</link> for more information
            on setting the application configuration properties in various deployments.
        </para>
        <para>
            WADL support in Jersey is implemented via &jersey.server.ModelProcessor; extension. This implementation enhances
            the application resource model by adding the WADL providing resources. WADL &lit.jersey.server.ModelProcessor;
            priority value is high (i.e. the priority is low) as it should be executed as one of the last model processors.
            Therefore, any &lit.jersey.server.ModelProcessor; executed before will not see WADL extensions in the resource model.
            WADL handling resource model extensions (resources and &lit.http.OPTIONS; resource methods) are not added to the
            application resource model if there is already a matching resource or a resource method detected in the model.
            In other words, if you define for example your own &lit.http.OPTIONS; method that would produce
            <literal>"application.wadl"</literal> response content, this method will not be overridden by WADL model processor.
            See <link linkend="resource-builder">Resource builder chapter</link> for more information on
            &lit.jersey.server.ModelProcessor; extension mechanism.
        </para>
    </section>

    <section>
        <title>Extended WADL support</title>
        <para>
            <emphasis role="strong">Please note that the API of extended WADL support is going to be changed in one of the future
            releases of Jersey 2.x (see below).</emphasis>
        </para>
        <para>
            Jersey supports extension of WADL generation called <emphasis>extended WADL</emphasis>. Using the extended WADL
            support you can enhance the generated WADL document with additional information, such as
            resource method javadoc-based documentation of your REST APIs, adding general documentation,
            adding external grammar support, or adding any custom WADL extension information.
        </para>
        <para>
            <emphasis role="strong">Again, note that the extended WADL in Jersey 2.x is NOT the intended final version and
            API is going to be changed.</emphasis> The existing set of features and functionality will be preserved but the
            APIs will be significantly re-designed to support additional use cases. This impacts mainly the APIs of
            &jersey.server.WadlGenerator;, &jersey.server.WadlGeneratorConfig; as well as any related classes. The API changes
            may impact your code if you are using a custom &lit.jersey.server.WadlGenerator; or plan to implement one.
        </para>
    </section>
</chapter>
