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

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