blob: e0cb8ebd6636baf15b4f3089ef1408ffc885ee93 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Apache Wink : 2 Apache Wink Building Blocks</title>
<link rel="stylesheet" href="styles/site.css" type="text/css" />
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%" bgcolor="#ffffff">
<tr>
<td valign="top" class="pagebody">
<div class="pageheader">
<span class="pagetitle">
Apache Wink : 2 Apache Wink Building Blocks
</span>
</div>
<div class="pagesubheading">
This page last changed on Oct 18, 2009 by <font color="#0050B2">michael</font>.
</div>
<h1><a name="2ApacheWinkBuildingBlocks-ApacheWinkBuildingBlocks"></a>Apache Wink Building Blocks</h1>
<p>In order to take full advantage of Apache Wink, a basic understanding of the building blocks that comprise it and their functional integration is required. The following section provides an introduction to the&nbsp; basic concepts and building blocks of Apache Wink, version 1.0. In order to gain in-depth understandings of the building blocks refer to the table of contents where these concepts are expanded and addtional example are used to further illustrate the Apache Wink and JAX-RS SDK technologies.</p>
<h2><a name="2ApacheWinkBuildingBlocks-Thissectioncontainsthefollowingtopics%3A"></a>This section contains the following topics:</h2>
<h4><a name="2ApacheWinkBuildingBlocks-ServiceImplementationBuildingBlocks"></a>Service Implementation Building Blocks</h4>
<ul>
<li><a href="#2ApacheWinkBuildingBlocks-Resource">Resource</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-Providers">Providers</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-URIDispatching">URI Dispatching</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-Assets">Assets</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-Annotations">Annotations</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-URLHandling">URL Handling</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-HTTPMethodsGET%2CPOST%2CPUT%2CDELETEandOPTIONS">HTTP Methods - GET, POST, PUT, DELETE and OPTIONS</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-BasicURLQueryParameters">Basic URL Query Parameters</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-ApacheWinkBuildingBlocksSummary">Apache Wink Building Blocks Summary</a></li>
</ul>
<h4><a name="2ApacheWinkBuildingBlocks-ClientComponentsBuildingBlocks"></a>Client Components Building Blocks</h4>
<ul>
<li><a href="#2ApacheWinkBuildingBlocks-RestClientClass">RestClient Class</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-ResourceInterface">Resource Interface</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-ClientRequestInterface">ClientRequest Interface</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-ClientResponseInterface">ClientResponse Interface</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-ClientConfigClass">ClientConfig Class</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-ClientHandlerInterface">ClientHandler Interface</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-InputStreamAdapterInterface">InputStreamAdapter Interface</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-OutputStreamAdapterInterface">OutputStreamAdapter Interface</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-EntityTypeClass">EntityType Class</a></li>
</ul>
<h4><a name="2ApacheWinkBuildingBlocks-TheApacheWinkRuntime"></a>The Apache Wink Runtime</h4>
<ul>
<li><a href="#2ApacheWinkBuildingBlocks-RequestProcessor">Request Processor</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-DeploymentConfiguration">Deployment Configuration</a></li>
<li><a href="#2ApacheWinkBuildingBlocks-HandlerChains">Handler Chains</a></li>
</ul>
<p><br clear="all" /></p>
<hr />
<h1><a name="2ApacheWinkBuildingBlocks-ServiceImplementationBuildingBlockOverview"></a>Service Implementation Building Block Overview</h1>
<p>As mentioned in the "<b>Apache Wink Introduction</b>" section, Apache Wink 1.0 reflects the design principles of a REST web service. It does so by providing the developer with a set of java classes that enable the implementation of "<b>Resources</b>", "<b>Representations</b>" and the association between them. Wink 1.0 also enables the developer to define the resource URI and the "<b>Uniform methods</b>" that are applicable to the resource.</p>
<p><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-Resource"></a>Resource</h2>
<p>A "<b>resource</b>" represents a serviceable component that enables for the retrieval and manipulation of data. A "<b>resource class</b>" is used to implement a resource by defining the "<b>resource methods</b>" that handle requests by implementing the business logic. A resource is bound or anchored to a URI space by annotating the resource class with the @Path annotation.</p>
<p><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-Providers"></a>Providers</h2>
<p>A provider is a class that is annotated with the @Provider annotation and implements one or more interfaces defined by the JAX-RS specification. Providers are not bound to any specific resource. The appropriate provider is automatically selected by the Apache Wink runtime according to the JAX-RS specification. Apache Wink supplies many providers, however, application developers may supply their own which take precedence over any provider in the default runtime.</p>
<p>There are three types of providers defined by the JAX-RS specification:</p>
<ul>
<li>Entry Providers</li>
<li>Context Providers</li>
<li>Exception Mapping Provider</li>
</ul>
<h3><a name="2ApacheWinkBuildingBlocks-EntityProvider"></a>Entity Provider</h3>
<p>An "<b>Entity Provider</b>" is a class that converts server data into a specific format requested by the client and/or converts a request transmitted by the client into server data. For instance, a String entity provider can turn request entities (message bodies) over the wire into a Java type (java.lang.String). Entity providers can also turn native Java types such as a java.lang.String into an appropriate response entity. An entity provider can be restricted to support a limited set of media types using the @javax.ws.rs.Produces and @javax.ws.rs.Consumes annotations. An entity provider is configured to handle a specific server data type by implementing the javax.ws.rs.ext.MessageBodyWriter and/or javax.ws.rs.ext.MessageBodyReader interfaces.</p>
<p><b>Figure 2: Entity Provider Diagram</b></p>
<p>&nbsp; <img src="attachments/2329360/2523203.jpg" align="absmiddle" border="0"/></p>
<h3><a name="2ApacheWinkBuildingBlocks-ContextProvider"></a>Context Provider</h3>
<p>Context providers are used to supply contexts to resource classes and other providers by implementing the javax.ws.rs.ext.ContextResolver interface. For example, if a custom JAXBContext is required to serialize or deserialize JAXB objects, an application can provide a ContextResolver that will return a specific instance of a JAXBContext. Context providers may restrict the media types that they support using the @javax.ws.rs.Produces annotation.</p>
<p><b>Figure 3: Context Provider Diagram</b></p>
<p> <img src="attachments/2329360/3113002.jpg" align="absmiddle" border="0"/></p>
<h3><a name="2ApacheWinkBuildingBlocks-ExceptionMappingProvider"></a>Exception Mapping Provider</h3>
<p>Exception mapping providers map exceptions into an instance of a javax.ws.rs.core.Response by implementing the javax.ws.rs.ext.ExceptionMapper interface. The Response objects can contain response information such as status codes, HTTP headers, and a response entity (message body). When a resource method throws an exception, the runtime will try to find a suitable ExceptionMapper to "translate" the exception to an appropriate Response object.</p>
<p><b>Figure 4: Exception Mapping Provider Diagram</b></p>
<p> <img src="attachments/2329360/3113003.jpg" align="absmiddle" border="0"/></p>
<p><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-URIDispatching"></a>URI Dispatching</h2>
<p>Designing an efficient REST web service requires that the application developer understands the resources that comprise the service, how to best identify the resources, and how they relate to one another.</p>
<p>RESTful resources are identified by URIs in most cases related resources have URIs that share common path elements.</p>
<p><b>Figure 5: Apache Wink Logic Flow</b></p>
<p> <img src="attachments/2329360/2523204.jpg" align="absmiddle" border="0" height="406" width="492"/></p>
<h4><a name="2ApacheWinkBuildingBlocks-ApacheWinkLogicFlow"></a>Apache Wink Logic Flow</h4>
<p>Figure 5 illustrates the Apache Wink logic flow. The HTTP request sent by the client invokes the "<b>Apache Wink REST Servlet</b>". The REST servlet uses the "<b>Request Processor</b>" and the request URI in order to find, match and invoke the correct resource method.</p>
<h3><a name="2ApacheWinkBuildingBlocks-BookmarksExample"></a>Bookmarks Example</h3>
<p>Throughout this document, various project examples are used in order to describe the functionality and processes that comprise the Apache Wink.<br/>
In order to explain the REST design principles used in the Apache Wink this developer guide refers to the "<b>Bookmark</b>" example project found in the examples folder located in the Apache Wink distribution.</p>
<p>Refer to the code (using an IDE application) in the example in conjunction with the following explanations and illustrations in this developer guide.</p>
<h4><a name="2ApacheWinkBuildingBlocks-ApacheWinkServletandRequestProcessor"></a>Apache Wink Servlet and Request Processor</h4>
<p><b>Figure 6:&nbsp; Apache Wink REST Servlet and Request Processor for the Bookmark Services</b></p>
<p> <img src="attachments/2329360/2523205.jpg" align="absmiddle" border="0" height="421" width="500"/></p>
<h4><a name="2ApacheWinkBuildingBlocks-ServerandRequestProcessor"></a>Server and Request Processor</h4>
<p>Figure 6 shows the Apache Wink servlet and request Processor concept in the context of the application server. In the "<b>Bookmarks</b>" example in Figure 6 there are two Resources, the first Resource is associated with the <b>/mybookmarks</b> URI and manages the bookmarks collection, the second resource is associated with the <b>/mybookmarks/{bookmark}</b> Resources and manages an individual bookmark within the collection.</p>
<p>The Resources' defined by the web service and managed by Apache Wink are referred to as <b>"URI space"</b>. The Resources space is the collection of all URI's that exist in the same context. Figure 6 shows the URI space that contains <b>/mybookmarks</b> and <b>/mybookmarks/{bookmarks}</b>.</p>
<h4><a name="2ApacheWinkBuildingBlocks-URISpace"></a>URI Space</h4>
<p>The Bookmarks service URI space consists of the following URI space items and detailed descriptions about their context and functionality.<br/>
<b>Table 1: URI Management</b></p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> URI space Item <br clear="all" /> </th>
<th class='confluenceTh'> Description <br clear="all" /> </th>
</tr>
<tr>
<td class='confluenceTd'> <b>/Bookmark/rest</b> <br clear="all" /> </td>
<td class='confluenceTd'> This URI is the root context of the bookmark service and the entry point of the URI space of the service. An HTTP GET request to this URI returns a "Service Document" which is automatically generated by Apache Wink. The service document provides information about all available collections in the URI space. <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> <b>/Bookmark/rest /mybookmarks</b> <br clear="all" /> </td>
<td class='confluenceTd'> This URI is associated with a collection of bookmarks resources.&nbsp; Clients use the HTTP GET method in order to retrieve a representation of the collection and HTTP POST method in order to create a new item in the collection. <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> <b>/Bookmark/rest /mybookmarks/{bookmark}</b> </td>
<td class='confluenceTd'> This URI template is associated with a single bookmark resource. Clients use the HTTP GET method in order to retrieve a representation of the resource, HTTP PUT method is used in order to update the resource and HTTP DELETE method is used in order to delete the resource. <br clear="all" /> </td>
</tr>
</tbody></table>
<p><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-Assets"></a>Assets</h2>
<p>Assets are classes that contain "<b>web service business logic</b>" implemented by the developer. Each Asset is associated with one or more URI. The Apache Wink dispatcher invokes the Asset, which is associated with the URI found in the HTTP request.</p>
<p>An Asset class can implement one or more methods, each method is associated with a single HTTP method (GET, HEAD, POST, PUT, DELETE etc).&nbsp; The methods can be associated with a MIME type of a produced representation. Methods that handle HTTP verbs of requests with a body (such as PUT, POST) are also associated with the MIME type of the HTTP request.<br/>
The Asset class can be registered to the Apache Wink using the "Spring context xml" or by using a registration API.</p>
<p><div class='panelMacro'><table class='infoMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="images/icons/emoticons/information.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Spring Context Configuration</b><br />For further information regarding the Spring Context, refer to <a href="5.5 Spring Integration.html" title="5.5 Spring Integration">5.5 Spring Integration</a> in section 5 Apache Wink Server.</td></tr></table></div><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-Annotations"></a>Annotations</h2>
<p>Annotations are a special text notations, or metadata, added to Java version 1.5. Annotations in Java source code can affect both compilation and runtime behavior of the resulting Java classes.<br/>
JAX-RS is implemented by the use of annotations that are defined in the JAX-RS specification. Apache Wink provides a set of additional annotations that enrich the functionality of the JAX-RS enabled application.</p>
<p>The following table describes the additional Apache Wink annotations:</p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Annotation <br clear="all" /> </th>
<th class='confluenceTh'> Precedes <br clear="all" /> </th>
<th class='confluenceTh'> Description <br clear="all" /> </th>
</tr>
<tr>
<td class='confluenceTd'> @Workspace <br clear="all" /> </td>
<td class='confluenceTd'> Resource <br clear="all" /> </td>
<td class='confluenceTd'> Associate a "Collection Resource" with a workspace element and collection elements in an APP Service Document <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> @Scope <br clear="all" /> </td>
<td class='confluenceTd'> Resource /Provider <br clear="all" /> </td>
<td class='confluenceTd'> Defines the default lifecycle behavior for resources and providers, and the option for controlling the lifecycle through the javax.ws.rs.core.Application class <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> @Parent <br clear="all" /> </td>
<td class='confluenceTd'> Resource <br clear="all" /> </td>
<td class='confluenceTd'> Provides the ability to define a base template URI for the URI specified in a resources @Path annotation <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> @Asset <br clear="all" /> </td>
<td class='confluenceTd'> Class <br clear="all" /> </td>
<td class='confluenceTd'> Used by the Apache Wink runtime in order to identify an entity as an Asset <br clear="all" /> </td>
</tr>
</tbody></table>
<p><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-URLHandling"></a>URL Handling</h2>
<p>The Apache Wink receives HTTP requests and then dispatches a wrapped HTTP request to the appropriate Resource method.<br/>
The HTTP request is match to the Resource method based on the HTTP request parameters, the Resource method definitions and the MIME type.</p>
<p><b>Figure 7: URL Request Handling</b></p>
<p> <img src="attachments/2329360/2523210.jpg" align="absmiddle" border="0" height="431" width="425"/></p>
<h4><a name="2ApacheWinkBuildingBlocks-RequestHandling"></a>Request Handling</h4>
<p>Figure 7 demonstrates the HTTP Client request path to the URI dispatcher, once the dispatcher receives the request it is then matched according to the HTTP method, URL and MIME type and finally the Resource registry definition.</p>
<p><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-HTTPMethodsGET%2CPOST%2CPUT%2CDELETEandOPTIONS"></a>HTTP Methods - GET, POST, PUT, DELETE and OPTIONS</h2>
<p>The common HTTP 1.1 methods for the Apache Wink are defined in the following section. This set of methods can be expanded.</p>
<h3><a name="2ApacheWinkBuildingBlocks-MethodUsage"></a>Method Usage</h3>
<p><b>Table 3: HTTP Methods</b></p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Method <br clear="all" /> </th>
<th class='confluenceTh'> Safe <br clear="all" /> </th>
<th class='confluenceTh'> Idempotent <br clear="all" /> </th>
<th class='confluenceTh'> Cacheable <br clear="all" /> </th>
</tr>
<tr>
<td class='confluenceTd'> GET <br clear="all" /> </td>
<td class='confluenceTd'> X <br clear="all" /> </td>
<td class='confluenceTd'> X <br clear="all" /> </td>
<td class='confluenceTd'> X <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> HEAD <br clear="all" /> </td>
<td class='confluenceTd'> X <br clear="all" /> </td>
<td class='confluenceTd'> X <br clear="all" /> </td>
<td class='confluenceTd'> X <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> PUT <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> X <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> POST <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> &#42; <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> DELETE <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> X <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
<tr>
<td class='confluenceTd'> OPTIONS <br clear="all" /> </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
</tr>
</tbody></table>
<h4><a name="2ApacheWinkBuildingBlocks-KeyX"></a>Key - X</h4>
<ul>
<li><b>Safe</b> &#45; does not affect the server state</li>
<li><b>Idempotent</b> &#45; a repeated application of the same method has the same effect as a single application</li>
<li><b>Cacheable</b> &#45; a response to a method is cacheable if it meets the requirements for HTTP caching</li>
<li><b>&#42;</b> &#45;&nbsp;&nbsp; Responses to this method are not cacheable, unless the response includes an appropriate Cache-Control or Expires header fields. However, the 303 response can be used to direct the user agent to retrieve a cacheable resource.</li>
</ul>
<h3><a name="2ApacheWinkBuildingBlocks-GET"></a>GET</h3>
<p>The GET method is used to retrieve information from a specified URI and is assumed to be a safe and repeatable operation by browsers, caches and other HTTP aware components. This means that the operation must have no side effects and GET method requests can be re-issued.</p>
<h3><a name="2ApacheWinkBuildingBlocks-HEAD"></a>HEAD</h3>
<p>The HEAD method is the same as the GET method except for the fact that the HEAD does not contain message body.</p>
<h3><a name="2ApacheWinkBuildingBlocks-POST"></a>POST</h3>
<p>The POST method is used for operations that have side effects and cannot be safely repeated. For example, transferring money from one bank account to another has side effects and should not be repeated without explicit approval by the user.</p>
<p>The POST method submits data to be processed, for example, from an HTML form, to the identified resource. The data is included in the body of the request. This may result in the creation of a new resource or the updates of existing resources or both.</p>
<h3><a name="2ApacheWinkBuildingBlocks-PUT"></a>PUT</h3>
<p>The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity should be considered as a modified version of the one residing on the origin server.</p>
<p>If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.</p>
<h3><a name="2ApacheWinkBuildingBlocks-DELETE"></a>DELETE</h3>
<p>The DELETE method requests that the origin server delete the resource identified by the Request-URI. This method can be overridden on the origin server.<br/>
The client cannot be guaranteed that the operation has been carried out, even if the status code returned from the origin server indicates that the action has been completed successfully.</p>
<h3><a name="2ApacheWinkBuildingBlocks-OPTIONS"></a>OPTIONS</h3>
<p>The OPTIONS method represents a request for information about the communication options available on the request/response chain identified by the Request-URI.<br/>
This method allows the client to determine the options and/or requirements associated with a resource, or the capabilities of a server, without implying a resource action or initiating a resource retrieval.</p>
<h3><a name="2ApacheWinkBuildingBlocks-BasicURLQueryParameters"></a>Basic URL Query Parameters</h3>
<p>A URL parameter is a name and value pair appended to a URL. The parameter begins with a question mark "<b>?</b>" and takes the form of name=value.<br/>
If more than one URL parameter exists, each parameter is separated by an ampersand "<b>&amp;</b>" symbol. URL parameters enable the client to send data as part of the URL to the server.</p>
<p>When a server receives a request and parameters are appended to the URL of the request, the server uses these parameters as if they were sent as part of the request body. There are several predefined URL parameters recognized by Apache Wink when using Wink providers. The following table lists the parameters commonly used in web service URLs. These special URL parameters are defined in the "<b>RestConstants</b>" class.</p>
<h4><a name="2ApacheWinkBuildingBlocks-QueryParameters"></a>Query Parameters</h4>
<p><b>Table 4: URL Parameters</b></p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Parameter <br clear="all" /> </th>
<th class='confluenceTh'> Description <br clear="all" /> </th>
<th class='confluenceTh'> Value <br clear="all" /> </th>
</tr>
<tr>
<td class='confluenceTd'> alt <br clear="all" /> </td>
<td class='confluenceTd'> Provides an alternative representation of the specified MIME type. Apache Wink recognizes this as a representation request of the highest priority. <br clear="all" /> </td>
<td class='confluenceTd'> MIME type, e.g. <br clear="all" />
"text%2Fplain" <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> absolute-urls <br clear="all" /> </td>
<td class='confluenceTd'> Indicates to Apache Wink that the generated&nbsp; links in the response should be absolute, mutual exclusive with the relative-urls parameter <br clear="all" /> </td>
<td class='confluenceTd'> NONE <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> relative-urls <br clear="all" /> </td>
<td class='confluenceTd'> Indicates to Apache Wink that the generated&nbsp; links in the response should be relative, mutual exclusive with the absolute-urls parameter <br clear="all" /> </td>
<td class='confluenceTd'> NONE <br clear="all" /> </td>
</tr>
<tr>
<td class='confluenceTd'> callback <br clear="all" /> </td>
<td class='confluenceTd'> Wrap javascript representation in callback function, is relevant when requested with an application/json MIME type. <br clear="all" /> </td>
<td class='confluenceTd'> name of callback function. <br clear="all" />
For example, "myfunc" <br clear="all" /> </td>
</tr>
</tbody></table>
<h5><a name="2ApacheWinkBuildingBlocks-CombiningURLParameters"></a>Combining URL Parameters</h5>
<p>A single URL can contain more than one URL parameter, example <b>"?alt=text%2Fjavascript &amp;callback=myfunc"</b>(where "%2F" represents escaped "/").</p>
<p><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-ApacheWinkBuildingBlocksSummary"></a>Apache Wink Building Blocks Summary</h2>
<p>The previous section "<b>Service Implementation Building Blocks</b>" outlines the basic precepts and building blocks that comprise the service side of Apache Wink.<br/>
In order to understand the relationship between the building blocks that comprise Apache Wink a set of example applications have been designed and built that provide a reference point that demonstrate a rudimentary understanding about the functionality of Apache Wink.</p>
<h3><a name="2ApacheWinkBuildingBlocks-ApacheWinkExamples"></a>Apache Wink Examples</h3>
<p>The following examples applications are used in this "<b>Apache Wink Developer Guide</b>".</p>
<ul>
<li>Bookmarks</li>
<li>HelloWorld</li>
<li>QADefects</li>
</ul>
<h4><a name="2ApacheWinkBuildingBlocks-BookmarksProject"></a>Bookmarks Project</h4>
<p>This developer guide uses the bookmarks example application in order to describe the logic flow process within Apache Wink.<br/>
Refer to the comments located in the "<b>Bookmarks</b>" example application code for in-depth explanations about the methods used to build the bookmarks application.</p>
<h4><a name="2ApacheWinkBuildingBlocks-HelloWorldProject"></a>HelloWorld Project</h4>
<p>Complete the step-by-step "<b>HelloWorld</b>" tutorial in chapter 3 "<b>Getting Started with Apache Wink</b>" and then follow the installation instructions on page xx, in order to view the "<b>Bookmarks</b>" example application from within the Eclipse IDE.</p>
<h4><a name="2ApacheWinkBuildingBlocks-QADefects"></a>QADefects</h4>
<p>The QADefects example application illustrates the advanced functionality of Apache Wink by implementing most of the features provided by the Apache Wink (Runtime) framework.</p>
<p><br clear="all" /></p>
<hr />
<h1><a name="2ApacheWinkBuildingBlocks-ApacheWinkClientComponentBasicsOverview"></a>Apache Wink Client Component Basics Overview</h1>
<p>The Apache Wink Client interacts with REST Web-Services. It maps REST concepts to Java classes and encapsulates underlying REST related standards and protocols, as well as providing a plug-in mechanism for raw HTTP streaming data manipulation. This mechanism also provides the ability to embed cross application functionality on the client side, such as security, compression and caching.</p>
<p><b>Figure 8: Apache Wink Client Simplified Breakdown</b></p>
<p><img src="attachments/2329360/3113001.jpg" align="absmiddle" border="0"/></p>
<p><b>Figure 8</b>: The illustration shows the basic elements that comprise the Apache Wink Client. The Apache Wink Client utilizes the providers mechanism defined by the JAX-RS specification to perform reading and writing of java objects. The Apache Wink Client is pre-initialized with the same providers that are predefined by the Apache Wink JAX-RS server implementation.</p>
<p><br clear="all" /></p>
<hr />
<h1><a name="2ApacheWinkBuildingBlocks-ApacheWinkClientComponents"></a>Apache Wink Client Components</h1>
<p>The Apache Wink Client is comprised of several key elements that together create a simple and convenient framework for the consumption of REST based web services. The client is an abstraction of REST concepts modeled into simple java classes that encapsulate the underlying HTTP protocol, used for the service invocation.</p>
<p>The Apache Wink Client uses the java HttpURLConnection class for the HTTP invocation. The Apache Wink Client also provides a module that utilizes the Apache HTTP Client instead of the default HttpURLConnection class.</p>
<p>The following section provides an overview of the key elements and classes that comprise the Apache Wink Client.</p>
<h2><a name="2ApacheWinkBuildingBlocks-RestClientClass"></a>RestClient Class</h2>
<p>The RestClient class is the central access point to Apache Wink Client. It provides the user with functionality that enables the creation of new Resource instances. The RestClient provides the user with the ability to set different configuration parameters and custom JAX-RS providers and propagates them to the created resources.</p>
<h2><a name="2ApacheWinkBuildingBlocks-ResourceInterface"></a>Resource Interface</h2>
<p>The Resource interface represents a single web resource located at a specific URL, enabling for the manipulation and retrieval of the resource by the invocation of different HTTP methods on the resource instance. The resource interface is implemented following the Builder design pattern so method calls can be easily aggregated and in order to enable easy construction of requests and setting of the resource properties prior to invocation.</p>
<h2><a name="2ApacheWinkBuildingBlocks-ClientRequestInterface"></a>ClientRequest Interface</h2>
<p>The ClientRequest interface represents a request issued by invoking any one of the invocation methods on a Resource. An instance of a ClientRequest is created at the beginning of an invocation and passed to all the client handlers defined on the client that was used for the invocation.</p>
<h2><a name="2ApacheWinkBuildingBlocks-ClientResponseInterface"></a>ClientResponse Interface</h2>
<p>The ClientResponse interface represents an HTTP response that is received after invoking any one of the invocation methods on a Resource. An instance of a ClientResponse is created by the ConnectionHandler at the end of the handler chain, and is returned from every handler on the chain.</p>
<h2><a name="2ApacheWinkBuildingBlocks-ClientConfigClass"></a>ClientConfig Class</h2>
<p>The ClientConfig class provides client configuration when instantiating a new RestClient. The ClientConfig is implemented using the Builder design pattern so method calls can be easily aggregated. Custom Providers and client Handlers are set on the ClientConfig instance prior to the creation of the RestClient.</p>
<h2><a name="2ApacheWinkBuildingBlocks-ClientHandlerInterface"></a>ClientHandler Interface</h2>
<p>Client handlers are used to incorporate cross invocation functionality. The ClientHandler interface is implemented by client handlers, and the handle() method is invoked for every request invocation in order to allow the handler to perform custom actions during the request invocation.</p>
<h2><a name="2ApacheWinkBuildingBlocks-InputStreamAdapterInterface"></a>InputStreamAdapter Interface</h2>
<p>The InputStreamAdapter interface is used to wrap the response input stream with another input stream in order to allow the manipulation of the response entity stream. The adapt() method is called after reading the response status code and response headers, and before returning to the ClientResponse to the handlers on the chain.</p>
<h2><a name="2ApacheWinkBuildingBlocks-OutputStreamAdapterInterface"></a>OutputStreamAdapter Interface</h2>
<p>The OutputStreamAdapter interface is used to wrap the request output stream with another output stream to allow the manipulation of the request entity stream. The adapt() method is called before writing the request headers to allow the adapter to manipulate the request.</p>
<h2><a name="2ApacheWinkBuildingBlocks-EntityTypeClass"></a>EntityType Class</h2>
<p>The EntityType is used to specify the class type and the generic type of responses. Typically, an anonymous "<b>EntityType</b>" instance is created in order to specify the response type, as is shown in the following code example:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java">Resource resource = client.resource(uri);
List&lt;<span class="code-object">String</span>&gt; list = resource.get(<span class="code-keyword">new</span> EntityType&lt;List&lt;<span class="code-object">String</span>&gt;&gt;() {});
</pre>
</div></div>
<h2><a name="2ApacheWinkBuildingBlocks-ApacheHttpClientConfigClass"></a>ApacheHttpClientConfig Class</h2>
<p>The "<b>ApacheHttpClientConfig</b>" Configuration object configures the Apache Wink Client to use the Apache HttpClient as the underlying HTTP client. The following code snippet, demonstrates the typical usage:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-java"><span class="code-comment">// creates the client that uses Apache DefaultHttpClient as the underlying Http client.
</span>RestClient client = <span class="code-keyword">new</span> RestClient(<span class="code-keyword">new</span> ApacheHttpClientConfig(<span class="code-keyword">new</span> DefaultHttpClient()));
<span class="code-comment">// creates the resource
</span>Resource resource = client.resource(<span class="code-quote">"http:<span class="code-comment">//myhost:80/my/service"</span>);
</span>
<span class="code-comment">// invokes a GET method on the resource and receives the response entity as a string
</span><span class="code-object">String</span> entity = resource.get(<span class="code-object">String</span>.class);
...
</pre>
</div></div>
<p><br clear="all" /></p>
<hr />
<h1><a name="2ApacheWinkBuildingBlocks-TheApacheWinkRuntime"></a>The Apache Wink Runtime</h1>
<p>The Apache Wink runtime is deployed on a JEE environment and is configured by defining the RestServlet in the web.xml file of the application. This servlet is the entry point of all the HTTP requests targeted for web services, and passes the request and response instances to the Wink engine for processing.</p>
<p><b>Figure 9: Apache Wink Request Processor</b> <b>Architecture</b><br/>
<img src="attachments/2329360/2523215.jpg" align="absmiddle" border="0" height="312" width="490"/></p>
<p>The diagram illustrates the core components of the Apache Wink runtime. The Wink engine is the RequestProcessor. It builds an instance of a MessageContext with all of the required information for the request and passes it through the engine handler chains. The handler chains are responsible for serving the request, invoking the required resource method and finally generating a response.<br/>
In case of an error, the RequestProcessor invokes the Error chain with the generated exception for producing the appropriate response.<br/>
The Apache Wink runtime maintains providers and resources in two registries, the "<b>providers registry</b>" and the "resource registry" utilizing them during request processing.</p>
<p><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-RequestProcessor"></a>Request Processor</h2>
<p>The RequestProcessor is the Apache Wink engine, that is initialized by the RestServlet and is populated with an instance of a DeploymentConfiguration.<br/>
When a request is passed to the handleRequest() method of the RequestProcessor, a new instance of a&nbsp; MessageContext is created.<br/>
The MessageContext contains all of the information that is required for the Wink runtime to handle the request. The RequestProcessor first invokes the Request Handler Chain and then the Response Handler Chain.</p>
<p>If an exception occurs during any stage of the request processing, the RequestProcessor invokes the Error Handler Chain for processing the exception.</p>
<p><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-DeploymentConfiguration"></a>Deployment Configuration</h2>
<p>The Apache Wink runtime is initialized with an instance of a Deployment Configuration. The Deployment Configuration holds the runtime configuration, including the handler chains, registries, configuration properties.<br/>
The Deployment Configuration is initialized with an instance of a JAX-RS Application used for obtaining user resources and providers.</p>
<p><br clear="all" /></p>
<hr />
<h3><a name="2ApacheWinkBuildingBlocks-CustomizationoftheHandlersChain"></a>Customization of the Handlers Chain</h3>
<p>The handler chain is customized by extending the org.apache.wink.server.handlers.HandlersFactory class, overriding specific methods and specifying the new class in the web.xml file of the application.<br/>
In order to specify a different HandlersFactory class instead of the default handlers, specify an init parameter for a custom properties file to be loaded by the RestServlet. Then, the value of the wink.handlersFactoryClass property must be set as the fully qualified name of the customized handlers class in the properties file.</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml"><span class="code-tag">&lt;servlet&gt;</span>
<span class="code-tag">&lt;servlet-name&gt;</span>restSdkService<span class="code-tag">&lt;/servlet-name&gt;</span>
<span class="code-tag">&lt;servlet-class&gt;</span>
org.apache.wink.server.internal.servlet.RestServlet
<span class="code-tag">&lt;/servlet-class&gt;</span>
<span class="code-tag">&lt;init-param&gt;</span>
<span class="code-tag">&lt;param-name&gt;</span>propertiesLocation<span class="code-tag">&lt;/param-name&gt;</span>
<span class="code-tag">&lt;param-value&gt;</span>path/to/my-wink-properties.properties<span class="code-tag">&lt;/param-value&gt;</span>
<span class="code-tag">&lt;/init-param&gt;</span>
<span class="code-tag">&lt;/servlet&gt;</span>
</pre>
</div></div>
<p>In the my-wink-properties properties file:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="code-xml">wink.handlersFactoryClass=org.apache.wink.MyCustomHandlersFactory
</pre>
</div></div>
<p>See the JavaDoc for the HandlersFactory API.</p>
<p><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-HandlerChains"></a>Handler Chains</h2>
<p>The handler chain pattern is used by the Wink runtime for implementing the core functionalities.<br/>
There are three handler chains utilized by the Wink runtime:</p>
<ul>
<li>RequestHandlersChain</li>
<li>ResponseHandlersChain</li>
<li>ErrorHandlersChain</li>
</ul>
<p><div class='panelMacro'><table class='infoMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="images/icons/emoticons/information.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Handler Chains</b><br />For further information regarding the "<b>Handler Chains</b>", refer to section 5 <b>Apache Wink Server</b>, <a href="5.7 Handler Chain - Runtime Extension.html" title="5.7 Handler Chain - Runtime Extension">5.7 Handler Chain - Runtime Extension</a> </td></tr></table></div><br clear="all" /></p>
<hr />
<h2><a name="2ApacheWinkBuildingBlocks-Registries"></a>Registries</h2>
<p>The Apache Wink runtime utilizes two registries for maintaining the JAX-RS resources and providers. Both registries maintain their elements in a sorted state according to the JAX-RS specification for increasing performance during request processing. In addition to the JAX-RS specification sorting, Wink supports the prioritization of resources and providers.</p>
<div class='panelMacro'><table class='infoMacro'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="images/icons/emoticons/information.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b>Resources and Providers Prioritization</b><br />For further information regarding &#42;"<b>Resources and Providers Prioritization</b>", refer to the section <a href="5.1 Registration and Configuration.html#5.1RegistrationandConfiguration-Priorities">5.1 Registration and Configuration</a>. </td></tr></table></div>
<h3><a name="2ApacheWinkBuildingBlocks-ResourceRegistry"></a>Resource Registry</h3>
<p><b>Firgure 10: Resource Registry Architecture</b><br/>
<img src="attachments/2329360/2523216.jpg" align="absmiddle" border="0"/></p>
<p>The resources registry maintains all of the root resources in the form of Resource Records.<br/>
A Resource Record holds the following:</p>
<ul>
<li><b>URI Template Processor</b> &#45; represents a URI template associated with a resource. Used during the resource matching process.</li>
<li><b>Resource Metadata</b> &#45; holds the resource metadata collected from the resource annotations.</li>
<li><b>Sub-Resource Records</b> &#45; records of all the sub-resources (methods and locators) collected from the sub-resource annotations.</li>
<li><b>Resource Factory</b> &#45; a factory that retrieves an instance of the resource in accordance to the creation method defined for the resource.<br/>
Possible creation methods include:
<ul>
<li>
<ul>
<li>singleton</li>
<li>prototype</li>
<li>spring configuration</li>
<li>user customizable</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>
<div class="tabletitle">
<a name="attachments">Attachments:</a>
</div>
<div class="greybox" align="left">
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/2523203.jpg">Entity Provider.jpg</a> (image/jpeg)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/2523204.jpg">Apache Wink Logic Workflow.jpg</a> (image/jpeg)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/2523205.jpg">Servlet Dispatcher Concept 2.jpg</a> (image/jpeg)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/2523210.jpg">URL Handling.jpg</a> (image/jpeg)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/2523213.jpg">Simplified Client.jpg</a> (image/jpeg)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/2523212.jpg">Simplified Client.jpg</a> (image/jpeg)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/2523214.jpg">Simplified Client2.jpg</a> (image/jpeg)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/2523215.jpg">Winky Spanky Diagram.jpg</a> (image/jpeg)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/2523216.jpg">Resource Registry.jpg</a> (image/jpeg)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/3113001.jpg">Wink Client Diagram.jpg</a> (image/jpeg)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/3113002.jpg">Context Provider.jpg</a> (image/jpeg)
<br/>
<img src="images/icons/bullet_blue.gif" height="8" width="8" alt=""/>
<a href="attachments/2329360/3113003.jpg">Exception Mapping Provider.jpg</a> (image/jpeg)
<br/>
</div>
</td>
</tr>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td height="12" background="http://cwiki.apache.org/confluence/images/border/border_bottom.gif"><img src="images/border/spacer.gif" width="1" height="1" border="0"/></td>
</tr>
<tr>
<td align="center"><font color="grey">Document generated by Confluence on Nov 11, 2009 06:57</font></td>
</tr>
</table>
</body>
</html>