<!DOCTYPE HTML>
<!--
/***************************************************************************************************************************
 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *  
 *  http://www.apache.org/licenses/LICENSE-2.0
 *  
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations under the License.
 ***************************************************************************************************************************/
 -->
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<link rel="icon" type="image/png" href="http://www.apache.org/favicons/favicon-32x32.png" sizes="32x32">
	<link rel="icon" type="image/png" href="http://www.apache.org/favicons/favicon-194x194.png" sizes="194x194">
	<link rel="icon" type="image/png" href="http://www.apache.org/favicons/favicon-96x96.png" sizes="96x96">
	<link rel="icon" type="image/png" href="http://www.apache.org/favicons/android-chrome-192x192.png" sizes="192x192">
	<link rel="icon" type="image/png" href="http://www.apache.org/favicons/favicon-16x16.png" sizes="16x16">
	<link rel="shortcut icon" href="http://www.apache.org/favicons/favicon.ico">
	<style type="text/css">
		/* For viewing in file system and page designer */
		@IMPORT url("../../../../juneau-core/java/src/main/javadoc/javadoc.css");
		@IMPORT url("../../../../juneau-core/java/src/main/javadoc/resources/juneau-doc.css");
		@IMPORT url("../../../../juneau-core/java/src/main/javadoc/resources/juneau-code.css");

		body { 
			margin: 20px; 
		}	
		.spaced-list li { padding:5px; }
		.footer .spaced-list ul { margin:0 }
	</style>
	<script type="text/javascript">
		/* Replace all @code and @link tags. */	
		window.onload = function() {
			document.body.innerHTML = document.body.innerHTML.replace(/\{\@code ([^\}]+)\}/g, '<code>$1<\/code>');
			document.body.innerHTML = document.body.innerHTML.replace(/\{\@link (([^\}]+)\.)?([^\.\}]+)\}/g, '<code>$3<\/code>');
		}
	</script>
</head>
<body>
<p>Apache Juneau Overview</p>
<script type="text/javascript">
	function toggle(x) {
		var div = x.nextSibling;
		while (div != null && div.nodeType != 1)
			div = div.nextSibling;
		if (div != null) {
			var d = div.style.display;
			if (d == 'block' || d == '') {
				div.style.display = 'none';
				x.className += " closed";
			} else {
				div.style.display = 'block';
				x.className = x.className.replace(/(?:^|\s)closed(?!\S)/g , '' );
			}
		}
	}
</script>
<ul class='spaced-list'>
	<li>A universal toolkit for marshalling POJOs to a wide variety of content types using a common framework.
	<li>A universal REST server API for creating Swagger-based self-documenting REST interfaces using POJOs, simply deployed as 
		one or more top-level servlets in any Servlet 3.1 or above container.
	<li>A universal REST client API for interacting with Juneau or 3rd-party REST interfaces using POJOs and proxy interfaces.
	<li>A sophisticated configuration file API.
	<li>A REST microservice API that combines all the features above with a simple configurable Jetty server for 
		creating lightweight stand-alone REST interfaces that start up in milliseconds.
	<li>Built on top of Servlet and Apache HttpClient APIs that allow you to use the newest HTTP/2 features
		such as request/response multiplexing and server push.
</ul>

<a id='TOC'></a><h5 class='toc'>Table of Contents</h5>
<ol class='toc'>
	<li><p><a class='doclink' href='#Intro'>Introduction</a></p>
	<ol>
		<li><p><a class='doclink' href='#Intro.Features'>Features</a></p>
		<li><p><a class='doclink' href='#Intro.Components'>Components</a></p>
	</ol>
	<li><p><a class='doclink' href='#juneau-marshall'><i>juneau-marshall</i></a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-marshall.Serializers'>Serializers</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.Parsers'>Parsers</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.Groups'>SerializerGroups and ParserGroups</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.ObjectMap'>ObjectMap and ObjectList</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.ConfigurableProperties'>Configurable Properties</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.ContextsBuildersSessionsPropertyStores'>Contexts, Builders, Sessions, and PropertyStores</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.Transforms'>Transforms</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.PojoSwaps'>PojoSwaps</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.PerMediaTypePojoSwaps'>Per-media-type PojoSwaps</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.OneWayPojoSwaps'>One-way PojoSwaps</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.SwapAnnotation'>@Swap Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.TemplatedSwaps'>Templated Swaps</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.SwapMethods'>Swap Methods</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.SurrogateClasses'>Surrogate Classes</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.BeanAnnotation'>@Bean Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.BeanPropertyAnnotation'>@BeanProperty Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.BeanConstructorAnnotation'>@BeanConstructor Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.BeanIgnoreAnnotation'>@BeanIgnore Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.NamePropertyAnnotation'>@NameProperty Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.ParentPropertyAnnotation'>@ParentProperty Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.PojoBuilders'>POJO Builders</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.URIs'>URIs</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.BeanFilters'>BeanFilters</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.InterfaceFilters'>Interface filters</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.StopClasses'>Stop Classes</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.BypassSerialization'>Bypass Serialization using Readers and InputStreams</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.BeanDictionaries'>Bean Name and Dictionaries</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.BeanSubTypes'>Bean Subtypes</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.VirtualBeans'>Virtual Beans</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.ReadingContinuousStreams'>Reading Continuous Streams</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.JacksonComparison'>Comparison with Jackson</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.PojoCategories'>POJO Categories</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.BestPractices'>Best Practices</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.AdditionalInfo'>Additional Information</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.AdditionalInfo.JSON'>JSON</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.AdditionalInfo.XML'>XML</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.AdditionalInfo.HTML'>HTML</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.AdditionalInfo.UON'>UON</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.AdditionalInfo.URLEncoding'>URL-Encoding</a></p>
		</ol>
	</ol>
	<li><p><a class='doclink' href='#juneau-marshall-rdf'><i>juneau-marshall-rdf</i></a></p>
	<li><p><a class='doclink' href='#juneau-dto'><i>juneau-dto</i></a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-dto.HTML5'>HTML5</a></p>
		<li><p><a class='doclink' href='#juneau-dto.Atom'>Atom</a></p>
		<li><p><a class='doclink' href='#juneau-dto.Swagger'>Swagger</a></p>
	</ol>
	<li><p><a class='doclink' href='#juneau-svl'><i>juneau-svl</i></a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-svl.SimpleVarLanguage'>Simple Variable Language</a></p>
		<li><p><a class='doclink' href='#juneau-svl.SvlVariables'>SVL Variables</a></p>
		<li><p><a class='doclink' href='#juneau-svl.VarResolvers'>VarResolvers and VarResolverSessions</a></p>
		<li><p><a class='doclink' href='#juneau-svl.OtherNotes'>Other Notes</a></p>
	</ol>
	<li><p><a class='doclink' href='#juneau-config'><i>juneau-config</i></a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-config.Overview'>Overview</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-config.SyntaxRules'>Syntax Rules</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-config.EntryTypes'>Entry Types</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-config.PrimitiveTypes'>Primitive Types</a></p>
			<li><p><a class='doclink' href='#juneau-config.POJOs'>POJOs</a></p>
			<li><p><a class='doclink' href='#juneau-config.Arrays'>Arrays</a></p>
			<li><p><a class='doclink' href='#juneau-config.Collections'>Collections</a></p>
			<li><p><a class='doclink' href='#juneau-config.BinaryData'>Binary Data</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-config.Variables'>Variables</a></p>
		<li><p><a class='doclink' href='#juneau-config.EncodedEntries'>Encoded Entries</a></p>
		<li><p><a class='doclink' href='#juneau-config.SectionMaps'>Section Maps</a></p>
		<li><p><a class='doclink' href='#juneau-config.SectionBeans'>Section Beans</a></p>
		<li><p><a class='doclink' href='#juneau-config.SectionInterfaces'>Section Interfaces</a></p>
		<li><p><a class='doclink' href='#juneau-config.SettingValues'>Setting Values</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-config.CustomEntrySerialization'>Custom Entry Serialization</a></p>
			<li><p><a class='doclink' href='#juneau-config.BulkSettingValues'>Setting Values in Bulk</a></p>
		</ol>		
		<li><p><a class='doclink' href='#juneau-config.Listeners'>Listeners</a></p>
		<li><p><a class='doclink' href='#juneau-config.Serializing'>Serializing</a></p>
		<li><p><a class='doclink' href='#juneau-config.ConfigStores'>Config Stores</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-config.ConfigMemoryStore'>ConfigMemoryStore</a></p>
			<li><p><a class='doclink' href='#juneau-config.ConfigFileStore'>ConfigFileStore</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-config.ReadOnlyConfigs'>Read-only Configs</a></p>
		<li><p><a class='doclink' href='#juneau-config.ClosingConfigs'>Closing Configs</a></p>
	</ol>
	<li><p><a class='doclink' href='#juneau-rest-server'><i>juneau-rest-server</i></a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-rest-server.HelloWorldExample'>Hello World Example</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.ClassHierarchy'>Class Hierarchy</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Instantiation'>Instantiation</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.RestServlet'>RestServlet</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestServletDefault'>RestServletDefault</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Children'>Children</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RouterPages'>Router Pages</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.ResourceResolvers'>Resource Resolvers</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.LifecycleHooks'>Lifecycle Hooks</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-server.RestResource'>@RestResource</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.AnnotationInheritance'>Annotation Inheritance</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-server.RestContext'>RestContext</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.RestMethod'>@RestMethod</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.MethodParameters'>Java Method Parameters</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestRequest'>RestRequest</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestResponse'>RestResponse</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RequestBody'>RequestBody</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RequestHeaders'>RequestHeaders</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RequestQuery'>RequestQuery</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RequestFormData'>RequestFormData</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethodPath'>@RestMethod.path()</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RequestPathMatch'>RequestPathMatch</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.MethodReturnTypes'>Method Return Types</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.ReaderResource'>ReaderResource</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.StreamResource'>StreamResource</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Redirect'>Redirect</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethodMatchers'>@RestMethod.matchers()</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-server.Body'>@Body</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.HandlingFormPosts'>Handling Form Posts</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HandlingMultiPartFormPosts'>Handling Multi-Part Form Posts</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-server.FormData'>@FormData</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Query'>@Query</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Header'>@Header</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Serializers'>Serializers</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Parsers'>Parsers</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Properties'>Properties</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Transforms'>Transforms</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Guards'>Guards</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Converters'>Converters</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Messages'>Messages</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Encoders'>Encoders</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.SvlVariables'>SVL Variables</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.ConfigurationFiles'>Configuration Files</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.StaticFiles'>Static files</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.ClientVersioning'>Client Versioning</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.OptionsPages'>OPTIONS pages</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.RestInfoProvider'>RestInfoProvider</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestInfoProviderDefault'>RestInfoProviderDefault</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation'>@HtmlDoc</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.Widgets'>Widgets</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.PredefinedWidgets'>Predefined Widgets</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.UiCustomization'>UI Customization</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Stylesheets'>Stylesheets</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-server.DefaultHeaders'>Default Headers</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.LoggingAndErrorHandling'>Logging and Error Handling</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.HttpStatusCodes'>HTTP Status Codes</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.OverloadingHttpMethods'>Overloading HTTP Methods</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.BuiltInParameters'>Built-in Parameters</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.CustomSerializersAndParsers'>Custom Serializers and Parsers</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.UsingWithOsgi'>Using with OSGi</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.RemoteableProxies'>Remoteable Proxies</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.RemoteableProxiesClientSide'>Client Side</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RemoteableProxiesServerSide'>Server Side</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RemoteableProxiesRemoteableAnnotation'>@Remoteable Annotation</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-server.Injection'>Using with Spring and Injection frameworks</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.HTTP2'>Using HTTP/2 features</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.PredefinedLabelBeans'>Predefined Label Beans</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.OtherNotes'>Other Notes</a></p>
	</ol>
	<li><p><a class='doclink' href='#juneau-rest-server-jaxrs'><i>juneau-rest-server-jaxrs</i></a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-rest-server-jaxrs.BaseProvider'>Juneau JAX-RS Provider</a></p>
	</ol>	
	<li><p><a class='doclink' href='#juneau-rest-client'><i>juneau-rest-client</i></a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-rest-client.3rdPartyProxies'>Interface Proxies Against 3rd-party REST Interfaces</a></p>
		<li><p><a class='doclink' href='#juneau-rest-client.SSL'>SSL Support</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-client.SSLOpts'>SSLOpts Bean</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-client.Authentication'>Authentication</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-client.BASIC'>BASIC Authentication</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.FORM'>FORM-based Authentication</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.OIDC'>OIDC Authentication</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-client.ResponsePatterns'>Using Response Patterns</a></p>
		<li><p><a class='doclink' href='#juneau-rest-client.PipingOutput'>Piping Response Output</a></p>
		<li><p><a class='doclink' href='#juneau-rest-client.Debugging'>Debugging</a></p>
		<li><p><a class='doclink' href='#juneau-rest-client.Logging'>Logging</a></p>
		<li><p><a class='doclink' href='#juneau-rest-client.Interceptors'>Interceptors</a></p>
		<li><p><a class='doclink' href='#juneau-rest-client.Remoteable'>Remoteable Proxies</a></p>
		<li><p><a class='doclink' href='#juneau-rest-client.Other'>Other Useful Methods</a></p>
	</ol>
	<li><p><a class='doclink' href='#juneau-microservice-server'><i>juneau-microservice-server</i></a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-microservice-server.Introduction'>Microservice Introduction</a></p>
		<li><p><a class='doclink' href='#juneau-microservice-server.GettingStarted'>Getting Started</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-microservice-server.Installing'>Installing in Eclipse</a></p>
			<li><p><a class='doclink' href='#juneau-microservice-server.Running'>Running in Eclipse</a></p>
			<li><p><a class='doclink' href='#juneau-microservice-server.Building'>Building and Running from Command-Line</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-microservice-server.Manifest'>Manifest File</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-microservice-server.ManifestApi'>Manifest API</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-microservice-server.Config'>Config</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-microservice-server.ConfigApi'>Config API</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-microservice-server.ResourceClasses'>Resource Classes</a></p>
		<li><p><a class='doclink' href='#juneau-microservice-server.PredefinedResourceClasses'>Predefined Resource Classes</a></p>
		<li><p><a class='doclink' href='#juneau-microservice-server.RestMicroservice'>RestMicroservice</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-microservice-server.ExtendingRestMicroservice'>Extending RestMicroservice</a></p>
		</ol>
	</ol>
	<li><p><a class='doclink' href='#juneau-examples-core'><i>juneau-examples-core</i></a></p>
	<li><p><a class='doclink' href='#juneau-examples-rest'><i>juneau-examples-rest</i></a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-examples-rest.RootResources'>RootResources</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.HelloWorldResource'>HelloWorldResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.MethodExampleResource'>MethodExampleResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.UrlEncodedFormResource'>UrlEncodedFormResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.RequestEchoResource'>RequestEchoResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.AddressBookResource'>AddressBookResource</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-examples-rest.AddressBookResource.Classes'>Classes</a></p>
			<li><p><a class='doclink' href='#juneau-examples-rest.AddressBookResource.Demo'>Demo</a></p>
			<li><p><a class='doclink' href='#juneau-examples-rest.AddressBookResource.Traversable'>Traversable</a></p>
			<li><p><a class='doclink' href='#juneau-examples-rest.AddressBookResource.Queryable'>Queryable</a></p>
			<li><p><a class='doclink' href='#juneau-examples-rest.AddressBookResource.Introspectable'>Introspectable</a></p>
			<li><p><a class='doclink' href='#juneau-examples-rest.AddressBookResource.RestClient'>ClientTest</a></p>
			<li><p><a class='doclink' href='#juneau-examples-rest.AddressBookResource.Browser'>Browser Tips</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-examples-rest.SampleRemoteableServlet'>SampleRemoteableServlet</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.TempDirResource'>TempDirResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.AtomFeedResource'>AtomFeedResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.DockerRegistryResource'>DockerRegistryResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.TumblrParserResource'>TumblrParserResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.PhotosResource'>PhotosResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.JsonSchemaResource'>JsonSchemaResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.SqlQueryResource'>SqlQueryResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.ConfigResource'>ConfigResource</a></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.LogsResource'>LogsResource</a></p>
	</ol>
	<li><p><a class='doclink' href='#Security'>Security Best-Practices</a></p>
	<li><p><a class='doclink' href='#ReleaseNotes'>Release Notes</a></p>
</ol>

<!-- =============================================================================================================== -->
<a id="Intro"></a>
<h2 class='topic' onclick='toggle(this)'>1 - Introduction</h2>
<div class='topic'>
	<p>
		Juneau is a single cohesive framework consisting of the following parts:
	</p>
	<ul class='spaced-list'>
		<li>A universal toolkit for marshalling POJOs to a wide variety of content types using a common framework.
		<li>A universal REST server API for creating Swagger-based self-documenting REST interfaces using POJOs, simply 
			deployed as one or more top-level servlets in any Servlet 3.1 or above container.
		<li>A universal REST client API for interacting with Juneau or 3rd-party REST interfaces using POJOs and proxy 
			interfaces.
		<li>A sophisticated configuration file API.
		<li>A REST microservice API that combines all the features above with a simple configurable Jetty server for 
			creating lightweight stand-alone REST interfaces that start up in milliseconds.
		<li>Built on top of Servlet and Apache HttpClient APIs that allow you to use the newest HTTP/2 features
			such as request/response multiplexing and server push.
	</ul>
	<p>
		Questions via email to <a class='doclink' href='mailto:dev@juneau.apache.org?Subject=Apache%20Juneau%20question'>dev@juneau.apache.org</a> are always welcome.
	</p>
	<p>
		Juneau is packed with features that may not be obvious at first.  
		Users are encouraged to ask for code reviews by providing links to specific source files such as through GitHub.
		Not only can we help you with feedback, but it helps us understand usage patterns to further improve the product.
	</p>

	<h5 class='topic'>History</h5>
	<p>
		Juneau started off as a popular internal IBM toolkit called Juno.
		Originally used for serializing POJOs to and from JSON, it later expanded in scope to include a variety of 
		content types, and then later REST servlet, client, and microservice APIs.
		It's use grew to more than 50 projects and was one of the most popular community source projects within IBM.
	</p>
	<p>
		In June of 2016, the code was donated to the Apache Foundation under the project <l>Apache Juneau</l> where it 
		has continued to evolve to where it is today.
	</p>	

	<!-- =========================================================================================================== -->
	<a id="Intro.Features"></a>
	<h3 class='topic' onclick='toggle(this)'>1.1 - Features</h3>
	<div class='topic'>
		<ul class='spaced-list'>
			<li>
				KISS is our mantra!  No auto-wiring.  No code generation.  No dependency injection (but still compatible with).  
				Just add it to your classpath and use it.  Extremely simple unit testing! 
			<li>
				Extensive and extensible support for a large variety of POJOs, including structured data (beans) and 
				unstructured data (<code>Maps</code> and <code>Collections</code>).
			<li>
				Sophisticated configurable serializers and parsers. 
				<br>For example, the JSON serializers and parsers can handle strict or lax syntax, comments, 
				concatenated strings, etc...
			<li>Tiny - ~1MB
			<li>Exhaustively tested
		</ul>
	</div>
		
	<!-- =========================================================================================================== -->
	<a id="Intro.Components"></a>
	<h3 class='topic' onclick='toggle(this)'>1.2 - Components</h3>
	<div class='topic'>
		<p>
			We've strived to keep prerequisites to an absolute minimum in order to make adoption as easy as possible.
		</p>
		<p>
			The library consists of the following artifacts found in the Maven group <code>"org.apache.juneau"</code>:
		</p>
		<table class='styled' style='min-width:800px;width:50%'>
			<tr>
				<th>Category</th><th>Maven Artifacts</th><th>Description</th><th>Prerequisites</th>
			</tr>
			<tr class='dark bb'>
				<td rowspan="5" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-core</td>
				<td class='code'><a class='doclink' href='#juneau-marshall'>juneau-marshall</a></td>
				<td>Serializers and parsers for:
					<ul style='margin:0px 10px;'>
						<li>JSON
						<li>XML
						<li>HTML
						<li>UON
						<li>URL-Encoding
						<li>MessagePack
						<li>SOAP/XML
						<li>CSV
						<li>BSON (coming soon)
						<li>YAML (coming soon)
						<li>Protobuf (coming soon)
					</ul>
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
					</ul>
				</td>
			</tr>
			<tr class='dark bb'>
				<td class='code'><a class='doclink' href='#juneau-marshall-rdf'>juneau-marshall-rdf</a></td>
				<td>
					Serializers and parsers for:
					<ul style='margin:0px 10px;'>
						<li>RDF/XML
						<li>RDF/XML-Abbrev 
						<li>N-Triple
						<li>Turtle
						<li>N3
					</ul>				
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
						<li>Apache Jena 2.7.1
					</ul>
				</td>
			</tr>
			<tr class='dark bb'>
				<td class='code'><a class='doclink' href='#juneau-dto'>juneau-dto</a></td>
				<td>
					Data Transfer Objects for:
					<ul style='margin:0px 10px;'>
						<li>HTML5
						<li>Atom
						<li>Cognos
						<li>JSON-Schema
						<li>Swagger 2.0
					</ul>				
				</td>
				<td><ul style='margin:0px 10px;'><li>Java 6</li></ul></td>
			</tr>
			<tr class='dark bb'>
				<td class='code'><a class='doclink' href='#juneau-svl'>juneau-svl</a></td>
				<td>
					Simple Variable Language API
				</td>
				<td><ul style='margin:0px 10px;'><li>Java 6</li></ul></td>
			</tr>
			<tr class='dark bb'>
				<td class='code'><a class='doclink' href='#juneau-config'>juneau-config</a></td>
				<td>
					Configuration file API
				</td>
				<td><ul style='margin:0px 10px;'><li>Java 6</li></ul></td>
			</tr>
			<tr class='light bb'>
				<td rowspan="3" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-rest</td>
				<td class='code'><a class='doclink' href='#juneau-rest-server'>juneau-rest-server</a></td>
				<td>
					REST Servlet API
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
						<li>Servlet 3.1
					</ul>
				</td>
			</tr>
			<tr class='light bb'>
				<td class='code'><a class='doclink' href='#juneau-rest-server-jaxrs'>juneau-rest-server-jaxrs</a></td>
				<td>
					Optional JAX-RS support
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
						<li>JAX-RS 2.0
					</ul>
				</td>
			</tr>
			<tr class='light bb'>
				<td class='code'><a class='doclink' href='#juneau-rest-client'>juneau-rest-client</a></td>
				<td>
					REST Client API
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
						<li>Apache HttpClient 4.5.3
					</ul>
				</td>
			</tr>
			<tr class='dark bb'>
				<td rowspan="1" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-microservice</td>
				<td class='code'><a class='doclink' href='#juneau-microservice-server'>juneau-microservice-server</a></td>
				<td>
					REST Microservice Server API
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 8
						<li>Eclipse Jetty 9.4.3
					</ul>
				</td>
			</tr>
			<tr class='light bb'>
				<td rowspan="2" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-examples</td>
				<td class='code'><a class='doclink' href='#juneau-examples-core'>juneau-examples-core</a></td>
				<td>
					Core code examples
				</td>
				<td></td>
			</tr>
			<tr class='light bb'>
				<td class='code'><a class='doclink' href='#juneau-examples-rest'>juneau-examples-rest</a></td>
				<td>
					REST code examples
				</td>
				<td></td>
			</tr>
			<tr class='dark bb'>
				<td rowspan="1" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-all</td>
				<td class='code'><code>juneau-all</code></td>
				<td>
					Combination of the following:
					<ul style='margin:0px 10px;'>
						<li>juneau-marshall
						<li>juneau-dto
						<li>juneau-svl
						<li>juneau-config
						<li>juneau-rest-server
						<li>juneau-rest-client
					</ul>
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
						<li>Servlet 3.1
						<li>Apache HttpClient 4.5.3
					</ul>
				</td>
			</tr>
		</table>
		
		<p>
			Each component are also packaged as stand-alone OSGi modules.
		</p>
	</div>

</div>
	
<!-- =========================================================================================================== -->
<a id="juneau-marshall"></a>
<h2 class='topic' onclick='toggle(this)'>2 - juneau-marshall</h2>
<div class='topic'>

	<h5 class='figure'>Maven Dependency</h5>
	<p class='bcode' style='width:500px;'>
	<xt>&lt;dependency&gt;</xt>
		<xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
		<xt>&lt;artifactId&gt;</xt>juneau-marshall<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>7.0.0<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
	</p>	
	
	<h5 class='figure'>Java Library</h5>
	<p class='bcode' style='width:500px;'>
	juneau-marshall-7.0.0.jar 
	</p>	
	
	<h5 class='figure'>OSGi Module</h5>
	<p class='bcode' style='width:500px;'>
	org.apache.juneau.marshall_7.0.0.jar 
	</p>	

	<p>
		The <code>juneau-marshall</code> artifact contains the API for defining serializers and parsers, and
		marshalling support for JSON, XML, HTML, URL-Encoding, UON and others.
	</p>
	<p>
		It also defines many convenience utility classes used throughout the framework.
	</p>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.Serializers"></a>
	<h3 class='topic' onclick='toggle(this)'>2.1 - Serializers</h3>
	<div class='topic'>
		<p>
			One of the goals of Juneau was to make serialization as simple as possible.  
			In a single line of code, you should be able to serialize and parse most POJOs.
			Despite this simplicity, Juneau provides lots of extensibility and configuration properties for tailoring how 
			POJOs are serialized and parsed.
		</p>
		<p>
			The built-in serializers in Juneau are fast, efficient, and highly configurable.
			They work by serializing POJOs directly to streams instead of using intermediate Document Object Model 
			objects.
		</p>
		<p>
			In most cases, you can serialize objects in one line of code by using one of the default serializers:
		</p>
		<p class='bcode'>
	<jc>// A simple bean</jc>
	<jk>public class</jk> Person {
		<jk>public</jk> String <jf>name</jf> = <js>"John Smith"</js>;
		<jk>public int</jk> <jf>age</jf> = 21;
	}

	<jc>// Serialize to JSON, XML, or HTML</jc>
	Person p = <jk>new</jk> Person();

	<jc>// Produces:
	//	"{name:'John Smith',age:21}"</jc>
	String json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(p);

	<jc>// Produces:
	//	&lt;object&gt;
	//	  &lt;name&gt;John Smith&lt;/name&gt;
	//	  &lt;age&gt;21&lt;/age&gt;
	//	&lt;/object&gt;</jc>
	String xml = XmlSerializer.<jsf>DEFAULT</jsf>.serialize(p);

	<jc>// Produces:
	//	&lt;table&gt;
	//	  &lt;tr&gt;&lt;th&gt;key&lt;/th&gt;&lt;th&gt;value&lt;/th&gt;&lt;/tr&gt;
	//	  &lt;tr&gt;&lt;td&gt;name&lt;/td&gt;&lt;td&gt;John Smith&lt;/td&gt;&lt;/tr&gt;
	//	  &lt;tr&gt;&lt;td&gt;age&lt;/td&gt;&lt;td&gt;21&lt;/td&gt;&lt;/tr&gt;
	//	&lt;/table&gt;</jc>
	String html = HtmlSerializer.<jsf>DEFAULT</jsf>.serialize(p);
	
	<jc>// Produces:
	//	"(name='John Smith',age=21)"</jc>
	String uon = UonSerializer.<jsf>DEFAULT</jsf>.serialize(p);

	<jc>// Produces:
	//	"name='John+Smith'&amp;age=21"</jc>
	String urlencoding = UrlEncodingSerializer.<jsf>DEFAULT</jsf>.serialize(p);

	<jc>// Produces:
	// 82 A4 6E 61 6D 65 AA 4A 6F 68 6E 20 53 6D 69 74 68 A3 61 67 65 15 </jc>
	<jk>byte</jk>[] b = MsgPackSerializer.<jsf>DEFAULT</jsf>.serialize(p);
		</p>
		
		<p>
			In addition to the default serializers, customized serializers can be created using various built-in options:
		</p>
		
		<p class='bcode'>
	<jc>// Use one of the default serializers to serialize a POJO</jc>
	String json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(someObject);

	<jc>// Create a custom serializer for lax syntax using single quote characters</jc>
	JsonSerializer serializer = JsonSerializer.<jsm>create</jsm>().simple().sq().build();
	
	<jc>// Clone an existing serializer and modify it to use single-quotes</jc>
	JsonSerializer serializer = JsonSerializer.<jsf>DEFAULT</jsf>.builder().sq().build();
	
	<jc>// Serialize a POJO to JSON</jc>
	String json = serializer.serialize(someObject);
		</p>
		<p>
			Default serialization support is provided for Java primitives, <code>Maps</code>, <code>Collections</code>, 
			beans, and arrays. 
			<br>Extensible support for other data types such as <code>Calendars</code>, <code>Dates</code>, 
			<code>Iterators</code> is available through the use of POJO swaps (described later).
		</p>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.Parsers"></a>
	<h3 class='topic' onclick='toggle(this)'>2.2 - Parsers</h3>
	<div class='topic'>
		<p>
			Parsers work by parsing input directly into POJOs instead of having to create intermediate Document Object 
			Models.
			This allows them to parse input with minimal object creation.
		</p>
		<p>
			Like the serializers, you can often parse objects in one line of code by using one of the default parsers:
		</p>
		<p class='bcode'>
	<jc>// Use one of the predefined parsers.</jc>
	Parser parser = JsonParser.<jsf>DEFAULT</jsf>;

	<jc>// Parse a JSON object as a bean.</jc>
	String json = <js>"{name:'John Smith',age:21}"</js>;
	Person p = parser.parse(json, Person.<jk>class</jk>);

	<jc>// Or parse it into a generic Map.</jc>
	Map m1 = parser.parse(json, Map.<jk>class</jk>);

	<jc>// Parse a JSON string.</jc>
	json = <js>"'foobar'"</js>;
	String s2 = parser.parse(json, String.<jk>class</jk>);

	<jc>// Parse a JSON number as a Long or Float.</jc>
	json = <js>"123"</js>;
	Long l3 = parser.parse(json, Long.<jk>class</jk>);
	Float f3 = parser.parse(json, Float.<jk>class</jk>);

	<jc>// Parse a JSON object as a HashMap&lt;String,Person&gt;.</jc>
	json = <js>"{a:{name:'John Smith',age:21},b:{name:'Joe Smith',age:42}}"</js>;
	Map&lt;String,Person&gt; m4 = parser.parse(json, HashMap.<jk>class</jk>, String.<jk>class</jk>, Person.<jk>class</jk>)

	<jc>// Parse a JSON object as a HashMap&lt;String,LinkedList&lt;Person&gt;&gt;.</jc>
	json = <js>"{a:[{name:'John Smith',age:21},{name:'Joe Smith',age:42}]}"</js>;
	Map&lt;String,List&lt;Person&gt;&gt; m5 = parser.parse(json, HashMap.<jk>class</jk>, String.<jk>class</jk>, 
		LinkedList.<jk>class</jk>, Person.<jk>class</jk>)

	<jc>// Parse a JSON array of integers as a Collection of Integers or int[] array.</jc>
	json = <js>"[1,2,3]"</js>;
	List&lt;Integer&gt; l6 = parser.parse(json, LinkedList.<jk>class</jk>, Integer.<jk>class</jk>);
	<jk>int</jk>[] i7 = parser.parse(json, <jk>int</jk>[].<jk>class</jk>);
		</p>
		<p>
			The parsers can also be used to populating existing bean and collection objects:
		</p>
		<p class='bcode'>
	<jc>// Use one of the predefined parsers.</jc>
	Parser parser = JsonParser.<jsf>DEFAULT</jsf>;

	<jc>// Populate the properties on an existing bean from a JSON object.</jc>
	String json = <js>"{name:'John Smith',age:21}"</js>;
	Person p = <jk>new</jk> Person();
	parser.parseIntoBean(json, p);

	<jc>// Populate an existing list from a JSON array of numbers.</jc>
	json = <js>"[1,2,3]"</js>;
	List&lt;Integer&gt; l2 = <jk>new</jk> LinkedList&lt;Integer&gt;();
	parser.parseIntoCollection(json, l2, Integer.<jk>class</jk>);

	<jc>// Populate an existing map from a JSON object containing beans.</jc>
	json = <js>"{a:{name:'John Smith',age:21},b:{name:'Joe Smith',age:42}}"</js>;
	Map&lt;String,Person&gt; m3 = <jk>new</jk> TreeMap&lt;String,Person&gt;();
	parser.parseIntoMap(json, m3, String.<jk>class</jk>, Person.<jk>class</jk>);
		</p>
		<ul class='doctree'>
			<li class='info'>
				In the example above, we're parsing "lax" JSON (single quotes, unquoted attributes).
				The JSON parser can handle any valid JSON syntax (such as quoted or unquoted attributes, single or double 
				quotes).
				<br>It can also handle JSON fragments and embedded Javascript comments. 
				Many of the JSON examples provided will use lax syntax which is easier to read since we don't have to deal 
				with escapes.  
		</ul>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.Groups"></a>
	<h3 class='topic' onclick='toggle(this)'>2.3 - SerializerGroups and ParserGroups</h3>
	<div class='topic'>
		<p>
			Above the serializers and parsers are the {@link org.apache.juneau.serializer.SerializerGroup} and 
			{@link org.apache.juneau.parser.ParserGroup} classes.
			These classes allow serializers and parsers to be retrieved by W3C-compliant HTTP <code>Accept</code> 
			and <code>Content-Type</code> values...
		</p>
		<p class='bcode'>
	<jc>// Construct a new serializer group with configuration parameters that get applied to all serializers.</jc>
	SerializerGroup sg = SerializerGroup.<jsm>create</jsm>()
		.append(JsonSerializer.<jk>class</jk>, UrlEncodingSerializer.<jk>class</jk>);
		.ws   <jc>// or .useWhitespace(true)</jc>
		.pojoSwaps(CalendarSwap.ISO8601DT.<jk>class</jk>)
		.build();

	<jc>// Find the appropriate serializer by Accept type and serialize our POJO to the specified writer.</jc>
	sg.getSerializer(<js>"text/invalid, text/json;q=0.8, text/*;q:0.6, *\/*;q=0.0"</js>)
		.serialize(myPersonObject, myWriter);
		
	<jc>// Construct a new parser group with configuration parameters that get applied to all parsers.</jc>
	ParserGroup pg = ParserGroup.<jsm>create</jsm>()
		.append(JsonSerializer.<jk>class</jk>, UrlEncodingSerializer.<jk>class</jk>);
 		.pojoSwaps(CalendarSwap.ISO8601DT.<jk>class</jk>)
 		.build();

	Person p = pg.getParser(<js>"text/json"</js>).parse(myReader, Person.<jk>class</jk>);
		</p>
		<p>
			The REST servlet API builds upon the <code>SerializerGroup</code> and <code>ParserGroup</code> classes 
			to provide annotated REST servlets that automatically negotiate the HTTP media types and allow the developer
			to work with requests and responses as POJOs.
		</p>			
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.ObjectMap"></a>
	<h3 class='topic' onclick='toggle(this)'>2.4 - ObjectMap and ObjectList</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.ObjectMap} and {@link org.apache.juneau.ObjectList} classes are generic Java 
			representations of JSON objects and arrays.  
			These classes can be used to create "unstructured" models for serialization (as opposed to "structured" 
			models consisting of beans).  
			If you want to quickly generate JSON/XML/HTML from generic maps/collections, or parse JSON/XML/HTML into 
			generic maps/collections, these classes work well.  
		</p>
		<p>
			These classes extend directly from the following JCF classes:
		</p>
		<ul class='doctree'>
			<li class='jc'> 
				{@link java.util.LinkedHashMap java.util.LinkedHashMap}
				<ul>
					<li class='jc'> 
					{@link org.apache.juneau.ObjectMap org.apache.juneau.ObjectMap}
				</ul>
			</li>
			<li class='jc'> 
				{@link java.util.LinkedList java.util.LinkedList}
				<ul>
					<li class='jc'> 
						{@link org.apache.juneau.ObjectMap org.apache.juneau.ObjectList}
				</ul>
			</li>
		</ul>
		<p>
			The <l>ObjectMap</l> and <l>ObjectList</l> classes are very similar to the <l>JSONObject</l> and 
			<l>JSONArray</l> classes found in other libraries.  
			However, the names were chosen because the concepts of <l>Maps</l> and <l>Lists</l> are already familiar to 
			Java programmers, and these classes can be used with any of the serializers or parsers.
		</p>
		<p>
			These object can be serialized in one of two ways:
		</p>
		<ol class='spaced-list'>
			<li>
				Using the provided {@link org.apache.juneau.ObjectMap#serializeTo(java.io.Writer)} or 
				{@link org.apache.juneau.ObjectList#serializeTo(java.io.Writer)} methods.
			<li>
				Passing them to one of the {@link org.apache.juneau.serializer.Serializer} serialize methods.
			<li>
				Simply calling the {@link org.apache.juneau.ObjectMap#toString()} or {@link org.apache.juneau.ObjectList#toString()}
				methods which will serialize it as Simplified JSON.
		</ol>
		<p>
			Any valid JSON can be parsed into an unstructured model consisting of generic 
			{@link org.apache.juneau.ObjectMap} and {@link org.apache.juneau.ObjectList} objects. 
			<br>
			(In theory, any valid XML can also be parsed into an unstructured model, although this has not been 
			officially 'tested')
		</p>
		<p class='bcode'>
	<jc>// Parse an arbitrary JSON document into an unstructered data model
	// consisting of ObjectMaps, ObjectLists, and java primitive objects.</jc>
	Parser parser = JsonParser.<jsf>DEFAULT</jsf>;
	String json = <js>"{a:{name:'John Smith',age:21},b:{name:'Joe Smith',age:42}}"</js>;
	ObjectMap m = parser.parse(json, ObjectMap.<jk>class</jk>);

	<jc>// Use ObjectMap API to extract data from the unstructured model.</jc>
	<jk>int</jk> johnSmithAge = m.getObjectMap(<js>"a"</js>).getInt(<js>"age"</js>);
	
	<jc>// Convert it back into JSON.</jc>
	json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(m);
	
	<jc>// Or convert it to XML.</jc>
	String xml = XmlSerializer.<jsf>DEFAULT</jsf>.serialize(m);

	<jc>// Or just use toString().</jc>
	json = m.toString();
		</p>
		<p>
			The <code>ObjectMap</code> and <code>ObjectList</code> classes have many convenience features:
		</p>
		<p class='bcode'>	
	<jc>// Convert the map to a bean.</jc>		
	MyBean m = objectMap.cast(MyBean.<jk>class</jk>);
			
	<jc>// Find entries by multiple keys.</jc>
	MyBean m = objectMap.find(MyBean.<jk>class</jk>, <js>"key1"</js>, <js>"key2"</js>);
	
	<jc>// Fluent-style appenders.</jc>
	objectMap.append(<js>"key1"</js>, <js>"val1"</js>).append(<js>"key2"</js>, <js>"val2"</js>);
			
	<jc>// REST-like functions for manipulating nodes in the data structure using URL-like notation.</jc>
	objectMap.getAt(<js>"foo/bar/myBean"</js>, MyBean.<jk>class</jk>);		
	objectMap.putAt(<js>"foo/bar/myBean"</js>, MyBean.<jk>class</jk>);		
	objectMap.postAt(<js>"foo/bar/myListOfBeans"</js>, MyBean.<jk>class</jk>);		
	objectMap.deleteAt(<js>"foo/bar/myBean"</js>);		
	
	<jc>// Copy with inclusion or exclusion.</jc>
	ObjectMap m2 = objectMap.include(<js>"key1"</js>, <js>"key2"</js>, <js>"key3"</js>);
	ObjectMap m3 = objectMap.exclude(<js>"key1"</js>, <js>"key2"</js>, <js>"key3"</js>);
	
	<jc>// Serialize using another serializer.</jc>
	String xml = objectMap.serializeTo(XmlSerializer.<jsf>DEFAULT</jsf>);
	
	<jc>// Nested maps.</jc>
	objectMap.setInner(objectMapInner);
		</p>
		
		<ul class='doctree'>
			<li class='info'>
				As a general rule, if you do not specify a target type during parsing, or if the target type cannot be 
				determined through reflection, the parsers automatically generate <l>ObjectMaps</l> and <l>ObjectLists</l>.
		</ul>
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.ConfigurableProperties"></a>
	<h3 class='topic' onclick='toggle(this)'>2.5 - Configurable Properties</h3>
	<div class='topic'>
		<p>
			Serializers and parsers have a wide variety of configurable properties.
			<br>They all extend from the {@link org.apache.juneau.BeanContextBuilder} class that allows you to easily construct
			new instances from scratch or build upon existing instances.
			<br>For example, the following code shows how to configure a JSON serializer:
		</p>
		<p class='bcode'>
	WriterSerializer s = JsonSerializer
		.<jsm>create</jsm>()  <jc>// Create a JsonSerializerBuilder</jc>
		.simple()  <jc>// Simple mode</jc>
		.ws()  <jc>// Use whitespace</jc>
		.sq()  <jc>// Use single quotes </jc>
		.build();  <jc>// Create a JsonSerializer</jc>
		</p>
		<p>
			Configurable settings can also be set declaratively.
			<br>The following produces the same serializer.
		</p>
		<p class='bcode'>
	WriterSerializer s = JsonSerializer
		.<jsm>create</jsm>()
		.set(<jsf>JSON_simpleMode</jsf>, <jk>true</jk>)
		.set(<jsf>SERIALIZER_useWhitespace</jsf>, <jk>true</jk>)
		.set(<jsf>SERIALIZER_quoteChar</jsf>, <js>"'"</js>)
		.build();
		</p>
		<p>
			However, each of the serializers and parsers already contain reusable instances with common configurations.
			<br>For example, JSON has the following predefined reusable serializers and parsers:
		</p>
		<ul class='doctree'>
			<li class='jc'>
				{@link org.apache.juneau.json.JsonSerializer}
				<ul>
					<li class='jf'>
						{@link org.apache.juneau.json.JsonSerializer#DEFAULT DEFAULT}
					<li class='jf'>
						{@link org.apache.juneau.json.JsonSerializer#DEFAULT_LAX DEFAULT_LAX}
					<li class='jf'>
						{@link org.apache.juneau.json.JsonSerializer#DEFAULT_READABLE DEFAULT_READABLE}
					<li class='jf'>
						{@link org.apache.juneau.json.JsonSerializer#DEFAULT_LAX_READABLE DEFAULT_LAX_READABLE}
					<li class='jf'>
						{@link org.apache.juneau.json.JsonSerializer#DEFAULT_LAX_READABLE_SAFE DEFAULT_LAX_READABLE_SAFE}
				</ul>
			</li>
			<li class='jc'>
				{@link org.apache.juneau.json.JsonParser} 
				<ul>
					<li class='jf'>
						{@link org.apache.juneau.json.JsonParser#DEFAULT DEFAULT}
					<li class='jf'>
						{@link org.apache.juneau.json.JsonParser#DEFAULT_STRICT DEFAULT_STRICT}
				</ul>
			</li>
		</ul>
		<p>
			These can be used directly, as follows:
		</p>
		<p class='bcode'>
	<jc>// Serialize a POJO to LAX JSON.</jc>
	String json = JsonSerializer.<jsf>DEFAULT_LAX</jsf>.serialize(myPojo);
		</p>
		<p>
			For performance reasons, serializers and parsers are immutable.
			However, they can be 'copied' and modified using the <code>builder()</code> method.
		</p>
		<p class='bcode'>
	<jc>// Clone and customize an existing serializer.</jc>
	WriterSerializer s = JsonSerializer.<jsf>DEFAULT_LAX</jsf>
		.builder()  <jc>// Create a new builder with copied settings.</jc>
		.quoteChar(<js>'"'</js>)  <jc>// Use a different quote character.</jc>
		.build();
		</p>
		
		<h5 class='topic'>Additional Information</h5>
		<p>
			The following is a list of all configurable properties across all serializers and parsers.
		</p>
		<ul class='doctree'>
			<li class='jc'>
				{@link org.apache.juneau.BeanContext}
				- Properties associated with handling beans on serializers and parsers.
				<ul>
					<li class='jc'>
						{@link org.apache.juneau.serializer.Serializer}
						- Configurable properties common to all serializers.
						<ul>
							<li class='jc'>
								{@link org.apache.juneau.html.HtmlSerializer}
								- Configurable properties on the HTML serializer.
								<ul>
									<li class='jc'>
										{@link org.apache.juneau.html.HtmlDocSerializer} 
										- Configurable properties on the HTML document serializer.
								</ul>
							</li>
							<li class='jic'>
								{@link org.apache.juneau.jena.RdfCommon} 
								- Configurable properties common to the RDF serializers and parsers.
								<ul>
									<li class='jc'>
										{@link org.apache.juneau.jena.RdfSerializer}
										- Configurable properties on the RDF serializers.
								</ul>
							</li>
							<li class='jc'>
								{@link org.apache.juneau.json.JsonSerializer} 
								- Configurable properties on the JSON serializer.
							<li class='jc'>
								{@link org.apache.juneau.msgpack.MsgPackSerializer} 
								- Configurable properties on the MessagePack serializer.
							<li class='jc'>
								{@link org.apache.juneau.soap.SoapXmlSerializer} 
								- Configurable properties on the SOAP/XML serializer.
							<li class='jc'>
								{@link org.apache.juneau.uon.UonSerializer} 
								- Configurable properties on the URL-Encoding and UON serializers.
							<li class='jc'>
								{@link org.apache.juneau.xml.XmlSerializer} 
								- Configurable properties on the XML serializer.
						</ul>
					</li>
					<li class='jc'>
						{@link org.apache.juneau.parser.Parser} 
						- Configurable properties common to all parsers.
						<ul>
							<li class='jc'>
								{@link org.apache.juneau.html.HtmlParser} 
								- Configurable properties on the HTML parser.
							<li class='jic'>
								{@link org.apache.juneau.jena.RdfCommon} 
								- Configurable properties common to the RDF serializers and parsers.
								<ul>
									<li class='jc'>
									{@link org.apache.juneau.jena.RdfParser} 
									- Configurable properties on the RDF parsers.
								</ul>
							</li>
							<li class='jc'>
								{@link org.apache.juneau.json.JsonParser} 
								- Configurable properties on the JSON parser.
							<li class='jc'>
								{@link org.apache.juneau.msgpack.MsgPackParser} 
								- Configurable properties on the MessagePack parser.
							<li class='jc'>
								{@link org.apache.juneau.uon.UonParser} 
								- Configurable properties on the URL-Encoding and UON parsers.
							<li class='jc'>
								{@link org.apache.juneau.xml.XmlParser} 
								- Configurable properties on the XML parser.
						</ul>
					</li>
					<li class='jc'>
						{@link org.apache.juneau.rest.RestContext} 
						- Configurable properties on the REST servlet.
					</li>
					<li class='jc'>
						{@link org.apache.juneau.rest.client.RestClient} 
						- Configurable properties on the REST client.
					</li>
				</ul>
			</li>
		</ul>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.ContextsBuildersSessionsPropertyStores"></a>
	<h3 class='topic' onclick='toggle(this)'>2.6 - Contexts, Builders, Sessions, and PropertyStores</h3>
	<div class='topic'>
		<p>
			All the serializers, parsers, and REST server/client classes use the following design pattern:
		</p>
		<ul class='spaced-list'>
			<li>
				<l>Context</l> - A thread-safe read-only object.
				<br>Examples:  <code>BeanContext</code>, <code>JsonSerializer</code>
			<li>
				<l>ContextBuilder</l> - A thread-safe builder for contexts.
				<br>Examples:  <code>BeanContextBuilder</code>, <code>JsonSerializerBuilder</code>
			<li>
				<l>Session</l> - A non-thread-safe single-use object with configuration combined from context and 
				runtime args such as locale/timezone and overridden properties.
				<br>These are created by <code>Context</code> objects.
				<br>Examples:  <code>BeanSession</code>, <code>JsonSerializerSession</code>
			<li>
				<l>PropertyStore</l> - A thread-safe read-only set of configuration properties.  
				<br>Each <code>Context</code> contains one <code>PropertyStore</code>.
			<li>
				<l>PropertyStoreBuilder</l> - A thread-safe builder for <code>PropertyStore</code> objects.  
				<br>Each <code>ContextBuilder</code> contains one <code>PropertyStoreBuilder</code>.		
		</ul>	
		<p>
			For example, the class hierarchy for <code>JsonSerializer</code> is:
		</p>
		<ul class='doctree'>
			<li class='jc'><code>Object</code>
			<ul>
				<li class='jac'>{@link org.apache.juneau.Context}
				<ul>
					<li class='jc'>{@link org.apache.juneau.BeanContext}
					<ul>
						<li class='jac'>{@link org.apache.juneau.serializer.Serializer}
						<ul>
							<li class='jac'>{@link org.apache.juneau.serializer.WriterSerializer}
							<ul>
								<li class='jc'>{@link org.apache.juneau.json.JsonSerializer}
							</ul>
						</ul>
					</ul>
				</ul>
			</ul>
		</ul>
		<p>
			Each context object in the hierarchy define properties that can be stored in a <code>PropertyStore</code>
			such as <jsf>SERIALIZER_useWhitespace</jsf> or <jsf>JSON_simpleMode</jsf>.
		</p>
		<p>
			The class hierarchy for <code>JsonSerializerBuilder</code> is:
		</p>
		<ul class='doctree'>
			<li class='jc'><code>Object</code>
			<ul>
				<li class='jac'>{@link org.apache.juneau.ContextBuilder}
				<ul>
					<li class='jc'>{@link org.apache.juneau.BeanContextBuilder}
					<ul>
						<li class='jac'>{@link org.apache.juneau.serializer.SerializerBuilder}
						<ul>
							<li class='jc'>{@link org.apache.juneau.json.JsonSerializerBuilder}
						</ul>
					</ul>
				</ul>
			</ul>
		</ul>
		<p>
			The class hierarchy for <code>JsonSerializerSession</code> is:
		</p>
		<ul class='doctree'>
			<li class='jc'><code>Object</code>
			<ul>
				<li class='jac'>{@link org.apache.juneau.Session}
				<ul>
					<li class='jc'>{@link org.apache.juneau.BeanSession}
					<ul>
						<li class='jac'>{@link org.apache.juneau.serializer.SerializerSession}
						<ul>
							<li class='jac'>{@link org.apache.juneau.serializer.WriterSerializerSession}
							<ul>
								<li class='jc'>{@link org.apache.juneau.json.JsonSerializerSession}
							</ul>
						</ul>
					</ul>
				</ul>
			</ul>
		</ul>
		<p>
			The general idea behind a {@link org.apache.juneau.PropertyStore} is to serve as a reusable configuration of an artifact 
			(such as a serializer) such that the artifact can be cached and reused if the property stores are 'equal'.
		</p>
		<p>
			For example, two serializers of the same type created with the same configuration will always end up being
			the same serializer: 
		</p>
		<p class='bcode'>
	<jc>// Two serializers created with identical configurations will always be the same copy.</jc> 
	WriterSerializer s1 = JsonSerializer.<jsm>create</jsm>().pojoSwaps(MySwap.<jk>class</jk>).simple().build();
	WriterSerializer s2 = JsonSerializer.<jsm>create</jsm>().set(<jsf>JSON_simpleMode</jsf>, <jk>true</jk>).pojoSwaps(MySwap.<jk>class</jk>).build();
	<jk>assert</jk>(s1 == s2);
		</p>
		<p>
			This has the effect of significantly improving performance, especially if you're creating many 
			serializers and parsers.
		</p>
		<p>
			The {@link org.apache.juneau.PropertyStoreBuilder} class is used to build up and instantiate immutable 
			<code>PropertyStore</code> objects.
		</p>
		<p>
			In the example above, the property store being built looks like the following:
		</p>
		<p class='bcode'>
	PropertyStore ps = PropertyStore
		.<jsm>create</jsm>()
		.set(<js>"BeanContext.pojoSwaps.lc"</js>, MySwap.<jk>class</jk>)
		.set(<js>"JsonSerializer.simpleMode.b"</js>, <jk>true</jk>)
		.build();
		</p>
		<p>
			Property stores are immutable, comparable, and their hashcodes are calculated exactly one time.
			That makes them particularly suited for use as hashmap keys, and thus for caching reusable serializers and parsers.
		</p>
		<p>
			Refer to the {@link org.apache.juneau.PropertyStore} javadoc for a detailed explaination on how
			property stores work.
		</p>
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.Transforms"></a>
	<h3 class='topic' onclick='toggle(this)'>2.7 - Transforms</h3>
	<div class='topic'>
		<p>
			By default, the Juneau framework can serialize and parse a wide variety of POJOs out-of-the-box.  
			<br>However, two special classes are provided tailor how certain Java objects are handled by the framework.
			<br>These classes are:
		</p>
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.transform.BeanFilter} - Transforms that alter the way beans are handled.
			<li class='jac'>{@link org.apache.juneau.transform.PojoSwap} - Transforms that swap non-serializable POJOs with 
				serializable POJOs during serialization (and optionally vis-versa during parsing).
				<ul>
					<li class='jc'>{@link org.apache.juneau.transform.StringSwap} - Convenience subclass for swaps that convert 
						objects to strings.
					<li class='jc'>{@link org.apache.juneau.transform.MapSwap} - Convenience subclass for swaps that convert 
						objects to maps.
				</ul>
			</li>
		</ul>
		<p>
			Transforms are added to serializers and parsers (and REST clients) using the following configuration properties:
		</p> 
		<ul>
			<li class='jm'>{@link org.apache.juneau.BeanContext#BEAN_beanFilters}
			<li class='jm'>{@link org.apache.juneau.BeanContext#BEAN_pojoSwaps}
		</ul>
		<p>
			Annotations are also provided for specifying transforms directly on classes and methods (all described in later sections):
		</p>
		<ul class='doctree'>
			<li class='ja'>
				{@link org.apache.juneau.annotation.Swap @Swap} 
				- Used to tailor how non-bean POJOs get interpreted by the framework.
			<li class='ja'>
				{@link org.apache.juneau.annotation.Bean @Bean} 
				- Used to tailor how beans get interpreted by the framework.
			<li class='ja'>
				{@link org.apache.juneau.annotation.BeanConstructor @BeanConstructor} 
				- Maps constructor arguments to property names on beans with read-only properties.
			<li class='ja'>
				{@link org.apache.juneau.annotation.BeanIgnore @BeanIgnore} 
				- Ignore classes, fields, and methods from being interpreted as bean or bean components.
			<li class='ja'>
				{@link org.apache.juneau.annotation.BeanProperty @BeanProperty} 
				- Used to tailor how bean properties get interpreted by the framework.
			<li class='ja'>
				{@link org.apache.juneau.annotation.NameProperty @NameProperty} 
				- Identifies a setter as a method for setting the name of a POJO as it's known by its parent object.
			<li class='ja'>
				{@link org.apache.juneau.annotation.ParentProperty @ParentProperty} 
				- Identifies a setter as a method for adding a parent reference to a child object.
			<li class='ja'>
				{@link org.apache.juneau.annotation.URI @URI} 
				- Used to identify a class or bean property as a URI.
		</ul>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.PojoSwaps"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.1 - PojoSwaps</h4>
		<div class='topic'>
			<p>
				{@link org.apache.juneau.transform.PojoSwap PojoSwaps} are a critical component of Juneau.
				They allow the serializers and parsers to handle Java objects that wouldn't normally be serializable.
			</p>
			<p>
				Swaps are, simply put, 'object swappers' that swap in serializable objects for 
				non-serializable ones during serialization, and vis-versa during parsing.
			</p>
			<p>
				Some examples of non-serializable POJOs are <code>File</code>, <code>Reader</code>, 
				<code>Iterable</code>, etc...
				These are classes that aren't beans and cannot be represented as simple maps, collections, or primitives.
			</p>
			<p>
				In the following example, we introduce a <code>PojoSwap</code> that will swap in ISO8601 strings for 
				<code>Date</code> objects:
			</p>
			<p class='bcode'>
	<jc>// Sample swap for converting Dates to ISO8601 strings.</jc>
	<jk>public class</jk> MyDateSwap <jk>extends</jk> PojoSwap&lt;Date,String&gt; {
		
		<jc>// ISO8601 formatter.</jc>
		<jk>private</jk> DateFormat <jf>format</jf> = <jk>new</jk> SimpleDateFormat(<js>"yyyy-MM-dd'T'HH:mm:ssZ"</js>);
		
		<jc>// Converts a Date object to an ISO8601 string.</jc>
		<ja>@Override</ja> <jc>/* PojoSwap */</jc>
		<jk>public</jk> String swap(BeanSession session, Date o) {
			<jk>return</jk> <jf>format</jf>.format(o);
		}
		
		<jc>// Converts an ISO8601 string to a Date object.</jc>
		<ja>@Override</ja> <jc>/* PojoSwap */</jc>
		<jk>public</jk> Date unswap(BeanSession session, String o, ClassMeta hint) <jk>throws</jk> Exception {
			<jk>return</jk> <jf>format</jf>.parse(o);
		}
	}
			</p>
			<p>
				The swap can then be associated with serializers and parsers like so:
			</p>
			<p class='bcode'>
	<jc>// Sample bean with a Date field.</jc>
	<jk>public class</jk> MyBean {
		<jk>public</jk> Date <jf>date</jf> = <jk>new</jk> Date(112, 2, 3, 4, 5, 6);
	}

	<jc>// Create a new JSON serializer, associate our date swap with it, and serialize a sample bean.</jc>
	WriterSerializer s = JsonSerializer.<jsm>create</jsm>().simple().pojoSwaps(MyDateSwap.<jk>class</jk>).build();
	String json = s.serialize(<jk>new</jk> MyBean());	<jc>// == "{date:'2012-03-03T04:05:06-0500'}"</jc>
	
	<jc>// Create a JSON parser, associate our date swap with it, and reconstruct our bean (including the date).</jc>
	ReaderParser p = JsonParser.<jsm>create</jsm>().pojoSwaps(MyDateSwap.<jk>class</jk>).build();
	MyBean bean = p.parse(json, MyBean.<jk>class</jk>);
	<jk>int</jk> day = bean.<jf>date</jf>.getDay(); 						<jc>// == 3</jc>
			</p>
			<p>
				The {@link org.apache.juneau.BeanMap#get(Object)} and {@link org.apache.juneau.BeanMap#put(String,Object)} 
				methods will automatically convert to swapped values as the following example shows:
			</p>
			<p class='bcode'>
	<jc>// Create a new bean context and add our swap.</jc>
	BeanContext bc = BeanContext.<jsm>create</jsm>().pojoSwaps(MyDateSwap.<jk>class</jk>).build();

	<jc>// Create a new bean.</jc>
	MyBean myBean = <jk>new</jk> MyBean();

	<jc>// Wrap it in a bean map.</jc>
	BeanMap&lt;Bean&gt; beanMap = bc.forBean(myBean);

	<jc>// Use the get() method to get the date field as an ISO8601 string.</jc>
	String date = (String)beanMap.get(<js>"date"</js>);				<jc>// == "2012-03-03T04:05:06-0500"</jc> 
	
	<jc>// Use the put() method to set the date field to an ISO8601 string.</jc>
	beanMap.put(<js>"date"</js>, <js>"2013-01-01T12:30:00-0500"</js>);	<jc>// Set it to a new value.</jc> 
	
	<jc>// Verify that the date changed on the original bean.</jc>
	<jk>int</jk> year = myBean.<jf>date</jf>.getYear(); 								<jc>// == 113</jc>
			</p>
			<p>
				Another example of a <code>PojoSwap</code> is one that converts <code><jk>byte</jk>[]</code> arrays to
				BASE64-encoded strings:
			</p>
			<p class='bcode'>
	<jk>public class</jk> ByteArrayBase64Swap <jk>extends</jk> StringSwap&lt;<jk>byte</jk>[]&gt; {
	
		<ja>@Override</ja> <jc>/* StringSwap */</jc>
		<jk>public</jk> String swap(<jk>byte</jk>[] b) <jk>throws</jk> Exception {
			ByteArrayOutputStream baos = <jk>new</jk> ByteArrayOutputStream();
			OutputStream b64os = MimeUtility.encode(baos, <js>"base64"</js>);
			b64os.write(b);
			b64os.close();
			<jk>return new</jk> String(baos.toByteArray());
		}
		
		<ja>@Override</ja> <jc>/* StringSwap */</jc>
		<jk>public byte</jk>[] unswap(String s, ClassMeta&lt;?&gt; hint) <jk>throws</jk> Exception {
			<jk>byte</jk>[] b = s.getBytes();
			ByteArrayInputStream bais = <jk>new</jk> ByteArrayInputStream(b);
			InputStream b64is = MimeUtility.decode(bais, <js>"base64"</js>);
			<jk>byte</jk>[] tmp = <jk>new byte</jk>[b.length];
			<jk>int</jk> n = b64is.read(tmp);
			<jk>byte</jk>[] res = <jk>new byte</jk>[n];
			System.<jsm>arraycopy</jsm>(tmp, 0, res, 0, n);
			<jk>return</jk> res;
		}
	}
			</p>
			<p>
				The following example shows the BASE64 swap in use:
			</p>
			<p class='bcode'>
	<jc>// Create a JSON serializer and register the BASE64 encoding swap with it.</jc>
	WriterSerializer s = JsonSerializer.<jsm>create</jsm>().simple().pojoSwaps(ByteArrayBase64Swap.<jk>class</jk>).build();
	ReaderParser p = JsonParser.<jsm>create</jsm>().pojoSwaps(ByteArrayBase64Swap.<jk>class</jk>).build();
	
	<jk>byte</jk>[] bytes = {1,2,3};
	String json = s.serialize(bytes);		<jc>// Produces "'AQID'"</jc>
	bytes = p.parse(json, <jk>byte</jk>[].<jk>class</jk>);		<jc>// Reproduces {1,2,3}</jc>
	
	<jk>byte</jk>[][] bytes2d = {{1,2,3},{4,5,6},<jk>null</jk>};
	json = s.serialize(bytes2d);		<jc>// Produces "['AQID','BAUG',null]"</jc>
	bytes2d = p.parse(json, <jk>byte</jk>[][].<jk>class</jk>);		<jc>// Reproduces {{1,2,3},{4,5,6},null}</jc>
			</p>
			<p>
				Several <code>PojoSwaps</code> are already provided for common Java objects:
			</p>
			<ul class='doctree'>
				<li class='jp'><jk>org.apache.juneau.transforms</jk>
					<ul>
						<li class='jc'>
							{@link org.apache.juneau.transforms.ByteArrayBase64Swap}
						<li class='jac'>
							{@link org.apache.juneau.transforms.CalendarSwap}
						<li class='jac'>
							{@link org.apache.juneau.transforms.DateSwap}
						<li class='jc'>
							{@link org.apache.juneau.transforms.EnumerationSwap}
						<li class='jc'>
							{@link org.apache.juneau.transforms.IteratorSwap}
						<li class='jc'>
							{@link org.apache.juneau.transforms.ReaderSwap}
						<li class='jc'>
							{@link org.apache.juneau.transforms.XMLGregorianCalendarSwap}
					</ul>
				</li>
			</ul>
			<p>
				In particular, the {@link org.apache.juneau.transforms.CalendarSwap} and 
				{@link org.apache.juneau.transforms.DateSwap} transforms provide a large number of customized swaps to 
				ISO, RFC, or localized strings.
			</p>
			<p>
				Swaps have access to the session locale and timezone through the {@link org.apache.juneau.BeanSession#getLocale()} and
				{@link org.apache.juneau.BeanSession#getTimeZone()} methods.
				<br>This allows you to specify localized swap values when needed.
			</p>
			<p>
				If using the REST server API, the locale and timezone are set based on the <code>Accept-Language</code> and
				<code>Time-Zone</code> headers on the request.
			</p>
			
			<ul class='doctree'>
				<li class='info'>
					The 'swapped' class type must be a serializable type.
					<br>See the definition for Category 4 objects in <a class='doclink' href='#juneau-marshall.PojoCategories'>POJO Categories</a>.  
			</ul>
		</div>
		
		<!-- =================================================================================================== -->
		<a id="juneau-marshall.PerMediaTypePojoSwaps"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.2 - Per-media-type PojoSwaps</h4>
		<div class='topic'>
			<p>
				Swaps can also be defined per-media-type.		
			</p>
			<p>	
				The {@link org.apache.juneau.transform.PojoSwap#forMediaTypes()} method can be overridden to 
				provide a set of media types that the swap is invoked on.
				<br>It's also possible to define multiple swaps against the same POJO as long as they're differentiated 
				by media type.
				<br>When multiple swaps are defined, the best-match media type is used.
			</p>
			<p>
				In the following example, we define 3 swaps against the same POJO.  
				One for JSON, one for XML, and one for all other types.
			</p>
			<p class='bcode'>
	<jk>public class</jk> PojoSwapTest {

		<jk>public static class</jk> MyPojo {}

		<jk>public static class</jk> MyJsonSwap <jk>extends</jk> PojoSwap&lt;MyPojo,String&gt; {
			<ja>@Override</ja> <jc>/* PojoSwap */</jc>
			<jk>public</jk> MediaType[] forMediaTypes() {
				<jk>return</jk> MediaType.<jsm>forStrings</jsm>(<js>"&#42;/json"</js>);
			}
			<ja>@Override</ja> <jc>/* PojoSwap */</jc>
			<jk>public</jk> String swap(BeanSession session, MyPojo o) <jk>throws</jk> Exception {
				<jk>return</jk> <js>"It's JSON!"</js>;
			}
		}

		<jk>public static class</jk> MyXmlSwap <jk>extends</jk> PojoSwap&lt;MyPojo,String&gt; {
			<ja>@Override</ja> <jc>/* PojoSwap */</jc>
			<jk>public</jk> MediaType[] forMediaTypes() {
				<jk>return</jk> MediaType.<jsm>forStrings</jsm>(<js>"&#42;/xml"</js>);
			}
			<ja>@Override</ja> <jc>/* PojoSwap */</jc>
			<jk>public</jk> String swap(BeanSession session, MyPojo o) <jk>throws</jk> Exception {
				<jk>return</jk> <js>"It's XML!"</js>;
			}
		}

		<jk>public static class</jk> MyOtherSwap <jk>extends</jk> PojoSwap&lt;MyPojo,String&gt; {
			<ja>@Override</ja> <jc>/* PojoSwap */</jc>
			<jk>public</jk> MediaType[] forMediaTypes() {
				<jk>return</jk> MediaType.<jsm>forStrings</jsm>(<js>"&#42;/*"</js>);
			}
			<ja>@Override</ja> <jc>/* PojoSwap */</jc>
			<jk>public</jk> String swap(BeanSession session, MyPojo o) <jk>throws</jk> Exception {
				<jk>return</jk> <js>"It's something else!"</js>;
			}
		}

		<ja>@Test</ja>
		<jk>public void</jk> doTest() <jk>throws</jk> Exception {

			SerializerGroup g = SerializerGroup.<jsm>create</jsm>()
				.append(JsonSerializer.<jk>class</jk>, XmlSerializer.<jk>class</jk>, HtmlSerializer.<jk>class</jk>)
				.sq()
				.pojoSwaps(MyJsonSwap.<jk>class</jk>, MyXmlSwap.<jk>class</jk>, MyOtherSwap.<jk>class</jk>)
				.build();

			MyPojo myPojo = <jk>new</jk> MyPojo();

			String json = g.getWriterSerializer(<js>"text/json"</js>).serialize(myPojo);
			<jsm>assertEquals</jsm>(<js>"'It\\'s JSON!'"</js>, json);

			String xml = g.getWriterSerializer(<js>"text/xml"</js>).serialize(myPojo);
			<jsm>assertEquals</jsm>(<js>"&lt;string&gt;It's XML!&lt;/string&gt;"</js>, xml);

			String html = g.getWriterSerializer(<js>"text/html"</js>).serialize(myPojo);
			<jsm>assertEquals</jsm>(<js>"&lt;string&gt;It's something else!&lt;/string&gt;"</js>, html);
		}
	}
			</p>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.OneWayPojoSwaps"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.3 - One-way PojoSwaps</h4>
		<div class='topic'>
			<p>
				In the previous sections, we defined two-way swaps, meaning swaps where the original objects could be 
				reconstructing during parsing. 
				<br>However, there are certain kinds of POJOs that we may want to support for serializing, but that are not 
				possible to reconstruct during parsing.  
				<br>For these, we can use one-way object swaps.
			</p>
			<p>
				A one-way POJO swap is simply an object transform that only implements the {@code swap()} method.  
				<br>The {@code unswap()} method is simply left unimplemented.
			</p>
			<p>
				An example of a one-way swaps would be one that allows {@code Iterators} to be serialized as JSON arrays.  
				<br>It can make sense to be able to render {@code Iterators} as arrays, but in general it's not possible to 
				reconstruct an {@code Iterator} during parsing. 
			</p>
			<p class='bcode'>
	<jk>public class</jk> IteratorSwap <jk>extends</jk> PojoSwap&lt;Iterator,List&gt; {
		<ja>@Override</ja> <jc>/* PojoSwap */</jc>
		<jk>public</jk> List swap(Iterator o) {
			List l = <jk>new</jk> LinkedList();
			<jk>while</jk> (o.hasNext())
				l.add(o.next());
			<jk>return</jk> l;
		}
	}
			</p>
			<p>
				Here is an example of our one-way swap being used.  
				<br>Note that trying to parse the original object will cause a {@link org.apache.juneau.parser.ParseException} 
				to be thrown.
			</p>
			<p class='bcode'>
	<jc>// Create a JSON serializer that can serialize Iterators.</jc>
	WriterSerializer s = JsonSerializer.<jsm>create</jsm>().simple().pojoSwaps(IteratorSwap.<jk>class</jk>).build();
	
	<jc>// Construct an iterator we want to serialize.</jc>
	Iterator i = <jk>new</jk> ObjectList(1,2,3).iterator();
	
	<jc>// Serialize our Iterator</jc>
	String json = s.serialize(i);		<jc>// Produces "[1,2,3]"</jc>
	
	<jc>// Try to parse it.</jc>
	ReaderParser p = JsonParser.<jsm>create</jsm>().pojoSwaps(IteratorSwap.<jk>class</jk>).build();
	i = p.parse(s, Iterator.<jk>class</jk>);		<jc>// Throws ParseException!!!</jc>
			</p>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.SwapAnnotation"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.4 - @Swap Annotation</h4>
		<div class='topic'>
			<p>
				{@link org.apache.juneau.annotation.Swap @Swap} can be used to associate a swap class using an 
				annotation.
				<br>This is often cleaner than using the builder <code>pojoSwaps()</code> method since you can keep
				your swap class near your POJO class. 
			</p>
			<p class='bcode'>
	<ja>@Swap</ja>(MyPojoSwap.<jk>class</jk>)
	<jk>public class</jk> MyPojo {
		...
	}
	
	<jc>// Sample swap for converting MyPojo classes to a simple string.</jc>
	<jk>public class</jk> MyPojoSwap <jk>extends</jk> PojoSwap&lt;MyPojo,String&gt; {
		
		<ja>@Override</ja> <jc>/* PojoSwap */</jc>
		<jk>public</jk> String swap(BeanSession session, MyPojo o) {
			<jk>return</jk> o.toSomeSerializableForm();
		}
	}
			</p>
			<p>
				Multiple swaps can be associated with a POJO by using the {@link org.apache.juneau.annotation.Swaps @Swaps} annotation:
			</p>
			<p class='bcode'>
	<ja>@Swaps</ja>(
		{
			<ja>@Swap</ja>(MyJsonSwap.<jk>class</jk>),
			<ja>@Swap</ja>(MyXmlSwap.<jk>class</jk>),
			<ja>@Swap</ja>(MyOtherSwap.<jk>class</jk>)
		}
	)
	<jk>public class</jk> MyPojo {}
			</p>
			<p>
				<code>Readers</code> get serialized directly to the output of a serializer.
				Therefore it's possible to implement a swap that provides fully-customized output.
			</p>
			<p class='bcode'>
	<jk>public class</jk> MyJsonSwap <jk>extends</jk> PojoSwap&lt;MyPojo,Reader&gt; {

		<jk>public</jk> MediaType[] forMediaTypes() {
			<jk>return</jk> MediaType.<jsm>forStrings</jsm>(<js>"&#42;/json"</js>);
		}

		<jk>public</jk> Reader swap(BeanSession session, MyPojo o) <jk>throws</jk> Exception {
			<jk>return new</jk> StringReader(<js>"{message:'Custom JSON!'}"</js>);
		}
	}
			</p>
			<p>
				The <ja>@Swap</ja> annotation can also be used on getters and setters as well to apply a swap
				to individual property values
			</p>
			<p class='bcode'>
	<ja>@BeanProperty</ja>(swap=MyPojoSwap.<jk>class</jk>)
	<jk>public</jk> MyPojo getMyPojo();
			</p>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.TemplatedSwaps"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.5 - Templated Swaps</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.annotation.Swap#template() @Swap.template()} annotation allows you to associate
				arbitrary contextual strings with swaps.
				<br>The primary purpose is for providing template names, such as for Apache FreeMarker, therefore
				the name 'template'.
				<br>However, the usage of the string is open-ended.
			</p>
			<p>
				For example, you could pair a template string like so:
			</p>
			<p class='bcode'>
	<ja>@Swap</ja>(impl=FreeMarkerSwap.<jk>class</jk>, template=<js>"MyPojo.div.ftl"</js>)
	<jk>public class</jk> MyPojo {}
			</p>
			<p>
				The implementation of the FreeMarker swap would look something like this:
			</p>
			<p class='bcode'>
	<jc>// Our templated swap class.</jc>
	<jk>public class</jk> FreeMarkerSwap <jk>extends</jk> PojoSwap&lt;Object,Reader&gt; {

		<jk>public</jk> MediaType[] forMediaTypes() {
			<jc>// Make sure this only applies to the HTML serializer.</jc>
			<jk>return</jk> MediaType.<jsm>forStrings</jsm>(<js>"&#42;/html"</js>);
		}

		<jk>public</jk> Reader swap(BeanSession session, Object o, String template) <jk>throws</jk> Exception {
			<jc>// Call some method that uses FreeMarker to convert 'o' to raw HTML using </jc>
			<jc>// the 'MyPojo.div.ftl' template.</jc>
			<jk>return</jk> getFreeMarkerReader(template, o);  
		}
	}
			</p>
		</div>

		<!-- ======================================================================================================= -->
		<a id="juneau-marshall.SwapMethods"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.6 - Swap Methods</h4>
		<div class='topic'>
			<p>
				Various methods can be defined on a class directly to affect how it gets serialized.
				<br>This can often be simpler than using <code>PojoSwaps</code>.
			</p>
			<p>
				Objects serialized as <code>Strings</code> can be parsed back into their original objects by 
				implementing one of the following methods on the class:
			</p>		
			<ul class='spaced-list'>
				<li>
					<code><jk>public static</jk> T fromString(String)</code> method.
					<br>Any of the following method names also work: 
					<ul>
						<li><code>valueOf(String)</code>
						<li><code>parse(String)</code>
						<li><code>parseString(String)</code>
						<li><code>forName(String)</code>
						<li><code>forString(String)</code>
					</ul>
				<li>
					<code><jk>public</jk> T(String)</code> constructor.
			</ul>
			<p>
				Note that these methods cover conversion from several built-in Java types, meaning the parsers can 
				automatically construct these objects from strings:
			</p>
			<ul>
				<li><code>fromString(String)</code> - {@link java.util.UUID}
				<li><code>valueOf(String)</code> - {@link java.lang.Boolean}, {@link java.lang.Byte}, 
					{@link java.lang.Double}, {@link java.lang.Float}, 
					{@link java.lang.Integer}, {@link java.lang.Long}, {@link java.lang.Short}, {@link java.sql.Date}, 
					{@link java.sql.Time}, {@link java.sql.Timestamp}
				<li><code>parse(String)</code> - {@link java.text.DateFormat}, {@link java.text.MessageFormat}, 
					{@link java.text.NumberFormat}, {@link java.util.Date}, {@link java.util.logging.Level}
				<li><code>parseString(String)</code> - {@link javax.xml.bind.DatatypeConverter}
				<li><code>forName(String)</code> - {@link java.lang.Class}
			</ul>
			<p>
				If you want to force a bean-like class to be serialized as a string, you can use the 
				{@link org.apache.juneau.annotation.BeanIgnore @BeanIgnore} annotation on the class to force it to be 
				serialized to a string using the <code>toString()</code> method.
			</p>
			<p>
				Serializing to other intermediate objects can be accomplished by defining a swap method directly on the 
				class:
			</p>			
			<ul>
				<li><code><jk>public</jk> X swap(BeanSession)</code> method, where <code>X</code> is any serializable 
				object.
			</ul>
			<p>
				The <code>BeanSession</code> parameter allows you access to various information about the current 
				serialization session.
				<br>For example, you could provide customized results based on the media type being produced 
				({@link org.apache.juneau.BeanSession#getMediaType()}).
			</p>
			<p>
				The following example shows how an HTML5 form template object can be created that gets serialized as a 
				populated HTML5 {@link org.apache.juneau.dto.html5.Form} bean.
			</p>
			<p class='bcode'>
	<jk>import static</jk> org.apache.juneau.dto.html5.HtmlBuilder.*;
	
	<jd>/**
	 * A simple HTML form template whose serialized form is an HTML5 Form object.
	 */</jd>
	<jk>public class</jk> FormTemplate {
		
		<jk>private</jk> String <jf>action</jf>;
		<jk>private int</jk> <jf>value1</jf>;
		<jk>private boolean</jk> <jf>value2</jf>;
		
		<jc>// Some constructor that initializes our fields. </jc>
		<jk>public</jk> FormTemplate(String action, <jk>int</jk> value1, <jk>boolean</jk> value2) {
			<jk>this</jk>.<jf>action</jf> = action;
			<jk>this</jk>.<jf>value1</jf> = value1;
			<jk>this</jk>.<jf>value2</jf> = value2;
		}
		
		<jc>// Special swap method that converts this template to a serializable bean</jc>
		<jk>public</jk> Form swap(BeanSession session) {
			<jk>return</jk> <jsm>form</jsm>(<jf>action</jf>,
				<jsm>input</jsm>(<js>"text"</js>).name(<js>"v1"</js>).value(<jf>value1</jf>),
				<jsm>input</jsm>(<js>"text"</js>).name(<js>"v2"</js>).value(<jf>value2</jf>)
			);
		}
	}
			</p>
			<p>
				Swapped objects can be converted back into their original form by the parsers by specifying one of the 
				following methods:
			</p>
			<ul>
				<li><code><jk>public static</jk> T unswap(BeanSession, X)</code> method where <code>X</code> is the 
					swap class type.
				<li><code><jk>public</jk> T(X)</code> constructor where <code>X</code> is the swap class type.
			</ul>
			<p>
				The following shows how our form template class can be modified to allow the parsers to reconstruct our 
				original object:
			</p>
			<p class='bcode'>
	<jk>import static</jk> org.apache.juneau.dto.html5.HtmlBuilder.*;
	
	<jd>/**
	 * A simple HTML form template whose serialized form is an HTML5 Form object.
	 * This time with parsing support.
	 */</jd>
	<ja>@Bean</ja>(beanDictionary=HtmlBeanDictionary.<jk>class</jk>)
	<jk>public class</jk> FormTemplate {
		
		<jk>private</jk> String <jf>action</jf>;
		<jk>private int</jk> <jf>value1</jf>;
		<jk>private boolean</jk> <jf>value2</jf>;
		
		<jc>// Our 'unswap' constructor</jc>
		<jk>public</jk> FormTemplate(Form f) {
			<jk>this</jk>.<jf>action</jf> = f.getAttr(<js>"action"</js>);
			<jk>this</jk>.<jf>value1</jf> = f.getChild(Input.<jk>class</jk>, 0)
				.getAttr(<jk>int</jk>.<jk>class</jk>, <js>"value"</js>);
			<jk>this</jk>.<jf>value2</jf> = f.getChild(Input.<jk>class</jk>, 1)
				.getAttr(<jk>boolean</jk>.<jk>class</jk>, <js>"value"</js>);
		}
		
		<jk>public</jk> FormTemplate(String action, <jk>int</jk> value1, <jk>boolean</jk> value2) {
			<jk>this</jk>.<jf>action</jf> = action;
			<jk>this</jk>.<jf>value1</jf> = value1;
			<jk>this</jk>.<jf>value2</jf> = value2;
		}
		
		<jk>public</jk> Form swap(BeanSession session) {
			<jk>return</jk> <jsm>form</jsm>(<jf>action</jf>,
				<jsm>input</jsm>(<js>"text"</js>).name(<js>"v1"</js>).value(<jf>value1</jf>),
				<jsm>input</jsm>(<js>"text"</js>).name(<js>"v2"</js>).value(<jf>value2</jf>)
			);
		}
	}
			</p>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.SurrogateClasses"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.7 - Surrogate Classes</h4>
		<div class='topic'>
			<p>
			<p>
				Surrogate classes are very similar in concept to <code>PojoSwaps</code> except they're simpler to define.
			</p>
			<p>
				For example, let's say we want to be able to serialize the following class, but it's not serializable for 
				some reason (for example, there are no properties exposed):  
			<p class='bcode'>
	<jc>// Not serializable because it's not a bean because it has no public properties.</jc>
	<jk>public class</jk> MyNonSerializableClass {
		<jk>protected</jk> String <jf>foo</jf>;
	}
			</p>
			<p>
				This could be solved with the following <code>PojoSwap</code>.
			</p>
			<p class='bcode'>
	<jc>// A serializable bean with 1 property.</jc>
	<jk>public class</jk> MySerializableSurrogate {
		<jk>public</jk> String <jf>foo</jf>;
	}
		
	<jc>// A PojoSwap that swaps out our non-serializable object with our serializable object.</jc>
	<jk>public class</jk> MySwap <jk>extends</jk> PojoSwap&lt;MyNonSerializableClass,MySerializableSurrogate&gt; {
		<ja>@Override</ja> <jc>/* PojoSwap */</jc>
		<jk>public</jk> MySerializableSurrogate swap(MyNonSerializableClass o) {
			
			<jc>// Create some serializable class and manually copy the data into it.</jc>
			MySerializableSurrogate s = <jk>new</jk> MySerializableSurrogate();
			s.<jf>foo</jf> = o.<jf>foo</jf>;
			<jk>return</jk> s;
		}
	}
			</p>
			<p>
				However, the same can be accomplished by using a surrogate class that simply contains a constructor with 
				the non-serializable class as an argument:
			</p>
			<p class='bcode'>
	<jk>public class</jk> MySerializableSurrogate {
		<jk>public</jk> String <jf>foo</jf>;
		
		<jc>// Constructor takes in our non-serializable object!</jc>
		<jk>public</jk> MySerializableSurrogate(MyNonSerializableClass c) {
			<jk>this</jk>.<jf>foo</jf> = c.<jf>foo</jf>;
		}
	}
			</p>
			<p>
				The surrogate class is registered in the same way as a <code>PojoSwap</code>:
			</p>
			<p class='bcode'>
	<jc>// Create a JSON serializer that can serialize Iterators.</jc>
	WriterSerializer s = JsonSerializer.<jsm>create</jsm>().pojoSwaps(MySerializableSurrogate.<jk>class</jk>).build();
			</p>
			<p>
				When the serializer encounters the non-serializable class, it will serialize an instance of the surrogate 
				instead.
			</p>
			
			<h5 class='section'>See Also:</h5>
			<ul>
				<li class='jic'>{@link org.apache.juneau.transform.Surrogate}
			</ul>
		</div>

		<!-- ======================================================================================================= -->
		<a id="juneau-marshall.BeanAnnotation"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.8 - @Bean Annotation</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.annotation.Bean @Bean} annotation is used to tailor how beans are 
				interpreted by the framework.
			</p>
			<p> 
				Bean property inclusion and ordering on a bean class can be done using the 
				{@link org.apache.juneau.annotation.Bean#properties() @Bean.properties()} annotation.
			</p>
			<p class='bcode'>
	<jc>// Address class with only street/city/state properties (in that order).</jc>
	<jc>// All other properties are ignored.</jc>
	<ja>@Bean</ja>(properties=<js>"street,city,state"</js>)
	<jk>public class</jk> Address { ... }
			</p>
			<p> 
				Bean properties can be excluded using the {@link org.apache.juneau.annotation.Bean#excludeProperties() @Bean.excludeProperties()}
				annotation.
			</p>
			<p class='bcode'>
	<jc>// Address class with only street/city/state properties (in that order).</jc>
	<jc>// All other properties are ignored.</jc>
	<ja>@Bean</ja>(excludeProperties=<js>"city,state"</js>})
	<jk>public class</jk> Address { ... }
			</p>
			<p>
				Bean properties can be sorted alphabetically using {@link org.apache.juneau.annotation.Bean#sort() @Bean.sort()}
			</p>
			<p class='bcode'>
	<jc>// Address class with only street/city/state properties (in that order).</jc>
	<jc>// All other properties are ignored.</jc>
	<ja>@Bean</ja>(sort=<jk>true</jk>)
	<jk>public class</jk> MyBean { ... }
			</p>
			<p>
				The {@link org.apache.juneau.annotation.Bean#propertyNamer() @Bean.propertyNamer()} annotation
				is used to provide customized naming of properties.
			</p>
			<p>
				Property namers are used to transform bean property names from standard form to some other form.
				<br>For example, the {@link org.apache.juneau.PropertyNamerDLC} will convert property names to 
				dashed-lowercase, and these will be used as attribute names in JSON and element names in XML.
			</p>
			<p>
			<p class='bcode'>
	<jc>// Define a class with dashed-lowercase property names.</jc>
	<ja>@Bean</ja>(propertyNamer=PropertyNamerDashedLC.<jk>class</jk>)
	<jk>public class</jk> MyBean { ... }
			</p>
			<p>
				The {@link org.apache.juneau.annotation.Bean#interfaceClass @Bean.interfaceClass()} annotation is used
				to limit properties on beans to specific interface classes.
				<br>When specified, only the list of properties defined on the interface class will be used during 
				serialization.
				<br>Additional properties on subclasses will be ignored.
			</p>
			<p class='bcode'>
	<jc>// Parent class</jc>
	<ja>@Bean</ja>(interfaceClass=A.<jk>class</jk>)
	<jk>public abstract class</jk> A {
		<jk>public</jk> String <jf>f0</jf> = <js>"f0"</js>;
	}
	
	<jc>// Child class</jc>
	<jk>public class</jk> A1 <jk>extends</jk> A {
		<jk>public</jk> String <jf>f1</jf> = <js>"f1"</js>;
	}

	JsonSerializer s = JsonSerializer.<jsf>DEFAULT_LAX</jsf>;
	A1 a1 = <jk>new</jk> A1();
	String r = s.serialize(a1);
	<jsm>assertEquals</jsm>(<js>"{f0:'f0'}"</js>, r);  <jc>// Note f1 is not serialized.</jc>
			</p>
			<p>
				Note that this annotation can be used on the parent class so that it filters to all child classes.
				<br>Or can be set individually on the child classes.
			</p>
			<p>
				The {@link org.apache.juneau.annotation.Bean#stopClass @Bean.stopClass()} annotation is another
				way to limit which properties are serialized (except from the opposite direction).
				<br>It's identical in purpose to the stop class specified by {@link java.beans.Introspector#getBeanInfo(Class, Class)}.
				<br>Any properties in the stop class or in its base classes will be ignored during analysis.
			</p>
			<p>
				For example, in the following class hierarchy, instances of <code>C3</code> will include property 
				<code>p3</code>, but not <code>p1</code> or <code>p2</code>.
			</p>
			<p class='bcode'>
	<jk>public class</jk> C1 {
		<jk>public int</jk> getP1();
	}

	<jk>public class</jk> C2 <jk>extends</jk> C1 {
		<jk>public int</jk> getP2();
	}

	<ja>@Bean</ja>(stopClass=C2.<jk>class</jk>)
	<jk>public class</jk> C3 <jk>extends</jk> C2 {
		<jk>public int</jk> getP3();
	}
			</p>
			<p>
				The {@link org.apache.juneau.annotation.Bean#propertyFilter() @Bean.propertyFilter()} annotation
				and {@link org.apache.juneau.transform.PropertyFilter} class can be used to perform interception
				and inline handling of bean getter and setter calls.
			</p>
			<p class='bcode'>
	<jc>// Register filter on bean class.</jc>
	<ja>@Bean</ja>(propertyFilter=AddressPropertyFilter.<jk>class</jk>)
	<jk>public class</jk> Address {
		<jk>public</jk> String getTaxInfo() {...}
		<jk>public void</jk> setTaxInfo(String s) {...}
	}
				
	<jc>// Property filter that strips out sensitive information in our bean.</jc>
	<jk>public class</jk> AddressPropertyFilter <jk>extends</jk> PropertyFilter {
		
		<ja>@Override</ja> <jc>/* PropertyFilter */</jc>
		<jk>public</jk> Object readProperty(Object bean, String name, Object value) {
			<jk>if</jk> (<js>"taxInfo"</js>.equals(name))
				<jk>return</jk> <js>"redacted"</js>;
			<jk>return</jk> value;
		}

		<ja>@Override</ja> <jc>/* PropertyFilter */</jc>
		<jk>public</jk> Object writeProperty(Object bean, String name, Object value) {
			AddressBook a = (Address)bean;
			<jk>if</jk> (<js>"taxInfo"</js>.equals(name) &amp;&amp; <js>"redacted"</js>.equals(value))
				<jk>return</jk> TaxInfoUtils.<jsm>lookUpByName</jsm>(a.getStreet(), a.getCity(), a.getState());
			<jk>return</jk> value;
		}
	}	
			</p>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.BeanPropertyAnnotation"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.9 - @BeanProperty Annotation</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.annotation.BeanProperty @BeanProperty} annotation is used to tailor how 
				individual bean properties are interpreted by the framework.
			</p>
			<p>
				The {@link org.apache.juneau.annotation.BeanProperty#name() @BeanProperty.name()} annotation
				is used to override the name of the bean property.
			</p>
			<p class='bcode'>
	<jk>public class</jk> MyBean {
		<ja>@BeanProperty</ja>(name=<js>"Bar"</js>)
		<jk>public</jk> String getFoo() {...}
	}
			</p>
			<p>
				If the {@link org.apache.juneau.BeanContext#BEAN_beanFieldVisibility} setting on the bean context excludes this field 
				(e.g. the visibility is set to the default of PUBLIC, but the field is PROTECTED), this annotation 
				can be used to force the field to be identified as a property.
			</p>
			<p class='bcode'>
	<jk>public class</jk> MyBean {
		<ja>@BeanProperty</ja>
		<jk>protected</jk> String getFoo() {...}
	}
			</p>
			<p>
				The bean property named <js>"*"</js> is the designated "dynamic property" which allows for "extra" bean
				properties not otherwise defined.
				<br>This is similar in concept to the Jackson <ja>@JsonGetterAll</ja> and <ja>@JsonSetterAll</ja> 
				annotations, but generalized for all supported marshall languages.
				<br>The primary purpose is for backwards compatibility in parsing newer streams with addition 
				information into older beans.
			</p>
			<p>
				The following shows various ways of using dynamic bean properties.
			</p>
			<p class='bcode'>
	<jc>// Option #1 - A simple public Map field.</jc>
	<jc>// The field name can be anything.</jc>
	<jk>public class</jk> BeanWithDynaField {

		<ja>@BeanProperty</ja>(name=<js>"*"</js>)
		<jk>public</jk> Map&lt;String,Object&gt; extraStuff = <jk>new</jk> LinkedHashMap&lt;String,Object&gt;();
	}

	<jc>// Option #2 - Getters and setters.</jc>
	<jc>// Method names can be anything.</jc>
	<jc>// Getter must return a Map with String keys.</jc>
	<jc>// Setter must take in two arguments, a String and Object.</jc>
	<jk>public class</jk> BeanWithDynaMethods {

		<ja>@BeanProperty</ja>(name=<js>"*"</js>)
		<jk>public</jk> Map&lt;String,Object&gt; getMyExtraStuff() {
			...
		}

		<ja>@BeanProperty</ja>(name=<js>"*"</js>)
		<jk>public void</jk> setAnExtraField(String name, Object value) {
			...
		}
	}

	<jc>// Option #3 - Getter only.</jc>
	<jc>// Properties will be added through the getter.</jc>
	<jk>public class</jk> BeanWithDynaGetterOnly {

		<ja>@BeanProperty</ja>(name=<js>"*"</js>)
		<jk>public</jk> Map&lt;String,Object&gt; getMyExtraStuff() {
			...
		}
	}
			</p>
			<p>
				Similar rules apply for value types and swaps.
				<br>The property values optionally can be any serializable type or use swaps.
			</p>
			<p class='bcode'>
	<jc>// A serializable type other than Object.</jc>
	<jk>public class</jk> BeanWithDynaFieldWithListValues {

		<ja>@BeanProperty</ja>(name=<js>"*"</js>)
		<jk>public</jk> Map&lt;String,List&lt;String&gt;&gt; getMyExtraStuff() {
			...
		}
	}

	<jc>// A swapped value.</jc>
	<jk>public class</jk> BeanWithDynaFieldWithSwappedValues {

		<ja>@BeanProperty</ja>(name=<js>"*"</js>, swap=CalendarSwap.<jsf>ISO8601DTZ</jsf>.<jk>class</jk>)
		<jk>public</jk> Map&lt;String,Calendar&gt; getMyExtraStuff() {
			...
		}
	}
			</p>
			<ul class='doctree'>
				<li class='info'>
					Note that if you're not interested in these additional properties, you can also use the
					{@link org.apache.juneau.BeanContext#BEAN_ignoreUnknownBeanProperties} setting to ignore values 
					that don't fit into existing properties.
			</ul>
			<p>
				The {@link org.apache.juneau.annotation.BeanProperty#value() @BeanProperty.value()} annotation
				is a synonym for {@link org.apache.juneau.annotation.BeanProperty#name() @BeanProperty.name()}.
				<br>Use it in cases where you're only specifying a name so that you can shorten your annotation.
			</p>
			<p>
				The following annotations are equivalent:
			</p>
			<p class='bcode'>
	<ja>@BeanProperty</ja>(name=<js>"foo"</js>)

	<ja>@BeanProperty</ja>(<js>"foo"</js>)
			</p>
			<p>
				The {@link org.apache.juneau.annotation.BeanProperty#type() @BeanProperty.type()} annotation
				is used to identify a specialized class type for a generalized property.
				<br>Normally the type is inferred through reflection of the field type or getter return type.
				<br>However, you'll want to specify this value if you're parsing beans where the bean property class 
				is an interface or abstract class to identify the bean type to instantiate.
				<br>Otherwise, you may cause an {@link java.lang.InstantiationException} when trying to set these fields.
			</p>
			<p>
				This property must denote a concrete class with a no-arg constructor.
			</p>
			<p class='bcode'>
	<jk>public class</jk> MyBean {

		<jc>// Identify concrete type as a HashMap.</jc>
		<ja>@BeanProperty</ja>(type=HashMap.<jk>class</jk>)
		<jk>public</jk> Map <jf>p1</jf>;
			</p>
			<p>
				The {@link org.apache.juneau.annotation.BeanProperty#params() @BeanProperty.params()} annotation
				is for bean properties of type map or collection.
				<br>It's used to identify the class types of the contents of the bean property object when
				the general parameter types are interfaces or abstract classes.
			</p>
			<p class='bcode'>
	<jk>public class</jk> MyBean {

		<jc>// This is a HashMap&lt;String,Integer&gt;.</jc>
		<ja>@BeanProperty</ja>(type=HashMap.<jk>class</jk>, params={String.<jk>class</jk>,Integer.<jk>class</jk>})
		<jk>public</jk> Map <jf>p1</jf>;
	}
			</p>
			<p>
				The {@link org.apache.juneau.annotation.BeanProperty#properties() @BeanProperty.properties()} 
				annotation is used to limit which child properties are rendered by the serializers.
				<br>It can be used on any of the following bean property types:
			</p>
			<ul class='spaced-list'>
				<li>Beans - Only render the specified properties of the bean.
				<li>Maps - Only render the specified entries in the map.
				<li>Bean/Map arrays - Same, but applied to each element in the array.
				<li>Bean/Map collections - Same, but applied to each element in the collection.
			</ul>
			<p class='bcode'>
	<jk>public class</jk> MyClass {

		<jc>// Only render 'f1' when serializing this bean property.</jc>
		<ja>@BeanProperty</ja>(properties={<js>"f1"</js>})
		<jk>public</jk> MyChildClass x1 = <jk>new</jk> MyChildClass();
	}

	<jk>public class</jk> MyChildClass {
		<jk>public int</jk> f1 = 1;
		<jk>public int</jk> f2 = 2;
	}

	<jc>// Renders "{x1:{f1:1}}"</jc>
	String json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(<jk>new</jk> MyClass());
			</p>
			<p>
				The {@link org.apache.juneau.annotation.BeanProperty#format() @BeanProperty.format()} 
				annotation specifies a String format for converting a bean property value to a formatted string.
			</p>
			<p class='bcode'>
	<jc>// Serialize a float as a string with 2 decimal places.</jc>
	<ja>@BeanProperty</ja>(format=<js>"$%.2f"</js>)
	<jk>public float</jk> <jf>price</jf>;
			</p>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.BeanConstructorAnnotation"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.10 - @BeanConstructor Annotation</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.annotation.BeanConstructor @BeanConstructor} annotation is used to 
				map constructor arguments to property names on bean with read-only properties.
				<br>Since method parameter names are lost during compilation, this annotation essentially redefines 
				them so that they are available at runtime.
			</p>
			<p>
				The definition of a read-only bean is a bean with properties with only getters, like shown below:
			</p>	
			<p class='bcode'>
	<jc>// Our read-only bean.</jc>
	<jk>public class</jk> Person {
		<jk>private final</jk> String <jf>name</jf>;
		<jk>private final int</jk> <jf>age</jf>;

		<ja>@BeanConstructor</ja>(properties=<js>"name,age"</js>})
		<jk>public</jk> Person(String name, <jk>int</jk> age) {
			<jk>this</jk>.<jf>name</jf> = name;
			<jk>this</jk>.<jf>age</jf> = age;
		}

		<jc>// Read only properties.</jc>
		<jc>// Getters, but no setters.</jc>

		<jk>public</jk> String getName() {
			<jk>return</jk> <jf>name</jf>;
		}

		<jk>public int</jk> getAge() {
			<jk>return</jk> <jf>age</jf>;
		}
	}			
			</p>
			<p class='bcode'>
	<jc>// Parsing into a read-only bean.</jc>
	String json = <js>"{name:'John Smith',age:45}"</js>;
	Person p = JsonParser.<jsf>DEFAULT</jsf>.parse(json);
	String name = p.getName();  <jc>// "John Smith"</jc>
	<jk>int</jk> age = p.getAge();   <jc>// 45</jc>
			</p>
			<p>
				Beans can also be defined with a combination of read-only and read-write properties.
			</p>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.BeanIgnoreAnnotation"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.11 - @BeanIgnore Annotation</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.annotation.BeanIgnore @BeanIgnore} annotation is used to
				ignore classes, fields, and methods from being interpreted as beans or bean components.
			</p> 
			<p>
				When applied to classes, objects will be converted to strings even though they look like beans.
			</p>
			<p class='bcode'>
	<jc>// Not really a bean!  Use toString() instead!</jc>
	<ja>@BeanIgnore</ja>
	<jk>public class</jk> MyBean {...}
			</p>
			<p>
				When applied to fields and getters/setters, they will be ignored as bean properties.
			</p>
			<p class='bcode'>
	<jk>public class</jk> MyBean {
		
		<jc>// Not a bean property!</jc>
		<ja>@BeanIgnore</ja>
		<jk>public</jk> String <jf>foo</jf>;
		
		<jc>// Not a bean property!</jc>
		<ja>@BeanIgnore</ja>
		<jk>public</jk> String getBar() {...}
	}
			</p>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.NamePropertyAnnotation"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.12 - @NameProperty Annotation</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.annotation.NameProperty @NameProperty} annotation is used to
				identify a setter as a method for setting the name of a POJO as it's known by its parent object.
			</p>
			<p>
				A commonly-used case is when you're parsing a JSON map containing beans where one of the bean 
				properties is the key used in the map.
			</p>
			<p class='bcode'>
	<jc>// JSON</jc> 
	{
		id1: {name: <js>'John Smith'</js>, sex:<js>'M'</js>},
		id2: {name: <js>'Jane Doe'</js>, sex:<js>'F'</js>}
	}
				</p>
				<p class='bcode'>
	<jk>public class</jk> Person {
		
		<ja>@NameProperty</ja> 
		<jk>public</jk> String <jf>id</jf>;  <jc>// Value gets assigned from object key</jc>
		
		<jk>public</jk> String <jf>name</jf>;
		
		<jk>public char</jk> <jf>sex</jf>;
	}
			</p>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.ParentPropertyAnnotation"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.13 - @ParentProperty Annotation</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.annotation.ParentProperty @ParentProperty} annotation is used to
				identify a setter as a method for adding a parent reference to a child object.
			</p>
			<p>
				A commonly-used case is when you're parsing beans and a child bean has a reference to a parent bean.
			</p>
			<p class='bcode'>
	<jk>public class</jk> AddressBook {
		<jk>public</jk> List&lt;Person&gt; <jf>people</jf>;
	}

	<jk>public class</jk> Person {
	
		<ja>@ParentProperty</ja> 
		<jk>public</jk> AddressBook <jf>addressBook</jf>;  <jc>// A reference to the containing address book.</jc>
		
		<jk>public</jk> String <jf>name</jf>;
		
		<jk>public char</jk> <jf>sex</jf>;
	}
			</p>
			<p>
				Parsers will automatically set this field for you in the child beans.
			</p>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.PojoBuilders"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.14 - POJO Builders</h4>
		<div class='topic'>
			<p>
				Juneau parsers can use builders to instantiate POJOs.
				<br>This is useful in cases where you want to create beans with read-only properties.
				<br>Note that while it's possible to do this using the {@link org.apache.juneau.annotation.BeanConstructor @BeanConstructor}
				annotation, using builders can often be cleaner.
			</p>
			<p>
				A typical builder usage is shown below:
			</p>
			<p class='bcode'>
	MyBean b = MyBean.<jsm>create</jsm>().foo(<js>"foo"</js>).bar(123).build();
				</p>								
				<p>
					The code for such a builder is shown below:
				</p>
				<p class='bcode'>
	<jk>public class</jk> MyBean {
	
		<jc>// Read-only properties.</jc>
		<jk>public final</jk> String <jf>foo</jf>;
		<jk>public final int</jk> <jf>bar</jf>;
		
		<jc>// Private constructor.</jc>
		<jk>private</jk> MyBean(MyBeanBuilder b) {
			<jk>this</jk>.<jf>foo</jf> = b.foo;
			<jk>this</jk>.<jf>bar</jf> = b.bar;
		}

		<jc>// Static method that creates a builder.</jc>
		<jk>public static</jk> MyBeanBuilder <jsm>create</jsm>() {
			<jk>return new</jk> MyBeanBuilder();
		}

		<jc>// Builder class.</jc>
		<jk>public static class</jk> MyBeanBuilder {
			<jk>private</jk> String <jf>foo</jf>;
			<jk>private int</jk> <jf>bar</jf>;
			
			<jc>// Method that creates the bean.</jc>
			<jk>public</jk> MyBean build() {
				<jk>return new</jk> MyBean(<jk>this</jk>);
			}
			
			<jc>// Bean property setters.</jc>
			
			<ja>@BeanProperty</ja>
			<jk>public</jk> MyBeanBuilder foo(String foo) {
				<jk>this</jk>.<jf>foo</jf> = foo;
				<jk>return this</jk>;
			}
			
			<ja>@BeanProperty</ja>
			<jk>public</jk> MyBeanBuilder bar(<jk>int</jk> bar) {
				<jk>this</jk>.<jf>bar</jf> = bar;
				<jk>return this</jk>;
			}
		}
	}
			</p>
			<p>
				The POJO class can be any type including beans.
				<br>Builders MUST be beans with one or more writable properties.
				<br>The bean properties themselves do not need to be readable (i.e. getters are optional).
			</p>
			<p>
				Builders require two parts:
			</p>
			<ol>
				<li>A way to detect and instantiate a builder using reflection.
				<li>A way to instantiate a POJO from a builder.
			</ol>
			<p>
				The first can be accomplished through any of the following:
			</p>
			<ul class='spaced-list'>
				<li>A static <code>create()</code> method on the POJO class that returns a builder instance.
					<p class='bcode'>
	<jk>public static</jk> MyBuilder <jsm>create</jsm>() {...}
					</p>
				<li>A public constructor on the POJO class that takes in a single parameter that implements the {@link org.apache.juneau.transform.Builder} interface.
					<br>The builder class must have a public no-arg constructor.
					<p class='bcode'>
	<jk>public</jk> MyPojo(MyBuilder b) {...}
					</p>
				<li>A {@link org.apache.juneau.annotation.Builder @Builder} annotation on the POJO class.
					<br>The builder class must have a public no-arg constructor.
					<p class='bcode'>
	<ja>@Builder</ja>(MyBuilder.<jk>class</jk>)
	<jk>public class</jk> MyPojo {...}
					</p>
			</ul>
			<p>
				The second can be accomplished through any of the following:
			</p>
			<ul class='spaced-list'>
				<li>The existence of a <code>build()</code> method on the builder class.
					<p class='bcode'>
	<jk>public</jk> MyPojo build() {...}
					</p>
				<li>The existence of a public constructor on the POJO class that takes in the builder instance.
					<p class='bcode'>
	<jk>public</jk> MyPojo(MyBuilder b) {...}
					</p>
			</ul>
			<h5 class='section'>See Also:</h5>
			<ul>
				<li class='ja'>{@link org.apache.juneau.annotation.Builder}
				<li class='jic'>{@link org.apache.juneau.transform.Builder}
			</ul>
		</div>
		
		<!-- =================================================================================================== -->
		<a id="juneau-marshall.URIs"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.15 - URIs</h4>
		<div class='topic'>
			<p>
				Juneau serializers have sophisticated support for transforming relative URIs to absolute form.
			</p>
			<p>
				The following example shows a bean containing URIs of various forms and how they end up serialized. 
			</p>
			<p class='bcode'>
	<jc>// Our bean with properties containing various kinds of URIs.</jc>
	<jk>public class</jk> TestURIs {
		<jk>public</jk> URI
			<jf>f1a</jf> = URI.<jsm>create</jsm>(<js>"http://www.apache.org/f1a"</js>),
			<jf>f1b</jf> = URI.<jsm>create</jsm>(<js>"/f1b"</js>),
			<jf>f1c</jf> = URI.<jsm>create</jsm>(<js>"/f1c/x/y"</js>),
			<jf>f1d</jf> = URI.<jsm>create</jsm>(<js>"f1d"</js>),
			<jf>f1e</jf> = URI.<jsm>create</jsm>(<js>"f1e/x/y"</js>),
			<jf>f1f</jf> = URI.<jsm>create</jsm>(<js>""</js>),
			<jf>f2a</jf> = URI.<jsm>create</jsm>(<js>"context:/f2a/x"</js>),
			<jf>f2b</jf> = URI.<jsm>create</jsm>(<js>"context:/f2b"</js>),
			<jf>f2c</jf> = URI.<jsm>create</jsm>(<js>"context:/"</js>),
			<jf>f2d</jf> = URI.<jsm>create</jsm>(<js>"context:/.."</js>),
			<jf>f3a</jf> = URI.<jsm>create</jsm>(<js>"servlet:/f3a/x"</js>),
			<jf>f3b</jf> = URI.<jsm>create</jsm>(<js>"servlet:/f3b"</js>),
			<jf>f3c</jf> = URI.<jsm>create</jsm>(<js>"servlet:/"</js>),
			<jf>f3d</jf> = URI.<jsm>create</jsm>(<js>"servlet:/.."</js>),
			<jf>f4a</jf> = URI.<jsm>create</jsm>(<js>"request:/f4a/x"</js>),
			<jf>f4b</jf> = URI.<jsm>create</jsm>(<js>"request:/f4b"</js>),
			<jf>f4c</jf> = URI.<jsm>create</jsm>(<js>"request:/"</js>),
			<jf>f4d</jf> = URI.<jsm>create</jsm>(<js>"request:/.."</js>),
			<jf>f5 </jf> = <jk>null</jk>;
	}	
	
	<jc>// Create a serializer.</jc>
	WriterSerializer s = JsonSerializer
		<jsm>create</jsm>()
		.simple()
		.uriContext(<js>"{authority:'http://foo.com:123',contextRoot:'/myContext',servletPath:'/myServlet',pathInfo:'/myPath'}"</js>)
		.uriResolution(<jsf>ABSOLUTE</jsf>)
		.uriRelativity(<jsf>RESOURCE</jsf>)
		.build();
		
	<jc>// Produces:</jc>
	<jc>// {</jc>
	<jc>//	f1a:'http://www.apache.org/f1a',</jc>
	<jc>//	f1b:'http://foo.com:123/f1b',</jc>
	<jc>//	f1c:'http://foo.com:123/f1c/x/y',</jc>
	<jc>//	f1d:'http://foo.com:123/myContext/myServlet/f1d',</jc>
	<jc>//	f1e:'http://foo.com:123/myContext/myServlet/f1e/x/y',</jc>
	<jc>//	f1f:'http://foo.com:123/myContext/myServlet',</jc>
	<jc>//	f2a:'http://foo.com:123/myContext/f2a/x',</jc>
	<jc>//	f2b:'http://foo.com:123/myContext/f2b',</jc>
	<jc>//	f2c:'http://foo.com:123/myContext',</jc>
	<jc>//	f2d:'http://foo.com:123'</jc>
	<jc>//	f3a:'http://foo.com:123/myContext/myServlet/f3a/x',</jc>
	<jc>//	f3b:'http://foo.com:123/myContext/myServlet/f3b',</jc>
	<jc>//	f3c:'http://foo.com:123/myContext/myServlet',</jc>
	<jc>//	f3d:'http://foo.com:123/myContext',</jc>
	<jc>//	f4a:'http://foo.com:123/myContext/myServlet/myPath/f4a/x',</jc>
	<jc>//	f4b:'http://foo.com:123/myContext/myServlet/myPath/f4b',</jc>
	<jc>//	f4c:'http://foo.com:123/myContext/myServlet/myPath',</jc>
	<jc>//	f4d:'http://foo.com:123/myContext/myServlet',</jc>
	<jc>// }</jc>
	String json = s.serialize(<jk>new</jk> TestURIs());
			</p>
			<p>
				URI resolution is controlled by the following settings:
			</p>
			<ul class='doctree'>
				<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext}
					<br>Setting that defines the URI contextual information used to resolve relative URIs.
				<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity}
					<br>Setting that defines how relative URIs should be interpreted.
					<br>Possible values:
					<ul>
						<li class='jf'>{@link org.apache.juneau.UriRelativity#RESOURCE}
							<br>Relative URIs should be considered relative to the servlet URI.
							<br>(e.g. <js>"http://host:port/context-root/servlet-path"</js>).
						<li class='jf'>{@link org.apache.juneau.UriRelativity#PATH_INFO}
							<br>Relative URIs should be considered relative to the request URI.
							<br>(e.g. <js>"http://host:port/context-root/servlet-path/path-info"</js>).
					</ul>
				<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution}
					<br>Setting that defines the final format of serialized URIs.
					<br>Possible values:
					<ul>
						<li class='jf'>{@link org.apache.juneau.UriResolution#ABSOLUTE}
							<br>Resolve to an absolute URL.
							<br>(e.g. <js>"http://host:port/context-root/servlet-path/path-info"</js>).
						<li class='jf'>{@link org.apache.juneau.UriResolution#ROOT_RELATIVE}
							<br>Resolve to a root-relative URL.
							<br>(e.g. <js>"/context-root/servlet-path/path-info"</js>).
						<li class='jf'>{@link org.apache.juneau.UriResolution#NONE}
							<br>Don't do any URL resolution.
					</ul>
			</ul>
			<p>
				Juneau automatically interprets any {@link java.net.URL} and {@link java.net.URI} objects as URIs and will
				resolve them accordingly.
				<br>The {@link org.apache.juneau.annotation.URI @URI} annotation can be used to extend that to other bean 
				properties and class types so that they also get interpreted as URIs.
				<br>For example:
			</p>
			<p class='bcode'>
	<jc>// Applied to a class whose toString() method returns a URI.</jc>
	<ja>@URI</ja>
	<jk>public class</jk> MyURI {
		<ja>@Override</ja> <jc>/* Object */</jc>
		<jk>public</jk> String toString() {
			<jk>return</jk> <js>"http://localhost:9080/foo/bar"</js>;
		}
	}

	<jc>// Applied to bean properties</jc>
	<jk>public class</jk> MyBean {

		<ja>@URI</ja>
		<jk>public</jk> String <jf>beanUri</jf>;

		<ja>@URI</ja>
		<jk>public</jk> String getParentUri() {
			...
		}
	}
			</p>
		</div>

		<!-- ======================================================================================================= -->
		<a id="juneau-marshall.BeanFilters"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.16 - BeanFilter Class</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.transform.BeanFilter} class is the programmatic equivalent to the
				{@link org.apache.juneau.annotation.Bean @Bean} annotation.
			</p>
			<p>
				In practice, it's usually simpler to use the {@link org.apache.juneau.annotation.Bean @Bean} and 
				{@link org.apache.juneau.annotation.BeanProperty @BeanProperty} annotations on your bean classes.
				<br>However, bean filters make it possible to accomplish the same when you can't add annotations
				to existing code.
			</p>
			<p>
				Bean filters are defined through {@link org.apache.juneau.transform.BeanFilterBuilder BeanFilterBuilders}.
			</p>
			<p>
				In the previous examples, we defined this bean annotation:
			</p>
			<p class='bcode'>
	<ja>@Bean</ja>(properties=<js>"street,city,state"</js>)
	<jk>public class</jk> Address { ... }
			</p>
			<p>
				The programmatic equivalent would be:
			</p>				
			<p class='bcode'>
	<jk>public class</jk> AddressFilter <jk>extends</jk> BeanFilterBuilder&lt;Address&gt; {
		
		<jc>// Must provide a no-arg constructor!</jc>
		<jk>public</jk> AddressFilter() {
			includeProperties(<js>"street,city,state"</js>);  <jc>// The properties we want exposed.</jc>
		}
	}	
			</p>		
			<p>
				Bean filters are added to serializers and parsers using the following:
			</p>
			<ul>
				<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanFilters}
				<li class='jm'>{@link org.apache.juneau.BeanContextBuilder#beanFilters(Object...)}
			</ul>
			<p>
				For example:
			</p>
			<p class='bcode'>			
	<jc>// Create a new JSON serializer and associate a bean filter with it.</jc>
	WriterSerializer s = JsonSerializer
		.<jsm>create</jsm>()
		.beanFilters(AddressFilter.<jk>class</jk>)
		.build();
			</p>
			<p>
				Note that if you use the annotation, you do NOT need to set anything on the serializers/parsers.
				<br>The annotations will be detected and bean filters will automatically be created for them.
			</p>
			<p>
				The {@link org.apache.juneau.BeanContextBuilder#beanFilters(Object...)} method also allows you to pass in interfaces.
				<br>Any class that's not a subclass of {@link org.apache.juneau.transform.BeanFilterBuilder} get interpreted 
				as bean interface classes.
				<br>These cause bean implementations of those interfaces to only expose the properties defined on the 
				interface.
			</p>
			<p class='bcode'>
	<jc>// An interface with the 3 properties we want serialized.</jc>
	<jk>public interface</jk> AddressInterface {
		<jk>public</jk> String getStreet();
		<jk>public</jk> String getCity();
		<jk>public</jk> String getState();
	}
	
	<jc>// Our bean implementation.</jc>
	<jk>public class</jk> Address <jk>implements</jk> AddressInterface {
		<jk>public</jk> String getStreet() {...};
		<jk>public</jk> String getCity() {...};
		<jk>public</jk> String getState() {...};
		<jk>public</jk> String getCountry() {...};
	}
	
	<jc>// Create a new JSON serializer that only exposes street,city,state on Address bean.</jc>
	<jc>// The 'country' field will be ignored.</jc>
	WriterSerializer s = JsonSerializer
		.<jsm>create</jsm>()
		.beanFilters(AddressInterface.<jk>class</jk>)
		.build();
			</p>			
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.InterfaceFilters"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.17 - Interface Filters</h4>
		<div class='topic'>
			<p>
				Occasionally, you may want to limit bean properties to only those defined on a parent class or interface.  
				<br>This is accomplished through interface filters.
			</p>
			<p>
				Interface filters are defined through the following:
			</p>
			<ul>
				<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanFilters}
				<li class='ja'>{@link org.apache.juneau.annotation.Bean#interfaceClass() @Bean.interfaceClass()}
				<li class='jm'>{@link org.apache.juneau.transform.BeanFilterBuilder#interfaceClass(Class)}
			</ul>
			<p>
				For example, let's define the following interface and implementation:
			</p>
			<p class='bcode'>
	<jc>// Interface</jc>
	<jk>public class</jk> MyInterface {
		<jk>public</jk> String getFoo();
	}

	<jc>// Implementation</jc>
	<jk>public class</jk> MyInterfaceImpl <jk>implements</jk> MyInterface {
		<jk>public</jk> String getFoo() {...}
		<jk>public</jk> String getBar() {...}
	}
				</p>
				<p>
					Suppose we only want to render the properties defined on our interface, not the implementation. 
					<br>To do so, we can define the following bean filter:
				</p>
				<p class='bcode'>
	<jc>// Define transform that limits properties to only those defined on MyClass</jc>
	<jk>public class</jk> MyInterfaceFilter <jk>extends</jk> BeanFilter&lt;MyInterface&gt; {
		<jk>public</jk> MyInterfaceFilter() {
			interfaceClass(MyInterface.<jk>class</jk>);
		}
	}
				</p>
				<p>
					When serialized, the serialized bean will only include properties defined on the interface.
				</p>
				<p class='bcode'>
	WriterSerializer s = JsonSerializer
		.<jsm>create</jsm>()
		.simple()
		.beanFilters(MyInterfaceFilter.<jk>class</jk>)
		.build();
		
	MyInterface o = <jk>new</jk> MyInterfaceImpl();
	
	<jc>// Prints "{foo:'foo'}"</jc>
	<jc>// bar is ignored because it's not on the interface</jc>
	String json = s.serialize(o);  
				</p>	
				<p>
					The {@link org.apache.juneau.BeanContextBuilder#beanFilters(Object...)} method will automatically interpret any 
					non-<code>BeanFilter</code> classes passed in as meaning interface classes. 
					<br>So in the previous example, the <code>BeanFilter</code> class could have been avoided altogether by just 
					passing in <code>MyInterface.<jk>class</jk></code> to the serializer, like so:
				</p>
				<p class='bcode'>
	WriterSerializer s = JsonSerializer
		.<jsm>create</jsm>()
		.beanFilters(MyInterface.<jk>class</jk>)  <jc>Shortcut!</jc>
		.build();
				</p>
				<p>
					The annotation equivalent is {@link org.apache.juneau.annotation.Bean#interfaceClass() Bean#interfaceClass()}.
				</p>
				<p class='bcode'>
	<ja>@Bean</ja>(interfaceClass=MyInterface.<jk>class</jk>)
	<jk>public class</jk> MyInterfaceImpl <jk>implements</jk> MyInterface {
		<jk>public</jk> String getFoo() {...}
		<jk>public</jk> String getBar() {...}
	}
				</p>
				<p>
					The annotation can be used in a couple of ways.
				</p>
				<p>
					Using the annotation on an interface will be inherited by all children.
				</p>
				<p class='bcode'>
	<ja>@Bean</ja>(interfaceClass=MyInterface.<jk>class</jk>)
	<jk>public class</jk> MyInterface {
		<jk>public</jk> String getFoo();
	}
				</p>
				<p>
					The annotation can be used on parent classes as well.
					<br>Child beans will only serialize properties defined on the parent class.
				<p class='bcode'>
	<ja>@Bean</ja>(interfaceClass=MyAbstractClass.<jk>class</jk>)
	<jk>public abstract class</jk> MyAbstractClass {
		<jk>public</jk> String getFoo() {...};
	}
			</p>
		</div>
		
		<!-- =================================================================================================== -->
		<a id="juneau-marshall.StopClasses"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.18 - Stop Classes</h4>
		<div class='topic'>
			<p>
				Whereas interface filters limit properties defined on child classes, stop filters 
				do the opposite and limit properties defined on parent classes.
			</p>
			<p>
				Stop classes are defined through the following:
			</p>
			<ul>
				<li class='ja'>{@link org.apache.juneau.annotation.Bean#stopClass() @Bean.stopClass()}
				<li class='jf'>{@link org.apache.juneau.transform.BeanFilterBuilder#stopClass(Class)}
			</ul>
			<p>
				Stop classes are identical in purpose to the stop class specified by {@link java.beans.Introspector#getBeanInfo(Class, Class)}.
				<br>Any properties in the stop class or in its base classes will be ignored during serialization.
			</p>
			<p>
				For example, in the following class hierarchy, instances of <code>C3</code> will include property <code>p3</code>,
				but not <code>p1</code> or <code>p2</code>.
			</p>
			<p class='bcode'>
	<jk>public class</jk> C1 {
		<jk>public int</jk> getP1();
	}

	<jk>public class</jk> C2 <jk>extends</jk> C1 {
		<jk>public int</jk> getP2();
	}

	<ja>@Bean</ja>(stopClass=C2.<jk>class</jk>)
	<jk>public class</jk> C3 <jk>extends</jk> C2 {
		<jk>public int</jk> getP3();
	}
	
	<jc>// Serializes property 'p3', but NOT 'p1' or 'p2'.</jc>
	String json = JsonSerializer.<jsf>DEFAULT</jsf>.serialize(<jk>new</jk> C3());
			</p>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.BypassSerialization"></a>
		<h4 class='topic' onclick='toggle(this)'>2.7.19 - Bypass Serialization using Readers and InputStreams</h4>
		<div class='topic'>
			<p>
				Juneau serializers treat instances of <code>Readers</code> and <code>InputStreams</code> special by 
				simply serializing their contents directly to the output stream or writer.
				<br>This allows you to embed fully customized serializer output.
			</p>
			<p class='bcode'>
	<jk>public class</jk> MyBean {
		<jc>// A bean property that produces raw JSON.</jc>
		<jk>public</jk> Reader f1 = <jk>new</jk> StringReader(<js>"{'foo':'bar'}"</js>);	
	}	
	
	<jc>// Produces "{f1:{'foo':'bar'}}"</jc>
	String json = JsonSerializer.<jsf>DEFAULT_LAX</jsf>.toString(<jk>new</jk> MyBean());
			</p>			
			<p>
				Note that if you're serializing Readers and InputStreams, it's up to you to make sure you're producing
				valid output (in this case JSON).
			</p>
			<p>
				A more typical scenario where this is useful is by using swaps to convert POJOs to Readers whose 
				contents are determined via the {@link org.apache.juneau.BeanSession#getMediaType()} method.
				<br>In the following example, we're customizing the JSON output for a particular bean type, but leaving
				all other renditions as-is:
			</p>			
			<p class='bcode'>
	<ja>@Swap</ja>(MyBeanSwapSometimes.<jk>class</jk>)
	<jk>public class</jk> MyBean {...}
	
	<jc>// A swap that produces specialized output for JSON, but default serialization for</jc>
	<jc>// all other media types.</jc>
	<jk>public class</jk> MyBeanSwapSometimes <jk>extends</jk> PojoSwap&lt;MyBean,Object&gt; {
		<jk>public</jk> Object swap(BeanSession session, MyPojo o) <jk>throws</jk> Exception {
			MediaType mt = session.getMediaType();
			<jk>if</jk> (mt.hasSubType(<js>"json"</js>))
				<jk>return new</jk> StringReader(<js>"{myPojo:'foobar'}"</js>);  <jc>// Custom JSON output</jc>
			<jk>return</jk> o;  <jc>// Otherwise serialize it as a normal bean</jc>
		}
	}
			</p>	
			<ul class='doctree'>
				<li class='info'>
					Due to the nature of the RDF serializers, Readers and InputStreams are serialized as literals,
					not as RDF text.
					This is due to the fact that the RDF serializers use a DOM for serialization, so we don't have
					access to the underlying stream.
			</ul>
		</div>
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.BeanDictionaries"></a>
	<h3 class='topic' onclick='toggle(this)'>2.8 - Bean Names and Dictionaries</h3>
	<div class='topic'>
		<p>
			While parsing into beans, Juneau attempts to determine the class types of bean properties through 
			reflection on the bean property getter or setter.
			<br>Often this is insufficient if the property type is an interface or abstract class that cannot be 
			instantiated.
			<br>This is where bean names and dictionaries come into play.
		</p>
		<p>
			Bean names and dictionaries are used for identifying class types when they cannot be inferred through 
			reflection.  
		</p>
		<p>
			Bean classes are given names through the {@link org.apache.juneau.annotation.Bean#typeName() @Bean.typeName()} 
			annotation.
			<br>These names are then added to the serialized output as virtual <js>"_type"</js> properties (or element 
			names in XML).
		</p>
		<p>
			On the parsing side, these type names are resolved to classes through the use of bean dictionaries.
		</p>
		<p>
			For example, if a bean property is of type <code>Object</code>, then the serializer will add 
			<js>"_type"</js> attributes so that the class can be determined during parsing.
		</p>
 		<p class='bcode'>
 	<ja>@Bean</ja>(typeName=<js>"foo"</js>)
 	<jk>public class</jk> Foo {
 		<jc>// A bean property where the object types cannot be inferred since it's an Object[].</jc>
 		<ja>@BeanProperty</ja>(beanDictionary={Bar.<jk>class</jk>,Baz.<jk>class</jk>})
 		<jk>public</jk> Object[] x = <jk>new</jk> Object[]{<jk>new</jk> Bar(), <jk>new</jk> Baz()};
 	}
 		
 	<ja>@Bean</ja>(typeName=<js>"bar"</js>)
 	<jk>public class</jk> Bar {}
 		
 	<ja>@Bean</ja>(typeName=<js>"baz"</js>)
 	<jk>public class</jk> Baz {}
 		</p>
 		<p>
 			When serialized as JSON, <js>"_type"</js> attributes would be added when needed to infer the type during 
 			parsing:
 		</p>
 		<p class='bcode'>
 	{
		x: [
			{_type:<js>'bar'</js>},
			{_type:<js>'baz'</js>}
		]
	}	 
 		</p>
 		<p>
 			Type names can be represented slightly differently in different languages.
 			<br>For example, the dictionary name is used as element names when serialized to XML.
 			<br>This allows the <code>typeName</code> annotation to be used as a shortcut for defining element names for 
 			beans.
 		</p>
		<p>
			When serialized as XML, the bean is rendered as:
		</p>
		<p class='bcode'>
	<xt>&lt;foo&gt;</xt>
	   <xt>&lt;x&gt;</xt>
	      <xt>&lt;bar/&gt;</xt>
	      <xt>&lt;baz/&gt;</xt>
	   <xt>&lt;/x&gt;</xt>
	<xt>&lt;/foo&gt;</xt>
		</p>
		<p>
			Bean dictionaries are registered through the following:
		</p>
		<ul>
			<li class='ja'>{@link org.apache.juneau.annotation.BeanProperty#beanDictionary() @BeanProperty.beanDictionary()} 
				- On individual bean properties through the annotation.
			<li class='ja'>{@link org.apache.juneau.annotation.Bean#beanDictionary() @Bean.beanDictionary()} 
				- On all properties on a bean and all subclasses.
			<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanDictionary} 
				- Configuration property on serializers and parsers.
			<li class='jm'>{@link org.apache.juneau.BeanContextBuilder#beanDictionary(Object...)}
				- Builder method on serializers and parsers.
		</ul>
		<p>
			The bean dictionary setting can consist of any of the following types:
		</p>
		<ul>
			<li>Any bean class that specifies a value for {@link org.apache.juneau.annotation.Bean#typeName() @Bean.typeName()}.
			<li>Any subclass of {@link org.apache.juneau.BeanDictionaryList} containing a collection of bean classes with type name annotations.
			<li>Any subclass of {@link org.apache.juneau.BeanDictionaryMap} containing a mapping of type names to classes without type name annotations.
			<li>Any array or collection of the objects above.
		</ul>
		<p class='bcode'>
	<jc>// Create a parser and tell it which classes to try to resolve.</jc>
	ReaderParser p = JsonParser
		.<jsm>create</jsm>()
		.beanDictionary(Foo.<jk>class</jk>, Bar.<jk>class</jk>)
		.build();
	
	<jc>// Same, but use property.</jc>
	ReaderParser p = JsonParser
		.<jsm>create</jsm>()
		.addTo(<jsf>BEAN_beanDictionary</jsf>, Foo.<jk>class</jk>)
		.addTo(<jsf>BEAN_beanDictionary</jsf>, Bar.<jk>class</jk>)
		.build();

	<jc>// Use the predefined HTML5 bean dictionary which is a BeanDictionaryList.</jc>
	ReaderParser p = HtmlParser
		.<jsm>create</jsm>()
		.beanDictionary(HtmlBeanDictionary.<jk>class</jk>)
		.build();
		</p>
		<p>
			The <js>"_type"</js> property name can be overridden through the following:
		</p>
		<ul>
			<li class='ja'>{@link org.apache.juneau.annotation.Bean#typePropertyName() @Bean.typePropertyName()} 
				- On individual beans through the annotation.
			<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanTypePropertyName} 
				- Configuration property on serializers and parsers.
			<li class='jm'>{@link org.apache.juneau.BeanContextBuilder#beanTypePropertyName(String)} 
				- Builder method on serializers and parsers.
		</ul>
		<p>
			When using the annotation, you'll typically want to define it on an interface class so that it can
			be inherited by all subclasses.
		</p>
		<p class='bcode'>
	<ja>@Bean</ja>(typePropertyName=<js>"mytype"</js>, beanDictionary={MyClass1.<jk>class</jk>,MyClass2.<jk>class</jk>})
	<jk>public interface</jk> MyInterface {...}

	<ja>@Bean</ja>(typeName=<js>"C1"</js>)
	<jk>public class</jk> MyClass1 <jk>implements</jk> MyInterface {...}

	<ja>@Bean</ja>(typeName=<js>"C2"</js>)
	<jk>public class</jk> MyClass2 <jk>implements</jk> MyInterface {...}

	MyInterface[] x = <jk>new</jk> MyInterface[]{ <jk>new</jk> MyClass1(), <jk>new</jk> MyClass2() };

	<jc>// Produces "[{mytype:'C1',...},{mytype:'C2',...}]"</jc>
	String json = JsonSerializer.<jsf>DEFAULT_LAX</jsf>.serialize(x);
		</p>
		<ul class='doctree'>
			<li class='info'>
				Type names do not need to be universally unique.  
				However, they must be unique within a dictionary.
			<li class='info'>
				The following reserved words cannot be used as type names:  
				<code>object, array, number, boolean, null</code>.
			<li class='info'>
				Serialized type names are DISABLED by default.
				They must be enabled on the serializer using the 
				{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypeProperties} 
				configuration property.
		</ul>
	
		<!-- =================================================================================================== -->
		<a id="juneau-marshall.BeanSubTypes"></a>
		<h4 class='topic' onclick='toggle(this)'>2.8.1 - Bean Subtypes</h4>
		<div class='topic'>
			<p>
				In addition to the bean type name support described above, simplified support is provided
				for bean subtypes.
			</p>
			<p>
				Bean subtypes are similar in concept to bean type names, except for the following differences:
			</p>
			<ul>
				<li>You specify the list of possible subclasses through an annotation on a parent bean class.
				<li>You do not need to register the subtype classes on the bean dictionary of the parser.
			</ul>
			<p>
				In the following example, the abstract class has two subclasses:
			</p>
			<p class='bcode'>
	<jc>// Abstract superclass</jc>
	<ja>@Bean</ja>(
		beanDictionary={A1.<jk>class</jk>, A2.<jk>class</jk>}
	)
	<jk>public abstract class</jk> A {
		<jk>public</jk> String <jf>f0</jf> = <js>"f0"</js>;
	}
	 
	<jc>// Subclass 1</jc>
	<ja>@Bean</ja>(typeName=<js>"A1"</js>)
	<jk>public class</jk> A1 <jk>extends</jk> A {
		<jk>public</jk> String <jf>f1</jf>;
	}
	 
	<jc>// Subclass 2</jc>
	<ja>@Bean</ja>(typeName=<js>"A2"</js>)
	<jk>public class</jk> A2 <jk>extends</jk> A {
		<jk>public</jk> String <jf>f2</jf>;
	}
			</p>
			<p>
				When serialized, the subtype is serialized as a virtual <js>"_type"</js> property:
			</p>	
			<p class='bcode'>
	JsonSerializer s = JsonSerializer.<jsf>DEFAULT_LAX</jsf>;
	A1 a1 = <jk>new</jk> A1();
	a1.<jf>f1</jf> = <js>"f1"</js>;
	String r = s.serialize(a1);
	<jsm>assertEquals</jsm>(<js>"{_type:'A1',f1:'f1',f0:'f0'}"</js>, r);
			</p>
			<p>
				The following shows what happens when parsing back into the original object.
			</p>
			<p class='bcode'>
	JsonParser p = JsonParser.<jsf>DEFAULT</jsf>;
	A a = p.parse(r, A.<jk>class</jk>);
	<jsm>assertTrue</jsm>(a <jk>instanceof</jk> A1);
			</p>
		</div>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.VirtualBeans"></a>
	<h3 class='topic' onclick='toggle(this)'>2.9 - Virtual Beans</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.BeanContext#BEAN_useInterfaceProxies} setting (enabled by default) allows
			the Juneau parsers to parse content into virtual beans (bean interfaces without implementation classes).
		</p>
		<p>
			For example, the following code creates an instance of the specified unimplemented interface:
		</p>
		<p class='bcode'>
	<jc>// Our unimplemented interface</jc> 
	<jk>public interface</jk> Address {
		
		String getStreet();
		<jk>void</jk> setStreet(String x); 
		
		String getCity();
		<jk>void</jk> setCity(String x); 

		StateEnum getState();
		<jk>void</jk> setState(StateEnum x); 
		
		<jk>int</jk> getZip();
		<jk>void</jk> setZip(<jk>int</jk> zip);
	}
	
	<jc>// Our code</jc>
	Address address = JsonParser.<jsf>DEFAULT</jsf>.parse(
		<js>"{street:'123 Main St', city:'Anywhere', state:'PR', zip:12345}"</js>, 
		Address.<jk>class</jk>
	); 
	
	<jk>int</jk> zip = address.getZip();
	address.setState(StateEnum.<jsf>NY</jsf>);
		</p>
		<p>
			Getter and setter values can be any <a class='doclink' href='#juneau-marshall.PojoCategories'>parsable</a> values, even other virtual beans.
		</p>
		<p>
			Under-the-covers, a virtual bean is simply a proxy interface on top of an existing <code>BeanMap</code>
			instance.  From a programmatic point-of-view, they're indistinguishable from real beans, and can be 
			manipulated and serialized like any other bean.
		</p>	
		<p>
			Virtual beans can also be created programmatically using the <code>BeanContext</code> class:
		</p>
		<p class='bcode'>
	Address address = BeanContext.<jsf>DEFAULT</jsf>.createSession().newBean(Address.<jk>class</jk>);
		</p>
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.ReadingContinuousStreams"></a>
	<h3 class='topic' onclick='toggle(this)'>2.10 - Reading Continuous Streams</h3>
	<div class='topic'>
		<p>
			The following parsers can be configured to read continous streams of objects from the same input stream:
		</p>
		<ul>
			<li class='jc'>{@link org.apache.juneau.json.JsonParser}
			<li class='jc'>{@link org.apache.juneau.uon.UonParser}
			<li class='jc'>{@link org.apache.juneau.msgpack.MsgPackParser}
		</ul>
		<p>
			The {@link org.apache.juneau.json.JsonParser} and {@link org.apache.juneau.uon.UonParser}
			classes can read continous streams by using the {@link org.apache.juneau.parser.Parser#PARSER_unbuffered}
			setting.
			<br>This prevents the parsers from using an internal buffer that would read past the end of the currently
			parsed POJO.
		</p>
		<h5 class='figure'>Examples:</h5>
		<p class='bcode'>
	<jc>// If you're calling parse on the same input multiple times, use a session instead of the parser directly.</jc>
	ReaderParserSession p = JsonParser.<jsm>create</jsm>().unbuffered().build().createSession();
	Object x;
	Reader r;

	r = new StringReader(<js>"{foo:'bar'}{baz:'qux'}"</js>);
	x = p.parse(r, ObjectMap.<jk>class</jk>);  <jc>// {foo:'bar'}</jc>
	x = p.parse(r, ObjectMap.<jk>class</jk>);  <jc>// {baz:'qux'}</jc>

	r = reader(<js>"[123][456]"</js>);
	x = p.parse(r, <jk>int</jk>[].<jk>class</jk>);  <jc>// [123]</jc>
	x = p.parse(r, <jk>int</jk>[].<jk>class</jk>);  <jc>// [456]</jc>
		</p>
		<p>
			Note that this isn't perfect in all cases since you can't combine two JSON numbers into a single
			reader (e.g. <code>"123" + "456" = "123456"</code>).
		</p>
		<p>
			For obvious reasons, do not use the following properties when reading continuous streams:
		</p>
		<ul>
			<li class='jf'>{@link org.apache.juneau.json.JsonParser#JSON_validateEnd}
			<li class='jf'>{@link org.apache.juneau.uon.UonParser#UON_validateEnd}
			<li class='jf'>{@link org.apache.juneau.parser.Parser#PARSER_autoCloseStreams}
		</ul>
		<p>
			The {@link org.apache.juneau.msgpack.MsgPackParser} class doesn't use any internal buffering to begin with, so it can be used with
			continuous streams without any special properties.
		</p>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.JacksonComparison"></a>
	<h3 class='topic' onclick='toggle(this)'>2.11 - Comparison with Jackson</h3>
	<div class='topic'>
		<p>
			Juneau was developed independently from Jackson, but shares many of the same features and capabilities.
			Whereas Jackson was created to work primarily with JSON, Juneau was created to work for multiple languages.
			Therefore, the terminology and annotations in Juneau are similar, but language-agnostic.   
		</p>
		<p>
			The following charts describe equivalent features between the two libraries:
		</p>
	
		<h5 class='topic'>Annotations</h5>
		<table class='styled' style='min-width:800px;width:50%'>
			<tr><th>Jackson</th><th>Juneau</th></tr>
			<tr>
				<td>
					<ja>@JsonGetter</ja>
					<br><ja>@JsonSetter</ja>
				</td>
				<td>
					{@link org.apache.juneau.annotation.BeanProperty @BeanProperty}
				</td>
			</tr>
			<tr>
				<td>
					<ja>@JsonAnyGetter</ja>
					<br><ja>@JsonAnySetter</ja>
				</td>
				<td>
					{@link org.apache.juneau.annotation.BeanProperty#name() @BeanProperty(name="*")}
				</td>
			</tr>
			<tr>
				<td>
					<ja>@JsonIgnore</ja>
					<br><ja>@JsonIgnoreType</ja>
				</td>
				<td>
					{@link org.apache.juneau.annotation.BeanIgnore @BeanIgnore}
				</td>
			</tr>
			<tr>
				<td><code><ja>@JsonIgnoreProperties</ja>({...})</code></td>
				<td>
					{@link org.apache.juneau.annotation.Bean#excludeProperties @Bean(excludeProperties="...")}
				</td>
			</tr>
			<tr>
				<td><code><ja>@JsonAutoDetect</ja>(fieldVisibility=...)</code></td>
				<td>
					No equivalent annotation, but can be controlled via: 
					<br>{@link org.apache.juneau.BeanContext#BEAN_beanFieldVisibility}
					<br>{@link org.apache.juneau.BeanContext#BEAN_beanMethodVisibility}
					<br>Future annotation support planned.
				</td>
			</tr>
			<tr>
				<td>
					<ja>@JsonCreator</ja>
					<br><ja>@JsonProperty</ja>
				</td>
				<td>
					{@link org.apache.juneau.annotation.BeanConstructor @BeanConstructor}
				</td>
			</tr>
			<tr>
				<td><ja>@JacksonInject</ja></td>
				<td>
					No equivalent.
					<br>Future support planned.
				</td>
					
			</tr>
			<tr>
				<td>
					<ja>@JsonSerialize</ja>
					<br><ja>@JsonDeserialize</ja>
				</td>
				<td>
					Juneau uses swaps to convert non-serializable object to serializable forms:
					<br>{@link org.apache.juneau.annotation.Swap @Swap}
				</td>
			</tr>
			<tr>
				<td><ja>@JsonInclude</ja></td>
				<td>
					No equivalent annotation, but can be controlled via various settings:
					<br>{@link org.apache.juneau.BeanContext}
					<br>{@link org.apache.juneau.serializer.Serializer}
					<br>Future annotation support planned.
				</td>
			</tr>
			<tr>
				<td><ja>@JsonPropertyOrder</ja></td>
				<td>
					{@link org.apache.juneau.annotation.Bean#properties @Bean(properties="...")}
					<br>{@link org.apache.juneau.annotation.Bean#sort @Bean(sort=x)}
				</td>
			</tr>
			<tr>
				<td>
					<ja>@JsonValue</ja>
					<br><ja>@JsonRawValue</ja>
				</td>
				<td>
					Can be replicated using swaps with <code>Reader</code> swapped values.
				</td>
			</tr>
		</table>
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.PojoCategories"></a>
	<h3 class='topic' onclick='toggle(this)'>2.12 - POJO Categories</h3>
	<div class='topic'>
		<p>
			The following chart shows POJOs categorized into groups and whether they can be serialized or parsed:
		</p>
		<table class='styled' style='border-collapse: collapse;min-width:800px;width:50%'>
			<tr><th>Group</th><th>Description</th><th>Examples</th><th>Can<br>serialize?</th><th>Can<br>parse?</th></tr>
			<tr class='dark bb' style='background-color:lightyellow;'>
				<td style='text-align:center'>1</td>
				<td><b>Java primitives and primitive objects</b></td>
				<td>
					<ul class='normal'>
						<li>{@code String}
						<li>{@code Integer}
						<li>{@code Float}
						<li>{@code Boolean}
					</ul>
				</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
			</tr>			
			<tr class='dark bb' style='background-color:lightyellow'>
				<td style='text-align:center'>2</td>
				<td><b>Java Collections Framework objects and Java arrays</b></td>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
			</tr>			
			<tr class='light bb'>
				<td style='text-align:center'>2a</td>
				<td>
					<b>With standard keys/values</b>
					<br>Map keys are group [1, 4a, 6a] objects.
					<br>Map, Collection, and array values are group [1, 2, 3ac, 4a, 6a] objects.	
				</td>
				<td>
					<ul class='normal'>
						<li><code>HashSet&lt;String,Integer&gt;</code>
						<li><code>TreeMap&lt;Integer,Bean&gt;</code>
						<li><code>List&lt;<jk>int</jk>[][]&gt;</code>
						<li><code>Bean[]</code>
					</ul>
				</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
			</tr>			
			<tr class='light bb'>
				<td style='text-align:center'>2b</td>
				<td>
					<b>With non-standard keys/values</b>
					<br>Map keys are group [2, 3, 4b, 5, 6b, 7] objects.
					<br>Map, Collection, and array values are group [3b, 4b, 5, 6b, 7] objects.	
				</td>
				<td>
					<ul class='normal'>
						<li><code>HashSet&lt;Bean,Integer&gt;</code>
						<li><code>TreeMap&lt;Integer,Reader&gt;</code>
					</ul>
				</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:salmon;text-align:center'><b>no</b></td>
			</tr>			
			<tr class='dark bb' style='background-color:lightyellow'>
				<td style='text-align:center'>3</td>
				<td><b>Java Beans</b></td>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
			</tr>			
			<tr class='light bb'>
				<td style='text-align:center'>3a</td>
				<td>
					<b>With standard properties</b>
					<br>These are beans that have one or more properties defined by public getter 
					or public fields.
					<br>Properties can also be defined as final read-only fields and passed in as constructor args.
					<br>Property values are group [1, 2, 3ac, 4a, 6a] objects.
				</td>
				<td>&nbsp;</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
			</tr>			
			<tr class='light bb'>
				<td style='text-align:center'>3b</td>
				<td>
					<b>With non-standard properties or not true beans</b>
					<br>These include true beans that have one or more properties defined by getter 
					and setter methods or properties, but property types include group [3b, 4b, 5, 6b, 7] objects.
					<br>This also includes classes that look like beans but aren't true beans.  
					For example, classes that have getters but not setters, or classes without no-arg constructors.	
				</td>
				<td>&nbsp;</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:salmon;text-align:center'><b>no</b></td>
			</tr>		
			<tr class='light bb'>
				<td style='text-align:center'>3c</td>
				<td>
					<b>Virtual beans</b>
					<br>These are unimplemented bean interfaces with properties of type [1, 2, 3ac, 4a, 6a] objects.
					<br>Parsers will automatically  create interface proxies on top of BeanMap instances.	
				</td>
				<td>&nbsp;</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
			</tr>		
			<tr class='light bb'>
				<td style='text-align:center'>3d</td>
				<td>
					<b>Read-only beans without setters</b>
					<br>The same as 3a, but without property setters or constructor args.
				</td>
				<td>&nbsp;</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:salmon;text-align:center'><b>no</b></td>
			</tr>		
			<tr class='dark bb' style='background-color:lightyellow'>
				<td style='text-align:center'>4</td>
				<td>
					<b>Swapped objects</b>
					<br>These are objects that are not directly serializable, but have 
					{@link org.apache.juneau.transform.PojoSwap PojoSwaps} associated with them.  
					The purpose of a POJO swap is to convert an object to another object that is easier to serialize 
					and parse.  
					For example, the {@link org.apache.juneau.transforms.DateSwap.ISO8601DT} class can be used to 
					serialize {@link java.util.Date} objects to ISO8601 strings, and parse them back into 
					{@link java.util.Date} objects.
				</td>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
			</tr>			
			<tr class='light bb'>
				<td style='text-align:center'>4a</td>
				<td>
					<b>2-way swapped to group [1, 2a, 3ac] objects</b>
					<br>For example, a swap that converts a {@code Date} to a {@code String}.
				</td>
				<td>
					<ul class='normal'>
						<li><code>java.util.Date</code>
						<li><code>java.util.GregorianCalendar</code>
					</ul>
				</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
			</tr>			
			<tr class='light bb'>
				<td style='text-align:center'>4b</td>
				<td>
					<b>1-way swapped to group [1, 2, 3] objects</b>
					<br>For example, a swap that converts an {@code Iterator} to a {@code List}.  
					This would be one way, since you cannot reconstruct an {@code Iterator}.
				</td>
				<td>
					<ul class='normal'>
						<li><code>java.util.Iterator</code>
					</ul>
				</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:salmon;text-align:center'><b>no</b></td>
			</tr>		
			<tr class='dark bb' style='background-color:lightyellow'>
				<td style='text-align:center'>5</td>
				<td>
					<b>Readers and InputStreams</b>
					<br>Contents are serialized directly to the output stream or writer.
					<br>Typically used for low-level language-specific replacement of POJOs using per-Media-Type 
					POJO swaps.
				</td>
				<td>					
					<ul class='normal'>
						<li>{@code FileInputStream}
						<li>{@code StringReader}
					</ul>
				</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:salmon;text-align:center'><b>no</b></td>
			</tr>		

			<tr class='dark bb' style='background-color:lightyellow'>
				<td style='text-align:center'>6</td>
				<td>
					<b>Non-serializable objects with standard methods for converting to a serializable form</b><br>
				</td>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
				<td>&nbsp;</td>
			</tr>		
			<tr class='light bb' style='background-color:lightyellow'>
				<td style='text-align:center'>6a</td>
				<td>
					Classes with a method that converts it to a serializable form:
					<ul>
						<li><code><jk>public</jk> X swap(BeanSession);</code> where <code>X</code> is in groups 
							[1, 2a, 3ac].
						<li><code><jk>public</jk> String toString();</code> where the string is any meaningful data.
					</ul>
					And a method that converts it back into the original object:
					<ul>
						<li><code><jk>public static</jk> T fromString(String);</code>		
						<li><code><jk>public static</jk> T valueOf(String);</code>		
						<li><code><jk>public static</jk> T parse(String);</code>		
						<li><code><jk>public static</jk> T parseString(String);</code>		
						<li><code><jk>public static</jk> T forName(String);</code>		
						<li><code><jk>public static</jk> T forString(String);</code>		
						<li><code><jk>public</jk> T(X);</code> where <code>X</code> is in groups [1, 2a, 3ac].
						<li><code><jk>public static</jk> T unswap(BeanSession,X);</code> where <code>X</code> is in 
							groups [1, 2a, 3ac].		
					</ul>
				</td>
				<td>
					<ul class='normal'>
						<li><code>java.lang.Class</code>
						<li><code>java.sql.Time</code>
						<li><code>java.sql.Timestamp</code>
						<li><code>java.text.MessageFormat</code>
						<li><code>java.text.NumberFormat</code>
						<li><code>java.util.Date</code>
						<li><code>java.util.UUID</code>
						<li><code>java.util.logging.Level</code>
						<li><code>javax.xml.bind.DatatypeConverter</code>
					</ul>
				</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
			</tr>		
			<tr class='light bb' style='background-color:lightyellow'>
				<td style='text-align:center'>6b</td>
				<td>
					Classes that only have a method to convert to a serializable form:
					<ul>
						<li><code><jk>public</jk> X swap(BeanSession);</code> where <code>X</code> is in groups 
							[1, 2, 3].
						<li><code><jk>public</jk> String toString();</code> where the string is any meaningful data.
					</ul>
				</td>
				<td>&nbsp;</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:salmon;text-align:center'><b>no</b></td>
			</tr>			
			<tr class='dark' style='background-color:lightyellow'>
				<td style='text-align:center'>7</td>
				<td>
					<b>All other objects</b>
					<br>Anything that doesn't fall into one of the groups above are simply converted to {@code Strings} 
					using the {@code toString()} method.
				</td>
				<td>&nbsp;</td>
				<td style='background-color:lightgreen;text-align:center'><b>yes</b></td>
				<td style='background-color:salmon;text-align:center'><b>no</b></td>
			</tr>			
		</table>
		<ul class='doctree'>
			<li class='info'>
				Serializers are designed to work on tree-shaped POJO models.  
				These are models where there are no referential loops (e.g. leaves with references to nodes, or nodes 
				in one branch referencing nodes in another branch).  
				There is a serializer setting {@code detectRecursions} to look for and handle these kinds of loops 
				(by setting these references to <jk>null</jk>), but it is not enabled by default since it introduces 
				a moderate performance penalty. 
		</ul>
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.BestPractices"></a>
	<h3 class='topic' onclick='toggle(this)'>2.13 - Best Practices</h3>
	<div class='topic'>
		<ol class='spaced-list'>
			<li>
				Reuse instances of serializers and parsers whenever possible.
				<br>They are designed to be thread safe and maintain internal caches of bean metadata to increase performance.
			<li>
				The {@link org.apache.juneau.serializer.Serializer#SERIALIZER_detectRecursions SERIALIZER_detectRecursions} 
				option on the {@link org.apache.juneau.serializer.Serializer} class can cause a performance penalty of 
				around 20%.  
				Therefore, it's recommended that this option be used only when necessary. 
			<li>
				In general, JSON serialization and parsing is about 20% faster than XML.  
				JSON is also more compact than XML.
				MessagePack is fastest and most compact of all.
			<li>
				The RDF parsers are SLOW.
				RDF simply isn't efficient with node traversal, so creating tree structures out of RDF models
				is highly inefficient.  	
			<li>
				The {@link org.apache.juneau.parser.Parser} methods that take in {@link org.apache.juneau.ClassMeta} 
				parameters are slightly faster than methods that 
				take in {@link java.lang.Class} or {@link java.lang.Object} parameters, since the latter methods involve 
				hash lookups to resolve to {@link org.apache.juneau.ClassMeta} parameters.
		</ol>
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-marshall.AdditionalInfo"></a>
	<h3 class='topic' onclick='toggle(this)'>2.14 - Additional Information</h3>
	<div class='topic'>
		<p>
			Extensive javadocs exist for individual language support.
			Refer to these docs for language-specific information.
		</p>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.AdditionalInfo.JSON"></a>
		<h4 class='topic' onclick='toggle(this)'>2.13.1 - JSON</h4>
		<div class='topic'>
			<h5 class='toc'>Additional Information - org.apache.juneau.json</h5>
			<ol class='toc'>
				<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#Overview'>JSON support overview</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#OverviewExample'>Example</a></p>
				</ol>
				<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#JsonSerializer'>JsonSerializer class</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#BeanAnnotations'>@Bean and @BeanProperty annotations</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#Collections'>Collections</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#JsonSchemaSupport'>JSON-Schema support</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#Recursion'> Non-tree models and recursion detection</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#SerializerConfigurableProperties'>Configurable properties</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#SerializerOtherNotes'>Other notes</a></p>
				</ol>
				<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#JsonParser'>JsonParser class</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#GenericParsing'>Parsing into generic POJO models</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#ParserConfigurableProperties'>Configurable properties</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/json/package-summary.html#ParserOtherNotes'>Other notes</a></p>
				</ol>
			</ol>
		</div>

		<!-- =================================================================================================== -->
		<a id="juneau-marshall.AdditionalInfo.XML"></a>
		<h4 class='topic' onclick='toggle(this)'>2.13.2 - XML</h4>
		<div class='topic'>
			<h5 class='toc'>Additional Information - org.apache.juneau.xml</h5>
			<ol class='toc'>
				<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#Overview'>XML support overview</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#OverviewExample'>XML support overview - example</a></p>
				</ol>
				<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#XmlSerializer'>XmlSerializer class</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#Methodology'>XML support methodology</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#XmlAnnotation'>@Xml annotations</a></p>
					<ol>
						<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#XmlName'>@Bean.typeName()</a></p>
						<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#XmlChildName'>@Xml.childName()</a></p>
						<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#XmlFormat'>@Xml.format()</a></p>
					</ol>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#Namespaces'>Namespaces</a></p>
					<ol>
						<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#AutoDetectNamespaces'>Auto-detection of namespaces</a></p>
					</ol>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#BeanAnnotations'>@Bean and @BeanProperty annotations</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#Collections'>Collections</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#XmlSchemaSupport'>XML-Schema support</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#Recursion'> Non-tree models and recursion detection</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#SerializerConfigurableProperties'>Configurable properties</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#SerializerOtherNotes'>Other notes</a></p>
				</ol>
				<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#XmlParser'>XmlParser class</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#GenericParsing'>Parsing into generic POJO models</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#ParserConfigurableProperties'>Configurable properties</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/xml/package-summary.html#ParserOtherNotes'>Other notes</a></p>
				</ol>
			</ol>
		</div>
		
		<!-- =================================================================================================== -->
		<a id="juneau-marshall.AdditionalInfo.HTML"></a>
		<h4 class='topic' onclick='toggle(this)'>2.13.3 - HTML</h4>
		<div class='topic'>
			<h5 class='toc'>Additional Information - org.apache.juneau.html</h5>
			<ol class='toc'>
				<li><p><a class='doclink' href='org/apache/juneau/html/package-summary.html#HtmlSerializer'>HTML serialization support</a></p> 
				<li><p><a class='doclink' href='org/apache/juneau/html/package-summary.html#HtmlParser'>HTML parsing support</a></p> 
			</ol>
		</div>
		
		<!-- =================================================================================================== -->
		<a id="juneau-marshall.AdditionalInfo.UON"></a>
		<h4 class='topic' onclick='toggle(this)'>2.13.4 - UON</h4>
		<div class='topic'>
			<h5 class='toc'>Additional Information - org.apache.juneau.uon</h5>
			<ol class='toc'>
				<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#Overview'>UON support overview</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#OverviewExample'>Example</a></p>
				</ol>
				<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#UrlEncodingSerializer'>UrlEncodingSerializer and UonSerializer classes</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#BeanAnnotations'>@Bean and @BeanProperty annotations</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#Collections'>Collections</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#Recursion'> Non-tree models and recursion detection</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#SerializerConfigurableProperties'>Configurable properties</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#SerializerOtherNotes'>Other notes</a></p>
				</ol>
				<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#UrlEncodingParser'>UrlEncodingParser and UonParser classes</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#GenericParsing'>Parsing into generic POJO models</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#ParserConfigurableProperties'>Configurable properties</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/uon/package-summary.html#ParserOtherNotes'>Other notes</a></p>
				</ol>
			</ol>
		</div>
					
		<!-- =================================================================================================== -->
		<a id="juneau-marshall.AdditionalInfo.URLEncoding"></a>
		<h4 class='topic' onclick='toggle(this)'>2.13.5 - URL-Encoding</h4>
		<div class='topic'>
			<h5 class='toc'>Additional Information - org.apache.juneau.urlencoding</h5>
			<ol class='toc'>
				<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#Overview'>URL encoding support overview</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#OverviewExample'>Example</a></p>
				</ol>
				<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#UrlEncodingSerializer'>UrlEncodingSerializer and UonSerializer classes</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#BeanAnnotations'>@Bean and @BeanProperty annotations</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#Collections'>Collections</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#Recursion'> Non-tree models and recursion detection</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#SerializerConfigurableProperties'>Configurable properties</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#SerializerOtherNotes'>Other notes</a></p>
				</ol>
				<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#UrlEncodingParser'>UrlEncodingParser and UonParser classes</a></p> 
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#GenericParsing'>Parsing into generic POJO models</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#ParserConfigurableProperties'>Configurable properties</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#ParserOtherNotes'>Other notes</a></p>
				</ol>
			</ol>
		</div>
	</div>
</div>

<!-- =========================================================================================================== -->
<a id="juneau-marshall-rdf"></a>
<h2 class='topic' onclick='toggle(this)'>3 - juneau-marshall-rdf</h2>
<div class='topic'>

	<h5 class='figure'>Maven Dependency</h5>
	<p class='bcode' style='width:500px;'>
	<xt>&lt;dependency&gt;</xt>
		<xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
		<xt>&lt;artifactId&gt;</xt>juneau-marshall-rdf<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>7.0.0<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
	</p>	
	
	<h5 class='figure'>Java Library</h5>
	<p class='bcode' style='width:500px;'>
	juneau-marshall-rdf-7.0.0.jar 
	</p>	

	<h5 class='figure'>OSGi Module</h5>
	<p class='bcode' style='width:500px;'>
	org.apache.juneau.marshall.rdf_7.0.0.jar 
	</p>	

	<p>
		The <code>juneau-marshall-rdf</code> library provides additional serializers and parsers for RDF.
		These rely on the Apache Jena library to provide support for the following languages:
	</p>
	<ul>
		<li>RDF/XML
		<li>RDF/XML-Abbrev 	
		<li>N-Triple
		<li>Turtle
		<li>N3
	</ul>				
	<p>
		The serializers and parsers work identically to those in <code>juneau-marshall</code>, but are
		packaged separately so that you don't need to pull in the Jena dependency unless you need it.
	</p>

	<p class='bcode'>
	<jc>// A simple bean</jc>
	<jk>public class</jk> Person {
		<jk>public</jk> String name = <js>"John Smith"</js>;
		<jk>public int</jk> age = 21;
	}
	
	<jc>// Serialize a bean to JSON, XML, or HTML</jc>
	Person p = <jk>new</jk> Person();

	<jc>// Produces:
	// &lt;rdf:RDF
	//  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	//  xmlns:jp="http://www.apache.org/juneaubp/"
	//  xmlns:j="http://www.apache.org/juneau/"&gt;
	// 	&lt;rdf:Description&gt;
	// 		&lt;jp:name&gt;John Smith&lt;/jp:name&gt;
	// 		&lt;jp:age&gt;21&lt;/jp:age&gt;
	// 	&lt;/rdf:Description&gt;
	// &lt;/rdf:RDF&gt;</jc>
	String rdfXml = RdfSerializer.<jsf>DEFAULT_XMLABBREV</jsf>.serialize(p);
	
	<jc>// Produces:
	// @prefix jp:      &lt;http://www.apache.org/juneaubp/&gt; .
	// @prefix j:       &lt;http://www.apache.org/juneau/&gt; .
	//	[]    jp:age  "21" ;
	//	      jp:name "John Smith" .</jc>
	String rdfN3 = RdfSerializer.<jsf>DEFAULT_N3</jsf>.serialize(p);

	<jc>// Produces:
	// _:A3bf53c85X3aX157cf407e2dX3aXX2dX7ffd &lt;http://www.apache.org/juneaubp/name&gt; "John Smith" .
	// _:A3bf53c85X3aX157cf407e2dX3aXX2dX7ffd &lt;http://www.apache.org/juneaubp/age&gt; "21" .</jc>
	String rdfNTriple = RdfSerializer.<jsf>DEFAULT_NTRIPLE</jsf>.serialize(p);
	</p>

	<h5 class='toc'>Additional Information - org.apache.juneau.jena</h5>
	<ol class='toc'>
		<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#RdfOverview'>RDF support overview</a></p> 
		<ol>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#RdfOverviewExample'>Example</a></p>
		</ol>
		<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#RdfSerializer'>RdfSerializer class</a></p> 
		<ol>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#Namespaces'>Namespaces</a></p>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#UriProperties'>URI properties</a></p>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#BeanAnnotations'>@Bean and @BeanProperty annotations</a></p>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#Collections'>Collections</a></p>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#RootProperty'>Root property</a></p>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#TypedLiterals'>Typed literals</a></p>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#Recursion'>Non-tree models and recursion detection</a></p>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#SerializerConfigurableProperties'>Configurable properties</a></p>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#SerializerOtherNotes'>Other notes</a></p>
		</ol>	
		<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#RdfParser'>RdfParser class</a></p> 
		<ol>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#GenericParsing'>Parsing into generic POJO models</a></p>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#ParserConfigurableProperties'>Configurable properties</a></p>
			<li><p><a class='doclink' href='org/apache/juneau/jena/package-summary.html#ParserOtherNotes'>Other notes</a></p>
		</ol>	
	</ol>
</div>
	
<!-- =========================================================================================================== -->
<a id="juneau-dto"></a>
<h2 class='topic' onclick='toggle(this)'>4 - juneau-dto</h2>
<div class='topic'>

	<h5 class='figure'>Maven Dependency</h5>
	<p class='bcode' style='width:500px;'>
	<xt>&lt;dependency&gt;</xt>
		<xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
		<xt>&lt;artifactId&gt;</xt>juneau-dto<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>7.0.0<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
	</p>	
	
	<h5 class='figure'>Java Library</h5>
	<p class='bcode' style='width:500px;'>
	juneau-dto-7.0.0.jar 
	</p>	

	<h5 class='figure'>OSGi Module</h5>
	<p class='bcode' style='width:500px;'>
	org.apache.juneau.dto_7.0.0.jar 
	</p>	

	<p>
		The <code>juneau-dto</code> library contains several predefined POJOs for generating commonly-used document types.
		This section describes support for these POJOs.
	</p>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-dto.HTML5"></a>
	<h3 class='topic' onclick='toggle(this)'>4.1 - HTML5</h3>
	<div class='topic'>
		<p>
			The Juneau HTML5 DTOs are simply beans with fluent-style setters that allow you to quickly construct HTML
			fragments as Java objects.  These object can then be serialized to HTML using one of the existing HTML 
			serializers, or to other languages such as JSON using the JSON serializers.
		</p>
		<p>
			The {@link org.apache.juneau.dto.html5.HtmlBuilder} class is a utility class with predefined static methods
			that allow you to easily construct DTO instances in a minimal amount of code. 
		</p>
		<p>
			The following examples show how to create HTML tables.
		</p>
		<table class='styled' style='width:auto'>
			<tr>
				<th>Java code</th>
				<th>HTML</th>
			</tr>
			<tr>
				<td class='code'>
	<jk>import static</jk> org.apache.juneau.dto.html5.HtmlBuilder.*;
	
	Object mytable = 	
		<jsm>table</jsm>(
			<jsm>tr</jsm>(
				<jsm>th</jsm>(<js>"c1"</js>),
				<jsm>th</jsm>(<js>"c2"</js>)
			),
			<jsm>tr</jsm>(
				<jsm>td</jsm>(<js>"v1"</js>),
				<jsm>td</jsm>(<js>"v2"</js>)
			)
		);

	String html = HtmlSerializer.<jsf>DEFAULT</jsf>.serialize(mytable);
				</td>
				<td class='code'><xt>
	&lt;table&gt;
		&lt;tr&gt;
			&lt;th&gt;<xv>c1</xv>&lt;/th&gt;
			&lt;th&gt;<xv>c2</xv>&lt;/th&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>v1</xv>&lt;/td&gt;
			&lt;td&gt;<xv>v2</xv>&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;
				</xt></td>
			</tr>
			<tr>
				<td class='code'>
	<jk>import static</jk> org.apache.juneau.dto.html5.HtmlBuilder.*;
		
	Object mydiv = 	
		<jsm>div</jsm>().align(<js>"center"</js>).onmouseover(<js>"alert(\"boo!\");"</js>)
		.children(
			<jsm>p</jsm>(<js>"Juneau supports "</js>, <jsm>b</jsm>(<jsm>i</jsm>(<js>"mixed"</js>)), <js>" content!"</js>)
		);

	String html = HtmlSerializer.<jsf>DEFAULT</jsf>.serialize(mydiv);
				</td>
				<td class='code'><xt>
	&lt;div <xa>align</xa>=<xs>'center'</xs> <xa>onmouseover</xa>=<xs>'alert("boo!");'</xs>&gt;
		&lt;p&gt;<xv>Juneau supports </xv>&lt;b&gt;&lt;i&gt;<xv>mixed</xv>&lt;/i&gt;&lt;/b&gt; <xv>content!</xv>&lt;/p&gt;
	&lt;/table&gt;
				</xt></td>
			</tr>
			<tr>
				<td class='code'>
	<jk>import static</jk> org.apache.juneau.dto.html5.HtmlBuilder.*;
		
	Object myform =
		<jsm>form</jsm>().action(<js>"/submit"</js>).method(<js>"POST"</js>)
		.children(
			<js>"Position (1-10000): "</js>, <jsm>input</jsm>(<js>"number"</js>).name(<js>"pos"</js>).value(1), <jsm>br</jsm>(),
			<js>"Limit (1-10000): "</js>, <jsm>input</jsm>(<js>"number"</js>).name(<js>"limit"</js>).value(100), <jsm>br</jsm>(),
			<jsm>button</jsm>(<js>"submit"</js>, <js>"Submit"</js>),
			<jsm>button</jsm>(<js>"reset"</js>, <js>"Reset"</js>)
		); 	

	String html = HtmlSerializer.<jsf>DEFAULT</jsf>.serialize(myform);
				</td>
				<td class='code'><xt>
		&lt;form <xa>action</xa>=<xs>'/submit'</xs> <xa>method</xa>=<xs>'POST'</xs>&gt;
			<xv>Position (1-10000):</xv> &lt;input <xa>name</xa>=<xs>'pos'</xs> <xa>type</xa>=<xs>'number'</xs> 
				<xa>value</xa>=<xs>'1'</xs>/&gt;&lt;br/&gt;
			<xv>Limit (1-10000):</xv> &lt;input <xa>name</xa>=<xs>'pos'</xs> <xa>type</xa>=<xs>'number'</xs> 
				<xa>value</xa>=<xs>'100'</xs>/&gt;&lt;br/&gt;
			&lt;button <xa>type</xa>=<xs>'submit'</xs>&gt;<xv>Submit</xv>&lt;/button&gt;
			&lt;button <xa>type</xa>=<xs>'reset'</xs>&gt;<xv>Reset</xv>&lt;/button&gt;			 
		&lt;/form&gt;
				</xt></td>
			</tr>
		</table>
		<p>
			Using the HTML5 DTOs, you should be able to construct any valid HTML5 from full document bodies
			to any possible fragments.
		</p>
		<p>
			The {@link org.apache.juneau.html.HtmlParser} class can be used convert these HTML documents back
			into POJOs.
		</p>
		<p>
			Other serializers and parsers (e.g. {@link org.apache.juneau.json.JsonSerializer}) can be used to 
			represent these POJOs in languages other than HTML.
		</p>
		
		<h5 class='toc'>Additional Information - org.apache.juneau.dto.html5</h5>
		<ol class='toc'>
			<li><p><a class='doclink' href='org/apache/juneau/dto/html5/package-summary.html#Overview'>Overview</a></p>
			<ol>
				<li><p><a class='doclink' href='org/apache/juneau/dto/html5/package-summary.html#Serialize'>Generating HTML5</a></p>
				<li><p><a class='doclink' href='org/apache/juneau/dto/html5/package-summary.html#Parse'>Parsing HTML5</a></p>
				<li><p><a class='doclink' href='org/apache/juneau/dto/html5/package-summary.html#Templates'>HTML5 Templates</a></p>
			</ol>
		</ol>
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-dto.Atom"></a>
	<h3 class='topic' onclick='toggle(this)'>4.2 - Atom</h3>
	<div class='topic'>
		<p>
			The Juneau ATOM feed DTOs are simply beans with fluent-style setters.
			<br>The following code shows a feed being created programmatically using the 
			{@link org.apache.juneau.dto.atom.AtomBuilder} class.
		</p>
		<p class='bcode'>
	<jk>import static</jk> org.apache.juneau.dto.atom.AtomBuilder.*;
	
	Feed feed = 
		<jsm>feed</jsm>(<js>"tag:juneau.apache.org"</js>, <js>"Juneau ATOM specification"</js>, <js>"2016-01-02T03:04:05Z"</js>)
		.subtitle(<jsm>text</jsm>(<js>"html"</js>).text(<js>"Describes &lt;em&gt;stuff&lt;/em&gt; about Juneau"</js>))
		.links(
			<jsm>link</jsm>(<js>"alternate"</js>, <js>"text/html"</js>, <js>"http://juneau.apache.org"</js>).hreflang(<js>"en"</js>),
			<jsm>link</jsm>(<js>"self"</js>, <js>"application/atom+xml"</js>, <js>"http://juneau.apache.org/feed.atom"</js>)
		)
		.rights(<js>"Copyright (c) ..."</js>)
		.generator(
			<jsm>generator</jsm>(<js>"Juneau"</js>).uri(<js>"http://juneau.apache.org/"</js>).version(<js>"1.0"</js>)
		)
		.entries(
			<jsm>entry</jsm>(<js>"tag:juneau.sample.com,2013:1.2345"</js>, <js>"Juneau ATOM specification snapshot"</js>, <js>"2016-01-02T03:04:05Z"</js>)
			.links(
				<jsm>link</jsm><js>"alternate"</js>, <js>"text/html"</js>, <js>"http://juneau.apache.org/juneau.atom"</js>),
				<jsm>link</jsm>(<js>"enclosure"</js>, <js>"audio/mpeg"</js>, <js>"http://juneau.apache.org/audio/juneau_podcast.mp3"</js>).length(1337)
			)
			.published(<js>"2016-01-02T03:04:05Z"</js>)
			.authors(
				<jsm>person</jsm>(<js>"Jane Smith"</js>).uri(<js>"http://juneau.apache.org/"</js>).email(<js>"janesmith@apache.org"</js>)
			)
			.contributors(
				<jsm>person</jsm>(<js>"John Smith"</js>)
			)
			.content(
				<jsm>content</jsm>(<js>"xhtml"</js>)
				.lang(<js>"en"</js>)
				.base(<js>"http://www.apache.org/"</js>)
				.text(<js>"&lt;div&gt;&lt;p&gt;&lt;i&gt;[Update: Juneau supports ATOM.]&lt;/i&gt;&lt;/p&gt;&lt;/div&gt;"</js>)
			)
		);
		</p>
		<p>
			To serialize this to ATOM, use the {@link org.apache.juneau.xml.XmlSerializer} class:
		</p>
		
		<h5 class='figure'>Example with no namespaces</h5>
		<p class='bcode'>
	<jc>// Create a serializer with readable output, no namespaces yet.</jc>
	XmlSerializer s = XmlSerializer.<jsm>create</jsm>().sq().ws().build();

	<jc>// Serialize to ATOM/XML</jc>
	String atomXml = s.serialize(feed);
		</p>
		
		<h5 class='figure'>Results</h5>
		<p class='bcode'>
	<xt>&lt;feed&gt;</xt>
		<xt>&lt;id&gt;</xt>
			tag:juneau.apache.org
		<xt>&lt;/id&gt;</xt>
		<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://juneau.apache.org/'</xs> <xa>rel</xa>=<xs>'alternate'</xs> 
			<xa>type</xa>=<xs>'text/html'</xs> <xa>hreflang</xa>=<xs>'en'</xs>/<xt>&gt;</xt>
		<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://juneau.apache.org/feed.atom'</xs> <xa>rel</xa>=<xs>'self'</xs> 
			<xa>type</xa>=<xs>'application/atom+xml'</xs>/<xt>&gt;</xt>
		<xt>&lt;rights&gt;</xt>
			Copyright (c) ...
		<xt>&lt;/rights&gt;</xt>
		<xt>&lt;title</xt> <xa>type</xa>=<xs>'text'</xs>&gt;</xt>
			Juneau ATOM specification
		<xt>&lt;/title&gt;</xt>
		<xt>&lt;updated&gt;</xt>2016-01-02T03:04:05Z<xt>&lt;/updated&gt;</xt>
		<xt>&lt;generator</xt> <xa>uri</xa>=<xs>'http://juneau.apache.org/'</xs> <xa>version</xa>=<xs>'1.0'</xs><xt>&gt;</xt>
			Juneau
		<xt>&lt;/generator&gt;</xt>
		<xt>&lt;subtitle</xt> <xa>type</xa>=<xs>'html'</xs><xt>&gt;</xt>
			Describes &lt;em&gt;stuff&lt;/em&gt; about Juneau
		<xt>&lt;/subtitle&gt;</xt>
		<xt>&lt;entry&gt;</xt>
			<xt>&lt;author&gt;</xt>
				<xt>&lt;name&gt;</xt>Jane Smith<xt>&lt;/name&gt;</xt>
				<xt>&lt;uri&gt;</xt>http://juneau.apache.org/<xt>&lt;/uri&gt;</xt>
				<xt>&lt;email&gt;</xt>janesmith@apache.org<xt>&lt;/email&gt;</xt>
			<xt>&lt;/author&gt;</xt>
			<xt>&lt;contributor&gt;</xt>
				<xt>&lt;name&gt;</xt>John Smith<xt>&lt;/name&gt;</xt>
			<xt>&lt;/contributor&gt;</xt>
			<xt>&lt;id&gt;</xt>
				tag:juneau.apache.org
			<xt>&lt;/id&gt;</xt>
			<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://juneau.apache.org/juneau.atom'</xs> 
				<xa>rel</xa>=<xs>'alternate'</xs> <xa>type</xa>=<xs>'text/html'</xs>/<xt>&gt;</xt>
			<xt>&lt;link</xt> <xa>href</xa>=<xs>'http://juneau.apache.org/audio/juneau_podcast.mp3'</xs> 
				<xa>rel</xa>=<xs>'enclosure'</xs> <xa>type</xa>=<xs>'audio/mpeg'</xs> <xa>length</xa>=<xs>'12345'</xs>/<xt>&gt;</xt>
			<xt>&lt;title&gt;</xt>
				Juneau ATOM specification snapshot
			<xt>&lt;/title&gt;</xt>
			<xt>&lt;updated&gt;</xt>2016-01-02T03:04:05Z<xt>&lt;/updated&gt;</xt>
			<xt>&lt;content</xt> <xa>base</xa>=<xs>'http://www.apache.org/'</xs> <xa>lang</xa>=<xs>'en'</xs> 
				<xa>type</xa>=<xs>'xhtml'</xs><xt>&gt;</xt>
				<xt>&lt;div</xt> <xa>xmlns</xa>=<xs>"http://www.w3.org/1999/xhtml"</xs>
					<xt>&gt;&lt;p&gt;&lt;i&gt;</xt>[Update: Juneau supports ATOM.]<xt>&lt;/i&gt;&lt;/p&gt;&lt;/div&gt;</xt>
			<xt>&lt;/content&gt;</xt>
			<xt>&lt;published&gt;</xt>2016-01-02T03:04:05Z<xt>&lt;/published&gt;</xt>
		<xt>&lt;/entry&gt;</xt>
	<xt>&lt;/feed&gt;</xt>		
		</p>
		<p>
			The {@link org.apache.juneau.xml.XmlParser} class can be used convert these Atom documents back into POJOs.
		</p>
		<p>
			Other serializers and parsers (e.g. {@link org.apache.juneau.json.JsonSerializer}) can be used to 
			represent these POJOs in languages other than XML.
		</p>
		
		<h5 class='toc'>Additional Information - org.apache.juneau.dto.atom</h5>
		<ol class='toc'>
			<li><p><a class='doclink' href='org/apache/juneau/dto/atom/package-summary.html#Overview'>Overview</a></p>
			<ol>
				<li><p><a class='doclink' href='org/apache/juneau/dto/atom/package-summary.html#Serialize'>Serializing ATOM feeds</a></p>
				<ol>
					<li><p><a class='doclink' href='org/apache/juneau/dto/atom/package-summary.html#AtomJson'>ATOM/JSON</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/dto/atom/package-summary.html#AtomRdfXml'>ATOM/RDF/XML</a></p>
					<li><p><a class='doclink' href='org/apache/juneau/dto/atom/package-summary.html#AtomHtml'>ATOM/HTML</a></p>
				</ol>
				<li><p><a class='doclink' href='org/apache/juneau/dto/atom/package-summary.html#Parse'>Parsing ATOM feeds</a></p>
			</ol>
		</ol>
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-dto.Swagger"></a>
	<h3 class='topic' onclick='toggle(this)'>4.3 - Swagger</h3>
	<div class='topic'>
		<p>
			The Juneau Swagger DTOs are simply beans with fluent-style setters that allow you to quickly construct 
			Swagger documents as Java objects.  
			These object can then be serialized to JSON using one of the existing JSON serializers, or to other 
			languages such as XML or HTML using the other serializers.
		</p>
		<p>
			The {@link org.apache.juneau.dto.swagger.SwaggerBuilder} class is a utility class with predefined static 
			methods that allow you to easily construct DTO instances in a minimal amount of code. 
		</p>
		<p>
			The following is an example Swagger document from the 
			<a href="http://petstore.swagger.io/">Swagger website</a>.
		</p>
		<p class='bcode'>
	{
		<jf>"swagger"</jf>: <js>"2.0"</js>,
		<jf>"info"</jf>: {
			<jf>"title"</jf>: <js>"Swagger Petstore"</js>,
			<jf>"description"</jf>: <js>"This is a sample server Petstore server."</js>,
			<jf>"version"</jf>: <js>"1.0.0"</js>,
			<jf>"termsOfService"</jf>: <js>"http://swagger.io/terms/"</js>,
			<jf>"contact"</jf>: {
				<jf>"email"</jf>: <js>"apiteam@swagger.io"</js>
			},
			<jf>"license"</jf>: {
				<jf>"name"</jf>: <js>"Apache 2.0"</js>,
				<jf>"url"</jf>: <js>"http://www.apache.org/licenses/LICENSE-2.0.html"</js>
			}
		},
		<jf>"host"</jf>: <js>"petstore.swagger.io"</js>,
		<jf>"basePath"</jf>: <js>"/v2"</js>,
		<jf>"tags"</jf>: [
			{
				<jf>"name"</jf>: <js>"pet"</js>,
				<jf>"description"</jf>: <js>"Everything about your Pets"</js>,
				<jf>"externalDocs"</jf>: {
					<jf>"description"</jf>: <js>"Find out more"</js>,
					<jf>"url"</jf>: <js>"http://swagger.io"</js>
				}
			}
		],
		<jf>"schemes"</jf>: [
			<js>"http"</js>
		],
		<jf>"paths"</jf>: {
			<jf>"/pet"</jf>: {
				<jf>"post"</jf>: {
					<jf>"tags"</jf>: [
						<js>"pet"</js>
					],
					<jf>"summary"</jf>: <js>"Add a new pet to the store"</js>,
					<jf>"description"</jf>: <js>""</js>,
					<jf>"operationId"</jf>: <js>"addPet"</js>,
					<jf>"consumes"</jf>: [
						<js>"application/json"</js>,
						<js>"text/xml"</js>
					],
					<jf>"produces"</jf>: [
						<js>"application/json"</js>,
						<js>"text/xml"</js>
					],
					<jf>"parameters"</jf>: [
						{
							<jf>"in"</jf>: <js>"body"</js>,
							<jf>"name"</jf>: <js>"body"</js>,
							<jf>"description"</jf>: <js>"Pet object that needs to be added to the store"</js>,
							<jf>"required"</jf>: <jk>true</jk>
						}
					],
					<jf>"responses"</jf>: {
						<jf>"405"</jf>: {
							<jf>"description"</jf>: <js>"Invalid input"</js>
						}
					}
				}
			}
		},
	}		
		</p>
		<p>
			This document can be generated by the following Java code:
		</p>
		<p class='bcode'>
	<jk>static import</jk> org.apache.juneau.dto.swagger.SwaggerBuilder.*;

	Swagger swagger = <jsm>swagger</jsm>()
		.swagger(<js>"2.0"</js>)
		.info(
			<jsm>info</jsm>(<js>"Swagger Petstore"</js>, <js>"1.0.0"</js>)
				.description(<js>"This is a sample server Petstore server."</js>)
				.termsOfService(<js>"http://swagger.io/terms/"</js>)
				.contact(
					<jsm>contact</jsm>().email(<js>"apiteam@swagger.io"</js>)
				)
				.license(
					<jsm>license</jsm>(<js>"Apache 2.0"</js>).url(<js>"http://www.apache.org/licenses/LICENSE-2.0.html"</js>)
				)
		)
		.host(<js>"petstore.swagger.io"</js>)
		.basePath(<js>"/v2"</js>)
		.tags(
			<jsm>tag</jsm>(<js>"pet"</js>).description(<js>"Everything about your Pets"</js>)
				.externalDocs(
					<jsm>externalDocumentation</jsm>(<js>"http://swagger.io"</js>, <js>"http://swagger.io"</js>)
				)
		)
		.schemes(<js>"http"</js>)
		.path(<js>"/pet"</js>, <js>"post"</js>,
			<jsm>operation</jsm>()
				.tags(<js>"pet"</js>)
				.summary(<js>"Add a new pet to the store"</js>)
				.description(<js>""</js>)
				.operationId(<js>"addPet"</js>)
				.consumes(MediaType.<jsf>JSON</jsf>, MediaType.<jsf>XML</jsf>)
				.produces(MediaType.<jsf>JSON</jsf>, MediaType.<jsf>XML</jsf>)
				.parameters(
					<jsm>parameterInfo</jsm>(<js>"body"</js>, <js>"body"</js>)
						.description(<js>"Pet object that needs to be added to the store"</js>)
						.required(<jk>true</jk>)
				)
				.response(405, <jsm>responseInfo</jsm>(<js>"Invalid input"</js>))
		);

	<jc>// Serialize using JSON serializer.</jc>
	String swaggerJson = JsonSerializer.<jsf>DEFAULT_READABLE</jsf>.serialize(swagger);
	
	<jc>// Or just use toString().</jc>
	String swaggerJson = swagger.toString();
		</p>
		<p>
			Methods that take in beans and collections of beans can also take in JSON representations
			of those objects.
		</p>
		<p class='bcode'>
	<jc>// Pass in a JSON object representation of an Info object.</jc>
	swagger.info(<js>"{title:'Swagger Petstore',...}"</js>);
		</p>
		<p>
			Properties can also be accessed via the {@link org.apache.juneau.dto.swagger.SwaggerElement#get(String,Class)}
			and {@link org.apache.juneau.dto.swagger.SwaggerElement#set(String,Object)} methods.
			<br>These methods can also be used to set and retrieve non-Swagger attributes such as 
			<js>"$ref"</js> (which is not a part of the Swagger spec, but is part of the JSON Schema spec).
		</p>
		<p class='bcode'>
	<jc>// Set a non-standard attribute.</jc>
	swagger.set(<js>"$ref"</js>, <js>"http://foo.com"</js>);
	
	<jc>// Retrieve a non-standard attribute.</jc>
	URI ref = swagger.get(<js>"$ref"</js>, URI.<jk>class</jk>);
		</p>
		<p>
			Swagger docs can be parsed back into Swagger beans using the following code:
		</p>
		<p class='bcode'>
	Swagger swagger = JsonParser.<jsf>DEFAULT</jsf>.parse(swaggerJson, Swagger.<jk>class</jk>);
		</p>
	</div>

</div>

<!-- =========================================================================================================== -->
<a id="juneau-svl"></a>
<h2 class='topic' onclick='toggle(this)'>5 - juneau-svl</h2>
<div class='topic'>

	<h5 class='figure'>Maven Dependency</h5>
	<p class='bcode' style='width:500px;'>
	<xt>&lt;dependency&gt;</xt>
		<xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
		<xt>&lt;artifactId&gt;</xt>juneau-svl<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>7.0.0<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
	</p>	
	
	<h5 class='figure'>Java Library</h5>
	<p class='bcode' style='width:500px;'>
	juneau-svl-7.0.0.jar 
	</p>	

	<h5 class='figure'>OSGi Module</h5>
	<p class='bcode' style='width:500px;'>
	org.apache.juneau.svl_7.0.0.jar 
	</p>	

	<!-- ======================================================================================================== -->
	<a id="juneau-svl.SimpleVarLanguage"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1 - Simple Variable Language</h3>
	<div class='topic'>
		<p>
			The <l>juneau-svl</l> module defines an API for a language called <l>Simple Variable Language</l>.
			<br>In a nutshell, Simple Variable Language (or SVL) is text that contains variables of the form <js>"$varName{varKey}"</js>.
			<br>It is used extensively in the Config, REST and Microservice APIs.
		</p>
		<p>
			Most variables can be recursively nested within the varKey (e.g. <js>"$FOO{$BAR{xxx},$BAZ{xxx}}"</js>)
			and can return values that themselves contain more variables.
		</p>
		<p>
			The {@link org.apache.juneau.svl.VarResolver} class is used to resolve variables.
			<br>The {@link org.apache.juneau.svl.VarResolver#DEFAULT} resolver is a reusable instance of this class 
			configured with the following basic variables:
		</p>
		<ul>
			<li><code>$S{key}</code>,<code>$S{key,default}</code> - System properties.
	 		<li><code>$E{key}</code>,<code>$E{key,default}</code> - Environment variables.
	 		<li><code>$IF{booleanValue,thenValue[,elseValue]}</code> - If-else patterns.
	 		<li><code>$SW{test,matchPattern,thenValue[,matchPattern,thenValue][,elseValue]}</code> - Switch patterns.
	 		<li><code>$CO{arg1[,arg2...]}</code> - Coalesce variable.
	 		<li><code>$CR{arg1[,arg2...]}</code> - Coalesce-and-recurse variable.
		</ul>
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Use the default variable resolver to resolve a string that contains $S (system property) variables</jc>
	String myProperty = VarResolver.<jsf>DEFAULT</jsf>.resolve(<js>"The Java home directory is $S{java.home}"</js>);
		</p>
		<p>
			The following shows how variables can be arbitrarily nested...
		</p>
		<p class='bcode'>
	<jc>// Look up a property in the following order:
	// 1) MYPROPERTY environment variable.
	// 2) 'my.property' system property if environment variable not found.
	// 3) 'not found' string if system property not found.</jc>
	String myproperty = VarResolver.<jsf>DEFAULT</jsf>.resolve(<js>"$E{MYPROPERTY,$S{my.property,not found}}"</js>);
	 	</p>
	 </div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-svl.SvlVariables"></a>
	<h3 class='topic' onclick='toggle(this)'>5.2 - SVL Variables</h3>
	<div class='topic'>
		<p>
			Variables are defined through the {@link org.apache.juneau.svl.Var} API.
			<br>The API comes with several predefined variables and is easily extensible.
		</p>
		<p>
			The following is an example of a variable that performs URL-Encoding on strings.
		</p>
		<p class='bcode'>
	<jc>// First create our var.</jc>
	<jk>public class</jk> UrlEncodeVar <jk>extends</jk> SimpleVar {
		
		<jc>// Must have a no-arg constructor!</jc>
		<jk>public</jk> UrlEncodeVar() {
			<jk>super</jk>(<js>"UE"</js>);
		}	
		
		<jc>// The method we must implement</jc>
		<ja>@Override</ja>
		<jk>public</jk> String resolve(VarResolverSession session, String key) {
			<jk>return</jk> URLEncoder.<jsm>encode</jsm>(key, <js>"UTF-8"</js>);
		}
	}
	
	<jc>// Next create a var resolver that extends the existing DEFAULT resolver
	// that supports resolving system properties.</jc>
	VarResolver r = VarResolver.<jsf>DEFAULT</jsf>
		.builder()
		.vars(UrlEncodeVar.<jk>class</jk>)
		.build();
	
	<jc>// Retrieve a system property and URL-encode it if necessary.</jc>
	String myProperty = r.resolve(<js>"$UE{$S{my.property}}"</js>);
		</p>
		<p>
			The following shows the class hierarchy of the {@link org.apache.juneau.svl.Var} class:
		</p>  
		<ul class='doctree'>
			<li class='jac'>{@link org.apache.juneau.svl.Var} - Superclass of all vars.
			<ul>
				<li class='jac'>{@link org.apache.juneau.svl.SimpleVar} - Superclass of all vars that return strings.
				<ul>
					<li class='jac'>{@link org.apache.juneau.svl.DefaultingVar} - Variables that define a default value if the resolve method returns null.
					<ul>
						<li class='jac'>{@link org.apache.juneau.svl.MapVar} - Variables that pull values from maps.
					</ul>
					<li class='jac'>{@link org.apache.juneau.svl.MultipartVar} - Variables that consist of 2 or more comma-delimited arguments.
				</ul>
				<li class='jac'>{@link org.apache.juneau.svl.StreamedVar} - Superclass of all vars that stream their value to writers.
			</ul>
		</ul>
		<p>
			The following is the list of default variables defined in all modules:
		</p>
		<table class='styled' style='min-width:800px;width:50%'>
			<tr>
				<th>Module</th><th>Class</th><th>Pattern</th>
			</tr>
			<tr class='dark'>
				<td rowspan="6" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-svl</td>
				<td>{@link org.apache.juneau.svl.vars.EnvVariablesVar}</td>
				<td class='code'>$E{envVar[,defaultValue]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.svl.vars.SystemPropertiesVar}</td>
				<td class='code'>$S{systemProperty[,defaultValue]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.svl.vars.CoalesceVar}</td>
				<td class='code'>$CO{arg1[,arg2...]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.svl.vars.CoalesceAndRecurseVar}</td>
				<td class='code'>$CR{arg1[,arg2...]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.svl.vars.IfVar}</td>
				<td class='code'>$IF{booleanArg,thenValue[,elseValue]}</td>
			</tr>
			<tr class='dark dd'>
				<td>{@link org.apache.juneau.svl.vars.SwitchVar}</td>
				<td class='code'>$SW{stringArg(,pattern,thenValue)+[,elseValue]}</td>
			</tr>
			<tr class='light dd'>
				<td rowspan="1" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-config</td>
				<td>{@link org.apache.juneau.config.vars.ConfigVar}</td>
				<td class='code'>$C{key[,defaultValue]}</td>
			</tr>
			<tr class='dark'>
				<td rowspan="14" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-rest-server</td>
				<td>{@link org.apache.juneau.rest.vars.FileVar}</td>
				<td class='code'>$F{path[,defaultValue]}}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.ServletInitParamVar}</td>
				<td class='code'>$I{name[,defaultValue]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.LocalizationVar}</td>
				<td class='code'>$L{key[,args...]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestAttributeVar}</td>
				<td class='code'>$RA{key1[,key2...]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestFormDataVar}</td>
				<td class='code'>$RF{key1[,key2...]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestHeaderVar}</td>
				<td class='code'>$RH{key1[,key2...]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestHeaderVar}</td>
				<td class='code'>$RI{key}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestPathVar}</td>
				<td class='code'>$RP{key1[,key2...]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestQueryVar}</td>
				<td class='code'>$RQ{key1[,key2...]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestVar}</td>
				<td class='code'>$R{key1[,key2...]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.SerializedRequestAttrVar}</td>
				<td class='code'>$SA{contentType,key[,defaultValue]}</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.UrlVar}</td>
				<td class='code'>$U{uri}></td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.UrlEncodeVar}</td>
				<td class='code'>$UE{uriPart}</td>
			</tr>
			<tr class='dark dd'>
				<td>{@link org.apache.juneau.rest.vars.WidgetVar}</td>
				<td class='code'>$W{widgetName}</td>
			</tr>
			<tr class='light'>
				<td rowspan="2" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-microservice-server</td>
				<td>{@link org.apache.juneau.microservice.vars.ArgsVar}</td>
				<td class='code'>$ARG{key[,defaultValue]}</td>
			</tr>
			<tr class='light dd'>
				<td>{@link org.apache.juneau.microservice.vars.ManifestFileVar}</td>
				<td class='code'>$MF{key[,defaultValue]}</td>
			</tr>
		</table>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-svl.VarResolvers"></a>
	<h3 class='topic' onclick='toggle(this)'>5.3 - VarResolvers and VarResolverSessions</h3>
	<div class='topic'>
		<p>
			The main class for performing variable resolution is {@link org.apache.juneau.svl.VarResolver}.
			<br>Two methods are provided for resolving variables:
		</p>
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.svl.VarResolver}
			<ul>
				<li class='jm'>{@link org.apache.juneau.svl.VarResolver#resolve(String) resolve(String)} 
					- Resolves variables and returns the results as a simple string.
				<li class='jm'>{@link org.apache.juneau.svl.VarResolver#resolveTo(String,Writer) resolveTo(String,Writer)} 
					- Resolves variables and sends results to a writer.
			</ul>
		</ul>
		<p>
			Var resolvers can rely on the existence of other objects.
			<br>For example, {@link org.apache.juneau.config.vars.ConfigVar} relies on the existence of a {@link org.apache.juneau.config.Config}.
			<br>This is accomplished through the following:
		</p>
		<ul class='spaced-list'>
			<li>Context-objects - Objects set on the resolver.
			<li>Session-objects - Objects set on the resolver session.
		</ul>
		<p>
			The following two classes are identical in behavior except for which objects they can access:
		</p>
		<ul>
			<li class='jc'>{@link org.apache.juneau.svl.VarResolver} - Has access to context objects only.
			<li class='jc'>{@link org.apache.juneau.svl.VarResolverSession} - Has access to context and session objects.
		</ul>
		<p>
			Context and session objects are set through the following methods:
		</p>
		<ul>
			<li class='jm'>{@link org.apache.juneau.svl.VarResolverBuilder#contextObject(String,Object)} - Context objects.
			<li class='jm'>{@link org.apache.juneau.svl.VarResolverSession#sessionObject(String,Object)} - Session objects.
			<li class='jm'>{@link org.apache.juneau.svl.VarResolver#createSession(Map)} - Session objects.
		</ul>
		<p>
			Both kinds of objects are accessible through the following method:
		</p>
		<ul>
			<li class='jm'>{@link org.apache.juneau.svl.VarResolverSession#getSessionObject(Class, String)}
		</ul>
		<p>
			Var resolvers can be cloned and extended by using the {@link org.apache.juneau.svl.VarResolver#builder()} method.
			<br>Cloning a resolver will copy it's {@link org.apache.juneau.svl.Var} class names and context objects.
		</p>
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Create a resolver that copies the default resolver and adds $C and $ARG vars.</jc>
	VarResolver myVarResolver = VarResolver.<jsf>DEFAULT</jsf>
		.builder()
		.vars(ConfigVar.<jk>class</jk>, ArgsVar.<jk>class</jk>)
		.build();
		</p>
	</div>	
	
	<!-- ======================================================================================================== -->
	<a id="juneau-svl.OtherNotes"></a>
	<h3 class='topic' onclick='toggle(this)'>5.4 - Other Notes</h3>
	<div class='topic'>
		<ul class='spaced-list'>
			<li>
				The escape character <js>'\'</js> can be used when necessary to escape the following characters: 
				<code>$ , { }</code>
			<li>
				<b>WARNING:</b>  It is possible to cause {@link java.lang.StackOverflowError StackOverflowErrors} if 
				your nested variables result in a recursive loop (e.g. the environment variable 
				<code>'MYPROPERTY'</code> has the value <code>'$E{MYPROPERTY}'</code>).
				So don't do that!
			<li>
				As a general rule, this class tries to be as efficient as possible by not creating new strings when not 
				needed.
				<br>For example, calling the resolve method on a string that doesn't contain variables (e.g. 
				<code>resolver.resolve(<js>"foobar"</js>)</code>) will simply be a no-op and return the same string.
		</ul>
	</div>	
</div>

<!-- =========================================================================================================== -->
<a id="juneau-config"></a>
<h2 class='topic' onclick='toggle(this)'>6 - juneau-config</h2>
<div class='topic'>

	<h5 class='figure'>Maven Dependency</h5>
	<p class='bcode' style='width:500px;'>
	<xt>&lt;dependency&gt;</xt>
		<xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
		<xt>&lt;artifactId&gt;</xt>juneau-config<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>7.0.0<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
	</p>	
	
	<h5 class='figure'>Java Library</h5>
	<p class='bcode' style='width:500px;'>
	juneau-config-7.0.0.jar 
	</p>	

	<h5 class='figure'>OSGi Module</h5>
	<p class='bcode' style='width:500px;'>
	org.apache.juneau.config_7.0.0.jar 
	</p>	

	<!-- ======================================================================================================== -->
	<a id="juneau-config.Overview"></a>
	<h3 class='topic' onclick='toggle(this)'>6.1 - Overview</h3>
	<div class='topic'>
		<p>
			The <code>juneau-config</code> library contains a powerful API for creating and using INI-style config files.
		</p>
		<p>
			An example of the contents of a config file:
		</p>
		<p class='bcode'>
	<cc># A set of entries</cc>
	<cs>[Section1]</cs>

	<cc># An integer</cc>
	<ck>key1</ck> = <cv>1</cv>

	<cc># A boolean</cc>
	<ck>key2</ck> = <cv>true</cv>
	
	<cc># An array</cc>
	<ck>key3</ck> = <cv>1,2,3</cv>

	<cc># A POJO</cc>
	<ck>key4</ck> = <cv>http://bar</cv>
		</p>
		<p>
			This code shows how the file can be accessed:
		</p>
		<p class='bcode'>
	<jc>// Load our config file</jc>
	Config c = Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
	
	<jc>// Read values from section #1</jc>
	<jk>int</jk> key1 = c.getInt(<js>"Section1/key1"</js>);
	<jk>boolean</jk> key2 = c.getBoolean(<js>"Section1/key2"</js>);
	<jk>int</jk>[] key3 = c.getObject(<js>"Section1/key3"</js>, <jk>int</jk>[].<jk>class</jk>);
	URL key4 = c.getObject(<js>"Section1/key4"</js>, URL.<jk>class</jk>);
		</p>
		<p>
			The config language may look simple, but it is a very powerful feature with many capabilities including:
		</p>
		<ul class='spaced-list'>
			<li>
				Support for storing and retrieving any of the following data types:
				<ul>
					<li>Primitives
					<li>POJOs
					<li>Beans
					<li>Arrays, Maps, and Collections of anything
					<li>Binary data
				</ul>
			<li>
				A listener API that allows you to, for example, reinitialize your REST resource if the config file 
				changes, or listen for changes to particular sections or values.
			<li>
				Filesystem watcher integration allows configs to reflect changes on the file system in real-time.
			<li>
				Config files can be modified through the Config class (e.g. add/remove/modify sections and keys, add/remove comments and whitespace, etc...).
				<br>When using these APIs, you <b>DO NOT</b> lose formatting in your existing configuration file.
				All existing whitespace and comments are preserved for you!
			<li>
				Support for encoding of values for added security.
			<li>
				Config sections can be used to directly populate beans.
			<li>
				Config sections can be accessed and manipulated through Java interface proxies.
			<li>
				An extensible storage API allows you to write your own config storage location for files such as databases or the cloud.
		</ul>
		
		<!-- ======================================================================================================== -->
		<a id="juneau-config.SyntaxRules"></a>
		<h4 class='topic' onclick='toggle(this)'>6.1.1 - Syntax Rules</h4>
		<div class='topic'>
			<ul class='spaced-list'>
				<li>
					Each config file contains zero or more sections containing zero or more entries:
					<p class='bcode'>
	<cs>[Section1]</cs>
	<ck>key1</ck> = <cv>1</cv>

	<cs>[Section2]</cs>
	<ck>key1</ck> = <cv>2</cv>
					</p>
				<li>
					Unicode escapes can be used in values.
					<p class='bcode'>
	<ck>key1</ck> = <cv>\u0070\u0075\u0062\u006c\u0069\u0063</cv>
					</p>
				<li>
					Comment lines start with the <js>'#'</js> character and can be placed on lines before sections and entries:
					<p class='bcode'>
	<cc># A comment about this section</cc>
	<cs>[Section1]</cs>
	
	<cc># A comment about this entry</cc>
	<ck>key1</ck> = <cv>1</cv>
					</p>
				<li>
					Comments can also be placed on the same line as entries:
					<p class='bcode'>
	<ck>key1</ck> = <cv>1</cv>  <cc># A comment about this entry</cc>
					</p>
				<li>
					Values containing <js>'#'</js> must be escaped to prevent identification as a comment character:
					<p class='bcode'>
	<ck>valueContainingPound</ck> = <cv>Value containing \u0023 character</cv>
					</p>
					<br>Likewise, <js>'\'</js> should be escaped to prevent confusion with unicode escapes.
				<li>
					Values containing newlines can span multiple lines.
					<br>Subsequent lines start with a tab character.
					<p class='bcode'>
	<ck>multiLineValue</ck> = 
		<cv>Line 1,</cv>
		<cv>Line 2,</cv>
		<cv>Line 3</cv>
					</p>
					<br>When retrieved, the above translates to <js>"Line1,\nLine2,\nLine3"</js>.
				<li>
					Leading and trailing whitespace on values are ignored.
				<li>
					Whitespace is not ignored within multi-line values (except for the leading tab character on each line).
				<li>
					Blank lines can be used anywhere in the file.
					<p class='bcode'>
	<cc># A comment line</cc>
	
	<cc># Another comment line</cc>
	<cs>[Section1]</cs>
	...
					</p>
				<li>
					Values located before any sections are considered part of the no-name section, meaning
					they are accessed simply by key and not section/key.
					<p class='bcode'>
	<cc># Top of file</cc>
	
	<cc># Use config.getString("key1") to retrieve.</cc>
	<ck>key1</ck> = <cv>val1</cv>
	
	<cc># The first section</cc>
	<cs>[Section1]</cs>

	<cc># Use config.getString("Section1/key2") to retrieve.</cc>
	<ck>key2</ck> = <cv>val2</cv>
					</p>
				<li>
					Section and key names must be at least one character long and not consist of any of the following
					characters:
					<p class='bcode'>
	/ \ [ ] = #
					</p>
				<li>
					Whitespace in section and key names is technically allowed but discouraged.
			</ul>
		</div>
	</div>
		
	<!-- ======================================================================================================== -->
	<a id="juneau-config.EntryTypes"></a>
	<h3 class='topic' onclick='toggle(this)'>6.2 - Entry Types</h3>
	<div class='topic'>
		<p>
			Configuration files can contain entries for anything from primitive types up to complex hierarchies of POJOs consisting of maps, collections, and/or beans.
		</p>

		<!-- ======================================================================================================== -->
		<a id="juneau-config.PrimitiveTypes"></a>
		<h4 class='topic' onclick='toggle(this)'>6.2.1 - Primitive Types</h4>
		<div class='topic'>
			<p>
				The most common case for configuration values are primitives.
			</p>
			<p class='bcode'>
	<cc># A string</cc>
	<ck>key1</ck> = <cv>foo</cv>

	<cc># A boolean</cc>
	<ck>key2</ck> = <cv>true</cv>

	<cc># An integer</cc>
	<ck>key3</ck> = <cv>123</cv>
	
	<cc># A long</cc>
	<ck>key4</ck> = <cv>10000000000</cv>
			</p>
			<p>
				The following methods are provided for accessing primitive values:
			</p>
			<ul class='doctree'>
				<li class='jc'>{@link org.apache.juneau.config.Config}
				<ul>
					<li class='jm'>{@link org.apache.juneau.config.Config#getString(String) getString(String)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getString(String,String) getString(String,String)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getBoolean(String) getBoolean(String)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getBoolean(String,boolean) getBoolean(String,boolean)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getInt(String) getInt(String)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getInt(String,int) getInt(String,int)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getLong(String) getLong(String)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getLong(String,long) getLong(String,long)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getFloat(String) getFloat(String)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getFloat(String,float) getFloat(String,long)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getDouble(String) getDouble(String)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getDouble(String,double) getDouble(String,long)}
				</ul>
			</ul>
			<p>
				On integers and longs, <js>"K"</js>, <js>"M"</js>, and <js>"G"</js> can be used to identify kilo, mega, and giga.
			</p>	
			<p class='bcode'>
	<ck>key1</ck> = <cv>100K</cv>  <cc># Same as 1024000</cc>
	<ck>key2</ck> = <cv>100M</cv>  <cc># Same as 104857600</cc>
			</p>
			<p>
				Numbers can also use hexadecimal and octal notation:
			</p>	
			<p class='bcode'>
	<ck>hex1</ck> = <cv>0x12FE</cv>
	<ck>hex2</ck> = <cv>0X12FE</cv>
	<ck>octal1</ck> = <cv>01234</cv>
			</p>
			<p>
				Strings with newlines get broken into separate lines:
			</p>
			<p class='bcode'>
	<ck>key1</ck> = <cv>This is a particularly long sentence that we want to split</cv>
		<cv>onto separate lines</cv>.
			</p>
			<p>
				Typically, multi-line values are started on the next line for clarity like so:
			</p>
			<p class='bcode'>
	<ck>key1</ck> = 
		<cv>This is a particularly long sentence that we want to split</cv>
		<cv>onto separate lines</cv>.
			</p>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-config.POJOs"></a>
		<h4 class='topic' onclick='toggle(this)'>6.2.2 - POJOs</h4>
		<div class='topic'>
			<p>
				The following methods are provided for accessing POJO values:
			</p>
			<ul class='doctree'>
				<li class='jc'>{@link org.apache.juneau.config.Config}
				<ul>
					<li class='jm'>{@link org.apache.juneau.config.Config#getObject(String,Class) getObject(String,Class)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getObjectWithDefault(String,Object,Class) getObjectWithDefault(String,T,Class)}
				</ul>
			</ul>
			<p>
				In theory, any <a class='doclink' href='#juneau-marshall.PojoCategories'>parsable</a> POJO type can be represented
				as a config value. 
				<br>However in practice, we're typically talking about the following:
			</p>
			<ul>
				<li>Objects convertable from Strings.
				<li>Beans.
			</ul>
			<p>
				An example of an object convertible from a String was already shown in an example above.
				<br>In that case, it was a URL which has a public constructor that takes in a String:
			</p>
			<p class='bcode'>
	<cc># A POJO</cc>
	<ck>key4</ck> = <cv>http://bar</cv>
			</p>
			<p class='bcode'>
	<jc>// Read values from section #1</jc>
	URL key4 = c.getObject(<js>"Section1/key4"</js>, URL.<jk>class</jk>);
			</p>
			<p>
				Beans are represented as Lax JSON by default:
			</p>
			<p class='bcode'>
	<jc>// Contact information</jc>
	<cs>[ContactInfo]</cs>
	<ck>address</ck> = 
		<cv>{
			street: '123 Main Street',
			city: 'Anywhere',
			state: 'NY',
			zip: 12345
		}</cv>
			</p>
			<p class='bcode'>
	<jc>// Example bean</jc>
	<jk>public class</jk> Address {
		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>;
		<jk>public</jk> StateEnum <jf>state</jf>;
		<jk>public int</jk> <jf>zip</jf>;
	}

	<jc>// Example usage</jc>
	Config c = Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
	Address myAddress = c.getObject(<js>"ContactInfo/address"</js>, Address.<jk>class</jk>);
			</p>
			<p>
				The format for beans depends on the serializer and parser registered on the Config which 
				is defined in the builder via the following methods:
			</p>
			<ul class='doctree'>
				<li class='jc'>{@link org.apache.juneau.config.ConfigBuilder}
				<ul>
					<li class='jm'>{@link org.apache.juneau.config.ConfigBuilder#serializer(Class) serializer(Class)}
					<li class='jm'>{@link org.apache.juneau.config.ConfigBuilder#serializer(WriterSerializer) serializer(WriterSerializer)}
					<li class='jm'>{@link org.apache.juneau.config.ConfigBuilder#parser(Class) parser(Class)}
					<li class='jm'>{@link org.apache.juneau.config.ConfigBuilder#parser(ReaderParser) parser(ReaderParser)}
				</ul>
			</ul>
			<p>
				The default parser can also be overridden using the following getters:
			</p>
			<ul class='doctree'>
				<li class='jc'>{@link org.apache.juneau.config.Config}
				<ul>
					<li class='jm'>{@link org.apache.juneau.config.Config#getObject(String,Parser,Class) getObject(String,Parser,Class)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getObjectWithDefault(String,Parser,Object,Class) getObjectWithDefault(String,T,Parser,Class)}
				</ul>
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-config.Arrays"></a>
		<h4 class='topic' onclick='toggle(this)'>6.2.3 - Arrays</h4>
		<div class='topic'>
			<p>
				The following methods are provided for accessing arrays:
			</p>
			<ul class='doctree'>
				<li class='jc'>{@link org.apache.juneau.config.Config}
				<ul>
					<li class='jm'>{@link org.apache.juneau.config.Config#getStringArray(String) getStringArray(String)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getStringArray(String,String[]) getStringArray(String,String)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getObject(String,Class) getObject(String,Class)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getObject(String,Parser,Class) getObject(String,Parser,Class)}
				</ul>
			</ul>
			<p>
				The <code>getStringArray()</code> methods allow you to retrieve comma-delimited lists of values:
			<p class='bcode'>
	<ck>key1</ck> = <cv>foo, bar, baz</cv>
			</p>
			<p class='bcode'>
	String[] key1 = c.getStringArray(<js>"key1"</js>);
			</p>
			<p>
				String arrays can also be represented in JSON when using the <code>getObject()</code> methods:
			</p>
			<p class='bcode'>
	<ck>key1</ck> = <cv>['foo','bar','baz']</cv>
			</p>
			<p class='bcode'>
	String[] key1 = c.getObject(<js>"key1"</js>, String.<jk>class</jk>);
			</p>
			<p>
				Primitive arrays can also be retrieved using the <code>getObject()</code> methods:
			</p>
			<p class='bcode'>
	<ck>key1</ck> = <cv>[1,2,3]</cv>
			</p>
			<p class='bcode'>
	<jk>int</jk>[] key1 = c.getObject(<js>"key1"</js>, <jk>int</jk>[].<jk>class</jk>);
			</p>
			<p>
				Arrays of POJOs can also be retrieved using the <code>getObject()</code> methods:
			</p>
			<p class='bcode'>
	<ck>addresses</ck> = 
		<cv>[
			{
				street: '123 Main Street',
				city: 'Anywhere',
				state: 'NY',
				zip: 12345
			}</cv>,
			<cv>{
				street: '456 Main Street',
				city: 'Anywhere',
				state: 'NY',
				zip: 12345
			}
		]</cv>
			</p>
			<p class='bcode'>
	Address[] addresses = c.getObject(<js>"addresses"</js>, Address[].<jk>class</jk>);
			</p>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-config.Collections"></a>
		<h4 class='topic' onclick='toggle(this)'>6.2.4 - Collections</h4>
		<div class='topic'>
			<p>
				The following methods are provided for accessing maps and collections:
			</p>
			<ul class='doctree'>
				<li class='jc'>{@link org.apache.juneau.config.Config}
				<ul>
					<li class='jm'>{@link org.apache.juneau.config.Config#getObject(String,Type,Type...) getObject(String,Type,Type...)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getObject(String,Parser,Type,Type...) getObject(String,Parser,Type,Type...)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getObjectWithDefault(String,Object,Type,Type...) getObjectWithDefault(String,T,Type,Type...)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getObjectWithDefault(String,Parser,Object,Type,Type...) getObjectWithDefault(String,T,Parser,Type,Type...)}
				</ul>
			</ul>
			<p>
				The <code>Type,Type...</code> arguments allow you to specify the component types for maps and collections.
				<br><code>List</code> class arguments can be followed by zero or one arguments representing the entry types.
				<br><code>Map</code> class arguments can be followed by zero or two arguments representing the key and value types.
				<br>The arguments can be chained to produce any data structure consisting of maps, collections, or POJOs.
			</p>
			<p>
				<br>Examples are shown below:
			</p>
			<ul class='spaced-list'>
				<li><code>getObject(<js>"..."</js>, List.<jk>class</jk>)</code>
					<br>Produces: <code>List&lt;?&gt;</code>
				<li><code>getObject(<js>"..."</js>, LinkedList.<jk>class</jk>)</code>
					<br>Produces: <code>LinkedList&lt;?&gt;</code>
				<li><code>getObject(<js>"..."</js>, HashSet.<jk>class</jk>, Integer.<jk>class</jk>)</code>
					<br>Produces: <code>HashSet&lt;Integer&gt;</code>
				<li><code>getObject(<js>"..."</js>, Map.<jk>class</jk>)</code>
					<br>Produces: <code>Map&lt;?,?&gt;</code>
				<li><code>getObject(<js>"..."</js>, HashMap.<jk>class</jk>)</code>
					<br>Produces: <code>HashMap&lt;?,?&gt;</code>
				<li><code>getObject(<js>"..."</js>, LinkedHashMap.<jk>class</jk>, String.<jk>class</jk>, MyBean.<jk>class</jk>)</code>
					<br>Produces: <code>LinkedHashMap&lt;String,MyBean&gt;</code> 
				<li><code>getObject(<js>"..."</js>, HashMap.<jk>class</jk>, Integer.<jk>class</jk>, ArrayList.<jk>class</jk>, MyBean[].<jk>class</jk>)</code>
					<br>Produces: <code>LinkedHashMap&lt;Integer,ArrayList&lt;MyBean[]&gt;&gt;</code> 
			</ul>
			<p>
				For example:
			</p>
			<p class='bcode'>
	<ck>addresses</ck> = 
		<cv>[
			{
				street: '123 Main Street',
				city: 'Anywhere',
				state: 'NY',
				zip: 12345
			}</cv>,
			<cv>{
				street: '456 Main Street',
				city: 'Anywhere',
				state: 'NY',
				zip: 12345
			}
		]</cv>
			</p>
			<p class='bcode'>
	List&lt;Address&gt; addresses = c.getObject(<js>"addresses"</js>, ArrayList.<jk>class</jk>, Address.<jk>class</jk>);
			</p>
			<p>
				Oftentimes, it might be useful to parse into the {@link org.apache.juneau.ObjectList} and {@link org.apache.juneau.ObjectMap}
				classes that provide the various convenience methods for working with JSON-like data structures:
			</p>
			<ul>
				<li><code>getObject(<js>"..."</js>, ObjectList.<jk>class</jk>)</code>
				<li><code>getObject(<js>"..."</js>, ObjectMap.<jk>class</jk>)</code> 
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-config.BinaryData"></a>
		<h4 class='topic' onclick='toggle(this)'>6.2.5 - Binary Data</h4>
		<div class='topic'>
			<p>
				The following methods are provided for accessing binary data:
			</p>
			<ul class='doctree'>
				<li class='jc'>{@link org.apache.juneau.config.Config}
				<ul>
					<li class='jm'>{@link org.apache.juneau.config.Config#getBytes(String) getBytes(String)}
					<li class='jm'>{@link org.apache.juneau.config.Config#getBytes(String,byte[]) getBytes(String,byte[])}
				</ul>
			</ul>
			<p>
				Binary data can be represented in 3 formats:
			</p>
			<ul class='spaced-list'>
				<li>BASE-64 (default)
					<br>Example: <code><js>"Zm9vYmFycw=="</js></code>
				<li>Hexadecimal
					<br>Example: <code><js>"666F6F62617273</js></code>
				<li>Spaced hexadecimal
					<br>Example: <code><js>"66 6F 6F 62 61 72 73</js></code>
			</ul>
			<p>
				The binary data format is controlled via the following:
			</p>
			<ul class='doctree'>
				<li class='jf'>{@link org.apache.juneau.config.Config#CONFIG_binaryFormat}
				<li class='jm'>{@link org.apache.juneau.config.ConfigBuilder#binaryFormat(String)}
			</ul>
			<p>
				For example:
			</p>
			<p class='bcode'>
	<ck>bytes</ck> = <cv>Zm9vYmFycw==</cv>
			</p>
			<p class='bcode'>
	<jk>byte</jk>[] bytes = c.getBytes(<js>"bytes"</js>);
			</p>
			<p>
				Binary lines can be split up into separate lines for readability:
			</p>
			<p class='bcode'>
	<ck>bytes</ck> = 
		<cv>Zm9vYm
		Fycw==</cv>
			</p>
			<p>
				Binary data line wrapping can be controlled via the following:
			</p>
			<ul class='doctree'>
				<li class='jf'>{@link org.apache.juneau.config.Config#CONFIG_binaryLineLength}
				<li class='jm'>{@link org.apache.juneau.config.ConfigBuilder#binaryLineLength(int)}
			</ul>
		</div>

	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-config.Variables"></a>
	<h3 class='topic' onclick='toggle(this)'>6.3 - Variables</h3>
	<div class='topic'>
		<p>
			Config files can contain variables that get resolved dynamically using the {@link org.apache.juneau.svl.VarResolver} API.
		</p>
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<cc>#--------------------------</cc>
	<cc># My section</cc>
	<cc>#--------------------------</cc>
	<cs>[MySection]</cs>
	
	<cc># A system property</cc>
	<ck>locale</ck> = <cv>$S{java.locale, en_US}</cv>
	
	<cc># An environment variable</cc>
	<ck>path</ck> = <cv>$E{PATH, unknown}</cv>
	
	<cc># Another system property</cc>
	<ck>anInt</ck> = <cv>$C{anInt, -1}</cv>

	<cc># Another value in this config file</cc>
	<ck>sameAsAnInt</ck> = <cv>$C{MySection/anInt}</cv>
	
	<cc># Look for system property, or env var if that doesn't exist, or a default value if that doesn't exist.</cc>
	<ck>nested</ck> = <cv>$S{mySystemProperty,$E{MY_ENV_VAR,$C{MySection/anInt}}}</cv>

	<cc># A POJO with embedded variables</cc>
	<ck>aBean</ck> = <cv>{foo:'$S{foo}',baz:$C{MySection/anInt}}</cv>
		</p>
		<p class='bcode'>
	Config c = Config.<jsf>create</jsf>().build();
	
	Locale locale = cf.getObject(<js>"MySection/locale"</js>, Locale.<jk>class</jk>); 
	String path = cf.getString(<js>"MySection/path"</js>); 
	<jk>int</jk> sameAsAnInt = cf.getInt(<js>"MySection/sameAsAnInt"</js>); 
	ABean bean = cf.getObject(<js>"MySection/aBean"</js>, ABean.<jk>class</jk>); 
		</p>
		<p>
			By default, <code>Configs</code> use the {@link org.apache.juneau.svl.VarResolver#DEFAULT} variable resolver
			which provides support for the following variables and constructs (in addition to the <code>$C</code> variable):
		</p>
		<ul class='spaced-list'>
			<li><code>$S{key}</code>,<code>$S{key,default}</code> - {@link org.apache.juneau.svl.vars.SystemPropertiesVar}
			<li><code>$E{key}</code>,<code>$E{key,default}</code> - {@link org.apache.juneau.svl.vars.EnvVariablesVar}
			<li><code>$IF{booleanValue,thenValue[,elseValue]}</code> - {@link org.apache.juneau.svl.vars.IfVar}
			<li><code>$SW{test,matchPattern,thenValue[,matchPattern,thenValue][,elseValue]}</code> - {@link org.apache.juneau.svl.vars.SwitchVar}
			<li><code>$CO{arg1[,arg2...]}</code> - {@link org.apache.juneau.svl.vars.CoalesceVar}
			<li><code>$CR{arg1[,arg2...]}</code> - {@link org.apache.juneau.svl.vars.CoalesceAndRecurseVar}
		</ul>
		<p>
			The variable resolver can be overridden via the following:
		</p>
		<ul class='doctree'>
			<li class='jf'>{@link org.apache.juneau.config.Config#CONFIG_varResolver}
			<li class='jm'>{@link org.apache.juneau.config.ConfigBuilder#varResolver(Class)}
			<li class='jm'>{@link org.apache.juneau.config.ConfigBuilder#varResolver(VarResolver)}
		</ul>
		<p>
			Additionally, the following method can be used to retrieve a <code>Config</code> with a different variable resolver:
		</p>
		<ul class='doctree'>
			<li class='jf'>{@link org.apache.juneau.config.Config#resolving(VarResolverSession)}
		</ul>
	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-config.EncodedEntries"></a>
	<h3 class='topic' onclick='toggle(this)'>6.4 - Encoded Entries</h3>
	<div class='topic'>
		<p>
			Encoded entries allow for sensitive information such as passwords to be obfuscated.
		</p>
		<p>
			Encoded entries are denoted with a <js>'*'</js> character at the end of the key name.
		</p>
		<p>
			For example, the following password is marked for encoding....
		</p>
		<p class='bcode'>
	<cs>[MyHost]</cs>
	<ck>url</ck> = <cv>http://localhost:9080/foo</cv>
	<ck>user</ck> = <cv>me</cv>
	<ck>password*</ck> = <cv>{AwwJVhwUQFZEMg==}</cv>
		</p>
		<p>
			The default encoder is {@link org.apache.juneau.config.encode.ConfigXorEncoder} which is a simple XOR+Base64 encoder.
		</p>
		<p>
			Custom encoders can be used to provide your own encoding support by implementing the {@link org.apache.juneau.config.encode.ConfigEncoder} interface.
		</p>
		<p>
			Encoders are controlled via the following:
		</p>
		<ul class='doctree'>
			<li class='jf'>{@link org.apache.juneau.config.Config#CONFIG_encoder}
			<li class='jm'>{@link org.apache.juneau.config.ConfigBuilder#encoder(Class)}
			<li class='jm'>{@link org.apache.juneau.config.ConfigBuilder#encoder(ConfigEncoder)}
		</ul>
		<p>
			Encoded values can be set to plain-text values.  
			<br>The curly brackets around the value identify whether the value has been encoded or not. 
		</p>
		<p>
			Unencoded values are encoded when the file is saved using the {@link org.apache.juneau.config.Config#save()} method.
			<br>They can also be encoded by calling {@link org.apache.juneau.config.Config#encodeEntries()}.
		</p>
	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-config.SectionMaps"></a>
	<h3 class='topic' onclick='toggle(this)'>6.5 - Section Maps</h3>
	<div class='topic'>
		<p>
			Config sections can be retrieved in-bulk using the  
			{@link org.apache.juneau.config.Config#getSectionAsMap(String)} method:
		</p>
		<p class='bcode'>
	<jc>// Example config file</jc>
	<cs>[MyAddress]</cs>
	<ck>street</ck> = <cv>123 Main Street</cv>
	<ck>city</ck> = <cv>Anywhere</cv>
	<ck>state</ck> = <cv>NY</cv>
	<ck>zip</ck> = <cv>12345</cv>
		</p>
		<p class='bcode'>
	<jc>// Example usage</jc>
	Config c = Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
	
	ObjectMap m = c.getSectionAsMap(<js>"MyAddress"</js>);
	
	String street = m.getString(<js>"street"</js>);
	String city = m.getString(<js>"city"</js>);
	String state = m.getString(<js>"state"</js>);
	<jk>int</jk> zip = m.getInt(<js>"zip"</js>);
		</p>
	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-config.SectionBeans"></a>
	<h3 class='topic' onclick='toggle(this)'>6.6 - Section Beans</h3>
	<div class='topic'>
		<p>
			Config files can also be used to directly populate beans using the 
			{@link org.apache.juneau.config.Config#getSectionAsBean(String,Class,boolean)}:
		</p>
		<p class='bcode'>
	<jc>// Example config file</jc>
	<cs>[MyAddress]</cs>
	<ck>street</ck> = <cv>123 Main Street</cv>
	<ck>city</ck> = <cv>Anywhere</cv>
	<ck>state</ck> = <cv>NY</cv>
	<ck>zip</ck> = <cv>12345</cv>
		</p>
		<p class='bcode'>
	<jc>// Example bean</jc>
	<jk>public class</jk> Address {
		public String street, city;
		public StateEnum state;
		public int zip;
	}

	<jc>// Example usage</jc>
	Config cf = Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
	Address myAddress = cf.getSectionAsBean(<js>"MyAddress"</js>, Address.<jk>class</jk>);
		</p>
	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-config.SectionInterfaces"></a>
	<h3 class='topic' onclick='toggle(this)'>6.7 - Section Interfaces</h3>
	<div class='topic'>
		<p>
			Config sections can also be accessed via interface proxies using 
			{@link org.apache.juneau.config.Config#getSectionAsInterface(String,Class)}.
		</p>
		<p>
			While section maps and beans retrieve copies of the configuration data at the time of the method
			call, section interfaces can also be use to set values in the underlying configuration.
		</p>
		<p class='bcode'>
	<jc>// Example config file</jc>
	<cs>[MySection]</cs>
	<ck>string</ck> = <cv>foo</cv>
	<ck>int</ck> = <cv>123</cv>
	<ck>enum</ck> = <cv>ONE</cv>
	<ck>bean</ck> = <cv>{foo:'bar',baz:123}</cv>
	<ck>int3dArray</ck> = <cv>[[[123,null],null],null]</cv>
	<ck>bean1d3dListMap</ck> = <cv>{key:[[[[{foo:'bar',baz:123}]]]]}</cv>
		</p>
		<p class='bcode'>
	<jc>// Example interface.</jc>
	<jc>// Setters are optional.</jc>
	<jk>public interface</jk> MyConfigInterface {

		String getString();
		<jk>void</jk> setString(String x);

		<jk>int</jk> getInt();
		<jk>void</jk> setInt(<jk>int</jk> x);

		MyEnum getEnum();
		<jk>void</jk> setEnum(MyEnum x);

		MyBean getBean();
		<jk>void</jk> setBean(MyBean x);

		<jk>int</jk>[][][] getInt3dArray();
		<jk>void</jk> setInt3dArray(<jk>int</jk>[][][] x);
		
		Map&lt;String,List&lt;MyBean[][][]&gt;&gt; getBean1d3dListMap();
		<jk>void</jk> setBean1d3dListMap(Map&lt;String,List&lt;MyBean[][][]&gt;&gt; x);
	}
	
	<jc>// Example usage.</jc>
	Config c = Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
	MyConfigInterface ci = c.getSectionAsInterface(<js>"MySection"</js>, MyConfigInterface.<jk>class</jk>);
	
	<jc>// Read a value.</jc>
	<jk>int</jk> myInt = ci.getInt();

	<jc>// Write a value.</jc>
	ci.setBean(<jk>new</jk> MyBean());

	<jc>// Save your changes.</jc>
	c.save();
		</p>
	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-config.SettingValues"></a>
	<h3 class='topic' onclick='toggle(this)'>6.8 - Setting Values</h3>
	<div class='topic'>
		<p>
			The following methods allow you to add, remove, and modify entries and sections in a config file:
		</p>
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.config.Config}
			<ul>
				<li class='jm'>{@link org.apache.juneau.config.Config#set(String,Object) set(String,Object)}
				<li class='jm'>{@link org.apache.juneau.config.Config#set(String,Object,Serializer) set(String,Object,Serializer)}
				<li class='jm'>{@link org.apache.juneau.config.Config#set(String,Object,Serializer,ConfigMod,String,List) set(String,Object,Serializer,ConfigMod,String,List)}
				<li class='jm'>{@link org.apache.juneau.config.Config#set(String,Object,Serializer,ConfigMod[],String,List) set(String,Object,Serializer,ConfigMod[],String,List)}
				<li class='jm'>{@link org.apache.juneau.config.Config#set(String,String) set(String,String)}
				<li class='jm'>{@link org.apache.juneau.config.Config#remove(String) remove(String)}
				<li class='jm'>{@link org.apache.juneau.config.Config#setSection(String,List) setSection(String,List)}
				<li class='jm'>{@link org.apache.juneau.config.Config#setSection(String,List,Map) setSection(String,List,Map)}
				<li class='jm'>{@link org.apache.juneau.config.Config#removeSection(String) removeSection(String)}
			</ul>
		</ul>
		<p class='bcode'>
	<jc>// Construct the sample config file programmatically</jc>
	Config c = Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build()
		.set(<js>"key1"</js>, 1)
		.set(<js>"key2"</js>, <jk>true</jk>)
		.set(<js>"key3"</js>, <jk>new int</jk>[]{1,2,3})
		.set(<js>"key4"</js>, <jk>new</jk> URI(<js>"http://foo"</js>))
		.set(<js>"Section1/key1"</js>, 2)
		.set(<js>"Section1/key2"</js>, <jk>false</jk>)
		.set(<js>"Section1/key3"</js>, <jk>new int</jk>[]{4,5,6})
		.set(<js>"Section1/key4"</js>, <jk>new</jk> URI(<js>"http://bar"</js>))
		.save();
		</p>

		<!-- ======================================================================================================== -->
		<a id="juneau-config.CustomEntrySerialization"></a>
		<h4 class='topic' onclick='toggle(this)'>6.8.1 - Custom Entry Serialization</h4>
		<div class='topic'>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-config.BulkSettingValues"></a>
		<h4 class='topic' onclick='toggle(this)'>6.8.2 - Setting Values in Bulk</h4>
		<div class='topic'>
		</div>

	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-config.Listeners"></a>
	<h3 class='topic' onclick='toggle(this)'>6.9 - Listeners</h3>
	<div class='topic'>
	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-config.Serializing"></a>
	<h3 class='topic' onclick='toggle(this)'>6.10 - Serializing</h3>
	<div class='topic'>
	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-config.ConfigStores"></a>
	<h3 class='topic' onclick='toggle(this)'>6.11 - Config Stores</h3>
	<div class='topic'>
		
		<!-- ======================================================================================================== -->
		<a id="juneau-config.ConfigMemoryStore"></a>
		<h4 class='topic' onclick='toggle(this)'>6.11.1 - ConfigMemoryStore</h4>
		<div class='topic'>
		</div>
		
		<!-- ======================================================================================================== -->
		<a id="juneau-config.ConfigFileStore"></a>
		<h4 class='topic' onclick='toggle(this)'>6.11.2 - ConfigFileStore</h4>
		<div class='topic'>
		</div>

	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-config.ReadOnlyConfigs"></a>
	<h3 class='topic' onclick='toggle(this)'>6.12 - Read-only Configs</h3>
	<div class='topic'>
		<p>
			The following settings can be used to create read-only <code>Config</code> objects:
		</p>
		<ul class='doctree'>
			<li class='jf'>{@link org.apache.juneau.config.Config#CONFIG_readOnly}
			<li class='jm'>{@link org.apache.juneau.config.ConfigBuilder#readOnly()}
		</ul>
		<h6 class='figure'>Example:</h6>
		<p class='bcode'>
	<jc>// Create a read-only config</jc>
	Config c = Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).readOnly().build();
		</p>
		<p>
			This causes all methods that make modifications to throw {@link java.lang.UnsupportedOperationException}.
		</p>
	</div>

	<!-- ======================================================================================================== -->
	<a id="#juneau-config.ClosingConfigs"></a>
	<h3 class='topic' onclick='toggle(this)'>6.13 - Closing Configs</h3>
	<div class='topic'>
		<p>
			In general, it's good practice to close Config if you're only creating them temporarily so that
			their listeners get unregistered from the underlying storage APIs.
		</p>
		<p class='bcode'>
	<jc>// Create a transient config.</jc>
	Config c = Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
	
	<jc>// Do stuff with it.</jc>
	
	<jc>// Then close the config to unregister the listeners.</jc>
	c.close();
		</p>
	</div>

</div>

<!-- =========================================================================================================== -->
<a id="juneau-rest-server"></a>
<h2 class='topic' onclick='toggle(this)'>7 - juneau-rest-server</h2>
<div class='topic'>

	<h5 class='figure'>Maven Dependency</h5>
	<p class='bcode' style='width:500px;'>
	<xt>&lt;dependency&gt;</xt>
		<xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
		<xt>&lt;artifactId&gt;</xt>juneau-rest-server<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>7.0.0<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
	</p>	
	
	<h5 class='figure'>Java Library</h5>
	<p class='bcode' style='width:500px;'>
	juneau-rest-server-7.0.0.jar 
	</p>	

	<h5 class='figure'>OSGi Module</h5>
	<p class='bcode' style='width:500px;'>
	org.apache.juneau.rest.server_7.0.0.jar 
		</p>	

	<p>
		The <l>juneau-rest-server</l> library allows you to quickly wrap POJOs and expose them as full-fledged REST 
		resources served up in a servlet container using a bare-minimum amount of code.
		<br>The primary goal for Juneau was to make it as easy as possible to implement easy-to-read and self-documenting 
		REST resources using very little code.
	</p>
	<p>
		One of the biggest advantages of the Juneau REST framework over similar architectures is that it hides the 
		serialization layer from the developer.  
		<br>The developer can work entirely with POJOs and let the Juneau framework handle all the serialization and 
		parsing work.  
		<br>The developer need never know what the <l>Accept</l> or <l>Content-Type</l> or <l>Accept-Encoding</l> (etc...) 
		header values are because those details are all handled by the framework. 
	</p>
	<p> 
		The API builds upon the existing JEE Servlet API.  
		<br>The root class, {@link org.apache.juneau.rest.RestServlet} is nothing but a specialized 
		{@link javax.servlet.http.HttpServlet}, and the {@link org.apache.juneau.rest.RestRequest} and 
		{@link org.apache.juneau.rest.RestResponse} classes are nothing more than specialized 
		{@link javax.servlet.http.HttpServletRequest} and {@link javax.servlet.http.HttpServletResponse} objects.  
		<br>This allows maximum flexibility for the developer since you can let Juneau handle operations such as 
		serialization, or you can revert to the existing servlet APIs to do low-level processing of requests yourself.	
		<br>It also means you need nothing more than a Servlet container such as Jetty to use the REST framework.
	</p>
	
	<h5 class='topic'>Features</h5>
	<ul class='spaced-list'>
		<li>
			Serializes POJOs to JSON, XML, HTML, URL-Encoding, UON, RDF/XML, N-Triple, Turtle, N3, SOAP, or 
			Java-serialized-object based on value of <l>Accept</l> header.  
			<br>No user code is required to handle these types.
			<ul>
				<li>Extensible design that provides ability to override existing content type handlers, or add the 
					ability to handle other kinds of content types.
			</ul>
		<li>
			Parses content of POST/PUT request bodies to POJOs.
		<li>
			Automatic built-in ability to serialize POJO metadata to JSON+SCHEMA, XML+SCHEMA, or HTML+SCHEMA based on 
			<l>Accept</l> header.
		<li>
			Automatic negotiation of output Writer based on HTTP headers.
			<ul>
				<li>Automatic handling of <l>Accept-Charset</l> header for all character sets supported by the JVM.
				<li>Automatic handling of <l>Accept-Encoding</l> header with registered encoders.
			</ul>
		<li>
			Automatic error handling.
			<ul>
				<li>Automatic 401 errors (Unauthorized) on failed guards.
				<li>Automatic 404 errors (Not Found) on unmatched path patterns.
				<li>Automatic 405 errors (Method Not Implemented) on unimplemented methods.
				<li>Automatic 406 errors (Not Acceptable) when no matching serializer was found to handle the 
					<l>Accept</l> header.
				<li>Automatic 412 errors (Precondition Failed) when all matchers failed to match.
				<li>Automatic 415 errors (Unsupported Media Type) when no matching parser was found was found to handle 
					the <l>Content-Type</l> header.
				<li>Automatic 500 errors on uncaught exceptions.
			</ul>
		<li>
			Self-documenting Swagger-based REST interfaces.
		<li>
			Various useful debugging features that make debugging using a browser extremely simple...
			<ul>
				<li>Ability to pass HTTP header values as URL GET parameters (e.g. <l>&amp;Accept=text/xml</l>).
				<li>Ability to pass HTTP content on PUT/POST requests as a URL GET parameter 
					(e.g. <l>&amp;content={foo:"bar"}</l>).
				<li>Ability to simulate non-GET requests using a <l>&amp;method</l> GET parameter 
					(e.g. <l>&amp;method=POST</l>).
				<li>Ability to force <js>"text/plain"</js> on response using GET parameter <l>&amp;plainText=true</l>.
			</ul>
		<li>
			Ability to implement overloaded HTTP methods through the use of the <l>&amp;method</l> attribute 
			(e.g. <l>&amp;method=FOO</l>).
		<li>
			Ability to match URL patterns (e.g. <l>/foo/{fooId}/bar/{barId}</l>) against URLs 
			(e.g. <l>/foo/123/bar/456/bing</l>).
		<li>
			Ability to associate guards at the resource or method levels through annotations.
			<br>Typically useful for security, but can be used for a variety of purposes.
		<li>
			Ability to associate converters at the resource or method levels through annotations.
			<br>Typically useful for performing conversions on input and output, such as for supporting older input and 
			output formats.
	</ul>
	<p>
		Many of the examples in this document are pulled directly from <l>juneau-examples-rest</l>.
	</p>

	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.HelloWorldExample"></a>
	<h3 class='topic' onclick='toggle(this)'>7.1 - Hello World Example</h3>
	<div class='topic'>
		<p>
			A REST resource is simply a Java class annotated with {@link org.apache.juneau.rest.annotation.RestResource}.
			<br>The most common case is a class that extends {@link org.apache.juneau.rest.RestServlet}, which itself is simply an 
			extension of {@link javax.servlet.http.HttpServlet} which allows it to be deployed as a servlet.  
		</p>
		<p>
			In this example, we define a resource called <l>HelloWorldResource</l>.  
			<br>This example is located in the <l>juneau-examples-rest</l> project.
			<br>It's assumed the reader is familiar with defining servlets in web applications.
		</p>
		<p>
			Like any servlet, we could define our resource in the <l>web.xml</l> file of the web application like so...
		</p>
		<p class='bcode'>
	<xt>&lt;?xml</xt> <xa>version</xa>=<xs>"1.0"</xs> <xa>encoding</xa>=<xs>"UTF-8"</xs><xt>?&gt;</xt>
	<xt>&lt;web-app</xt> <xa>version</xa>=<xs>"2.3"</xs><xt>&gt;</xt>
		<xt>&lt;servlet&gt;</xt>
			<xt>&lt;servlet-name&gt;</xt>HelloWorldResource<xt>&lt;/servlet-name&gt;</xt>
			<xt>&lt;servlet-class&gt;</xt>com.foo.sample.HelloWorldResource<xt>&lt;/servlet-class&gt;</xt>
		<xt>&lt;/servlet&gt;</xt>
		<xt>&lt;servlet-mapping&gt;</xt>
			<xt>&lt;servlet-name&gt;</xt>HelloWorldResource<xt>&lt;/servlet-name&gt;</xt>
			<xt>&lt;url-pattern&gt;</xt>/*<xt>&lt;/url-pattern&gt;</xt>
		<xt>&lt;/servlet-mapping&gt;</xt>
	<xt>&lt;/web-app&gt;</xt>
		</p>
		<p>
			Our servlet code is shown below:
		</p>
		<p class='bcode'>
	<jd>/** 
	 * Sample REST resource that prints out a simple "Hello world!" message.
	 */</jd>
	<ja>@RestResource</ja>(
		path=<js>"/helloWorld"</js>,
		title=<js>"Hello World"</js>,
		description=<js>"An example of the simplest-possible resource"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			},
			aside={
				<js>"&lt;div style='max-width:400px' class='text'&gt;"</js>,
				<js>"	&lt;p&gt;This page shows a resource that simply response with a 'Hello world!' message&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;The POJO serialized is a simple String.&lt;/p&gt;"</js>,
				<js>"&lt;/div&gt;"</js>
			}
		)
	)
	<jk>public class</jk> HelloWorldResource <jk>extends</jk> RestServletDefault {
	
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>, summary=<js>"Responds with \"Hello world!\""</js>)
		<jk>public</jk> String sayHello() {
			<jk>return</jk> <js>"Hello world!"</js>;
		}
	}
		</p>
		<p>
			This is what it looks like in a browser:
		</p>
		<img class='bordered' src='doc-files/juneau-rest-server.HelloWorldExample.1.png' style='width:800px'>
		<p>
			It doesn't much simpler than that.  
			<br>In this case, we're simply returning a string that will be converted to any of the supported languages (e.g. 
			JSON, XML, HTML, ...).
			<br>However, we could have returned any POJO consisting of beans, maps, collections, etc...
		</p>
		<p>
			The {@link org.apache.juneau.rest.RestServletDefault} class that we're using here is a subclass of 
			{@link org.apache.juneau.rest.RestServlet} that provides default support for a variety of content types.  
			<br>Implementers can choose to use this class, or create their own subclass of 
			{@link org.apache.juneau.rest.RestServlet} with their own specialized serializers and parsers.
		</p>
	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.ClassHierarchy"></a>
	<h3 class='topic' onclick='toggle(this)'>7.2 - Class Hierarchy</h3>
	<div class='topic'>
		<p>
			The class hierarchy for the REST servlet class is shown below:
		</p>
		<ul class='doctree'>
			<li class='jac'>
				{@link javax.servlet.http.HttpServlet javax.servlet.http.HttpServlet} 
				<ul>
					<li class='jac'>
						{@link org.apache.juneau.rest.RestServlet org.apache.juneau.rest.RestServlet}
						<br>Contains all the main logic.
						<ul>
							<li class='jac'>{@link org.apache.juneau.rest.RestServletDefault org.apache.juneau.rest.RestServletDefault}
								<br>Provides a default set of serializers, parsers, options page, stylesheet, and other common settings.
								<br><b>Developers will typically subclass this when creating REST resources in JEE environments.</b> 
								<ul>
									<li class='jac'>{@link org.apache.juneau.microservice.Resource org.apache.juneau.microservice.Resource}
										<br>Identical to <l>RestServletDefault</l> but provides support for <code>$ARGS</code> and <code>$MF</code> variables.
										<br><b>Developers will typically subclass this when creating microservices.</b> 
									<li class='jac'>{@link org.apache.juneau.rest.RestServletGroupDefault org.apache.juneau.rest.RestServletGroupDefault}
										<br>A default implementation for "router" pages.
										<ul>
											<li class='jac'>{@link org.apache.juneau.microservice.ResourceGroup org.apache.juneau.microservice.ResourceGroup}
											<br>Identical to <l>RestServletGroupDefault</l> but provides support for <code>$ARGS</code> and <code>$MF</code> variables.
											<br><b>Developers will typically subclass this when creating microservice groups.</b> 
										</ul>
									</li>
								</ul>
							</li>
						</ul>
					</li>
				</ul>
			</li>
		</ul>
		<p>
			The servlets with RDF support require Jena on the classpath.  
			<br>All other serializers and parsers do not have any external library dependencies.
			<br>For this reason, we have separate servlets for supporting RDF so that you don't need Jena if you don't need to 
			support RDF. 
		</p>
		<p>
			Everything is configured through the following classes which you will see a lot:
		</p>
		<ul>
			<li class='jc'>{@link org.apache.juneau.rest.RestContext} - Each resource class instance has one copy that holds all of its configuration.
			<li class='jc'>{@link org.apache.juneau.rest.RestContextBuilder} - Builder for the class above.
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Instantiation"></a>
	<h3 class='topic' onclick='toggle(this)'>7.3 - Instantiation</h3>
	<div class='topic'>
		<p>
			REST resources are deployed in one of two ways:
		</p>
		<ul>
			<li>Deployed in a J2EE container as a servlet.
			<li>Deployed as a child of another REST resource.
		</ul>
		<p>
			When deployed in a J2EE container, you MUST extend from one of the servlet classes.
			<br>When deployed as a child of another resource, you MAY extend from one of the servlet classes but it's 
			not necessary.
		</p>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RestServlet"></a>
		<h4 class='topic' onclick='toggle(this)'>7.3.1 - RestServlet</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RestServlet} class is the entry point for your REST resources.
				<br>It extends directly from <l>HttpServlet</l> and is deployed like any other servlet.
			</p>
			<p>
				When the servlet <l>init()</l> method is called, it triggers the code to find and process the <l>@RestResource</l>
				annotations on that class and all child classes.
				<br>These get constructed into a {@link org.apache.juneau.rest.RestContext} object that holds all the configuration
				information about your resource in a read-only object.
			</p>
			<p>
				Most developers are not going to be using the <l>RestServlet</l> class itself, and instead will
				extend from one of the preconfigured default servlets such as {@link org.apache.juneau.rest.RestServletDefault}.
				<br>The <l>RestServlet</l> class by itself is not configured with any serializers and parsers, and therefore
				not very useful on it's own.
				<br>However, the class does provide a couple of convenience methods to be aware of:
			</p>
			<ul class='doctree'>
				<li class='jac'><code>{@link org.apache.juneau.rest.RestServlet} <jk>extends</jk> HttpServlet</code>
				<ul>
					<li class='jf'>{@link org.apache.juneau.rest.RestServlet#log(Level,String,Object...) log(Level,String,Object...)}
					<li class='jf'>{@link org.apache.juneau.rest.RestServlet#log(Level,Throwable,String,Object...) log(Level,Throwable,String,Object...)}
					<li class='jf'>{@link org.apache.juneau.rest.RestServlet#getContext() getContext()}
				</ul>
			</ul>
			<p>
				Since this is a servlet, you also have the ability to intercept calls to the <l>init</l> and <l>service</l> methods
				in your subclass.
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RestServletDefault"></a>
		<h4 class='topic' onclick='toggle(this)'>7.3.2 - RestServletDefault</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RestServletDefault} class is a subclass of {@link org.apache.juneau.rest.RestServlet}
				preconfigured with the following:
			</p>
			<ul class='spaced-list'>
				<li>A default set of serializers and parsers (pretty much all of them except for the RDF ones).
				<li>Some basic HTML boilerplate for the HTML representation of your POJOs.
				<li>Support for auto-generated Swagger documentation through OPTIONS page requests.
				<li>Configuration of default CSS stylesheets.
			</ul>
			<p>
				The entirety of the class is shown below.
				<br>You should notice that very little code is being used and everything is configurable through
				annotations:
			</p>
			<p class='bcode'>
	<ja>@RestResource</ja>(
		serializers={
			HtmlDocSerializer.<jk>class</jk>,
			HtmlStrippedDocSerializer.<jk>class</jk>,
			HtmlSchemaDocSerializer.<jk>class</jk>,
			JsonSerializer.<jk>class</jk>,
			JsonSerializer.Simple.<jk>class</jk>,
			JsonSchemaSerializer.<jk>class</jk>,
			XmlDocSerializer.<jk>class</jk>,
			XmlSchemaDocSerializer.<jk>class</jk>,
			UonSerializer.<jk>class</jk>,
			UrlEncodingSerializer.<jk>class</jk>,
			MsgPackSerializer.<jk>class</jk>,
			SoapXmlSerializer.<jk>class</jk>,
			PlainTextSerializer.<jk>class</jk>
		},
		parsers={
			JsonParser.<jk>class</jk>,
			XmlParser.<jk>class</jk>,
			HtmlParser.<jk>class</jk>,
			UonParser.<jk>class</jk>,
			UrlEncodingParser.<jk>class</jk>,
			MsgPackParser<jk>.class</jk>,
			PlainTextParser.<jk>class</jk>
		},
		properties={
			<jc>// URI-resolution is disabled by default.  Need to enable it.</jc>
			<ja>@Property</ja>(name=<jsf>SERIALIZER_uriResolution</jsf>, value=<js>"ROOT_RELATIVE"</js>)
		},
		allowedMethodParams=<js>"OPTIONS"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			header={
				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,
				<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>,
				<js>"&lt;a href='http://juneau.apache.org'&gt;&lt;img src='$U{servlet:/htdocs/juneau.png}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;&lt;/a&gt;"</js>
			},
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			},
			stylesheet=<js>"servlet:/styles/light.css"</js>,
			head={
				<js>"&lt;link rel='icon' href='$U{servlet:/htdocs/juneau.png}'/&gt;"</js>
			}
		),
		
		<jc>// Optional external configuration file.</jc>
		config=<js>"$S{juneau.configFile}"</js>,
	
		<jc>// These are static files that are served up by the servlet under the specified sub-paths.
		// For example, "/servletPath/htdocs/javadoc.css" resolves to the file "[servlet-package]/htdocs/javadoc.css"</jc>
		staticFiles={<js>"htdocs:htdocs"</js>,<js>"styles:styles"</js>}
	)
	<jk>public abstract class</jk> RestServletDefault <jk>extends</jk> RestServlet {
	
		<jd>/**
		 * [OPTIONS /*] - Show resource options.
		 * 
		 * @param req The HTTP request.
		 * @return A bean containing the contents for the OPTIONS page.
		 */</jd>
		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>,
			htmldoc=<ja>@HtmlDoc</ja>(
				navlinks={
					<js>"back: servlet:/"</js>,
					<js>"json: servlet:/?method=OPTIONS&amp;Accept=text/json&amp;plainText=true"</js>
				},
				aside=<js>"NONE"</js>
			),
			summary=<js>"Swagger documentation",</js>
			description=<js>"Auto-generated swagger documentation for this resource"</js>
		)
		<jk>public</jk> Swagger getOptions(RestRequest req) {
			<jk>return</jk> req.getSwagger();
		}
	}
			</p>
			<p>
				Your top-level resource will simply extend from this class, as shown in the Hello World example
				from a couple sections back.
			</p>
			<p>
				There's a lot going on in this class.
				<br>But not to worry, the details will be described later.
			</p>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.Children"></a>
		<h4 class='topic' onclick='toggle(this)'>7.3.3 - Children</h4>
		<div class='topic'>
			<p>
				Child Resources are REST servlets or objects that are linked to parent resources through the 
				{@link org.apache.juneau.rest.annotation.RestResource#children() @RestResource.children()} annotation.
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<jd>/** Parent Resource */</jd>
	<ja>@RestResource</ja>(
		path=<js>"/parent"</js>,
		children={FooResource.<jk>class</jk>}
	)
	<jk>public</jk> MyResource <jk>extends</jk> RestServletDefault {...}
			</p>
			<p class='bcode'>
	<jd>/** Child Resource */</jd>
 	<ja>@RestResource</ja>(
		path=<js>"/foo"</js>  <jc>// Path relative to parent resource.</jc>
	)
	<jk>public</jk> FooResource {...} <jc>// Note that we don't need to extend from RestServlet.</jc>
			</p>
			<p>
				The path of the child resource gets appended to the path of the parent resource. 
				<br>So in the example above, the child resource is accessed through the URL <l>/parent/foo</l>.
			</p>
			<p>
				A HUGE advantage of using child resources is that they do not need to be declared in the JEE <l>web.xml</l> 
				file.
				<br>Initialization of and access to the child resources occurs through the parent resource.
				<br>Children can be nested arbitrary deep to create complex REST interfaces with a single top-level REST servlet.
			</p>
			<h5 class='section'>See Also:</h5>
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_children}
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RouterPages"></a>
		<h4 class='topic' onclick='toggle(this)'>7.3.4 - Router Pages</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RestServletGroupDefault} class provides a default "router" page for 
				child resources when a parent resource is nothing more than a grouping of child resources.
			</p>		
			<p>
				The <l>RootResources</l> class in the Samples project is an example of a router page:
			</p>
			<p class='bcode'>		
	<jd>/**
	 * Sample REST resource showing how to implement a "router" resource page.
	 */</jd>
	<ja>@RestResource</ja>(
		path=<js>"/"</js>,
		title=<js>"Root resources"</js>,
		description=<js>"Example of a router resource page."</js>,
		children={
			HelloWorldResource.<jk>class</jk>,
			MethodExampleResource.<jk>class</jk>,
			RequestEchoResource.<jk>class</jk>,
			TempDirResource.<jk>class</jk>,
			AddressBookResource.<jk>class</jk>,
			SampleRemoteableServlet.<jk>class</jk>,
			PhotosResource.<jk>class</jk>,
			AtomFeedResource.<jk>class</jk>,
			JsonSchemaResource.<jk>class</jk>,
			SqlQueryResource.<jk>class</jk>,
			TumblrParserResource.<jk>class</jk>,
			CodeFormatterResource.<jk>class</jk>,
			UrlEncodedFormResource.<jk>class</jk>,
			SourceResource.<jk>class</jk>,
			ConfigResource.<jk>class</jk>,
			LogsResource.<jk>class</jk>,
			DockerRegistryResource.<jk>class</jk>,
			ShutdownResource.<jk>class</jk>
		}
	)
	<jk>public class</jk> RootResources <jk>extends</jk> RestServletGroupDefault {
		<jc>// NO CODE!!!</jc>
	}
			</p>
			<p>
				When you bring up this resource in a browser, you see the following that provides a list
				of navigable links to your child resources:
			</p>
			<img class='bordered' src="doc-files/juneau-rest-server.RouterPages.1.png" style='width:800px;'/>
			<p> 
				The {@link org.apache.juneau.rest.RestServletGroupDefault} class is nothing more than a subclass of 
				{@link org.apache.juneau.rest.RestServletDefault} with a <l>getChildren()</l> method mapped to the servlet 
				root path.
				<br>The method returns a POJO with is just a linked-list of beans with name/description properties.
			</p>	
			<p class='bcode'>
	<jk>public class</jk> RestServletGroupDefault <jk>extends</jk> RestServletDefault {
	
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>, description=<js>"Child resources"</js>)
		<jk>public</jk> ChildResourceDescriptions getChildren(RestRequest req) {
			<jk>return new</jk> ChildResourceDescriptions(<jk>this</jk>, req);
		}
	}		
			</p>
		</div>
		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.ResourceResolvers"></a>
		<h4 class='topic' onclick='toggle(this)'>7.3.5 - Resource Resolvers</h4>
		<div class='topic'>
			<p>
				By default, you can add the {@link org.apache.juneau.rest.annotation.RestResource @RestResource}
				to any class as long as it has one of the following constructors:
			</p>
			<ul>
				<li><code><jk>public</jk> T(RestContextBuilder)</code>
				<li><code><jk>public</jk> T()</code>
			</ul>
				<p>
				The former constructor can be used to get access to the {@link org.apache.juneau.rest.RestContextBuilder} object to make
				any configurations to the resource before it's initialized.
			</p>
			<p>
				Resource object resolution is controlled through the following API:
			</p>
			<ul class='doctree'>
				<li class='jic'>{@link org.apache.juneau.rest.RestResourceResolver}
				<ul>
					<li class='jc'>{@link org.apache.juneau.rest.RestResourceResolverDefault}
				</ul>
			</ul>
			<p>
				This API can be extended to provide your own custom resource resolution.
				<br>Later topics discuss how to use this API to instantiate resources using Spring.
			</p>
			<h5 class='section'>See Also:</h5>
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_resourceResolver}
			</ul>
		</div>
		
		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.LifecycleHooks"></a>
		<h4 class='topic' onclick='toggle(this)'>7.3.6 - Lifecycle Hooks</h4>
		<div class='topic'>
			<p>
				Lifecycle hooks allow you to hook into lifecycle events of the servlet/resource creation and REST calls.
			</p>
			<p>
				For example, if you want to add an initialization method to your resource:
			</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(...)
	<jk>public class</jk> MyResource  {

		<jc>// Our database.</jc>
		<jk>private</jk> Map&lt;Integer,Object&gt; <jf>myDatabase</jf>;

		<ja>@RestHook</ja>(<jsf>INIT</jsf>)
		<jk>public void</jk> initMyDatabase(RestContextBuilder builder) <jk>throws</jk> Exception {
			<jf>myDatabase</jf> = <jk>new</jk> LinkedHashMap&lt;&gt;();
		}
	}
			</p>
			<p>
				Or if you want to intercept REST calls:
			</p>
			<p class='bcode'>
	<ja>@RestResource</ja>(...)
	<jk>public class</jk> MyResource {

		<jc>// Add a request attribute to all incoming requests.</jc>
		<ja>@RestHook</ja>(<jsf>PRE_CALL</jsf>)
		<jk>public void</jk> onPreCall(RestRequest req) {
			req.setAttribute(<js>"foo"</js>, <js>"bar"</js>);
		}
	}
			</p>
			<p>
				The hook events can be broken down into two categories:
			</p>
			<ul class='spaced-list'>
				<li>Resource lifecycle events:
					<ul>
						<li class='jf'>{@link org.apache.juneau.rest.annotation.HookEvent#INIT INIT} - Right before initialization.
						<li class='jf'>{@link org.apache.juneau.rest.annotation.HookEvent#POST_INIT POST_INIT} - Right after initialization.
						<li class='jf'>{@link org.apache.juneau.rest.annotation.HookEvent#POST_INIT_CHILD_FIRST POST_INIT_CHILD_FIRST} - Right after initialization, but run child methods first.
						<li class='jf'>{@link org.apache.juneau.rest.annotation.HookEvent#DESTROY DESTROY} - Right before servlet destroy.
					</ul>
				<li>REST call lifecycle events:
					<ul>
						<li class='jf'>{@link org.apache.juneau.rest.annotation.HookEvent#START_CALL START_CALL} - At the beginning of a REST call.
						<li class='jf'>{@link org.apache.juneau.rest.annotation.HookEvent#PRE_CALL PRE_CALL} - Right before the <ja>@RestMethod</ja> method is invoked.
						<li class='jf'>{@link org.apache.juneau.rest.annotation.HookEvent#POST_CALL POST_CALL} - Right after the <ja>@RestMethod</ja> method is invoked.
						<li class='jf'>{@link org.apache.juneau.rest.annotation.HookEvent#END_CALL END_CALL} - At the end of the REST call after the response has been flushed.
					</ul>
			</ul>

			<h5 class='section'>See Also:</h5>
			<ul>
				<li class='ja'>{@link org.apache.juneau.rest.annotation.RestHook}
			</ul>
		</div>

	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.RestResource"></a>
	<h3 class='topic' onclick='toggle(this)'>7.4 - @RestResource</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.annotation.RestResource @RestResource} annotation is the primary way of defining
			and configuring REST resource classes.
			<br>The functionality of the class itself is covered in detail in the topics below.
		</p>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.AnnotationInheritance"></a>
		<h4 class='topic' onclick='toggle(this)'>7.4.1 - Annotation Inheritance</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.annotation.RestResource @RestResource} annotation can also be used on parents and interfaces of resource classes.
				<br>When multiple annotations are defined at different levels, the annotation values are combined.
			</p>
			<p>
				This is a particularly useful feature because it allows you to define your own configured parent
				resource classes that can be extended by all your child resources so that they all share common
				settings.
			</p>
			<table class='styled' style='max-width: 800px;'>
				<tr>
					<th><l>Annotation</l></th>
					<th><l>Inheritence Rules</l></th>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#guards() guards()}</td>
					<td>
						Guards on child are combined with those on parent class.
						<br>Guards are executed child-to-parent in the order they appear in the annotation.
						<br>Guards on methods are executed before those on classes.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#converters() converters()}</td>
					<td>
						Converters on child are combined with those on parent class.
						<br>Converters are executed child-to-parent in the order they appear in the annotation.
						<br>Converters on methods are executed before those on classes.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#beanFilters() beanFilters()}</td>
					<td>
						Bean filters on child are combined with those on parent class.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#pojoSwaps() pojoSwaps()}</td>
					<td>
						POJO swaps on child are combined with those on parent class.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#properties() properties()}</td>
					<td>
						Properties on child are combined with those on parent class.
						<br>Properties are applied parent-to-child in the order they appear in the annotation.
						<br>Properties on methods take precedence over those on classes.				
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#serializers() serializers()}</td>
					<td>
						Serializers on child are combined with those on parent class.
						<br>Serializers on methods take precedence over those on classes.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#parsers() parsers()}</td>
					<td>
						Parsers on child are combined with those on parent class.
						<br>Parsers on methods take precedence over those on classes.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#responseHandlers() responseHandlers()}</td>
					<td>
						Response handlers on child are combined with those on parent class.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#encoders() encoders()}</td>
					<td>
						Encoders on child are combined with those on parent class.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#defaultRequestHeaders() defaultRequestHeaders()}</td>
					<td>
						Headers on child are combined with those on parent class.
						<br>Headers are applied parent-to-child in the order they appear in the annotation.
						<br>Headers on methods take precedence over those on classes.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#defaultResponseHeaders() defaultResponseHeaders()}</td>
					<td>
						Headers on child are combined with those on parent class.
						<br>Headers are applied parent-to-child in the order they appear in the annotation.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#children() children()}</td>
					<td>
						Children on child are combined with those on parent class.
						<br>Children are list parent-to-child in the order they appear in the annotation.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#path() path()}</td>
					<td>
						Path is searched for in child-to-parent order.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#title() title()}</td>
					<td>
						Label is searched for in child-to-parent order.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#description() description()}</td>
					<td>
						Description is searched for in child-to-parent order.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#config() config()}</td>
					<td>
						Config file is searched for in child-to-parent order.
					</td>
				</tr>
				<tr>
					<td>{@link org.apache.juneau.rest.annotation.RestResource#staticFiles() staticFiles()}</td>
					<td>
						Static files on child are combined with those on parent class.
						<br>Static files are are executed child-to-parent in the order they appear in the annotation.
					</td>
				</tr>
			</table>
		</div>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.RestContext"></a>
	<h3 class='topic' onclick='toggle(this)'>7.5 - RestContext</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.RestContext} object is the workhorse class for all of the configuration
			of a single REST resource class.
			<br>It's by-far the most important class in the REST API.
		</p>
		<p>
			Every class annotated with <l>@RestResource</l> ends up with an instance of this object.
			<br>The object itself is read-only and unchangeable.
			<br>It is populated through the following:
		</p>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestResource} - Settings copied from the annotation during servlet initialization.
			<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder} - Builder used during servlet initialization.
		</ul>
		<p>
			The annotation should be self-explanatory at this point.
			<br>The builder allows you to perform all of the same configuration as the annotation programmatically.
		</p>
		<p>
			The {@link org.apache.juneau.rest.RestContextBuilder} class extends {@link org.apache.juneau.BeanContextBuilder}
			allowing you to programmatically set any properties defined on that builder class.
			<br>It also implements {@link javax.servlet.ServletConfig}
		</p>
		<p>
			To access this object, simply pass it in as a constructor argument or in an INIT hook:
		</p>
		<p class='bcode'>
	<jc>// Option #1 - Pass in through constructor.</jc>
	<jk>public</jk> MyResource(RestContextBuilder builder) {
			builder
				.pojoSwaps(CalendarSwap.<jsf>RFC2822DTZ</jsf>.<jk>class</jk>)
				.set(<jsf>PARSER_debug</jsf>, <jk>true</jk>);
	}

	<jc>// Option #2 - Use an INIT hook.</jc>
	<ja>@RestHook</ja>(<jsf>INIT</jsf>)
	<jk>public void</jk> init(RestContextBuilder builder) <jk>throws</jk> Exception {
			builder
				.pojoSwaps(CalendarSwap.<jsf>RFC2822DTZ</jsf>.<jk>class</jk>)
				.set(<jsf>PARSER_debug</jsf>, <jk>true</jk>);
	}
		</p>
		<p>
			Warning:  This class is huge.
			<br>Through it, you can configure bean/serializer/parser settings, define config files, children, 
				resource finders, info providers, etc...
		</p>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.RestMethod"></a>
	<h3 class='topic' onclick='toggle(this)'>7.6 - @RestMethod</h3>
	<div class='topic'>
		<p>
			REST Java methods are identified on REST servlets using the 
			{@link org.apache.juneau.rest.annotation.RestMethod @RestMethod} annotation. 
			<br>The annotation allows the framework to identify the available REST methods through reflection.
		</p>
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
	<jk>public</jk> String sayHello() {
		<jk>return</jk> <js>"Hello world!"</js>;
	}
		</p>
	
		<p>
			There are no restrictions on the name of the Java method.  
		</p>
	
		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.MethodParameters"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.1 - Java Method Parameters</h4>
		<div class='topic'>
			<p>
				Java methods can contain any of the following parameters in any order:
			</p>
			<ul class='spaced-list'>
				<li>
					<b>Parameters based on class types:</b>
					<ul>
						<li><b>Request/response objects:</b>
							<ul>
								<li class='jc'>{@link org.apache.juneau.rest.RestRequest} - The request object.
								<li class='jc'>{@link javax.servlet.http.HttpServletRequest} - The superclass of <code>RestRequest</code>.
								<li class='jc'>{@link org.apache.juneau.rest.RestResponse} - The response object.
								<li class='jc'>{@link javax.servlet.http.HttpServletResponse} - The superclass of <code>RestResponse</code>.
							</ul>
						<li><b>Parsed request header values:</b>
							<ul>
								<li class='jc'>{@link org.apache.juneau.http.Accept}
								<li class='jc'>{@link org.apache.juneau.http.AcceptCharset}
								<li class='jc'>{@link org.apache.juneau.http.AcceptEncoding}
								<li class='jc'>{@link org.apache.juneau.http.AcceptLanguage}
								<li class='jc'>{@link org.apache.juneau.http.Authorization}
								<li class='jc'>{@link org.apache.juneau.http.CacheControl}
								<li class='jc'>{@link org.apache.juneau.http.Connection}
								<li class='jc'>{@link org.apache.juneau.http.ContentLength}
								<li class='jc'>{@link org.apache.juneau.http.ContentType}
								<li class='jc'>{@link org.apache.juneau.http.Date}
								<li class='jc'>{@link org.apache.juneau.http.Expect}
								<li class='jc'>{@link org.apache.juneau.http.From}
								<li class='jc'>{@link org.apache.juneau.http.Host}
								<li class='jc'>{@link org.apache.juneau.http.IfMatch}
								<li class='jc'>{@link org.apache.juneau.http.IfModifiedSince}
								<li class='jc'>{@link org.apache.juneau.http.IfNoneMatch}
								<li class='jc'>{@link org.apache.juneau.http.IfRange}
								<li class='jc'>{@link org.apache.juneau.http.IfUnmodifiedSince}
								<li class='jc'>{@link org.apache.juneau.http.MaxForwards}
								<li class='jc'>{@link org.apache.juneau.http.Pragma}
								<li class='jc'>{@link org.apache.juneau.http.ProxyAuthorization}
								<li class='jc'>{@link org.apache.juneau.http.Range}
								<li class='jc'>{@link org.apache.juneau.http.Referer}
								<li class='jc'>{@link org.apache.juneau.http.TE}
								<li class='jc'>{@link org.apache.juneau.http.UserAgent}
								<li class='jc'>{@link org.apache.juneau.http.Upgrade}
								<li class='jc'>{@link org.apache.juneau.http.Via}
								<li class='jc'>{@link org.apache.juneau.http.Warning}
								<li class='jc'>{@link java.util.TimeZone}
							</ul>
						<li><b>Direct streams on request/response:</b>
							<ul>
								<li class='jc'>{@link java.io.InputStream}
								<li class='jc'>{@link javax.servlet.ServletInputStream}
								<li class='jc'>{@link java.io.Reader}
								<li class='jc'>{@link java.io.OutputStream}
								<li class='jc'>{@link javax.servlet.ServletOutputStream}
								<li class='jc'>{@link java.io.Writer}
							</ul>
						<li><b>Localization:</b>
							<ul>
								<li class='jc'>{@link java.util.ResourceBundle} - Client-localized resource bundle.
								<li class='jc'>{@link org.apache.juneau.utils.MessageBundle} - A resource bundle with additional features.
								<li class='jc'>{@link java.util.Locale} - Client locale.
							</ul>
						<li><b>Request APIs:</b>
							<ul>
								<li class='jc'>{@link org.apache.juneau.rest.RequestHeaders} - API for accessing request headers.
								<li class='jc'>{@link org.apache.juneau.rest.RequestQuery} - API for accessing request query parameters.
								<li class='jc'>{@link org.apache.juneau.rest.RequestFormData} - API for accessing request form data.
								<li class='jc'>{@link org.apache.juneau.rest.RequestPathMatch} - API for accessing path variables.
								<li class='jc'>{@link org.apache.juneau.rest.RequestBody} - API for accessing request body.
							</ul>
						<li><b>Other:</b>
							<ul>
								<li class='jc'>{@link org.apache.juneau.http.HttpMethod} - The method name matched (when using <code><ja>@RestMethod</ja>(name=<js>"*"</js>)</code>)
								<li class='jc'>{@link org.apache.juneau.rest.RestLogger} - Logger with additional features.
								<li class='jc'>{@link org.apache.juneau.rest.RestContext} - The resource read-only context.
								<li class='jc'>{@link org.apache.juneau.parser.Parser} - The parser matching the request content type.
								<li class='jc'>{@link org.apache.juneau.dto.swagger.Swagger} - The auto-generated Swagger doc.
								<li class='jc'>{@link org.apache.juneau.config.Config} - The external config for the resource.
								<li class='jc'>{@link org.apache.juneau.rest.RequestProperties} - API for modifying request-time configuration properties.
							</ul>
					</ul>
				<li><b>Annotated parameters:</b>
					<ul>
						<li class='ja'>{@link org.apache.juneau.rest.annotation.Path} - Variables in matched URL path patterns.
						<li class='ja'>{@link org.apache.juneau.rest.annotation.FormData} - Multipart form post parameter values.
						<li class='ja'>{@link org.apache.juneau.rest.annotation.HasFormData} - Denotes whether the form data parameter exists.
						<li class='ja'>{@link org.apache.juneau.rest.annotation.Query} - Query parameters.  Using this prevents the HTTP body from being processed as a URL-Encoded form post.
						<li class='ja'>{@link org.apache.juneau.rest.annotation.HasQuery} - Denotes whether the query parameter exists.
						<li class='ja'>{@link org.apache.juneau.rest.annotation.Header} - A header value.
						<li class='ja'>{@link org.apache.juneau.rest.annotation.Method} - The HTTP method name. 
						<li class='ja'>{@link org.apache.juneau.rest.annotation.PathRemainder} - The remainder value after path pattern match.
						<li class='ja'>{@link org.apache.juneau.rest.annotation.Body} - The HTTP content parsed as a POJO.
					</ul>
			</ul>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/example1/{a1}/{a2}/{a3}/*"</js>)
	<jk>public</jk> String doGetExample1(
		RestRequest req,
		RestResponse res,
		<ja>@Method</ja> String method,
		<ja>@Path</ja> String a1,
		<ja>@Path</ja> <jk>int</jk> a2,
		<ja>@Path</ja> UUID a3,
		<ja>@Query</ja>(<js>"p1"</js>) <jk>int</jk> p1,
		<ja>@Query</ja>(<js>"p2"</js>) String p2,
		<ja>@Query</ja>(<js>"p3"</js>) UUID p3,
		<ja>@HasQuery</ja>(<js>"p3"</js>) boolean hasP3,
		<ja>@PathRemainder</ja> String remainder,
		<ja>@Header</ja>(<js>"Accept-Language"</js>) String lang,
		<ja>@Header</ja>(<js>"Accept"</js>) String accept,
		<ja>@Header</ja>(<js>"DNT"</js>) <jk>int</jk> doNotTrack,
		RequestProperties properties,
		ResourceBundle nls
	) {
		<jc>// Do something with all of those</jc>
	}
			</p>
			<h5 class='section'>Notes:</h5>
			<ul>
				<li>All annotations have programmatic equivalents on the {@link org.apache.juneau.rest.RestRequest} class.
			</ul>
			<h5 class='section'>See Also:</h5>
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_paramResolvers} - For configuring custom parameter types.
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RestRequest"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.2 - RestRequest</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RestRequest} object is an extension of the <l>HttpServletRequest</l> class
				with various built-in convenience methods for use in building REST interfaces.
				<br>It can be accessed by passing it as a parameter on your REST Java method:
			</p>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RestRequest req) {...}			
			</p>
			<p>
				There are many useful methods on this object, but the main ones are shown below:
			</p>
			<ul class='doctree'>
				<li class='jc'><code>{@link org.apache.juneau.rest.RestRequest} <jk>extends</jk> HttpServletRequest</code>
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getHeaders() getHeaders()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getQuery() getQuery()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getFormData() getFormData()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getBody() getBody()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getPathMatch() getPathMatch()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getLogger() getLogger()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getInfoProvider() getInfoProvider()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getSwagger() getSwagger()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getConfig() getConfig()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getVarResolverSession() getVarResolverSession()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getMessageBundle() getMessageBundle()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getProperties() getProperties()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getClasspathReaderResource(String,boolean,MediaType) getClasspathReaderResource(String,boolean,MediaType)}
				</ul>
			</ul>
		</div>
		
		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RestResponse"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.3 - RestResponse</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RestResponse} object is an extension of the <l>HttpServletResponse</l> class
				with various built-in convenience methods for use in building REST interfaces.
				<br>It can be accessed by passing it as a parameter on your REST Java method:
			</p>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RestResponse req) {...}			
			</p>
			<p>
				The important methods on this class are shown below:
			</p>
			<ul class='doctree'>
				<li class='jc'><code>{@link org.apache.juneau.rest.RestResponse} <jk>extends</jk> HttpServletResponse</code>
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.RestResponse#setOutput(Object) setOutput(Object)}
					<li class='jm'>{@link org.apache.juneau.rest.RestResponse#getProperties() getProperties()}
					<li class='jm'>{@link org.apache.juneau.rest.RestResponse#getHtmlDocBuilder() getHtmlDocBuilder()}
					<li class='jm'>{@link org.apache.juneau.rest.RestResponse#getDirectWriter(String) getDirectWriter(String)}
				</ul>
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RequestBody"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.4 - RequestBody</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RequestBody} object is the API for accessing the body of an HTTP request.
				<br>It can be accessed by passing it as a parameter on your REST Java method:
			</p>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestBody body) {...}			
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public void</jk> doPost(RequestBody body) {
		<jc>// Convert body to a linked list of Person objects.</jc>
		List&lt;Person&gt; l = body.asType(LinkedList.<jk>class</jk>, Person.<jk>class</jk>);
		...
	}
			</p>
			<p>
				The important methods on this class are:
			</p>
			<ul class='doctree'>
				<li class='jc'>{@link org.apache.juneau.rest.RequestBody} 
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.RequestBody#getReader() getReader()}
					<li class='jm'>{@link org.apache.juneau.rest.RequestBody#getInputStream() getInputStream()}
					<li class='jm'>{@link org.apache.juneau.rest.RequestBody#asType(Class) asType(Class)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestBody#asType(Type,Type...) asType(Type,Type...)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestBody#asString() asString()}
					<li class='jm'>{@link org.apache.juneau.rest.RequestBody#asHex() asHex()}
					<li class='jm'>{@link org.apache.juneau.rest.RequestBody#asSpacedHex() asSpacedHex()}
				</ul>
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RequestHeaders"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.5 - RequestHeaders</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RequestHeaders} object is the API for accessing the headers of an HTTP request.
				<br>It can be accessed by passing it as a parameter on your REST Java method:
			</p>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestHeaders headers) {...}			
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestHeaders headers) {

		<jc>// Add a default value.</jc>
		headers.addDefault(<js>"ETag"</js>, <jsf>DEFAULT_UUID</jsf>);
	
		<jc>// Get a header value as a POJO.</jc>
		UUID etag = headers.get(<js>"ETag"</js>, UUID.<jk>class</jk>);
	
		<jc>// Get a standard header.</jc>
		CacheControl = headers.getCacheControl();
	 }			
			</p>
			<p>
				The important methods on this class are:
			</p>
			<ul class='doctree'>
				<li class='jc'><code>{@link org.apache.juneau.rest.RequestHeaders} <jk>extends</jk> TreeMap&lt;String,String[]&gt;</code>
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#get(String,Class) get(String,Class)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#get(String,Type,Type...) get(String,Type,Type)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#getString(String,String) getString(String,String)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#getInt(String,int) getInt(String,int)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#getBoolean(String,boolean) getBoolean(String,boolean)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#addDefault(String,Object) addDefault(String,Object)}
				</ul>
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RequestQuery"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.6 - RequestQuery</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RequestQuery} object is the API for accessing the GET query parameters of an HTTP request.
				<br>It can be accessed by passing it as a parameter on your REST Java method:
			</p>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestQuery query) {...}			
				</p>
				<h5 class='figure'>Example:</h5>
				<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestQuery query) {

		<jc>// Get query parameters converted to various types.</jc>
		<jk>int</jk> p1 = query.get(<js>"p1"</js>, 0, <jk>int</jk>.<jk>class</jk>);
		String p2 = query.get(<js>"p2"</js>, String.<jk>class</jk>);
		UUID p3 = query.get(<js>"p3"</js>, UUID.<jk>class</jk>);
	 }			
			</p>
			<p>
				An important distinction between the behavior of this object and <l>HttpServletRequest.getParameter(String)</l> is
				that the former will NOT load the body of the request on FORM POSTS and will only look at parameters
				found in the query string.
				<br>This can be useful in cases where you're mixing GET parameters and FORM POSTS and you don't want to 
				inadvertantly read the body of the request to get a query parameter.
			</p>
			<p>
				The important methods on this class are:
			</p>
			<ul class='doctree'>
				<li class='jc'><code>{@link org.apache.juneau.rest.RequestQuery} <jk>extends</jk> LinkedHashMap&lt;String,String[]&gt;</code>
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#get(String,Class) get(String,Class)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#get(String,Type,Type...) get(String,Type,Type)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#getString(String,String) getString(String,String)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#getInt(String,int) getInt(String,int)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#getBoolean(String,boolean) getBoolean(String,boolean)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#addDefault(String,Object) addDefault(String,Object)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#getSearchArgs() getSearchArgs()}
				</ul>
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RequestFormData"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.7 - RequestFormData</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RequestFormData} object is the API for accessing the HTTP request body as form data.
				<br>It can be accessed by passing it as a parameter on your REST Java method:
			</p>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestFormData query) {...}			
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestFormData formData) {

		<jc>// Get query parameters converted to various types.</jc>
		<jk>int</jk> p1 = formData.get(<js>"p1"</js>, 0, <jk>int</jk>.<jk>class</jk>);
		String p2 = formData.get(<js>"p2"</js>, String.<jk>class</jk>);
		UUID p3 = formData.get(<js>"p3"</js>, UUID.<jk>class</jk>);
	 }			
			</p>
			<p>
				Note that this object does NOT take GET parameters into account and only returns values found in the body of the request.
			</p>
			<p>
				The important methods on this class are:
			</p>
			<ul class='doctree'>
				<li class='jc'><code>{@link org.apache.juneau.rest.RequestFormData} <jk>extends</jk> LinkedHashMap&lt;String,String[]&gt;</code>
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#get(String,Class) get(String,Class)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#get(String,Type,Type...) get(String,Type,Type)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#getString(String,String) getString(String,String)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#getInt(String,int) getInt(String,int)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#getBoolean(String,boolean) getBoolean(String,boolean)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#addDefault(String,Object) addDefault(String,Object)}
				</ul>
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RestMethodPath"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.8 - @RestMethod.path()</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.annotation.RestMethod#path() @RestMethod.path()} annotation allows 
				you to define URL path patterns to match against.
				<br>These patterns can contain variables of the form <l>"{xxx}"</l> that can be passed in directly to the
				Java methods as extra parameters.
			</p>
			<p>
				In the following example, 3 separate GET request handlers are defined with different path patterns.
				<br>Note how the variables are passed in as additional arguments on the method, and how those arguments are 
				automatically converted to the specified class type...
			</p>
			<p class='bcode'>
	<jc>// Default method</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>)
	<jk>public void</jk> doGetDefault() {
		...
	}

	<jc>// Method with path pattern</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/xxx"</js>)
	<jk>public void</jk> doGetNoArgs(...) {
		...
	}

	<jc>// Method with path pattern with arguments</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/xxx/{foo}/{bar}/{baz}/{bing}"</js>)
	<jk>public void</jk> doGetWithArgs(<ja>@Path</ja> String foo, <ja>@Path</ja> <jk>int</jk> bar, <ja>@Path</ja> MyEnum baz, <ja>@Path</ja> UUID bing) {
		...
	}
			</p>
			<p>
				By default, path patterns are matched using a best-match heuristic. 
				<br>When overlaps occur, URLs are matched from most-specific to most-general order:
			</p>
			<p class='bcode'>
	<jc>// Try first </jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/foo/bar"</js>)
	<jk>public void</jk> method1() {
		...
	}

	<jc>// Try second</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/foo/{bar}"</js>)
	<jk>public void</jk> method2(...) {
		...
	}

	<jc>// Try third</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/foo/*"</js>)
	<jk>public void</jk> method3(...) {
		...
	}

	<jc>// Try last</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>)
	<jk>public void</jk> method4(...) {
		...
	}
			</p>
			<p>
				The match heuristic behavior can be overridden by the 
				{@link org.apache.juneau.rest.annotation.RestMethod#priority() @RestMethod.priority()} annotation 
				property.
				<br>However, in practice this is almost never needed.
			</p>
			<p>
				Paths that end with <js>"/*"</js> will do a prefix match on the incoming URL.  
				<br>Any remainder after the match can be accessed through 
				{@link org.apache.juneau.rest.RequestPathMatch#getRemainder()} or parameters with the 
				{@link org.apache.juneau.rest.annotation.PathRemainder @PathRemainder} annotation.
				<br>On the other hand, paths that don't end with <js>"/*"</js> (e.g. <js>"/"</js> or <js>"/foo"</js>) will 
				require an exact URL match, and if any remainder exists, a 404 (not found) error will be thrown.
			</p>
			<p>
				The following example shows the distinction.
			</p>
			<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>)
	<jk>public void</jk> doGet(<ja>@PathRemainder</ja> String remainder) {
		<jc>// URL path pattern can have remainder accessible through req.getRemainder().</jc>
	}

	<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/"</js>)
	<jk>public void</jk> doPut() {
		<jc>// URL path pattern must match exactly and will cause a 404 error if a remainder exists.</jc>
	}
			</p>
			<p>
				Annotations are provided for easy access to URL parameters with automatic conversion to any <a class='doclink' href='#juneau-marshall.PojoCategories'>parsable</a> type.
				<br>For example, the following example can process the URL <l>"/urlWithParams?foo=foo&amp;bar=[1,2,3]&amp;baz=067e6162-3b6f-4ae2-a171-2470b63dff00"</l>...
			</p>
			<p class='bcode'>
	<jc>// Example GET request with access to query parameters</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/urlWithParams"</js>)
	<jk>public</jk> String doGetWithParams(<ja>@Query</ja>(<js>"foo"</js>) String foo, <ja>@Query</ja>(<js>"bar"</js>) <jk>int</jk> bar, <ja>@Query</ja>(<js>"baz"</js>) UUID baz) <jk>throws</jk> Exception {
		<jk>return</jk> <js>"GET /urlWithParams?foo="</js>+foo+<js>"&amp;bar="</js>+bar+<js>"&amp;baz="</js>+baz;
	}
			</p>
			<h5 class='section'>See Also:</h5>
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_path}
				<li class='ja'>{@link org.apache.juneau.rest.annotation.Path}
				<li class='ja'>{@link org.apache.juneau.rest.annotation.PathRemainder}
				<li class='jc'>{@link org.apache.juneau.rest.RequestPathMatch}
			</ul>
		</div>	

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RequestPathMatch"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.9 - RequestPathMatch</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RequestPathMatch} object is the API for accessing the matched variables
				and remainder on the URL path.
			</p>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestPathMatch path) {...}			
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<ja>@RestMethod</ja>(..., path=<js>"/{foo}/{bar}/{baz}/*"</js>)
	<jk>public void</jk> doGet(RequestPathMatch path) {
		<jc>// Example URL:  /123/qux/true/quux</jc>
	 	
		<jk>int</jk> foo = pm.getInt(<js>"foo"</js>);  <jc>// =123</jc>
		String bar = pm.getString(<js>"bar"</js>);  <jc>// =qux</jc>
		<jk>boolean</jk> baz = pm.getBoolean(<js>"baz"</js>);  <jc>// =true</jc>
		String remainder = pm.getRemainder();  <jc>// =quux</jc>
	}
			</p>
			<p>
				The important methods on this class are:
			</p>
			<ul class='doctree'>
				<li class='jc'><code>{@link org.apache.juneau.rest.RequestPathMatch} <jk>extends</jk> TreeMap&lt;String,String&gt;</code>
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.RequestPathMatch#get(String,Class) get(String,Class)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestPathMatch#get(String,Type,Type...) get(String,Type,Type)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestPathMatch#getString(String) getString(String)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestPathMatch#getInt(String) getInt(String)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestPathMatch#getBoolean(String) getBoolean(String)}
					<li class='jm'>{@link org.apache.juneau.rest.RequestPathMatch#getRemainder() getRemainder()}
				</ul>
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.MethodReturnTypes"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.10 - Method Return Types</h4>
		<div class='topic'>
			<p>
				The return type can be any serializable POJO as defined in <a class='doclink' href='#juneau-marshall.PojoCategories'>POJO Categories</a>.
				<br>It can also be <jk>void</jk> if the method is not sending any output (e.g. a request redirect) or is 
				setting the output using the {@link org.apache.juneau.rest.RestResponse#setOutput(Object)} method.
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public</jk> String doGet() {
		<jk>return</jk> <js>"Hello World!"</js>;
	}
			</p>
			<p>
				Out-of-the-box, besides POJOs, the following return types are handled as special cases:
			</p>
			<ul class='spaced-list'>
				<li class='jc'>{@link java.io.InputStream}
					<br>The contents are simply piped to the output stream returned by 
					{@link org.apache.juneau.rest.RestResponse#getNegotiatedOutputStream()}.
					<br>Note that you should call {@link org.apache.juneau.rest.RestResponse#setContentType(String)} to set 
					the <l>Content-Type</l> header if you use this object type.
				<li class='jc'>{@link java.io.Reader}
					<br>The contents are simply piped to the output stream returned by 
					{@link org.apache.juneau.rest.RestResponse#getNegotiatedWriter()}.
					<br>Note that you should call {@link org.apache.juneau.rest.RestResponse#setContentType(String)} to set 
					the <l>Content-Type</l> header if you use this object type.
				<li class='jc'>{@link org.apache.juneau.rest.Redirect}
					<br>Represents an HTTP redirect response.
				<li class='jc'>{@link org.apache.juneau.Streamable}
					<br>Interface that identifies that an object can be serialized directly to an output stream.
				<li class='jc'>{@link org.apache.juneau.Writable}
					<br>Interface that identifies that an object can be serialized directly to a writer.
				<li class='jc'>{@link org.apache.juneau.utils.ZipFileList}
					<br>Special interface for sending zip files as responses.
			</ul>
			<p>
				This is controlled through the following extensible API:
			</p>
			<ul class='doctree'>
				<li class='jic'>{@link org.apache.juneau.rest.ResponseHandler}
				<ul>
					<li class='jc'>{@link org.apache.juneau.rest.response.DefaultHandler}
					<li class='jc'>{@link org.apache.juneau.rest.response.InputStreamHandler}
					<li class='jc'>{@link org.apache.juneau.rest.response.ReaderHandler}
					<li class='jc'>{@link org.apache.juneau.rest.response.RedirectHandler}
					<li class='jc'>{@link org.apache.juneau.rest.response.StreamableHandler}
					<li class='jc'>{@link org.apache.juneau.rest.response.WritableHandler}
					<li class='jc'>{@link org.apache.juneau.rest.response.ZipFileListResponseHandler}
				</ul>
			</ul>
			<p>
				REST Java methods can generate output in any of the following ways:
			</p>
			<ul class='spaced-list'>
				<li>
					By returning a serializable POJO, or any of the following:
					<br>{@link java.io.Reader}, {@link java.io.InputStream}, {@link org.apache.juneau.Streamable}, 
					{@link org.apache.juneau.Writable} 
				<li>
					By calling {@link org.apache.juneau.rest.RestResponse#setOutput(Object)} with any of the types above.
				<li>
					By accessing the {@link java.io.Writer} directly by calling 
					{@link org.apache.juneau.rest.RestResponse#getNegotiatedWriter()} and writing the output yourself.
			</ul>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<jc>// Equivalent method 1</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/example1/{personId}"</js>)
	<jk>public</jk> Person doGet1(<ja>@Path</ja> UUID personId) {
		Person p = getPersonById(personId);
		<jk>return</jk> p;
	}

	<jc>// Equivalent method 2</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/example2/{personId}"</js>)
	<jk>public void</jk> doGet2(RestResponse res, <ja>@Path</ja> UUID personId) {
		Person p = getPersonById(personId);
		res.setOutput(p);
	}

	<jc>// (Sorta) Equivalent method 3</jc>
	<jc>// (Ignores any converters or method-level properties)</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/example3/{personId}"</js>)
	<jk>public void</jk> doGet3(RestRequest req, RestResponse res, <ja>@Path</ja> UUID personId) {
		Person p = getPersonById(personId);
		String accept = req.getHeader(<js>"Accept"</js>, <js>"text/json"</js>);
		WriterSerializer s = res.getSerializerGroup().getWriterSerializer(accept);
		res.setContentType(s.getResponseContentType());
		s.serialize(p, res.getNegotiatedWriter());
	}
			</p>
			<h5 class='section'>See Also:</h5>
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_responseHandlers} - For configuring custom response handlers.
			</ul>
		</div>
	
		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.ReaderResource"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.11 - ReaderResource</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.ReaderResource} class is a convenience object for defining thread-safe
				reusable character-based responses.
				<br>In essence, it's a container for character data with optional response headers and support for
				resolving SVL variables.
			</p>
			<p>
				The {@link org.apache.juneau.rest.ReaderResource} class implements the {@link org.apache.juneau.Writable}
				interface which is handled by the {@link org.apache.juneau.rest.response.WritableHandler} class.
				<br>This allows these objects to be returned as responses by REST methods.
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object sayHello(RestRequest req) {
	
		<jc>// Return a reader resource loaded from a file with support for request-time SVL variables.</jc>
		<jk>return</jk> ReaderResource.<jsm>create</jsm>()
			.contents(<jk>new</jk> File(<js>"helloWorld.txt"</js>))
			.varResolver(req.getVarResolver()) 
			.header(<js>"Cache-Control"</js>, <js>"no-cache"</js>)
			.mediaType(<jsf>TEXT_PLAIN</jsf>)
			.build();
	}
			</p>
			<p>
				The important methods on this class are:
			</p>
			<ul class='doctree'>
				<li class='jc'>{@link org.apache.juneau.rest.ReaderResourceBuilder}
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.ReaderResourceBuilder#contents(Object...) contents(Object...)}
					<li class='jm'>{@link org.apache.juneau.rest.ReaderResourceBuilder#header(String,Object) header(String,Object)}
					<li class='jm'>{@link org.apache.juneau.rest.ReaderResourceBuilder#mediaType(MediaType) mediaType(MediaType)}
					<li class='jm'>{@link org.apache.juneau.rest.ReaderResourceBuilder#varResolver(VarResolverSession) varResolver(VarResolverSession)}
				</ul>
			</ul>
		</div>
	
		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.StreamResource"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.12 - StreamResource</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.StreamResource} class is the binary equivalent to the {@link org.apache.juneau.rest.ReaderResource} object.
				<br>In essence, it's a container for binary data with optional response headers.
			</p>
			<p>
				The {@link org.apache.juneau.rest.StreamResource} class implements the {@link org.apache.juneau.Streamable}
				interface which is handled by the {@link org.apache.juneau.rest.response.StreamableHandler} class.
				<br>This allows these objects to be returned as responses by REST methods.
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object showPicture(RestRequest req) {
	
		<jc>// Return a stream resource loaded from a file.</jc>
		<jk>return</jk> StreamResource.<jsm>create</jsm>()
			.contents(<jk>new</jk> File(<js>"mypicture.png"</js>))
			.header(<js>"Cache-Control"</js>, <js>"no-cache"</js>)
			.mediaType(<jsf>IMAGE_PNG</jsf>)
			.build();
	}
			</p>
			<p>
				The important methods on this class are:
			</p>
			<ul class='doctree'>
				<li class='jc'>{@link org.apache.juneau.rest.StreamResourceBuilder}
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.StreamResourceBuilder#contents(Object...) contents(Object...)}
					<li class='jm'>{@link org.apache.juneau.rest.StreamResourceBuilder#header(String,Object) header(String,Object)}
					<li class='jm'>{@link org.apache.juneau.rest.StreamResourceBuilder#mediaType(MediaType) mediaType(MediaType)}
				</ul>
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.Redirect"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.13 - Redirect</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.Redirect} object is a convenience shortcut for performing <code>HTTP 302</code> redirects.
			</p>
			<p>
				<l>Redirect</l> objects are handled by the {@link org.apache.juneau.rest.response.RedirectHandler} class.
				<br>This allows these objects to be returned as responses by REST methods.
			</p>
			<p>
				The following example shows the difference between handling redirects via <l>RestResponse</l> and the simplified approach of using this class.
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<jc>// Redirect to "/contextPath/servletPath/foobar"</jc>

	<jc>// Using RestRequest/RestResponse</jc>
	<ja>@RestMethod</ja>(...)
	<jk>public void</jk> redirectExample1(RestRequest req, RestResponse res) <jk>throws</jk> IOException {
		res.sendRedirect(req.getServletURI() + <js>"/foobar"</js>);
	}
	
	<jc>// Using Redirect</jc>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Redirect redirectExample2() {
		<jk>return new</jk> Redirect(<js>"foobar"</js>);
	}
			</p>
			<p>
				The constructor can use a <l>MessageFormat</l>-style pattern with multiple arguments.
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Redirect redirectExample3() {
		<jk>return new</jk> Redirect(<js>"foo/{0}/bar/{1}"</js>, id1, id2);
	}
			</p>
			<p>
				The arguments are automatically URL-encoded.
			</p>
			<p>
				Redirecting to the servlet root can be accomplished by simply using the no-arg constructor.
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<jc>// Simply redirect to the servlet root.
	// Equivalent to res.sendRedirect(req.getServletURI()).</jc>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Redirect redirectExample4() {
		<jk>return new</jk> Redirect();
	}
			</p>
		</div>
		
		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RestMethodMatchers"></a>
		<h4 class='topic' onclick='toggle(this)'>7.6.14 - @RestMethod.matchers()</h4>
		<div class='topic'>
			<p>
				{@link org.apache.juneau.rest.RestMatcher RestMatchers} are used to allow multiple Java methods to be 
				tied to the same HTTP method and path, but differentiated by some request attribute such as a specific 
				header value.
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<jc>// GET method that gets invoked for administrators</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>, matchers=IsAdminMatcher.<jk>class</jk>)
	<jk>public</jk> Object doGetForAdmin() {
		...
	}

	<jc>// GET method that gets invoked for everyone else</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>)
	<jk>public</jk> Object doGetForEveryoneElse() {
		...
	}
			</p>
			<p>
				The interface for matchers is simple:
			</p>
			<p class='bcode'>
	<jk>public class</jk> IsAdminMatcher <jk>extends</jk> RestMatcher {

		<ja>@Override</ja> <jc>/* RestMatcher */</jc>
		<jk>public boolean</jk> matches(RestRequest req) {
			<jk>return</jk> req.isUserInRole(<js>"ADMINS_GROUP"</js>);
		}
	}
			</p>
			
			<h5 class='section'>Notes:</h5>
			<ul class='spaced-list'>
				<li>
					If no methods are found with a matching matcher, a <l>412 Precondition Failed</l> status is returned.
				<li>
					If multiple matchers are specified on the same method, ONLY ONE matcher needs to match for the 
					method to be invoked.
				<li>
					Note that you CANNOT define identical paths on different methods UNLESS you use matchers.
					<br>That includes paths that are only different in variable names (e.g. <l>"/foo/{bar}"</l> and 
					<l>"/foo/{baz}"</l>).
					<br>If you try to do so, a <l>ServletException</l> will be thrown on startup.
				<li>
					Methods with matchers take precedence over methods without.
					<br>Otherwise, methods are attempted in the order they appear in the class.
			</ul>
			
			<h5 class='section'>See Also:</h5>
			<ul>
				<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#matchers}
				<li class='jc'>{@link org.apache.juneau.rest.matchers.MultipartFormDataMatcher}
				<li class='jc'>{@link org.apache.juneau.rest.matchers.UrlEncodedFormMatcher}
			</ul>
		</div>
	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Body"></a>
	<h3 class='topic' onclick='toggle(this)'>7.7 - @Body</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.annotation.Body @Body} annotation provides easy access to the HTTP body content as any <a class='doclink' href='#juneau-marshall.PojoCategories'>parsable</a> POJO type
			<br>In the example below, we're POSTing beans.
		</p>
		<p class='bcode'>
	<jc>// Example POST of a bean</jc>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/"</js>)
	<jk>public void</jk> doPost(<ja>@Body</ja> Person person) <jk>throws</jk> Exception {
		<jc>// Do something with person.</jc>
	}
		</p>
		<p>
			The HTTP body of a request can be retrieved as a parsed POJO using either the 
			{@link org.apache.juneau.rest.RestRequest#getBody()} method, or a parameter annotated with 
			{@link org.apache.juneau.rest.annotation.Body @Body}.
		</p>
		<p class='bcode'>
	<jc>// Equivalent method 1</jc>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/example1"</js>)
	<jk>public void</jk> doPost1(<ja>@Body</ja> Person p) {
		<jc>// Do something with p.</jc>
	}

	<jc>// Equivalent method 2</jc>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/example2"</js>)
	<jk>public void</jk> doPost2(RestRequest req) {
		Person p = req.getBody).asType(Person.<jk>class</jk>);
		<jc>// Do something with p.</jc>
	}
		</p>
		<p>
			The Juneau framework will automatically determine the appropriate <l>Parser</l> to use based on the 
			<l>Content-Type</l> HTTP header.  
			<br>So the body content could be JSON or XML or any other supported parsing types.
		</p>
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.Body}
			<li class='jc'>{@link org.apache.juneau.rest.RequestBody}
		</ul>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.HandlingFormPosts"></a>
		<h4 class='topic' onclick='toggle(this)'>7.7.1 - Handling Form Posts</h4>
		<div class='topic'>
			<p>
				The best way to handle a form post is by using an input bean.
				<br>The samples include a <l>UrlEncodedFormResource</l> class that takes in URL-Encoded form post of the 
				form <l>"aString=foo&amp;aNumber=123&amp;aDate=2001-07-04T15:30:45Z"</l>.
				<br>The code is shown here:
			</p>
			<p class='bcode'>				
	<ja>@RestResource</ja>(
		path=<js>"/urlEncodedForm"</js>
	)
	<jk>public class</jk> UrlEncodedFormResource <jk>extends</jk> Resource {

		<jd>/** POST request handler */</jd>
		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/"</js>)
		<jk>public</jk> Object doPost(<ja>@Body</ja> FormInputBean input) <jk>throws</jk> Exception {
			<jc>// Just mirror back the request</jc>
			<jk>return</jk> input;
		}
	
		<jk>public static class</jk> FormInputBean {
			<jk>public</jk> String <jf>aString</jf>;
			<jk>public int</jk> <jf>aNumber</jf>;
			<ja>@BeanProperty</ja>(pojoSwaps=CalendarSwap.<jsf>ISO8601DT</jsf>.<jk>class</jk>)
			<jk>public</jk> Calendar <jf>aDate</jf>;
		}
	}		
			</p>	
			<p>
				Another possibility is to access the form parameters individually:	
			</p>	
			<p class='bcode'>
	<jd>/** POST request handler */</jd>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/"</js>)
	<jk>public</jk> Object doPost(<ja>@FormData</ja>(<js>"aString"</js>) String aString, <ja>@FormData</ja>(<js>"aNumber"</js>) <jk>int</jk> aNumber, <ja>@FormData</ja>(<js>"aDate"</js>) Calendar aDate) <jk>throws</jk> Exception {
		...
	}
			</p>
			<p>
				The advantage to the form input bean is that it can handle any of the parsable types (e.g. JSON, XML...) 
				in addition to URL-Encoding.  
				<br>The latter approach only supports URL-Encoding.
			</p>
			<ul class='doctree'>
				<li class='warn'>
					If you're using form input beans, DO NOT use the <l>@FormData</l> attribute or 
					{@link org.apache.juneau.rest.RestRequest#getParameter(String)} method since this will cause the 
					underlying JEE servlet to parse the HTTP body as a form post.
					<br>Your input bean will end up being null since there won't be any content left after the servlet 
					has parsed the body of the request.
					<br>This applies to WHENEVER you use <l>@Body</l> or {@link org.apache.juneau.rest.RestRequest#getBody()}
			</ul>
		</div>
		
		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.HandlingMultiPartFormPosts"></a>
		<h4 class='topic' onclick='toggle(this)'>7.7.2 - Handling Multi-Part Form Posts</h4>
		<div class='topic'>
			<p>
				The Juneau framework does not natively support multipart form posts.  
				<br>However, it can be done in conjunction with the Apache Commons File Upload library.
			</p>	
			<p>
				The samples include a <l>TempDirResource</l> class that uses the File Upload library to allow files to 
				be uploaded as multipart form posts.
			</p>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<ja>@RestResource</ja>(
		path=<js>"/tempDir"</js>
	)
	<jk>public class</jk> TempDirResource <jk>extends</jk> DirectoryResource {
	
		<jd>/**
		 * [POST /upload] - Upload a file as a multipart form post.
		 * Shows how to use the Apache Commons ServletFileUpload class for handling multi-part form posts.
		 */</jd>
		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/upload"</js>, matchers=TempDirResource.MultipartFormDataMatcher.<jk>class</jk>)
		<jk>public</jk> Redirect uploadFile(RestRequest req) <jk>throws</jk> Exception {
			ServletFileUpload upload = <jk>new</jk> ServletFileUpload();
			FileItemIterator iter = upload.getItemIterator(req);
			<jk>while</jk> (iter.hasNext()) {
				FileItemStream item = iter.next();
				<jk>if</jk> (item.getFieldName().equals(<js>"contents"</js>)) { 
					File f = <jk>new</jk> File(getRootDir(), item.getName());
					IOPipe.<jsm>create</jsm>(item.openStream(), <jk>new</jk> FileOutputStream(f)).closeOut().run();
				}
			}
			<jk>return new</jk> Redirect(); <jc>// Redirect to the servlet root.</jc>
		}
	
		<jd>/** Causes a 404 if POST isn't multipart/form-data */</jd>
		<jk>public static class</jk> MultipartFormDataMatcher <jk>extends</jk> RestMatcher {
		
			<ja>@Override</ja> <jc>/* RestMatcher */</jc>
			<jk>public boolean</jk> matches(RestRequest req) {
				String contentType = req.getContentType();
				<jk>return</jk> contentType != <jk>null</jk> &amp;&amp; contentType.startsWith(<js>"multipart/form-data"</js>); 
			}
		}
			</p>
		</div>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.FormData"></a>
	<h3 class='topic' onclick='toggle(this)'>7.8 - @FormData</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.annotation.FormData @FormData} annotation is used to retrieve request form post entries.
		</p>
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>	
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> doPost(RestRequest req, RestResponse res,
		<ja>@FormData</ja>(<js>"p1"</js>) <jk>int</jk> p1, 
		<ja>@FormData</ja>(<js>"p2"</js>) String p2, 
		<ja>@FormData</ja>(<js>"p3"</js>) UUID p3) {...}
		</p>
		<p>
			This is functionally equivalent to the following code:
		</p>
		<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> doPost(RestRequest req, RestResponse res) {
		RequestFormData fd = req.getFormData();
		<jk>int</jk> p1 = fd.get(<js>"p1"</js>, 0, <jk>int</jk>.<jk>class</jk>);
		String p2 = fd.get(<js>"p2"</js>, String.<jk>class</jk>);
		UUID p3 = fd.get(<js>"p3"</js>, UUID.<jk>class</jk>);
	}
		</p>
		<p>
			The registered {@link org.apache.juneau.rest.RestContext#REST_partParser} is used to convert strings
			to POJOs and controls what POJO types are supported.
			<br>As a general rule, any POJO convertable from a String is supported.
		</p>
		<ul class='doctree'>
			<li class='warn'>
 				This annotation should not be combined with the {@link org.apache.juneau.rest.annotation.Body @Body} annotation or {@link org.apache.juneau.rest.RestRequest#getBody()} method
 				for <code>application/x-www-form-urlencoded POST</code> posts, since it will trigger the underlying servlet
				API to parse the body content as key-value pairs resulting in empty content.
				<br>The {@link org.apache.juneau.rest.annotation.Query @Query} annotation can be used to retrieve a URL parameter in the URL string without triggering the
				servlet to drain the body content.
		</ul>
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.FormData}
			<li class='ja'>{@link org.apache.juneau.rest.annotation.HasFormData}
			<li class='jc'>{@link org.apache.juneau.rest.RequestFormData}
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Query"></a>
	<h3 class='topic' onclick='toggle(this)'>7.9 - @Query</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.annotation.Query @Query} annotation is used to retrieve request URL query parameters.
			<br>It's identical to {@link org.apache.juneau.rest.annotation.FormData @FormData}, but only retrieves the parameter from the URL string, not URL-encoded form posts.
		</p>
		<p>
			Unlike {@link org.apache.juneau.rest.annotation.FormData @FormData}, using this annotation does not result in the servlet reading the contents of
			URL-encoded form posts.
			<br>Therefore, this annotation can be used in conjunction with the {@link org.apache.juneau.rest.annotation.Body @Body} annotation or
			{@link org.apache.juneau.rest.RestRequest#getBody()} method for <code>application/x-www-form-urlencoded POST</code> calls.
		</p>
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(RestRequest req, RestResponse res,
		<ja>@Query</ja>(<js>"p1"</js>) <jk>int</jk> p1, 
		<ja>@Query</ja>(<js>"p2"</js>) String p2, 
		<ja>@Query</ja>(<js>"p3"</js>) UUID p3) {...}
			</p>
			<p>
				This is functionally equivalent to the following code:
			</p>
			<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(RestRequest req, RestResponse res) {
		RequestQuery q = req.getQuery();
		<jk>int</jk> p1 = q.get(<js>"p1"</js>, 0, <jk>int</jk>.<jk>class</jk>);
		String p2 = q.get(<js>"p2"</js>, String.<jk>class</jk>);
		UUID p3 = q.get(<js>"p3"</js>, UUID.<jk>class</jk>);
	}
		</p>
		<p>
			The registered {@link org.apache.juneau.rest.RestContext#REST_partParser} is used to convert strings
			to POJOs and controls what POJO types are supported.
			<br>As a general rule, any POJO convertable from a String is supported.
		</p>
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.Query}
			<li class='ja'>{@link org.apache.juneau.rest.annotation.HasQuery}
			<li class='jc'>{@link org.apache.juneau.rest.RequestQuery}
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Header"></a>
	<h3 class='topic' onclick='toggle(this)'>7.10 - @Header</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.annotation.Header @Header} is used to retrieve request headers.
		</p>
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(RestRequest req, RestResponse res, <ja>@Header</ja>(<js>"ETag"</js>) UUID etag) {...}
		</p>
		<p>
			This is functionally equivalent to the following code:
		</p>
		<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doPostPerson(RestRequest req, RestResponse res) {
		RequestHeaders h = req.getHeaders();
		UUID etag = h.get(<js>"ETag"</js>, UUID.<jk>class</jk>);
	}
		</p>
		<p>
			The registered {@link org.apache.juneau.rest.RestContext#REST_partParser} is used to convert strings
			to POJOs and controls what POJO types are supported.
			<br>As a general rule, any POJO convertible from a String is supported.
		</p>
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.Header}
			<li class='jc'>{@link org.apache.juneau.rest.RequestHeaders}
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Serializers"></a>
	<h3 class='topic' onclick='toggle(this)'>7.11 - Serializers</h3>
	<div class='topic'>
		<p>
			REST resources use the {@link org.apache.juneau.serializer.Serializer} API for defining serializers for 
			serializing response POJOs.
		</p>
		<p>
			The servlet will pick which serializer to use by matching the request <l>Accept</l> header with the
			media types defined through the {@link org.apache.juneau.serializer.Serializer#getMediaTypes()} method.
		</p>
		<p>
			Serializers can be associated with REST servlets in the following ways:
		</p>
		<ul class='doctree'>
			<li class='ja'>
				{@link org.apache.juneau.rest.annotation.RestResource#serializers()} 
				- Annotation on resource Java class.
			<li class='ja'>
				{@link org.apache.juneau.rest.annotation.RestMethod#serializers()} 
				- Annotation on resource Java method.
			<li class='jf'>
				{@link org.apache.juneau.rest.RestContext#REST_serializers} 
				- Programmatic.
		</ul>
		<p>
			The following are all equivalent ways of defining serializers used by a resource:
		</p> 		
		<p class='bcode'>
	<jc>// Option #1 - Defined via annotation.</jc>
	<ja>@RestResource</ja>(serializers={JsonSerializer.<jk>class</jk>, XmlSerializer.<jk>class</jk>})
	<jk>public class</jk> MyResource {
		
		<jc>// Option #2 - Defined via builder passed in through resource constructor.</jc>
			<jk>public</jk> MyResource(RestContextBuilder builder) <jk>throws</jk> Exception {
			
			<jc>// Using method on builder.</jc>
			builder.serializers(JsonSerializer.<jk>class</jk>, XmlSerializer.<jk>class</jk>);

			<jc>// Same, but use pre-instantiated parsers.</jc>
			builder.serializers(JsonSerializer.<jsf>DEFAULT</jsf>, XmlSerializer.<jsf>DEFAULT</jsf>);

			<jc>// Same, but using property.</jc>
			builder.set(<jsf>REST_serializers</jsf>, JsonSerializer.<jk>class</jk>, XmlSerializer.<jk>class</jk>);
		}

		<jc>// Option #3 - Defined via builder passed in through init method.</jc>
		<ja>@RestHook</ja>(<jsf>INIT</jsf>)
		<jk>public void</jk> init(RestContextBuilder builder) <jk>throws</jk> Exception {
			builder.serializers(JsonSerializer.<jk>class</jk>, XmlSerializer.<jk>class</jk>);
		}

		<jc>// Override at the method level.</jc>
		<ja>@RestMethod</ja>(serializers={HtmlSerializer.<jk>class</jk>})
		<jk>public</jk> MyPojo myMethod() {
			<jc>// Return a POJO to be serialized.</jc>
			<jk>return new</jk> MyPojo(); 
		}
	}
		</p>
		
		<h5 class='section'>See Also:</h5>
		<ul class='doctree'>
			<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_serializers}
		</ul>
	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Parsers"></a>
	<h3 class='topic' onclick='toggle(this)'>7.12 - Parsers</h3>
	<div class='topic'>
		<p>
			REST resources use the {@link org.apache.juneau.parser.Parser} API for defining parsers for parsing request
			body content and converting them into POJOs.
		</p>
		<p>
			The servlet will pick which parser to use by matching the request <l>Content-Type</l> header with the
			media types defined through the {@link org.apache.juneau.parser.Parser#getMediaTypes()} method.
		</p>
		<p>
			Parsers can be associated with REST servlets in the following ways:
		</p>
		<ul class='doctree'>
			<li class='ja'>
				{@link org.apache.juneau.rest.annotation.RestResource#parsers()} 
				- Annotation on resource Java class.
			<li class='ja'>
				{@link org.apache.juneau.rest.annotation.RestMethod#parsers()} 
				- Annotation on resource Java method.
			<li class='jm'>
				{@link org.apache.juneau.rest.RestContextBuilder#parsers(Class[])} 
				- Programmatic.
		</ul>
		<p>
			The following are all equivalent ways of defining parsers used by a resource:
		</p>
		<p class='bcode'>
	<jc>// Option #1 - Defined via annotation.</jc>
	<ja>@RestResource</ja>(parsers={JsonParser.<jk>class</jk>, XmlParser.<jk>class</jk>})
	<jk>public class</jk> MyResource {
		
		<jc>// Option #2 - Defined via builder passed in through resource constructor.</jc>
		<jk>public</jk> MyResource(RestContextBuilder builder) <jk>throws</jk> Exception {
			
			<jc>// Using method on builder.</jc>
			builder.parsers(JsonParser.<jk>class</jk>, XmlParser.<jk>class</jk>);

			<jc>// Same, but use pre-instantiated parsers.</jc>
			builder.parsers(JsonParser.<jsf>DEFAULT</jsf>, XmlParser.<jsf>DEFAULT</jsf>);

			<jc>// Same, but using property.</jc>
			builder.set(<jsf>REST_parsers</jsf>, JsonParser.<jk>class</jk>, XmlParser.<jk>class</jk>);
		}

		<jc>// Option #3 - Defined via builder passed in through init method.</jc>
		<ja>@RestHook</ja>(<jsf>INIT</jsf>)
		<jk>public void</jk> init(RestContextBuilder builder) <jk>throws</jk> Exception {
			builder.parsers(JsonParser.<jk>class</jk>, XmlParser.<jk>class</jk>);
		}

		<jc>// Override at the method level.</jc>
		<ja>@RestMethod</ja>(parsers={HtmlParser.<jk>class</jk>})
		<jk>public</jk> Object myMethod(<ja>@Body</ja> MyPojo myPojo) {
			<jc>// Do something with your parsed POJO.</jc>
		}
	}
		</p>
		<h5 class='section'>See Also:</h5>
		<ul class='doctree'>
			<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_parsers}
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Properties"></a>
	<h3 class='topic' onclick='toggle(this)'>7.13 - Properties</h3>
	<div class='topic'>
		<p>
			As shown in previous sections, Juneau serializers and parsers are highly-configurable through properties.
			(See <a class='doclink' href='#juneau-marshall.ConfigurableProperties'>Configurable Properties</a>)
		</p>
		<p>
			These properties can be defined for serializers and parsers registered on a REST resource via the following:
		</p>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestResource#properties()} 
			<li class='jc'>{@link org.apache.juneau.rest.RestContextBuilder} - Various methods on the context builder.
		</ul>
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jk>import static</jk> org.apache.juneau.BeanContext.*;
	<jk>import static</jk> org.apache.juneau.serializer.Serializer.*;
	<jk>import static</jk> org.apache.juneau.json.JsonSerializer.*;

	<jc>// Servlet with properties applied</jc>
	<ja>@RestResource</ja>(
		properties={
			<jc>// Bean properties should be sorted alphabetically.</jc>
			<ja>@Property</ja>(name=<jsf>BEAN_sortProperties</jsf>, value=<js>"true"</js>),
			
			<jc>// Nulls should not be serialized</jc>
			<ja>@Property</ja>(name=<jsf>SERIALIZER_trimNulls</jsf>, value=<js>"true"</js>),

			<jc>// Solidus characters should be escaped in JSON</jc>
			<ja>@Property</ja>(name=<jsf>JSON_escapeSolidus</jsf>, value=<js>"true"</js>)
		}
	)
	<jk>public</jk> MyRestServlet <jk>extends</jk> RestServletDefault {...}
		</p>
		<p>
			The programmatic equivalent to this is:
		</p>
		<p class='bcode'>
	<jc>// Servlet with properties applied</jc>
	<ja>@RestResource</ja>(...)
	<jk>public</jk> MyRestServlet <jk>extends</jk> RestServletDefault {
	
		<jk>public</jk> MyRestServlet(RestContextBuilder builder) {
			
			builder
				.sortProperties();  <jc>// Note: RestContextBuilder extends from BeanContextBuilder</jc>
				.set(<jsf>SERIALIZER_trimNulls</jsf>, <jk>true</jk>);
				.set(<jsf>JSON_escapeSolidus</jsf>, <jk>true</jk>);
		}
	}
		</p>
		<p>
			Properties can also be overridden at the Java method level:
		</p>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#properties()} 
			<li class='jc'>{@link org.apache.juneau.rest.RequestProperties} 
		</ul>
		<p class='bcode'>
	<jc>// GET method with method-level properties</jc>
	<ja>@RestMethod</ja>(
		name=<jsf>GET</jsf>, path=<js>"/*"</js>,
		properties={
			<jc>// Bean properties should be sorted alphabetically.</jc>
			<ja>@Property</ja>(name=<jsf>BEAN_sortProperties</jsf>, value=<js>"true"</js>),
			
			<jc>// Nulls should not be serialized</jc>
			<ja>@Property</ja>(name=<jsf>SERIALIZER_trimNulls</jsf>, value=<js>"true"</js>),

			<jc>// Solidus characters should be escaped in JSON</jc>
			<ja>@Property</ja>(name=<jsf>JSON_escapeSolidus</jsf>, value=<js>"true"</js>)
		}
	<jk>public</jk> Object doGet() {
		...
	}
		</p>
		<p>
			Using the {@link org.apache.juneau.rest.RequestProperties} object:
		</p>
		<p class='bcode'>
	<jc>// Access it from RestRequest.</jc>
	<jk>public</jk> Object doGet(RestRequest req) {
		RequestProperties properties = req.getProperties();
		properties.put(<jsf>JSON_escapeSolidus</jsf>, <jk>true</jk>);
	}

	<jc>// Or just pass in a RequestProperties object.</jc>
	<jk>public</jk> Object doGet(RequestProperties properties) {
		properties.put(<jsf>JSON_escapeSolidus</jsf>, <jk>true</jk>);
	}
		</p>
		<p>
			Properties set via {@link org.apache.juneau.rest.RequestProperties} are session-override
			properties that are passed in through {@link org.apache.juneau.serializer.SerializerSessionArgs}
			and {@link org.apache.juneau.parser.ParserSessionArgs} and can only be used on configuration settings
			marked as <code>Session-overridable: <jk>true</jk></code>.
		</p>			
		<p>
			Properties are open-ended and can be used for other purposes.
			<br>They're made available through the following methods:
		</p>
		<ul>
			<li class='jm'>{@link org.apache.juneau.rest.RestContext#getProperties()}
			<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getProperties()}
		</ul>
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestResource#flags()} - Shorthand for boolean properties.
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#flags()} - Shorthand for boolean properties.
			<li class='jc'>{@link org.apache.juneau.rest.RestContextProperties} 
			<li class='jc'>{@link org.apache.juneau.rest.RestMethodProperties} 
			<li class='jc'>{@link org.apache.juneau.rest.RequestProperties} 
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Transforms"></a>
	<h3 class='topic' onclick='toggle(this)'>7.14 - Transforms</h3>
	<div class='topic'>
		<p>
			The Juneau serializers and parsers can be configured on how to handle POJOs through the use of Transforms.
			(See <a class='doclink' href='#juneau-marshall.Transforms'>Transforms</a>)
		</p>
		<p>
			Transforms are associated serializers and parsers registered on a REST resource via the following:
		</p>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestResource#beanFilters()} 
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestResource#pojoSwaps()} 
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#beanFilters()} 
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#pojoSwaps()}
			<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#beanFilters(Object...)} 
			<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#pojoSwaps(Object...)} 
		</ul>
		<p class='bcode'>
	<jc>// Servlet with transforms applied</jc>
	<ja>@RestResource</ja>(
		pojoSwaps={
			<jc>// Calendars should be serialized/parsed as ISO8601 date-time strings</jc>
			CalendarSwap.<jsf>DEFAULT_ISO8601DT</jsf>.<jk>class</jk>,

			<jc>// Byte arrays should be serialized/parsed as BASE64-encoded strings</jc>
			ByteArrayBase64Swap.<jk>class</jk>
		},
		beanFilters={
			<jc>// Subclasses of MyInterface will be treated as MyInterface objects.</jc>
			<jc>// Bean properties not defined on that interface will be ignored.</jc>
		}
	)
	<jk>public</jk> MyRestServlet <jk>extends</jk> RestServletDefault {...}
		</p>
		<p>
			The programmatic equivalent to this is:
		</p>
		<p class='bcode'>
	<jc>// Servlet with properties applied</jc>
	<ja>@RestResource</ja>(...)
	<jk>public</jk> MyRestServlet <jk>extends</jk> RestServletDefault {
	
		<jk>public</jk> MyRestServlet(RestContextBuilder builder) {
			
			builder
				.pojoSwaps(
					CalendarSwap.<jsf>DEFAULT_ISO8601DT</jsf>.<jk>class</jk>,
					ByteArrayBase64Swap.<jk>class</jk>
				) 
				.beanFilters(MyInterface.<jk>class</jk>);
		}
	}
		</p>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Guards"></a>
	<h3 class='topic' onclick='toggle(this)'>7.15 - Guards</h3>
	<div class='topic'>
		<p>
			Guards are classes that control access to REST classes and methods.
		</p>
		<p>
			Guards are associated with resource classes and methods via the following:
		</p>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestResource#guards()} 
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#guards()} 
			<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#guards(Class...)} 
		</ul>
		<p class='bcode'>
	<jc>// Define a guard that only lets Billy make a request</jc>
	<jk>public</jk> BillyGuard <jk>extends</jk> RestGuard {

		<ja>@Override</ja> <jc>/* RestGuard */</jc>
		<jk>public boolean</jk> isRequestAllowed(RestRequest req) {
			<jk>return</jk> req.getUserPrincipal().getName().equals(<js>"Billy"</js>);
		}
	}

	<jc>// Servlet with class-level guard applied</jc>
	<ja>@RestResource</ja>(guards=BillyGuard.<jk>class</jk>)
	<jk>public</jk> MyRestServlet <jk>extends</jk> RestServletDefult {

 		<jc>// Delete method that only Billy is allowed to call.</jc>
 		<ja>@RestMethod</ja>(name=<js>"DELETE"</js>)
		<jk>public</jk> doDelete(RestRequest req, RestResponse res) <jk>throws</jk> Exception {...}
 	}
		</p>
		<p>
			A common use for guards is to only allow admin access to certain Java methods...
		</p>
		<p class='bcode'>
	<jc>// DELETE method</jc>
	<ja>@RestMethod</ja>(name=<jsf>DELETE</jsf>, guards={AdminGuard.<jk>class</jk>})
	<jk>public void</jk> doDelete(RestRequest req, RestResponse res) <jk>throws</jk> Exception {...}
		</p>
		<p class='bcode'>
	<jk>public class</jk> AdminGuard <jk>extends</jk> RestGuard {

		<ja>@Override</ja> <jc>/* RestGuard */</jc>
		<jk>public boolean</jk> isRequestAllowed(RestRequest req) {
			<jk>return</jk> req.getUserPrincipal().isUserInRole(<js>"ADMIN"</js>);
		}
	}
		</p>
		<p>
			A guard failure results in an <l>HTTP 401 Unauthorized</l> response.
			<br>However, this can be configured by overriding the 
			{@link org.apache.juneau.rest.RestGuard#guard(RestRequest,RestResponse)} and processing the response 
			yourself.
		</p>
		<p class='bcode'>
	<jk>public class</jk> AdminGuard <jk>extends</jk> RestGuard {

		<ja>@Override</ja> <jc>/* RestGuard */</jc>
		<jk>public boolean</jk> guard(RestRequest req, RestResponse res) <jk>throws</jk> RestException {
			<jk>if</jk> (! isOkay(req))
				<jk>throw new</jk> RestException(<jsf>SC_FORBIDDEN</jsf>, <js>"Access denied!!!"</js>);
			<jk>return true</jk>;
		}
	}
		</p>
		<p>
			When guards are associated at the class-level, it's equivalent to associating guards on all Java methods on 
			the servlet.
			<br>If multiple guards are present, ALL guards must pass.
		</p>
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_guards}
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Converters"></a>
	<h3 class='topic' onclick='toggle(this)'>7.16 - Converters</h3>
	<div class='topic'>
		<p>
			Converters can be thought of as "post-processors" for POJOs before they get passed to the serializers.
		</p>
		<p>
			Converters are associated with resource classes and methods via the following:
		</p>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestResource#converters()} 
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#converters()} 
			<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#converters(Class...)} 
		</ul>
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Associate the Traversable converter to all Java REST methods in this servlet</jc>
	<ja>@RestResource</ja>(converters=Traversable.<jk>class</jk>)
	<jk>public</jk> MyRestServlet <jk>extends</jk> RestServlet {
		...
	}
		</p>
		<p>
			They can also be defined at the method level:
		</p>
		<p class='bcode'>
	<jc>// GET person request handler.</jc>
	<jc>// Traversable conversion enabled to allow nodes in returned POJO tree to be addressed.</jc>
	<jc>// Queryable conversion enabled to allow returned POJO to be searched/viewed/sorted.</jc>
	<ja>@RestMethod</ja>(
		name=<jsf>GET</jsf>, path=<js>"/people/{id}/*"</js>,
		converters={Traversable.<jk>class</jk>,Queryable.<jk>class</jk>}
	)
	<jk>public</jk> Person getPerson(<ja>@Path</ja> <jk>int</jk> id) {
		<jk>return</jk> findPerson(id);
	}
		</p>	
		<p>
			The following converter is used to provide support for addressing child nodes in a POJO tree with URL path 
			remainders.  
			<br>In this code, the 3rd parameter is the object that was returned by the Java method.
			<br>The converter uses the {@link org.apache.juneau.utils.PojoRest} wrapper class to address nodes in the 
			tree.
		</p>
		<p class='bcode'>
	<jd>/**
	 * Converter for enablement of PojoRest support on response objects returned by a @RestMethod method.
	 * When enabled, objects in a POJO tree returned by the REST method can be addressed through additional URL path information.
	 */</jd>
	<jk>public class</jk> Traversable <jk>implements</jk> RestConverter {
	
		<ja>@Override</ja> <jc>/* RestConverter */</jc>
		<jk>public</jk> Object convert(RestRequest req, Object o) <jk>throws</jk> RestException {
			if (o == <jk>null</jk>)
				<jk>return null</jk>;
	
			String pathRemainder = req.getPathMatch().getRemainder();
	
			<jk>if</jk> (pathRemainder != <jk>null</jk>) {
				<jk>try</jk> {
				
					<jc>// Use the PojoRest class to traverse our POJO model.</jc> 
					PojoRest p = <jk>new</jk> PojoRest(o);
					o = p.get(pathRemainder);
				
				} <jk>catch</jk> (PojoRestException e) {
					<jk>throw new</jk> RestException(e.getStatus(), e);
				} <jk>catch</jk> (Exception e) {
					<jk>throw new</jk> RestException(HttpServletResponse.<jsf>SC_INTERNAL_SERVER_ERROR</jsf>, e);
				}
			}
			
			<jk>return</jk> o;
		}
	}
		</p>	
		<p>
			Juneau defines the following converters out-of-the-box:
		</p>
		<ul class='doctree'>
			<li class='jic'>
			{@link org.apache.juneau.rest.RestConverter}
			<ul>
				<li class='jc'>
					{@link org.apache.juneau.rest.converters.Queryable}
					<br>Provides query parameters that can be used to transform the response (i.e. search/view/sort the 
					POJO response before being serialized).
				<li class='jc'>
					{@link org.apache.juneau.rest.converters.Traversable}
					<br>Allows nodes in the POJO response tree to be individually accessed through additional path info on 
					the request.
				<li class='jc'>
					{@link org.apache.juneau.rest.converters.Introspectable}
					<br>Allows method calls to be made on the response POJO, and for the result of that method call to be 
					serialized as the response.
			</ul>
		</ul>
	
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_converters} 
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Messages"></a>
	<h3 class='topic' onclick='toggle(this)'>7.17 - Messages</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.annotation.RestResource#messages @RestResource.messages()} annotation is used to associate a resource bundle with a servlet class.
		</p>
		<p class='bcode'>
	<jc>// Servlet with associated resource bundle</jc>
	<ja>@RestResource</ja>(messages=<js>"nls/MyMessages"</js>)
	<jk>public</jk> MyRestServlet <jk>extends</jk> RestServlet {

		<jc>// Returns the localized greeting from the "greeting" key in MyMessages.properties</jc>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
		<jk>public</jk> String printLocalizedGreeting(RestRequest req) {
			<jk>return</jk> req.getMessage(<js>"greeting"</js>);
		}
		</p>
		<p>	
			The resource bundle can also be passed into the method by simply specifying a parameter
			of type {@link java.util.ResourceBundle} or {@link org.apache.juneau.utils.MessageBundle}:
		</p>
		<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public</jk> String printLocalizedGreeting(MessageBundle messages) {
		<jk>return</jk> messages.getString(<js>"greeting"</js>);
	}
		</p>
		<p>
			If a resource bundle is shared by multiple servlets, the label and description can be prefixed by the class 
			name:
		</p>
		<p class='bcode'>
	<cc>#--------------------------------------------------------------------------------
	# Contents of MyMessages.properties
	#--------------------------------------------------------------------------------</cc>
	<ck>greeting</ck> = Hello!
		</p>	 	
		<p class='bcode'>
	<cc>#--------------------------------------------------------------------------------
	# Contents of shared MyMessages.properties
	#--------------------------------------------------------------------------------</cc>
	<ck>MyRestServlet.greeting</ck> = Hello!
		</p>
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_messages}
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.Encoders"></a>
	<h3 class='topic' onclick='toggle(this)'>7.18 - Encoders</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.annotation.RestResource#encoders @RestResource.encoders()} annotation can 
			be used to associate character encoders with a servlet class.
			<br>Encoders can be used to enable various kinds of compression (e.g. <l>"gzip"</l>) on requests and responses 
			based on the request <l>Accept-Encoding</l> and <l>Content-Encoding</l> headers.
		</p>
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Servlet with automated support for GZIP compression</jc>
	<ja>@RestResource</ja>(encoders={GzipEncoder.<jk>class</jk>})
	<jk>public</jk> MyRestServlet <jk>extends</jk> RestServlet {
		...
	}
		</p>
		<p>
			Juneau defines the following encoders out-of-the-box:
		</p>
		<ul class='doctree'>
			<li class='jac'>
			{@link org.apache.juneau.encoders.Encoder}
			<ul>
				<li class='jc'>
					{@link org.apache.juneau.encoders.GzipEncoder}
				<li class='jc'>
					{@link org.apache.juneau.encoders.IdentityEncoder}
			</ul>
		</ul>
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_encoders}
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.SvlVariables"></a>
	<h3 class='topic' onclick='toggle(this)'>7.19 - SVL Variables</h3>
	<div class='topic'>
		<p>	
			In the previous examples, there were several cases where embedded variables were contained within
			annotation values:
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		title=<js>"$L{my.label}"</js>
    )
		</p>
		<p>
			Variables take the form <l>$X{contents}</l> where <l>X</l> can consist of zero or more ASCII characters and <l>contents</l> can be virtually anything.
			<br>This is called Simple Variable Language, or SVL, and is defined here: <a class='doclink' href='#juneau-svl'>juneau-svl</a>.
		</p>
		<h5 class='topic'>Features</h5>
		<ul class='spaced-list'>
			<li>
				Variables can be nested arbitrarily deep (e.g. <l>"$X{$Y{foo}}"</l>).
			<li>
				Variables can contain arguments (e.g. <l>"$L{my.label,arg1,arg2}"</l>).
			<li>
				Variables are recursively resolved. 
				<br>i.e., if a variable results to a value with another variable in it, that variable will also be 
				resolved (restricted for security reasons on some variables).
		</ul>
		<p>
			Variables are configured on resources via the following API:
		</p>
		<ul>
			<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#vars(Class[])}
		</ul>
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Defined a variable that simply wrapps all strings inside [] brackets.</jc>
	<jc>// e.g. "$BRACKET{foobar}" -> "[foobar]"</jc>
	<jk>public class</jk> BracketVar <jk>extends</jk> SimpleVar {
		
		<jk>public</jk> BracketVar() {
			<jk>super</jk>(<js>"BRACKET"</js>);
		}
			
		<ja>@Override</ja> <jc>/* Var */</jc>
		<jk>public</jk> String resolve(VarResolverSession session, String arg) {
			<jk>return</jk> <js>'['</js> + arg + <js>']'</js>;
		}
	}

	<jc>// Register it with our resource.</jc>
	<ja>@RestResource</ja>(...)
	<jk>public class</jk> MyResource {
	
		<jk>public</jk> MyResource(RestContextBuilder builder) {
			builder.vars(BracketVar.<jk>class</jk>);
		}
	}
		</p>
		<p>
			The methods involved with variables are:
		</p>
		<ul>
			<li class='jm'>{@link org.apache.juneau.rest.RestContext#getVarResolver()}
			<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getVarResolverSession()}
			<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getClasspathReaderResource(String,boolean)}
		</ul>
		<p>
			There are two distinct groups of variables:
		</p>
		<ul>
			<li>Initialization-time variables.
				<br>These are variables that can be used in many of the annotations in {@link org.apache.juneau.rest.annotation.RestResource @RestResource}. 
				<br>The {@link org.apache.juneau.rest.RestContext#getVarResolver()} method returns initialization-time variables only.
			<li>Request-time variables.
				<br>These are variables that are available during HTTP-requests and can be used on annotation such as {@link org.apache.juneau.rest.annotation.HtmlDoc @HtmlDoc}. 
				<br>{@link org.apache.juneau.rest.RestRequest#getVarResolverSession()} method returns initialization and request-time variables.
		</ul>
		<p>
			The following is the default list of supported variables.
		</p>
		<a id='DefaultRestSvlVariables'></a>
		<h5 class='figure'>Default REST SVL Variables:</h5>
		<table class='styled' style='min-width:800px;width:50%'>
			<tr>
				<th>Module</th><th>Class</th><th>Pattern</th><th>Initialization<br>time</th><th>Request<br>time</th>
			</tr>
			<tr class='dark'>
				<td rowspan="6" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-svl</td>
				<td>{@link org.apache.juneau.svl.vars.EnvVariablesVar}</td>
				<td class='code'>$E{envVar[,defaultValue]}</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.svl.vars.SystemPropertiesVar}</td>
				<td class='code'>$S{systemProperty[,defaultValue]}</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.svl.vars.CoalesceVar}</td>
				<td class='code'>$CO{arg1[,arg2...]}</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.svl.vars.CoalesceAndRecurseVar}</td>
				<td class='code'>$CR{arg1[,arg2...]}</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.svl.vars.IfVar}</td>
				<td class='code'>$IF{booleanArg,thenValue[,elseValue]}</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark dd'>
				<td>{@link org.apache.juneau.svl.vars.SwitchVar}</td>
				<td class='code'>$SW{stringArg(,pattern,thenValue)+[,elseValue]}</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='light dd'>
				<td rowspan="1" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-config</td>
				<td>{@link org.apache.juneau.config.vars.ConfigVar}</td>
				<td class='code'>$C{key[,defaultValue]}</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td rowspan="14" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-rest-server</td>
				<td>{@link org.apache.juneau.rest.vars.FileVar}</td>
				<td class='code'>$F{path[,defaultValue]}}</td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.ServletInitParamVar}</td>
				<td class='code'>$I{name[,defaultValue]}</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.LocalizationVar}</td>
				<td class='code'>$L{key[,args...]}</td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestAttributeVar}</td>
				<td class='code'>$RA{key1[,key2...]}</td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestFormDataVar}</td>
				<td class='code'>$RF{key1[,key2...]}</td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestHeaderVar}</td>
				<td class='code'>$RH{key1[,key2...]}</td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestHeaderVar}</td>
				<td class='code'>$RI{key}</td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestPathVar}</td>
				<td class='code'>$RP{key1[,key2...]}</td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestQueryVar}</td>
				<td class='code'>$RQ{key1[,key2...]}</td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.RequestVar}</td>
				<td class='code'>$R{key1[,key2...]}</td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.SerializedRequestAttrVar}</td>
				<td class='code'>$SA{contentType,key[,defaultValue]}</td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.UrlVar}</td>
				<td class='code'>$U{uri}></td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark'>
				<td>{@link org.apache.juneau.rest.vars.UrlEncodeVar}</td>
				<td class='code'>$UE{uriPart}</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='dark dd'>
				<td>{@link org.apache.juneau.rest.vars.WidgetVar}</td>
				<td class='code'>$W{widgetName}</td>
				<td style='text-align:center;font-weight:bold'>no</td>
				<td style='text-align:center;font-weight:bold'>yes</td>
			</tr>
			<tr class='light'>
				<td rowspan="2" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-microservice-server</td>
				<td>{@link org.apache.juneau.microservice.vars.ArgsVar}</td>
				<td class='code'>$ARG{key[,defaultValue]}</td>
				<td style='text-align:center;font-weight:bold'>yes*</td>
				<td style='text-align:center;font-weight:bold'>yes*</td>
			</tr>
			<tr class='light dd'>
				<td>{@link org.apache.juneau.microservice.vars.ManifestFileVar}</td>
				<td class='code'>$MF{key[,defaultValue]}</td>
				<td style='text-align:center;font-weight:bold'>yes*</td>
				<td style='text-align:center;font-weight:bold'>yes*</td>
			</tr>
		</table>
		<p>
			* = Only if extending from {@link org.apache.juneau.microservice.Resource}
		<p>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.ConfigurationFiles"></a>
	<h3 class='topic' onclick='toggle(this)'>7.20 - Configuration Files</h3>
	<div class='topic'>
		<p>
			The Server API provides methods for associating configuration files with REST servlets so that 
			configuration properties can be defined in external files.
		</p>
		<p>
			In recap, the Configuration API provides support for INI-style configuration files with embedded string variables:
		</p>
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<cc>#--------------------------</cc>
	<cc># Examples </cc>
	<cc>#--------------------------</cc>
	<cs>[MyProperties]</cs>
	<ck>path</ck> = <cv>$E{PATH}</cv>
	<ck>javaHome</ck> = <cv>$S{java.home}</cv>
	<ck>customMessage</ck> = <cv>Java home is $C{MyProperties/javaHome} and the environment path is $C{MyProperties/path}.</cv>
		</p>
		<p>
			These properties are then accessible through the {@link org.apache.juneau.config.Config} class.
		</p>
		<p class='bcode'>
	Config cf = Config.<jsm>create</jsm>().name(<js>"myconfig.cfg"</js>).build();
	String path = cf.getString(<js>"MyProperties/path"</js>);
	File javaHome = cf.getObject(<js>"MyProperties/javaHome"</js>, File.<jk>class</jk>);
	String customMessage = cf.getString(<js>"MyProperties/customMessage"</js>);
		</p>
		<p>
			Configuration files are associated with REST resources through the following:
		</p>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestResource#config()}
		</ul>
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		<jc>// Config file is located at ./config_dir/myconfig.cfg</jc>
		config=<js>"config_dir/myconfig.cfg"</js>,
		...
	)
	<jk>public class</jk> MyResource {...}
		</p>
		<p>
			The annotation itself can contain string variables.  
			<br>For example, the Microservice API {@link org.apache.juneau.microservice.Resource} class defines the 
			location of the config file as a system property <l>"juneau.configFile"</l>:
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		<jc>// Config file location is defined as a system property</jc>
		config=<js>"$S{juneau.configFile}"</js>,
		...
	)
	<jk>public class</jk> MyResource {...}
		</p>
		<p>
			Once a config file has been associated with a REST resource, it can be accessed through the 
			{@link org.apache.juneau.rest.RestContextBuilder#getConfig()} method.
		</p>
		<p>
			A common usage is to use this method to initialize fields in your servlet.
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		<jc>// Config file is located at ./config_dir/myconfig.cfg</jc>
		config=<js>"config_dir/myconfig.cfg"</js>,
		...
	)
	<jk>public class</jk> MyResource  {
		<jk>private final</jk> String <jf>path</jf>;
		<jk>private final</jk> File <jf>javaHome</jf>;
	
		<jk>public</jk> MyResource(RestContextBuilder builder) {
			Config cf = builder.getConfig();
			<jf>path</jf> = cf.getString(<js>"MyProperties/path"</js>);
			<jf>javaHome</jf> = cf.getObject(File.<jk>class</jk>, <js>"MyProperties/javaHome"</js>);
		}
		</p>
		<p>
			Another common usage is to refer to config properties through <ck>$C</ck> variables in your annotations:
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		<jc>// Get stylesheet from myconfig.cfg, but default to devops.css if it's not specified</jc>
		htmldoc=<ja>@HtmlDoc</ja>(
			stylesheet=<js>"$C{MyServlet/stylesheet,servlet:/styles/devops.css}"</js>,
		)
		...
	)
	<jk>public class</jk> MyResource {...}
		</p>
		<p>
			It's even possible to reference request-level variables in your config file if you use 
			{@link org.apache.juneau.rest.RestRequest#getConfig()} to access the config file:
		</p>
		<p class='bcode'>
	<cc>#-------------------------------------</cc>
	<cc># Contents of config_dir/myconfig.cfg </cc>
	<cc>#-------------------------------------</cc>
	<cs>[HelloWorldResource]</cs>
	<ck>message</ck> = <cv>Hello $RQ{person}!</cv>
		</p>
		<p class='bcode'>
	<jd>/** 
	 * Sample REST resource that prints out a simple "Hello world!" message.
	 */</jd>
	 <ja>@RestResource</ja>(
	 	config=<js>"config_dir/myconfig.cfg"</js>,
	 	...
	 )
 	<jk>public class</jk> HelloWorldResource <jk>extends</jk> RestServletDefault {
		
		<jd>/** 
		 * GET request handler.
		 * Specify the GET parameter "?person=X" for a specialized message! 
		 */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
		<jk>public</jk> String sayHello(RestRequest req) {
			<jk>return</jk> req.getConfig().getString(<js>"HelloWorldResource/message"</js>);
		}
	}
		</p>
		<p>
			You can even add resource bundles into the mix:
		</p>
		<p class='bcode'>
	<cc>#-------------------------------------</cc>
	<cc># Contents of config_dir/myconfig.cfg </cc>
	<cc>#-------------------------------------</cc>
	<cs>[HelloWorldResource]</cs>
	<ck>message</ck> = <cv>$L{localizedMessage,$RQ{person}}</cv>
		</p>
		<p class='bcode'>
	<cc>#-------------------------------------------</cc>
	<cc># Contents of HelloWorldResource.properties </cc>
	<cc>#-------------------------------------------</cc>
	<ck>localizedMessage</ck> = <cv>Hello {0}!</cv>
		</p>
		<p class='bcode'>
	<jd>/** 
	 * Sample REST resource that prints out a simple "Hello world!" message.
	 */</jd>
	 <ja>@RestResource</ja>(
	 	messages=<js>"HelloWorldResources"</js>,
	 	config=<js>"config_dir/myconfig.cfg"</js>,
	 	...
	 )
 	<jk>public class</jk> HelloWorldResource <jk>extends</jk> RestServletDefault {
		
		<jd>/** 
		 * GET request handler.
		 * Specify the GET parameter "?person=X" for a specialized message! 
		 */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
		<jk>public</jk> String sayHello(RestRequest req) {
			<jk>return</jk> req.getConfig().getString(<js>"HelloWorldResource/message"</js>);
		}
	}
		</p>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.StaticFiles"></a>
	<h3 class='topic' onclick='toggle(this)'>7.21 - Static files</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.annotation.RestResource#staticFiles @RestResource.staticFiles()} 
			annotation is used to define paths and locations of statically-served files such as images or HTML 
			documents.
		</p>
		<p>
			The value is a JSON map of paths to packages/directories located on either the classpath or working 
			directory.
		</p>
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jk>package</jk> com.foo.mypackage;

	<ja>@RestResource</ja>(
		path=<js>"/myresource"</js>,
		staticFiles={<js>"htdocs:docs"</js>}
	)
	<jk>public class</jk> MyResource <jk>extends</jk> RestServletDefault {...}
		</p>
		<p>	
			Static files are found by calling {@link java.lang.Class#getResource(String)} up the class hierarchy.  
			If not found, then an attempt is made to find the class in the Java working directory.
		</p>
		<p>
			In the example above, given a GET request to <l>/myresource/htdocs/foobar.html</l>, the servlet will 
			attempt to find the <l>foobar.html</l> file in the following ordered locations:
		</p>
		<ol>
			<li><l>com.foo.mypackage.docs</l> package.
			<li><l>[working-dir]/docs</l> directory.
		</ol>
	
		<h5 class='section'>Notes:</h5>
		<ul class='spaced-list'>
			<li>
				Mappings are cumulative from parent to child.  
				<br>Child resources can override mappings made on parent resources.
			<li>
				The media type on the response is determined by the 
				{@link org.apache.juneau.rest.RestContext#getMediaTypeForName(String)} method.
		</ul>
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_staticFiles}
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.ClientVersioning"></a>
	<h3 class='topic' onclick='toggle(this)'>7.22 - Client Versioning</h3>
	<div class='topic'>
		<p>
			Client version headers are used to support backwards compatibility for breaking REST interface changes.
			<br>Using them, you're able to return different responses based on which client is making a request.
		</p>
		<p>
			The APIs involved with defining client version headers are:
		</p>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestResource#clientVersionHeader()}
			<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#clientVersionHeader(String)}
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#clientVersion()}
		</ul>
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Option #1 - Defined via annotation resolving to a config file setting with default value.</jc>
	<ja>@RestResource</ja>(clientVersionHeader=<js>"Client-Version"</js>)
	<jk>public class</jk> MyResource {

		<jc>// Call this method if Client-Version is at least 2.0.
		// Note that this also matches 2.0.1.</jc>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/foobar"</js>, clientVersion=<js>"2.0"</js>)
		<jk>public</jk> Object method1() {
			...
		}
	
		<jc>// Call this method if Client-Version is at least 1.1, but less than 2.0.</jc>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/foobar"</js>, clientVersion=<js>"[1.1,2.0)"</js>)
		<jk>public</jk> Object method2() {
			...
		}
	
		<jc>// Call this method if Client-Version is less than 1.1.</jc>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/foobar"</js>, clientVersion=<js>"[0,1.1)"</js>)
		<jk>public</jk> Object method3() {
			...
		}
		</p>
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_clientVersionHeader}
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.OptionsPages"></a>
	<h3 class='topic' onclick='toggle(this)'>7.23 - OPTIONS pages</h3>
	<div class='topic'>
		<p>
			One of the most useful features of Juneau is the ability to generate Swagger-based OPTIONS pages for self-documenting designs 
			(i.e. REST interfaces that document themselves).
			
		</p>
		<h5 class='figure'>OPTIONS page for HelloWorld sample resource</h5>
	 	<img class='bordered' src='doc-files/juneau-rest-server.OptionsPages.1.png' style='width:800px;'>
		<p>
	 		The {@link org.apache.juneau.rest.RestServletDefault} class implements the page by creating a method 
	 		mapped to the <l>OPTIONS</l> HTTP method that simply returns a Swagger bean:
		</p>
	 	<p class='bcode'>
	<ja>@RestResource</ja>(...)
	<jk>public class</jk> RestServletDefault <jk>extends</jk> RestServlet {

		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>,
			summary=<js>"Resource options"</js>,
			htmldoc=<ja>@HtmlDoc</ja>(
				navlinks={
					<js>"back: servlet:/,"</js>,
					<js>"json: servlet:/?method=OPTIONS&amp;Accept=text/json&amp;plainText=true"</js>
				}
			)
		)
		<jk>public</jk> Swagger getOptions(RestRequest req) {
			<jk>return</jk> req.getSwagger();
		}
	}
	 	</p>
		<p>
			This page is constructed using the Info Provider API described next.
		</p>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RestInfoProvider"></a>
		<h4 class='topic' onclick='toggle(this)'>7.23.1 - RestInfoProvider</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RestInfoProvider} class is used to find the title
				and description for your resource and also generate the Swagger documentation.
				<br>It can be overridden to provide your own custom Swagger documentation.
			</p>
			<p>
				The methods on this interface are:
			</p>
			<ul class='doctree'>
				<li class='jic'>{@link org.apache.juneau.rest.RestInfoProvider}
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProvider#getSwagger(RestRequest) getSwagger(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProvider#getSiteName(RestRequest) getSiteName(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProvider#getTitle(RestRequest) getTitle(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProvider#getDescription(RestRequest) getDescription(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProvider#getMethodSummary(Method,RestRequest) getMethodSummary(Method,RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProvider#getMethodDescription(Method,RestRequest) getMethodDescription(Method,RestRequest)}
				</ul>
			</ul>
			<p>
				The info provider in turn supplies the information returned by the following methods:
			</p>
			<ul class='doctree'>
				<li class='jc'>{@link org.apache.juneau.rest.RestRequest}
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getSwagger() getSwagger()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getSiteName() getSiteName()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getResourceTitle() getResourceTitle()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getResourceDescription() getResourceDescription()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getMethodSummary() getMethodSummary()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getMethodDescription() getMethodDescription()}
				</ul>
			</ul>
			<p>
				Info providers are registered through the following property:
			</p>
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_infoProvider}
			</ul>
			<p>
				While you can implement this interface from scratch, you may want to instead consider extending
				from the <l>RestInfoProviderDefault</l> class described next.
			</p>
		</div>
		
		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RestInfoProviderDefault"></a>
		<h4 class='topic' onclick='toggle(this)'>7.23.2 - RestInfoProviderDefault</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.RestInfoProviderDefault} class is the default implementation of the
				{@link org.apache.juneau.rest.RestInfoProvider} interface.
			</p>
			<p>
				It finds and collects information gathered from the following locations:
			</p>
			<ul>
				<li>Localized JSON Swagger files in the classpath.
				<li>Reflection.
				<li> annotations.
				<li>Info provided in properties files.
			</ul>
			<p>
				The class itself is designed to be extended if you wish to rely mostly on the default behavior, but tweak
				certain aspects.
			</p>
			<p>
				In addition to the methods defined on the <l>RestInfoProvider</l> interface, it also includes the following methods:
			</p>
			<ul class='doctree'>
				<li class='jc'><code>{@link org.apache.juneau.rest.RestInfoProviderDefault} <jk>implements</jk> {@link org.apache.juneau.rest.RestInfoProvider}</code>
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getVersion(RestRequest) getVersion(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getContact(RestRequest) getContact(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getConsumes(RestRequest) getConsumes(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getProduces(RestRequest) getProduces(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getLicense(RestRequest) getLicense(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getTags(RestRequest) getTags(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getTermsOfService(RestRequest) getTermsOfService(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getExternalDocs(RestRequest) getExternalDocs(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getMethodSummary(Method,RestRequest) getMethodSummary(Method,RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getMethodDescription(Method,RestRequest) getMethodDescription(Method,RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getMethodOperationId(Method,RestRequest) getMethodOperationId(Method,RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getMethodConsumes(Method,RestRequest) getMethodConsumes(Method,RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getMethodProduces(Method,RestRequest) getMethodProduces(Method,RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getMethodParameters(Method,RestRequest) getMethodParameters(Method,RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getMethodResponses(Method,RestRequest) getMethodResponses(Method,RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getMethodTags(Method,RestRequest) getMethodTags(Method,RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.RestInfoProviderDefault#getSwaggerFromFile(RestRequest) getSwaggerFromFile(RestRequest)}
				</ul>
			</ul>
			<p>
				The default provider provides several options for defining Swagger documentation on your resource:
			</p>
			<ul class='spaced-list'>
				<li>
					Provide nothing.
					<br>You'll still get an auto-generated Swagger doc with information gather solely through reflection, including methods, parameters, consumes/produces, etc...
				<li>
					Specify localized JSON Swagger files on your classpath.
					<br><h5 class='figure'>Example:</h5>
					<p class='bcode'>
	MyResource_ja_JP.json
					</p>
				<li>
					Use {@link org.apache.juneau.rest.annotation.ResourceSwagger @ResourceSwagger} and {@link org.apache.juneau.rest.annotation.MethodSwagger @MethodSwagger}
					annotations on your resource classes and methods.
					<br><h5 class='figure'>Example:</h5>
					<p class='bcode'>
	<ja>@RestMethod</ja>(
		swagger=<ja>@MethodSwagger</ja>(tags=<js>"foo,bar,baz"</js>)
	)
	<jk>public</jk> Object myMethod() {...}
					</p>
				<li> 
					Use properties files identified by the {@link org.apache.juneau.rest.annotation.RestResource#messages @RestResource.messages()} annotation.
					<br><h5 class='figure'>Example:</h5>
					<p class='bcode'>
	<ck>MyResource.myMethod.tags</ck> = <cv>foo,bar,baz</cv>
					</p>
				<li>
					Use any combination of the above.
				<li>
					Extend the <l>RestInfoProviderDefault</l> and provide customized behavior.	
					<br><h5 class='figure'>Example:</h5>
					<p class='bcode'>
	<jc>// Our customized info provider.</jc>
	<jc>// Extend from the default implementation and selectively override values.</jc>
	<jk>public class</jk> MyRestInfoProvider <jk>extends</jk> RestInfoProviderDefault {
		
		<jc>// Must provide this constructor!</jc>
		<jk>public</jk> MyRestInfoProvider(RestContext context) {
			<jk>super</jk>(context);
		}

		<ja>@Override</ja> <jc>/* RestInfoProvider */</jc>
		<jk>public</jk> Swagger getSwagger(RestRequest req) <jk>throws</jk> RestException {
			Swagger s = <jk>super</jk>.getSwagger(req);
			<jc>// Made inline modifications to generated swagger.</jc>
			<jk>return</jk> s;
		}
	}

	<jc>// Registered via annotation</jc>
	<ja>@RestResource</ja>(infoProvider=MyRestInfoProvider.<jk>class</jk>)
	<jk>public class</jk> MyResource {...}
					</p>
			</ul>
		</div>			
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.HtmlDocAnnotation"></a>
	<h3 class='topic' onclick='toggle(this)'>7.24 - @HtmlDoc</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.annotation.HtmlDoc @HtmlDoc} annotation is used to customize the HTML 
			view of your serialized POJOs.
			<br>It's used in the following locations:
		</p>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestResource#htmldoc()}
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#htmldoc()}
		</ul>
		<p>
			The annotation itself is just a convenience for setting configuration properties set
			on the {@link org.apache.juneau.html.HtmlDocSerializer} class.
			<br>For example, the following two pieces of code are equivalent:
		</p>
		<p class='bcode'>
	<jc>// Title defined via property.</jc>
	<ja>@RestResource</ja>(
		properties={
			<ja>@Property</ja>(name=<jsf>HTMLDOC_title</jsf>, value=<js>"My Resource Page"</js>)
		}
	)

	<jc>// Title defined via @HtmlDoc annotation.</jc>
	<ja>@RestResource</ja>(
		htmldoc=<ja>@HtmlDoc</ja>(
			title=<js>"My Resource Page"</js>
		)
	)
		</p>
		<p>
			The purpose of these annotation is to populate the HTML document view which by default consists of the following
			structure:
		</p>
		<p class='bcode'>
	<xt>&lt;html&gt;
		&lt;head&gt;
			&lt;style <xa>type</xa>=<xs>'text/css'</xs>&gt;
				<xv>CSS styles and links to stylesheets</xv>
			&lt;/style&gt;
		&lt;/head&gt;
		&lt;body&gt;
			&lt;header&gt;
				<xv>Page header</xv>
			&lt;/header&gt;
			&lt;nav&gt;
				<xv>Navigation links</xv>
			&lt;/nav&gt;
			&lt;aside&gt;
				<xv>Side-bar text</xv>
			&lt;/aside&gt;
			&lt;article&gt;
				<xv>Contents of serialized object</xv>
			&lt;/article&gt;
			&lt;footer&gt;
				<xv>Footer message</xv>
			&lt;/footer&gt;
		&lt;/body&gt;
	&lt;/html&gt;</xt>
		</p>
		<p>
			The outline above is controlled by the {@link org.apache.juneau.html.HtmlDocTemplate} interface
			which can be overridden via the {@link org.apache.juneau.rest.annotation.HtmlDoc#template @HtmlDoc.template()} annotation.
		</p>
		<p>
			The <l>HelloWorldResource</l> class was an example of the <l>@HtmlDoc</l> annotation in use:
		</p>
		<p class='bcode'>
	<jd>/** 
	 * Sample REST resource that prints out a simple "Hello world!" message.
	 */</jd>
	<ja>@RestResource</ja>(
		path=<js>"/helloWorld"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			},
			aside={
				<js>"&lt;div style='max-width:400px' class='text'&gt;"</js>,
				<js>"	&lt;p&gt;This page shows a resource that simply response with a 'Hello world!' message&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;The POJO serialized is a simple String.&lt;/p&gt;"</js>,
				<js>"&lt;/div&gt;"</js>
			}
		)
	)
	<jk>public class</jk> HelloWorldResource <jk>extends</jk> RestServletDefault {...}
		</p>
		<p>
			SVL variables can be used in any of these annotations:
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		path=<js>"/helloWorld"</js>,
		<jc>// Register a config file.</jc>
		config=<js>"MyConfig.cfg"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>,
				<jc>// Add a nav link to view the source code for this class.</jc>
				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"</js>
			},
			aside={
				<jc>// Localize our messages.</jc>
				<js>"&lt;div style='max-width:400px' class='text'&gt;"</js>,
				<js>"	&lt;p&gt;$L{localizedMessage1}&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;$L{localizedMessage2}&lt;/p&gt;"</js>,
				<js>"&lt;/div&gt;"</js>
			}
		)
	)
	<jk>public class</jk> HelloWorldResource <jk>extends</jk> RestServletDefault {...}
		</p>
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.HtmlDoc}
			<li class='jc'>{@link org.apache.juneau.rest.HtmlDocBuilder}
		</ul>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.Widgets"></a>
		<h4 class='topic' onclick='toggle(this)'>7.24.1 - Widgets</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.widget.Widget} class allows you to add arbitrary HTML, CSS, and Javascript
				to HTML pages.
			<br>They are registered in the following locations:
			</p>
			<ul>
				<li class='ja'>{@link org.apache.juneau.rest.annotation.HtmlDoc#widgets() @HtmlDoc.widgets}
				<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#widgets(Class...)}
				<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#widgets(Widget...)}
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_widgets}
			</ul>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<ja>@RestMethod</ja>(
		widgets={
			MyWidget.<jk>class</jk>
		}
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"$W{MyWidget}"</js>
			},
			aside={
				<js>"Check out this widget:  $W{MyWidget}"</js>
			}
		)
	)
			</p>
			<p>
				The <l>Widget</l> class is composed of the following methods:
			</p>
			<ul class='doctree'>
				<li class='jac'>{@link org.apache.juneau.rest.widget.Widget}
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getHtml(RestRequest) getHtml(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getStyle(RestRequest) getStyle(RestRequest)}
					<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getScript(RestRequest) getScript(RestRequest)}
				</ul>
			</ul>
			<p>
				The HTML content returned by the {@link org.apache.juneau.rest.widget.Widget#getHtml(RestRequest) getHtml(RestRequest)}
				method is added wherever the <js>"$W{...}"</js> variable is used.
			</p>
			<p>
				The CSS returned by {@link org.apache.juneau.rest.widget.Widget#getScript(RestRequest) getScript(RestRequest)}
				is added to the style section in the page header.
			</p>
			<p>	
				The Javascript returned by {@link org.apache.juneau.rest.widget.Widget#getScript(RestRequest) getScript(RestRequest)}
				is added to the script section in the page header.
			</p>
			<p>
				The following examples shows how to associate a widget with a REST method and then have it rendered in the links
				and aside section of the page.
				<br>It shows an example of a widget that renders an image located in the <code>htdocs</code> static files
				directory in your classpath (see {@link org.apache.juneau.rest.annotation.RestResource#staticFiles() @RestResource.staticFiles()}):
			</p>
			<p class='bcode'>
	<jk>public class</jk> MyWidget <jk>extends</jk> Widget {

		<ja>@Override</ja> <jc>/* Widget */</jc>
		<jk>public</jk> String getHtml(RestRequest req) <jk>throws</jk> Exception {
			UriResolver r = req.getUriResolver(); <jc>// API used for resolving URIs.</jc>
			<jk>return</jk> <js>"&lt;img class='myimage' onclick='myalert(this)' src='"</js>+r.resolve(<js>"servlet:/htdocs/myimage.png"</js>)+<js>"'&gt;"</js>;
		}

		<ja>@Override</ja> <jc>/* Widget */</jc>
		<jk>public</jk> String getScript(RestRequest req) <jk>throws</jk> Exception {
			<jk>return</jk> <js>""</js>
				+ <js>"\n function myalert(imageElement) {"</js>
				+ <js>"\n 	alert('cool!');"</js>
				+ <js>"\n }"</js>;
		}

		<ja>@Override</ja> <jc>/* Widget */</jc>
		<jk>public</jk> String getStyle(RestRequest req) <jk>throws</jk> Exception {
			<jk>return</jk> <js>""</js>
				+ <js>"\n .myimage {"</js>
				+ <js>"\n 	border: 10px solid red;"</js>
				+ <js>"\n }"</js>;
		}
	}
			</p>
			<p>
				The <l>Widget</l> class also defines the following two convenience methods for loading Javascript and CSS
				files from the classpath or file system.
			</p>
			<ul class='doctree'>
				<li class='jac'>{@link org.apache.juneau.rest.widget.Widget}
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getClasspathResourceAsString(String) getClasspathResourceAsString(String)}
					<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getClasspathResourceAsString(String,Locale) getClasspathResourceAsString(String,Locale)}
				</ul>
			</ul>
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<jk>public class</jk> MyWidget <jk>extends</jk> Widget {

		...

		<ja>@Override</ja> <jc>/* Widget */</jc>
		<jk>public</jk> String getScript(RestRequest req) <jk>throws</jk> Exception {
			<jk>return</jk> getClasspathResourceAsString(<js>"MyWidget.js"</js>);
		}

		<ja>@Override</ja> <jc>/* Widget */</jc>
		<jk>public</jk> String getStyle(RestRequest req) <jk>throws</jk> Exception {
			<jk>return</jk> getClasspathResourceAsString(<js>"MyWidget.css"</js>);
		}
	}
			</p>
			<h5 class='section'>See Also:</h5>
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_widgets}
			</ul>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.PredefinedWidgets"></a>
		<h4 class='topic' onclick='toggle(this)'>7.24.2 - Predefined Widgets</h4>
		<div class='topic'>
			TODO
		</div>
		
		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.UiCustomization"></a>
		<h4 class='topic' onclick='toggle(this)'>7.24.3 - UI Customization</h4>
		<div class='topic'>
			<p>
				The HTML views of POJOs can somewhat be considered a rudimentary User Interface.
				<br>In reality, a better term for them would be a Developer Interface as they're meant to be used 
				primarily by developers and not end users.
				<br>Despite that distinction, it is possible to 'brand' the HTML page to whatever you desire.
			</p>
			<p>
				The sample root page below includes some default branding for Juneau and Apache:
			</p>
			<img class='bordered' src='doc-files/juneau-rest-server.UiCustomization.1.png' style='width:800px'/>
			<p>
				In particular, you may want to replace these icons:
			</p>
			<img class='bordered' src='doc-files/juneau-rest-server.UiCustomization.2.png'/>
			<img class='bordered' src='doc-files/juneau-rest-server.UiCustomization.3.png'/>
			<p>
				The Juneau REST framework does not provide specific branding support (i.e. there is no concept of a brand icon).
				<br>Instead, it just uses the existing open-ended API for defining branding.
			</p>
			<p>
				The Juneau icon shown is a result of the header annotation on the {@link org.apache.juneau.rest.RestServletDefault} class:
			</p>	
			<p class='bcode'>			
	<ja>@RestResource</ja>(
		...
		htmldoc=<ja>@HtmlDoc</ja>(
			header={
				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,
				<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>,
				<js>"&lt;a href='http://juneau.apache.org'&gt;"</js>
					+<js>"&lt;img src='$U{servlet:/htdocs/juneau.png}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;"</js>
				+<js>"&lt;/a&gt;"</js>
			},
			head={
				<jc>// Browser tab icon.</jc>
				<js>"&lt;link rel='icon' href='$U{servlet:/htdocs/juneau.png}'/&gt;"</js>
			}
		),
		staticFiles={<js>"htdocs:htdocs"</js>}
	)
	<jk>public abstract class</jk> RestServletDefault <jk>extends</jk> RestServlet {...}
			</p>
			<p>
				The <js>"juneau.png"</js> image file is located in <code>org.apache.juneau.rest.htdocs</code> package and 
				is served up via the <code>staticFiles</code> annotation (i.e. anything in the <code>org.apache.juneau.rest.htdocs</code> 
				package is served up under the path <code>/servlet-path/htdocs</code>).  
				<br>Then we just reference using a URI resolution variable <js>"$U{servlet:/htdocs/juneau.png}"</js>.
			</p>
			<p>
				To change this image, you can extend the <l>RestServletDefault</l> class and simply override the annotations
				pointing to your own icon.
			</p>
			<p class='bcode'>			
	<ja>@RestResource</ja>(
		...
		htmldoc=<ja>@HtmlDoc</ja>(
			header={
				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,
				<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>,
				<js>"&lt;a href='http://my.project.org'&gt;"</js>
					+<js>"&lt;img src='$U{servlet:/my-htdocs/my-project.png}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;"</js>
				+<js>"&lt;/a&gt;"</js>
			},
			head={
				<jc>// Browser tab icon.</jc>
				<js>"&lt;link rel='icon' href='$U{servlet:/my-htdocs/my-project.png}'/&gt;"</js>
			}
		),
		staticFiles={<js>"my-htdocs:my-htdocs"</js>}
	)
	<jk>public class</jk> MyResourceBaseClass <jk>extends</jk> RestServletDefault {...}
			</p>
			<p>
				The footer icon shown is generated by a predefined widget:
			</p>
			<p class='bcode'>
	<ja>@RestResource</ja>(
		htmldoc=<ja>@HtmlDoc</ja>(
			widgets={
				PoweredByApache.<jk>class</jk>
			},
			footer=<js>"$W{PoweredByApache}"</js>
		),
		...
	)
	<jk>public class</jk> RootResources <jk>extends</jk> ResourceJenaGroup {...}
			</p>			
			<p>
				The widget definition is shown below:
			</p>
			<p class='bcode'>
	<jk>public class</jk> PoweredByApache <jk>extends</jk> Widget {
	
		<jd>/**
		 * Returns an Apache image tag hyperlinked to <js>"http://apache.org"</js>
		 */</jd>
		<ja>@Override</ja> <jc>/* Widget */</jc>
		<jk>public</jk> String getHtml(RestRequest req) <jk>throws</jk> Exception {
			UriResolver r = req.getUriResolver();
			<jk>return</jk> <js>"&lt;a href='http://apache.org'&gt;&lt;img style='float:right;padding-right:20px;height:32px' src='"</js>+r.resolve(<js>"servlet:/htdocs/asf.png"</js>)+<js>"'&gt;"</js>;
		}
	}
			</p>
			<p>
				To provide your own footer icon, simply define it in your own footer section:
			</p>
			<p class='bcode'>
	<ja>@RestResource</ja>(
		htmldoc=<ja>@HtmlDoc</ja>(
			footer=<js>"&lt;img style='float:right;padding-right:20px;height:32px' src='$U{servlet:/my-htdocs/my-project.png}'&gt;"</js>
		),
		staticFiles={<js>"my-htdocs:my-htdocs"</js>}
		...
	)
	<jk>public class</jk> MyResourceBaseClass <jk>extends</jk> RestServletDefault {...}
			</p>
			<p>
				Note how the "User Interface" is open-ended to pretty much lets you do whatever you want.
			</p>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.Stylesheets"></a>
		<h4 class='topic' onclick='toggle(this)'>7.24.4 - Stylesheets</h4>
		<div class='topic'>
			<p>
				The sample root page renders in the default "devops" look-and-feel:
			</p>
			<img class='bordered' src='doc-files/UiCustomization.1.png' style='width:800px'/>
			<p>
				The sample root page provides a dropdown widget to try out the other default look-and-feels:
			</p>
			<img class='bordered' src='doc-files/juneau-rest-server.Stylesheets.1.png'/>
			<p>
				For example, the "light" look-and-feel:
			</p>
			<img class='bordered' src='doc-files/juneau-rest-server.Stylesheets.2.png' style='width:800px'/>
			<p>
				And the "dark" look-and-feel:
			</p>
			<img class='bordered' src='doc-files/juneau-rest-server.Stylesheets.3.png' style='width:800px'/>
			<p>
				The stylesheet URL is controlled by the {@link org.apache.juneau.rest.annotation.HtmlDoc#stylesheet() @HtmlDoc.stylesheet()} annotation.
				<br>The {@link org.apache.juneau.rest.RestServletDefault} class defines the stylesheet served up as a static file:
			<p class='bcode'>
	<ja>@RestResource</ja>(
		htmldoc=<ja>@HtmlDoc</ja>(
			stylesheet=<js>"$C{REST/stylesheet,servlet:/styles/devops.css}"</js>,
		),
	
		staticFiles={<js>"styles:styles"</js>}
	)
	<jk>public abstract class</jk> RestServletDefault <jk>extends</jk> RestServlet {...}
			</p>		
			<p>
				The <js>"$C{REST/stylesheet,servlet:/styles/devops.css}"</js> variable says to use the URI defined
				in your servlet's config file, if there is one, and to default to serving up the file
				<code>org/apache/juneau/rest/styles/devops.css</code>.
			</p>
			<p>
				To provide your own stylesheet, simply override the stylesheet attribute and point to a different
				file:	
			</p>
			<p class='bcode'>
	<ja>@RestResource</ja>(
		htmldoc=<ja>@HtmlDoc</ja>(
			stylesheet=<js>"servlet:/my-styles/my-style.css}"</js>,
		),
		staticFiles={<js>"my-styles:my-styles"</js>}
	)
	<jk>public class</jk> MyResourceBaseClass <jk>extends</jk> RestServletDefault {...}
			</p>
			<p>
				You can try out different stylesheets by passing in a <code>stylesheet</code> attribute in the request
				URL.
				<br>The example above show this in use.
			</p>
			<p>
				In case you're curious about how the menu item works, it's defined via a widget:
			</p>
			<p class='bcode'>
	<ja>@RestResource</ja>(
		htmldoc=<ja>@HtmlDoc</ja>(
			widgets={
				PoweredByApache.<jk>class</jk>,
				ContentTypeMenuItem.<jk>class</jk>,
				StyleMenuItem.<jk>class</jk>
			},
			navlinks={
				<js>"options: ?method=OPTIONS"</js>,
				<js>"$W{ContentTypeMenuItem}"</js>,
				<js>"$W{StyleMenuItem}"</js>,
				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"</js>
			},
	)
	<jk>public class</jk> RootResources <jk>extends</jk> ResourceJenaGroup {...}
			</p>
			<p>
				The <l>StyleMenuItem</l> is a widget that extends from {@link org.apache.juneau.rest.widget.MenuItemWidget}, a
				specialized widget for creating pop-up menus.
				<br>In the case of <l>StyleMenuItem</l>, it's simply returning a list of links wrapped in a div tag:
			</p>
			<p class='bcode'>
	<jk>import static</jk> org.apache.juneau.dto.html5.HtmlBuilder.*;

	<jk>public class</jk> StyleMenuItem <jk>extends</jk> MenuItemWidget {
	
		<jk>private static final</jk> String[] <jsf>BUILT_IN_STYLES</jsf> = {<js>"devops"</js>, <js>"light"</js>, <js>"original"</js>, <js>"dark"</js>};
	
		<ja>@Override</ja> <jc>/* Widget */</jc>
		<jk>public</jk> String getLabel(RestRequest req) {
			<jk>return</jk> <js>"styles"</js>;
		}

		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
		<jk>public</jk> Div getContent(RestRequest req) <jk>throws</jk> Exception {
			Div div = <jsm>div</jsm>();
			<jk>for</jk> (String s : <jsf>BUILT_IN_STYLES</jsf>) {
				java.net.URI uri = req.getUri(<jk>true</jk>, <jk>new</jk> AMap&lt;String,String&gt;().append(<js>"stylesheet"</js>, <js>"styles/"</js>+s+<js>".css"</js>));
				div.children(<jsm>a</jsm>(uri, s), <jsm>br</jsm>());
			}
			<jk>return</jk> div;
		}
	}
			</p>
		</div>
	</div>

	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.DefaultHeaders"></a>
	<h3 class='topic' onclick='toggle(this)'>7.25 - Default Headers</h3>
	<div class='topic'>
		<p>
			The following annotations are provided for specifying default header values for requests and responses:
		</p>
		<ul class='doctree'>
			<li class='ja'>
				{@link org.apache.juneau.rest.annotation.RestResource#defaultRequestHeaders() @RestResource.defaultRequestHeaders()} 
				<br>Defines default headers on request when the client doesn't specify them.
			<li class='ja'>
				{@link org.apache.juneau.rest.annotation.RestResource#defaultResponseHeaders() @RestResource.defaultResponseHeaders()}
				<br>Appends the specified headers if they weren't already set programmatically.	
		</ul>		
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Servlet with default headers</jc>
	<ja>@RestResource</ja>(

		<jc>// Assume "text/json" Accept value when Accept not specified</jc>
		defaultRequestHeaders={<js>"Accept: text/json"</js>},

		<jc>// Add a version header attribute to all responses</jc>
		defaultResponseHeaders={<js>"X-Version: 1.0"</js>}
	)
	<jk>public</jk> MyRestServlet <jk>extends</jk> RestServlet {
		...
	}			
		</p>
		<p>
			Default headers can also be specified programmatically by overriding the following methods:
		</p>
		<ul class='doctree'>
			<li class='jac'>
				{@link org.apache.juneau.rest.RestContextBuilder}
				<ul>
					<li class='jm'>
						{@link org.apache.juneau.rest.RestContextBuilder#defaultRequestHeaders(String[])}
					<li class='jm'>
						{@link org.apache.juneau.rest.RestContextBuilder#defaultResponseHeaders(String[])}
				</ul>
			</li>
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.LoggingAndErrorHandling"></a>
	<h3 class='topic' onclick='toggle(this)'>7.26 - Logging and Error Handling</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.RestContext#REST_logger} property allows you to configure 
			logging for your resource.
			<br>The interface is shown below:
		</p>
		<ul class='doctree'>
			<li class='jac'>
				{@link org.apache.juneau.rest.RestLogger}
				<ul>
					<li class='jm'>
						{@link org.apache.juneau.rest.RestLogger#log(Level,String,Object[]) log(Level,String,Object[])}
					<li class='jm'>
						{@link org.apache.juneau.rest.RestLogger#log(Level,Throwable,String,Object[]) log(Level,Throwable,String,Object[])}
					<li class='jm'>
						{@link org.apache.juneau.rest.RestLogger#logObjects(Level,String,Object[]) logObjects(Level,String,Object[])}
					<li class='jm'>
						{@link org.apache.juneau.rest.RestLogger#onError(HttpServletRequest,HttpServletResponse,RestException) onError(HttpServletRequest,HttpServletResponse,RestException)}
						<br>Gets called when an error occurs on a request call.
						<br>Default implementation logs the error.
				</ul>
			</li>
		</ul>
		<p>
			The {@link org.apache.juneau.rest.RestLogger#logObjects(Level,String,Object[]) logObjects()} method is particularly useful because it allows you to pass in POJOs as arguments
			that serialized using {@link org.apache.juneau.json.JsonSerializer#DEFAULT_LAX_READABLE}, but only
			if the message is actually logged.
		</p>
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	logger.logObjects(<jsf>DEBUG</jsf>, <js>"Pojo contents:\n{0}"</js>, myPojo);
		</p>
		<p>
			By default, the Juneau framework uses the built-in Java Logging API for logging.
			<br>But you can define your own implementation to use any framework you wish.
		</p>
		<p>
			The {@link org.apache.juneau.rest.RestLogger} instance is accessible via the following:
		</p>
		<ul>
			<li class='jm'>{@link org.apache.juneau.rest.RestContext#getLogger()}
			<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getLogger()}
		</ul>
		<p>
			In addition, the logger can be accessed by passing it as a parameter to your REST java method:
		</p>
		<p class='bcode'>
	<ja>@RestMethod()</ja>
	<jk>public</jk> Object doSomething(RestLogger logger) {...}
		</p>
		<p>
			If your resource extends from {@link org.apache.juneau.rest.RestServlet}, you can also
			use and override the following methods:
		<ul>
			<li class='jm'>{@link org.apache.juneau.rest.RestServlet#log(Level,String,Object...)}
			<li class='jm'>{@link org.apache.juneau.rest.RestServlet#log(Level,Throwable,String,Object...)}
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.HttpStatusCodes"></a>
	<h3 class='topic' onclick='toggle(this)'>7.27 - HTTP Status Codes</h3>
	<div class='topic'>
		<p>
			By default, a 200 (OK) status is automatically set as the HTTP status when a Java method executes 
			successfully.
		</p>
		<p>
			Other status codes can be generated by throwing a {@link org.apache.juneau.rest.RestException} with a 
			specific HTTP status code, or calling {@link javax.servlet.http.HttpServletResponse#setStatus(int)}.
		</p>
		<p>
			Non-OK (200) status codes are automatically triggered by the following conditions:
		</p>
		<table class='styled' style='max-width:800px;'>
			<tr>
				<th><l>Code</l></th>
				<th><l>Description</l></th>
				<th><l>When triggered</l></th>
			</tr>
			<tr>
				<td><l>401</l></td>
				<td>Unauthorized</td>
				<td>A {@link org.apache.juneau.rest.RestGuard guard} prevented the method from being executed</td>
			</tr>
			<tr>
				<td><l>404</l></td>
				<td>Not Found</td>
				<td>No matching path patterns were found on any method</td>
			</tr>
			<tr>
				<td><l>405</l></td>
				<td>Method Not Implemented</td>
				<td>A path pattern matched, but no Java methods were found for the HTTP method</td>
			</tr>
			<tr>
				<td><l>406</l></td>
				<td>Not Acceptable</td>
				<td>
					A path pattern matched, but no Java methods were found with a matching serializer for the 
					<l>Accept</l> on the request
				</td>
			</tr>
			<tr>
				<td><l>412</l></td>
				<td>Precondition Failed</td>
				<td>
					A path pattern matched, but no Java methods were found that were not rejected by 
					{@link org.apache.juneau.rest.RestMatcher matchers}
				</td>
			</tr>
			<tr>
				<td><l>415</l></td>
				<td>Unsupported Media Type</td>
				<td>
					A path pattern matched, but no Java methods were found with a matching parser for the 
					<l>Content-Type</l> on the request
				</td>
			</tr>
			<tr>
				<td><l>500</l></td>
				<td>Internal Server Error</td>
				<td>The Java method threw an exception other than {@link org.apache.juneau.rest.RestException}</td>
			</tr>
		</table>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.OverloadingHttpMethods"></a>
	<h3 class='topic' onclick='toggle(this)'>7.28 - Overloading HTTP Methods</h3>
	<div class='topic'>
		<p>
			Through the use of the built-in <l>"method"</l> GET parameter, you can implement requests beyond the basic 
			REST http method types.
		</p>
		<p>
			For example, the URL <l>"/sample/foo?method=BAR"</l> will cause the following method to be invoked...
		</p>
		<p class='bcode'>
	<ja>@RestMethod</ja>(name=<js>"BAR"</js>)
	<jk>public void</jk> doBar(RestRequest req, RestResponse res) {
		<jc>// Handle BAR requests</jc>
	}
		</p>
		<p>
			To support overloaded methods, the {@link org.apache.juneau.rest.annotation.RestResource#allowedMethodParams() @RestResource.allowedMethodParams()} 
			setting must be enabled on your servlet.
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		<jc>// Allow &amp;method parameter on BAR requests</jc>
		allowedMethodParams=<js>"BAR"</js>
	)
		</p>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.BuiltInParameters"></a>
	<h3 class='topic' onclick='toggle(this)'>7.29 - Built-in Parameters</h3>
	<div class='topic'>
		<p>
			The following URL parameters have special meaning and can be passed in through the URL of the request:
		</p>
		<table class='styled' style='max-width:800px'>
			<tr>
				<th><l>GET Parameter</l></th>
				<th><l>Description</l></th>
			</tr>
			<tr>
				<td class='code'>&amp;plainText=true</td>
				<td>
					Response will always be <l>Content-Type: text/plain</l> and the returned text will be human-readable
					({@link org.apache.juneau.serializer.Serializer#SERIALIZER_useWhitespace SERIALIZER_useWhitespace} enabled).
					<br>Useful for debugging.
				</td>
			</tr>
			<tr>
				<td class='code'>&amp;debug=true</td>
				<td>
					Request body content will be dumped to log file.
				</td>
			</tr>
			<tr>
				<td class='code'>&amp;noTrace=true</td>
				<td>
					If an error occurs, don't log the stack trace to the log file.
					<br>Useful for automated JUnit testcases testing error states to prevent the log file from filling 
					up with useless stack traces.
				</td>
			</tr>
			<tr>
				<td class='code'>&amp;method=X</td>
				<td>
					Overload the HTTP method as a GET parameter (e.g <l>"POST"</l>).
					<br>Must be enabled via {@link org.apache.juneau.rest.annotation.RestResource#allowedMethodParams() @RestResource.allowedMethodParams()} setting.
				</td>
			</tr>
			<tr>
				<td class='code'>&amp;Header-Name=headerValue</td>
				<td>
					Specify a header value as a GET parameter.
					<br>Must be enabled via {@link org.apache.juneau.rest.annotation.RestResource#allowHeaderParams() @RestResource.allowHeaderParams()} setting.
				</td>
			</tr>
			<tr>
				<td class='code'>&amp;body=X</td>
				<td>
					Pass in the HTTP body content on PUT and POST methods as a UON-encoded GET parameter.
					<br>Must be enabled via {@link org.apache.juneau.rest.annotation.RestResource#allowBodyParam() @RestResource.allowBodyParam()} setting.
				</td>
			</tr>
			<tr>
				<td class='code'>&amp;x-response-headers=X</td>
				<td>
					Pass-through headers to the response.
					<br>Must be a UON-encoded map of key-value pairs.
				</td>
			</tr>
		</table>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.CustomSerializersAndParsers"></a>
	<h3 class='topic' onclick='toggle(this)'>7.30 - Custom Serializers and Parsers</h3>
	<div class='topic'>
		<p>
			A very easy-to-use API is provided for defining your own serializers and parsers at both the servlet and 
			method levels.
		</p>
		<p>
			The following examples show a custom serializer and parser defined at the method level.
			It's the <l>PhotosResource</l> class pulled from the Samples project.
			It shows an example of defining a serializer and parser to handle images.
		</p>
		<p class='bcode'>
	<jd>/**
	 * Sample resource that allows images to be uploaded and retrieved.
	 */</jd>
	<ja>@RestResource</ja>(
		path=<js>"/photos"</js>,
		messages=<js>"nls/PhotosResource"</js>,
		title=<js>"Photo REST service"</js>,
		description=<js>"Use a tool like Poster to upload and retrieve jpeg and png images."</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"options: ?method=OPTIONS"</js>
			}
		)
	)
	<jk>public class</jk> PhotosResource <jk>extends</jk> RestServletDefault {
	
		<jc>// Our cache of photos</jc>
		<jk>private</jk> Map&lt;Integer,Photo&gt; photos = <jk>new</jk> TreeMap&lt;Integer,Photo&gt;();
		
		<jd>/** Bean class for storing photos */</jd>
		<jk>public static class</jk> Photo {
			<jk>private int</jk> <jf>id</jf>;
			BufferedImage <jf>image</jf>;
			
			Photo(int id, BufferedImage image) {
				<jk>this</jk>.<jf>id</jf> = id;
				<jk>this</jk>.<jf>image</jf> = image;
			}
			
			<jk>public</jk> URI getURI() <jk>throws</jk> URISyntaxException {
				<jk>return new</jk> URI(<js>"photos/"</js>+<jf>id</jf>);
			}
			
			<jk>public int</jk> getID() {
				<jk>return</jk> <jf>id</jf>;
			}
		}
		
		<jd>/** GET request handler for list of all photos */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
		<jk>public</jk> Collection&lt;Photo&gt; getAllPhotos(RestRequest req, RestResponse res) <jk>throws</jk> Exception {
			res.setPageTitle(<js>"Photo REST service"</js>);
			res.setPageText(<js>"Use a tool like Poster to upload and retrieve jpeg and png images."</js>);
			<jk>return</jk> photos.values();
		}
		
		<jd>/** GET request handler for single photo */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{id}"</js>, serializers=ImageSerializer.<jk>class</jk>)
		<jk>public</jk> BufferedImage getPhoto(RestRequest req, <ja>@Path</ja> int id) <jk>throws</jk> Exception {
			Photo p = photos.get(id);
			if (p == <jk>null</jk>)
				<jk>throw new</jk> RestException(<jsf>SC_NOT_FOUND</jsf>, <js>"Photo not found"</js>);
			<jk>return</jk> p.image;
		}
		
		<jd>/** PUT request handler */</jd>
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/{id}"</js>, parsers=ImageParser.<jk>class</jk>)
		<jk>public</jk> String addPhoto(RestRequest req, <ja>@Path</ja> <jk>int</jk> id, <ja>@Body</ja> BufferedImage image) <jk>throws</jk> Exception {
			photos.put(id, <jk>new</jk> Photo(id, image));
			<jk>return</jk> <js>"OK"</js>;
		}
		
		<jd>/** POST request handler */</jd>
		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/"</js>, parsers=ImageParser.<jk>class</jk>)
		<jk>public</jk> Photo setPhoto(RestRequest req, <ja>@Body</ja> BufferedImage image) <jk>throws</jk> Exception {
			<jk>int</jk> id = photos.size();
			Photo p = <jk>new</jk> Photo(id, image);
			photos.put(id, p);
			<jk>return</jk> p;
		}
		
		<jd>/** DELETE request handler */</jd>
		<ja>@RestMethod</ja>(name=<jsf>DELETE</jsf>, path=<js>"/{id}"</js>)
		<jk>public</jk> String deletePhoto(RestRequest req, <ja>@Path</ja> <jk>int</jk> id) <jk>throws</jk> Exception {
			Photo p = photos.remove(id);
			if (p == <jk>null</jk>)
				<jk>throw new</jk> RestException(<jsf>SC_NOT_FOUND</jsf>, <js>"Photo not found"</js>);
			<jk>return</jk> <js>"OK"</js>;
		}
	
		<jd>/** OPTIONS request handler */</jd>
		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>)
		<jk>public</jk> Swagger getOptions(RestRequest req) {
			<jk>return</jk> req.getSwagger();
		}

		<jd>/** Serializer for converting images to byte streams */</jd>
		<ja>@Produces</ja>(<js>"image/png,image/jpeg"</js>)
		<jk>public static class</jk> ImageSerializer <jk>extends</jk> OutputStreamSerializer {
		
			<ja>@Override</ja> <jc>/* Serializer */</jc>
			<jk>public void</jk> serialize(Object o, OutputStream out, SerializerSession session) <jk>throws</jk> IOException, SerializeException {
				RenderedImage image = (RenderedImage)o;
				String mediaType = ctx.getMediaType();
				ImageIO.<jsm>write</jsm>(image, mediaType.substring(mediaType.indexOf(<js>'/'</js>)+1), out);
			}	
		}
		
		<jd>/** Parser for converting byte streams to images */</jd>
		<ja>@Consumes</ja>(<js>"image/png,image/jpeg"</js>)
		<jk>public static class</jk> ImageParser <jk>extends</jk> InputStreamParser {
		
			<ja>@Override</ja> <jc>/* Parser */</jc>
			<jk>public</jk> &lt;T&gt; T parse(InputStream in, ClassMeta&lt;T&gt; type, ParserSession session) <jk>throws</jk> ParseException, IOException {
				BufferedImage image = ImageIO.<jsm>read</jsm>(in);
				<jk>return</jk> (T)image;
			}
		}
	}
		</p>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.UsingWithOsgi"></a>
	<h3 class='topic' onclick='toggle(this)'>7.31 - Using with OSGi</h3>
	<div class='topic'>
		<p>
			Since REST servlets are basically just <l>HttpServlets</l>, incorporating them into an OSGi environment
			is pretty straightforward.
		</p>
		<p>
			The following code shows how to register your REST servlets in an OSGi <l>Activator</l>:
		</p>
		<p class='bcode'>
	<jk>package</jk> org.apache.juneau.examples.rest;
	
	<jk>import</jk> org.osgi.framework.*;
	<jk>import</jk> org.osgi.service.http.*;
	<jk>import</jk> org.osgi.util.tracker.*;
	
	<jk>import</jk> org.apache.juneau.rest.samples.*;
	
	<jd>/**
	 * Activator class used when running samples as a bundle in an OSGi environment.
	 */</jd>
	<jk>public class</jk> Activator <jk>implements</jk> BundleActivator, ServiceTrackerCustomizer {
	
		<jk>private</jk> ServiceTracker <jf>httpServiceTracker</jf>;
		<jk>private</jk> BundleContext <jf>context</jf>;
	
		<ja>@Override</ja> <jc>/* BundleActivator */</jc>
		<jk>public void</jk> start(BundleContext context) <jk>throws</jk> Exception {
			<jk>this</jk>.<jf>context</jf> = context;
			<jf>httpServiceTracker</jf> = <jk>new</jk> ServiceTracker(context, HttpService.<jk>class</jk>.getName(), <jk>this</jk>);
			<jf>httpServiceTracker</jf>.open();
		}
	
		<ja>@Override</ja> <jc>/* BundleActivator */</jc>
		<jk>public void</jk> stop(BundleContext context) <jk>throws</jk> Exception {
			<jf>httpServiceTracker</jf>.close();
		}
	
		<ja>@Override</ja> <jc>/* ServiceTrackerCustomizer */</jc>
		<jk>public</jk> Object addingService(ServiceReference reference) {
			Object service = <jf>context</jf>.getService(reference);
	
			<jk>if</jk> (service <jk>instanceof</jk> HttpService) {
				HttpService s = (HttpService)service;
				<jk>try</jk> {
					s.registerServlet(<js>"/sample"</js>, <jk>new</jk> MyRestServlet(), <jk>null</jk>, <jk>null</jk>);
				} <jk>catch</jk> (Exception e) {
					<jk>throw new</jk> RuntimeException(e);
				}
			}
	
			<jk>return</jk> service;
		}
	
		<ja>@Override</ja> <jc>/* ServiceTrackerCustomizer */</jc>
		<jk>public void</jk> modifiedService(ServiceReference reference, Object service) {
		}
	
		<ja>@Override</ja> <jc>/* ServiceTrackerCustomizer */</jc>
		<jk>public void</jk> removedService(ServiceReference reference, Object service) {
		}
	}
		</p>
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-rest-server.RemoteableProxies"></a>
	<h3 class='topic' onclick='toggle(this)'>7.32 - Remoteable Proxies</h3>
	<div class='topic'>
		<p>
			The Remoteable Service API allows for client side code to use interface proxies for calling methods on POJOs on 
			the server side.
		</p>
		<p>
			Proxy interfaces are retrieved using the {@link org.apache.juneau.rest.client.RestClient#getRemoteableProxy(Class)} 
			method.
			The remoteable servlet is a specialized subclass of {@link org.apache.juneau.rest.RestServlet} that provides a 
			full-blown REST interface for calling remoteable services (e.g. POJOs) remotely. 
		</p>
		<p>
			The following simplified example shows how a method on a POJO on a server can be called through an interface
			on a client...
		</p>
		<p class='bcode'>
	<jk>public interface</jk> IAddressBook {
		Person createPerson(CreatePerson cp) <jk>throws</jk> Exception;
		Person findPerson(<jk>int</jk> id);
		Address findAddress(<jk>int</jk> id);
		Person findPersonWithAddress(<jk>int</jk> id);
	}
		</p>			
		<p>
			The client side code for invoking this method is shown below...
		</p>
		<p class='bcode'>
	<jc>// Create a RestClient using JSON for serialization, and point to the server-side remoteable servlet.</jc>
	RestClient client = RestClient.<jsm>create</jsm>()
		.rootUrl(<js>"https://localhost:9080/juneau/sample/remoteable"</js>)
		.build();
	
	<jc>// Create a proxy interface.</jc>
	IAddressBook ab = client.getRemoteableProxy(IAddressBook.<jk>class</jk>);
	
	<jc>// Invoke a method on the server side and get the returned result.</jc>
	Person p = ab.createPerson(
		<jk>new</jk> CreatePerson(<js>"Test Person"</js>,
			AddressBook.<jsm>toCalendar</jsm>(<js>"Aug 1, 1999"</js>),
			<jk>new</jk> CreateAddress(<js>"Test street"</js>, <js>"Test city"</js>, <js>"Test state"</js>, 12345, <jk>true</jk>))
	);
		</p>
		<p>
			The requirements for a method to be callable through the remoteable service are:
		</p>
		<ul class='spaced-list'>
			<li>
				The method must be public.
			<li>
				The parameter and return types must be <a class='doclink' href='#juneau-marshall.PojoCategories'>serializable and parsable</a>.
		</ul>
		<p>
			Juneau provides the capability of calling methods on POJOs on a server through client-side proxy interfaces.
			It offers a number of advantages over other similar remote proxy interfaces, such as being much simpler to 
				define and use, and allowing much more flexibility in the types of objects serialized.
		</p>
		<p>
			The remote proxy interface API allows you to invoke server-side POJO methods on the client side using REST as 
			the communications protocol:
		</p>
		<p class='bcode'>
	<jc>// Create a client with basic JSON support.</jc>
	RestClient client = RestClient.<jsm>create</jsm>().rootUrl(<js>"http://localhost/remoteable"</js>).build();
	
 	<jc>// Get an interface proxy.</jc>
 	IAddressBook ab = client.getRemoteableProxy(IAddressBook.<jk>class</jk>);
	
	<jc>// Invoke a method on the server side and get the returned result.</jc>
	Person p = ab.createPerson(
		<jk>new</jk> Person(
			<js>"John Smith"</js>, 
			<js>"Aug 1, 1999"</js>,
			<jk>new</jk> Address(<js>"My street"</js>, <js>"My city"</js>, <js>"My state"</js>, 12345, <jk>true</jk>)
		)
	);
		</p>
		<p>
			Under the covers, this method call gets converted to a REST POST.
		</p>
		<p class='bcode'>
	HTTP POST http://localhost/remoteable/org.apache.juneau.examples.rest.IAddressBook/createPerson
	Accept: application/json
	Content-Type: application/json
	
	[
		{
			"name":"John Smith",
			"birthDate":"Aug 1, 1999",
			"addresses":[
				{
					"street":"My street",
					"city":"My city",
					"state":"My state",
					"zip":12345,
					"isCurrent":true
				}
			]
		}
	]
		</p>
		<p>
			Note that the body of the request is an array.  This array contains the serialized arguments of the method.
			The object returned by the method is then serialized as the body of the response.
		</p>
		<p>
			To define a remoteable interface, simply add the {@link org.apache.juneau.remoteable.Remoteable @Remoteable} 
			annotation to your interface class.  
		</p>
		<p class='bcode'>
	<ja>@Remoteable</ja>
	<jk>public interface</jk> IAddressBook {...}
		</p>
		<p>
			This annotation tells the framework that all methods defined on this interface can be executed remotely.
			It can be applied to super-interfaces, super-classes, etc..., and exposes the methods at whatever level it is 
			defined.  
		</p>
		<p>
			The {@link org.apache.juneau.remoteable.RemoteMethod @RemoteMethod} annotation can also be used on individual 
			methods to tailor which methods are exposed or their paths.
		</p>
		<p>
			There are two ways to expose remoteable proxies on the server side:
		</p>
		<ol class='spaced-list'>
			<li>
				Extending from <code>RemoteableServlet</code>.
			<li>
				Using a <code><ja>@RestMethod</ja>(name=<jsf>PROXY</jsf>)</code> annotation on a Java method.
		</ol>
		<p>
			The <code>RemoteableServlet</code> class is a simple specialized servlet with an abstract 
			<code>getServiceMap()</code> method to define the server-side POJOs:
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		path=<js>"/remote"</js>
	)
	<jk>public class</jk> SampleRemoteableServlet <jk>extends</jk> RemoteableServlet {
	
		<jc>// Our server-side POJO.</jc>
		AddressBook <jf>addressBook</jf> = <jk>new</jk> AddressBook();
	
		<ja>@Override</ja> <jc>/* RemoteableServlet */</jc>
		<jk>protected</jk> Map&lt;Class&lt;?&gt;,Object&gt; getServiceMap() <jk>throws</jk> Exception {
			Map&lt;Class&lt;?&gt;,Object&gt; m = <jk>new</jk> LinkedHashMap&lt;Class&lt;?&gt;,Object&gt;();
	
			<jc>// In this simplified example, we expose the same POJO service under two different interfaces.
			// One is IAddressBook which only exposes methods defined on that interface, and
			// the other is AddressBook itself which exposes all methods defined on the class itself (dangerous!).</jc>
			m.put(IAddressBook.<jk>class</jk>, <jf>addressBook</jf>);
			m.put(AddressBook.<jk>class</jk>, <jf>addressBook</jf>);
			<jk>return</jk> m;
		}
	}
		</p>
		<p>
			The <code><ja>@RestMethod</ja>(name=<jsf>PROXY</jsf>)</code> approach is easier if you only have a single 
			interface you want to expose.  
			You simply define a Java method whose return type is an interface, and return the implementation of that 
			interface:
		</p>
		<p class='bcode'>
	<jc>// Our exposed proxy object.</jc>
	<ja>@RestMethod</ja>(name=<jsf>PROXY</jsf>, path=<js>"/addressbookproxy/*"</js>)
	<jk>public</jk> IAddressBook getProxy() {
		<jk>return</jk> addressBook;
	}
		</p>
		<p>
			In either case, the proxy communications layer is pure REST.
			Therefore, in cases where the interface classes are not available on the client side, the same method calls can 
			be made through pure REST calls.  
			This can also aid significantly in debugging, since calls to the remoteable service can be made directly from
			a browser with no coding involved.
		</p>
		<p>
			The parameters and return types of the Java methods can be any of the supported <a class='doclink' href='#juneau-marshall.PojoCategories'>serializable and parsable types</a>.
			This ends up being WAY more flexible than other proxy interfaces since Juneau can handle so may POJO types 
			out-of-the-box.
			Most of the time you don't even need to modify your existing Java implementation code.
		</p>
		<p>
			The <code>RemoteableServlet</code> class itself shows how sophisticated REST interfaces can be built on the Juneau 
			RestServlet API using very little code.  
			The class consists of only 53 lines of code, yet is a sophisticated discoverable and 
			self-documenting REST interface.  
			And since the remote proxy API is built on top of REST, it can be debugged using just a browser.
		</p>
		<p>
			The requirements for a method to be callable through a remoteable service are:
		</p>
		<ul class='spaced-list'>
			<li>
				The method must be public.
			<li>
				The parameter and return types must be <a href='#juneau-marshall.PojoCategories'>serializable and parsable</a>.
				Parameterized types are supported.
			<li>
				Methods can throw <code>Throwables</code> with public no-arg or single-arg-string constructors which will 
				be automatically recreated on the client side.
		</ul>
		
		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RemoteableProxiesClientSide"></a>
		<h4 class='topic' onclick='toggle(this)'>7.32.1 - Client Side</h4>
		<div class='topic'>
			<p>
				Remoteable interface proxies are retrieved through the existing {@link org.apache.juneau.rest.client.RestClient} 
				class.
			</p>
			<p>
				It may seem that the client-side code would need to be complex.
				In reality, it builds upon existing serializing, parsing, and REST capabilities in Juneau resulting in very 
				little additional code.
				The entire code for the <code>RestClient.getRemoteableProxy(Class)</code> method is shown below:
			</p>
			<p class='bcode'>
	<jk>public</jk> &lt;T&gt; T getRemoteableProxy(<jk>final</jk> Class&lt;T&gt; interfaceClass) {
		<jk>return</jk> (T)Proxy.newProxyInstance(
			interfaceClass.getClassLoader(),
			<jk>new</jk> Class[] { interfaceClass },
			<jk>new</jk> InvocationHandler() {
				<ja>@Override</ja> <jc>/* InvocationHandler */</jc>
				<jk>public</jk> Object invoke(Object proxy, Method method, Object[] args) {
					<jk>try</jk> {
						String uri = <jf>remoteableServletUri</jf> + '/' + interfaceClass.getName() + '/' + ClassUtils.<jsm>getMethodSignature</jsm>(method);
						<jk>return</jk> doPost(uri, args).getResponse(method.getReturnType());
					} <jk>catch</jk> (Exception e) {
						<jk>throw new</jk> RuntimeException(e);
					}
				}
		});
	}
			</p>
			<p>
				Since we build upon the existing <code>RestClient</code> API, we inherit all of it's features.
				For example, convenience methods for setting POJO filters and properties to customize the behavior of the 
				serializers and parsers, and the ability to provide your own customized Apache <code>HttpClient</code> for 
				handling various scenarios involving authentication and Internet proxies.
			</p>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RemoteableProxiesServerSide"></a>
		<h4 class='topic' onclick='toggle(this)'>7.32.2 - Server Side</h4>
		<div class='topic'>
			<p>
				The server side is only slightly more complex, but boasts useful debugging and discovery capabilities.  
			</p>
			<p>
				The {@link org.apache.juneau.rest.remoteable.RemoteableServlet} class is an implementation of 
				{@link org.apache.juneau.rest.RestServlet} that provides a REST interface for invoking calls on POJOs.
				The <code>RemoteableServlet</code> class is abstract and must implement a single method for providing the set 
				of POJOs to expose as remote interfaces.  
			</p>
			<p>
				The samples bundle includes a sample implementation of a remoteable service that can be used to interact with 
				the address book POJO also included in the bundle.  
				The method that must be implemented is {@link org.apache.juneau.rest.remoteable.RemoteableServlet#getServiceMap()}
				that simply returns a mapping of Java interfaces (or classes) to POJO instances.
			</p>
			<p class='bcode'>
	<ja>@RestResource</ja>(
		path=<js>"/remoteable"</js>
	)
	<jk>public class</jk> SampleRemoteableServlet <jk>extends</jk> RemoteableServlet {
	
		<jc>// The POJO being manipulated (i.e. the remoteable service)</jc>
		AddressBook <jf>addressBook</jf> = <jk>new</jk> AddressBook();
	
		<ja>@Override</ja> <jc>/* RemoteableServlet */</jc>
		<jk>protected</jk> Map&lt;Class&lt;?&gt;,Object&gt; getServiceMap() <jk>throws</jk> Exception {
			Map&lt;Class&lt;?&gt;,Object&gt; m = <jk>new</jk> LinkedHashMap&lt;Class&lt;?&gt;,Object&gt;();
	
			<jc>// In this simplified example, we expose the same POJO service under two different interfaces.
			// One is IAddressBook which only exposes methods defined on that interface, and
			// the other is AddressBook itself which exposes all public methods defined on the class itself.</jc>
			m.put(IAddressBook.<jk>class</jk>, addressBook);
			m.put(AddressBook.<jk>class</jk>, addressBook);
			<jk>return</jk> m;
		}
	}
			</p>
			<p>
				Since this class is a servlet, and can be deployed as such.  
				In the sample code, it's listed as a child resource to <code>org.apache.juneau.rest.samples.RootResources</code>
					which makes it available under the URL <code>/juneau/sample/remoteable</code>.
			</p>
			<p>
				If you point your browser to that URL, you get a list of available interfaces:
			</p>
			<img class='bordered' src="doc-files/juneau-rest-server.RemoteableProxiesServerSide.1.png">
			<p>
				Clicking the hyperlinks on each shows you the list of methods that can be invoked on that service.
				Note that the <code>IAddressBook</code> link shows that you can only invoke methods defined on that
				interface, whereas the <code>AddressBook</code> link shows ALL public methods defined on that class.
				Since <code>AddressBook</code> extends from <code>LinkedList</code>, you may notice familiar collections
				framework methods listed.
			</p>
			<img class='bordered' src="doc-files/juneau-rest-server.RemoteableProxiesServerSide.2.png">
			<img class='bordered' src="doc-files/juneau-rest-server.RemoteableProxiesServerSide.3.png">
			<p>
				Let's see how we can interact with this interface through nothing more than REST calls to get a better idea on 
				how this works.
				We'll use the same method call as in the introduction.
				First, we need to create the serialized form of the arguments:
			</p>
	<p class='bcode'>
	Object[] args = <jk>new</jk> Object[] {
		<jk>new</jk> CreatePerson(<js>"Test Person"</js>,
			AddressBook.<jsm>toCalendar</jsm>(<js>"Aug 1, 1999"</js>),
			<jk>new</jk> CreateAddress(<js>"Test street"</js>, <js>"Test city"</js>, <js>"Test state"</js>, 12345, <jk>true</jk>))
	};
	String asJson = JsonSerializer.<jsf>DEFAULT_LAX_READABLE</jsf>.toString(args);
	System.<jsf>err</jsf>.println(asJson);
			</p>
			<p>
				That produces the following JSON output:
			</p>
			<p class='bcode'>
	[
		{
			name: <js>'Test Person'</js>, 
			birthDate: <js>'Aug 1, 1999'</js>, 
			addresses: [
				{
					street: <js>'Test street'</js>, 
					city: <js>'Test city'</js>, 
					state: <js>'Test state'</js>, 
					zip: 12345, 
					isCurrent: <jk>true</jk>
				}
			]
		}
	]	
			</p>
			<p>
				Note that in this example we're using JSON.  
				However, various other content types can also be used such as XML, URL-Encoding, UON, or HTML.  
				In practice however, JSON will preferred since it is often the most efficient.
			</p>
			<p>
				Next, we can use a tool such as Poster to make the REST call.
				Methods are invoked by POSTing the serialized object array to the URI of the interface method.
				In this case, we want to POST our JSON to <code>/juneau/sample/remoteable/org.apache.juneau.examples.addressbook.IAddressBook/createPerson(org.apache.juneau.examples.addressbook.CreatePerson)</code>.
				Make sure that we specify the <code>Content-Type</code> of the body as <code>text/json</code>.
				We also want the results to be returned as JSON, so we set the <code>Accept</code> header to 
				<code>text/json</code> as well.
			</p>
			<img class='bordered' src="doc-files/juneau-rest-server.RemoteableProxiesServerSide.4.png">
			<p>
				When we execute the POST, we should see the following successful response whose body contains the returned 
				<code>Person</code> bean serialized to JSON:
			</p>
			<img class='bordered' src="doc-files/juneau-rest-server.RemoteableProxiesServerSide.5.png">
			<p>
				From there, we could use the following code snippet to reconstruct the response object from JSON:
			</p>
			<p class='bcode'>
				String response = <js>"<i>output from above</i>"</js>;
				Person p = JsonParser.<jsf>DEFAULT</jsf>.parse(response, Person.<jk>class</jk>);
			</p>
			<p>
				If we alter our servlet to allow overloaded GET requests, we can invoke methods using nothing more than a 
				browser...
			</p>
			<p class='bcode'>
			<ja>@RestResource</ja>(
				path=<js>"/remoteable"</js>,
				
				<jc>// Allow us to use method=POST from a browser.</jc>
				allowedMethodParams=<js>"*"</js>
			)
			<jk>public class</jk> SampleRemoteableServlet <jk>extends</jk> RemoteableServlet {
			</p>
			<p>
				For example, here we call the <code>findPerson(<jk>int</jk>)</code> method to retrieve a person and get the 
				returned POJO (in this case as HTML since that's what's in the <code>Accept</code> header when calling from a 
				browser):
			</p>
			<img class='bordered' src="doc-files/juneau-rest-server.RemoteableProxiesServerSide.6.png">
			<p>
				When specifying the POST body as a <code>&amp;content</code> parameter, the method arguments should be in UON 
				notation.
				See {@link org.apache.juneau.uon.UonSerializer} for more information about this encoding.
				Usually you can also pass in JSON if you specify <code>&amp;Content-Type=text/json</code> in the URL parameters
				but passing in unencoded JSON in a URL may not work in all browsers.  
				Therefore, UON is preferred.
			</p>
		</div>

		<!-- ======================================================================================================== -->
		<a id="juneau-rest-server.RemoteableProxiesRemoteableAnnotation"></a>
		<a id="RemoteableAnnotation"></a>
		<h4 class='topic' onclick='toggle(this)'>7.32.3 - @Remoteable Annotation</h4>
		<div class='topic'>
			<p>
				What if you want fine-tuned control over which methods are exposed in an interface instead of just all public 
				methods?
				For this, the {@link org.apache.juneau.remoteable.Remoteable @Remoteable} annotation is provided.
				It can be applied to individual interface methods to only expose those methods through the remoteable servlet.
			</p>
			<p>
				For example, to expose only the first 2 methods in our <code>IAddressBook</code> interface...
			</p>
			<p class='bcode'>
			<jk>public interface</jk> IAddressBook {
				<ja>@Remoteable</ja> Person createPerson(CreatePerson cp) <jk>throws</jk> Exception;
				<ja>@Remoteable</ja> Person findPerson(<jk>int</jk> id);
				Address findAddress(<jk>int</jk> id);
				Person findPersonWithAddress(<jk>int</jk> id);
			}
			</p>	
			<p>
				On the server side, the option to restrict access to only annotated methods is defined through a property:
			</p>
			<p class='bcode'>
			<ja>@RestResource</ja>(
				path=<js>"/remoteable"</js>,
				properties={
					<jc>// Only expose methods annotated with @Remoteable.</jc>
					<ja>@Property</ja>(name=<jsf>REMOTEABLE_includeOnlyRemotableMethods</jsf>, value=<js>"true"</js>)
				}
			)
			<jk>public class</jk> SampleRemoteableServlet <jk>extends</jk> RemoteableServlet {
			</p>
			<p>
				The <ja>@Remoteable</ja> annotation can also be applied to the interface class to expose all public methods 
				defined on that interface.
			</p>
			<p class='bcode'>
			<ja>@Remoteable</ja>
			<jk>public interface</jk> IAddressBook {
				Person createPerson(CreatePerson cp) <jk>throws</jk> Exception;
				Person findPerson(<jk>int</jk> id);
				Address findAddress(<jk>int</jk> id);
				Person findPersonWithAddress(<jk>int</jk> id);
			}
			</p>	
		</div>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-rest-server.Injection"></a>
	<h3 class='topic' onclick='toggle(this)'>7.33 - Using with Spring and Injection frameworks</h3>
	<div class='topic'>
		<p>
			The Juneau REST server API is compatible with dependency injection frameworks such as Spring.
		</p>
		<p>
			The important class is the {@link org.apache.juneau.rest.RestResourceResolver} class which is used
			to resolve child servlet/resource implementation classes inside parent contexts.
			In other words, it's used for resolving {@link org.apache.juneau.rest.annotation.RestResource#children() @RestResource.children()} instances.
		</p>
		<p>
			The general approach starts with defining a resolver that uses the Spring application context for resolution:
		</p>
		<p class='bcode'>
	<jk>public class</jk> SpringRestResourceResolver <jk>extends</jk> RestResourceResolverSimple {

		<jk>private final</jk> ApplicationContext <jf>appContext</jf>;
		
		<jk>public</jk> SpringRestResourceResolver(ApplicationContext appContext) {
			<jk>this</jk>.<jf>appContext</jf> = appContext;
		}
		
		<jk>@Override</jk> <jc>/* RestResourceResolverSimple */</jc>
		<jk>public</jk> Object resolve(Class&lt;?&gt; resourceType, RestContextBuilder builder) <jk>throws</jk> Exception {
			Object resource = <jf>appContext.</jf>getBean(type);
			
			<jc>// If Spring can't resolve it, use default resolution (just look for no-arg constructor).</jc>
			<jk>if</jk> (resource == <jk>null</jk>) {
				resource = <jk>super</jk>.resolve(resourceType, builder);
			}
			<jk>return</jk> resource;
		}
	}
		</p>
		<p>
			Next, define the Spring configuration to return our resolver:
		</p>
		<p class='bcode'>
	<ja>@Configuration</ja>
	<jk>public abstract class</jk> MySpringConfiguration {
		
		<ja>@Autowired</ja>
		<jk>private static</jk> ApplicationContext <jsf>appContext</jsf>;
		
		<jk>public static</jk> ApplicationContext getAppContext(){
			<jk>return</jk> <jsf>appContext</jsf>;
		}
		
		<jk>public static void</jk> setAppContext(ApplicationContext appContext){
			MySpringConfiguration.<jsf>appContext</jsf> = appContext;
		}
		
		<ja>@Bean</ja>
		<jk>public</jk> RestResourceResolver restResourceResolver(ApplicationContext appContext) {
			<jk>return new</jk> SpringRestResourceResolver(appContext);
		}
	}
		</p>
		<p>
			Finally, define your <code>Root</code> resource with a constructor that takes in our rest resource resolver and
			sets it on the config object during initialization.
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		children={
			...
		}
	)
	<jk>public class</jk> Root <jk>extends</jk> RestServletGroupDefault {
		
		<jk>private final</jk> RestResourceResolver <jf>resolver</jf>;
		
		<ja>@Inject</ja>
		<jk>public</jk> Root(RestResourceResolver resolver) {
			<jk>this</jk>.<jf>resolver</jf> = resolver;
		}
		
		<ja>@RestHook</ja>(<jsf>INIT</jsf>)
		<jk>public void</jk> initSpring(RestContextBuilder builder) <jk>throws</jk> Exception {
			builder.setResourceResolver(<jf>resolver</jf>);
		}
	}
		</p>
		<p>
			After that, just define constructors on your child resources to take in Spring beans:
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		path=<js>"/child"</js>
	)
	<jk>public class</jk> MyChildResource <jk>extends</jk> RestServletDefault {
	
		<jk>private final</jk> Bean1 <jf>bean1</jf>;
		<jk>private final</jk> Bean2 <jf>bean2</jf>;
		<jk>private final</jk> Bean3 <jf>bean3</jf>;
		
		<ja>@Inject</ja>
		<jk>public</jk> MyChildResource(Bean1 bean1, Bean2 bean2, Bean3 bean3) {
			<jk>this</jk>.<jf>bean1</jf> = bean1;
			<jk>this</jk>.<jf>bean2</jf> = bean2;
			<jk>this</jk>.<jf>bean3</jf> = bean3;
		}
		</p>
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-rest-server.HTTP2"></a>
	<h3 class='topic' onclick='toggle(this)'>7.34 - Using HTTP/2 features</h3>
	<div class='topic'>
		<p>
			Juneau is built as a veneer on top of the Servlet API, allowing you to use low-level Servlet APIs
			whenever needed.
			<br>This allows you to take advantage of the newest HTTP/2 features implemented in the new Servlet 4.0 
			specification.
		</p>
		<p>
			Coming soon (sorry)
		</p>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-rest-server.PredefinedLabelBeans"></a>
	<h3 class='topic' onclick='toggle(this)'>7.35 - Predefined Label Beans</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.labels} package contains some reusable beans that are useful for 
			creating linked items in HTML views.
		</p>
		<p>
			The {@link org.apache.juneau.rest.labels.ResourceDescription} class is a bean with name/description
			properties for labeling and linking to child resources.
			<br>The following examples is pulled from the REST examples:
		</p>
		<p class='bcode'>
	<jk>public class</jk> PredefinedLabelsResource <jk>extends</jk> Resource {
	
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
		<jk>public</jk> ResourceDescription[] getChildMethods() {
			<jk>return new</jk> ResourceDescription[] {
				<jk>new</jk> ResourceDescription(<js>"beanDescription"</js>, <js>"BeanDescription"</js>),
				<jk>new</jk> ResourceDescription(<js>"htmlLinks"</js>, <js>"HtmlLink"</js>)
			};
		}
	}
		</p>
		<p>
			It get rendered as a table of name/description columns with links to child methods:
		</p>
		<img class='bordered' src='doc-files/juneau-rest-server.PredefinedLabelBeans.1.png' style='width:240px'/>
		<p>
			The internals of the class show it simply has two bean properties with a link annotation
			defined on the name property:
		</p>
		<p class='bcode'>
	<jk>public class</jk> ResourceDescription {

		<ja>@Html</ja>(link=<js>"servlet:/{name}"</js>)
		<jk>public</jk> Object getName() {...}
		
		<jk>public</jk> Object getDescription() {...}
	}
		</p>
		<p>
			The {@link org.apache.juneau.rest.labels.BeanDescription} class provides a simple view
			of a bean and it's properties.
		</p>
		<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/beanDescription"</js>)
	<jk>public</jk> BeanDescription getBeanDescription() {
		<jk>return new</jk> BeanDescription(Person.<jk>class</jk>);
	}	
		</p>
		<p>
			This example renders the following:
		</p>
		<img class='bordered' src='doc-files/juneau-rest-server.PredefinedLabelBeans.2.png' style='width:584px'/>
		<p>
			The {@link org.apache.juneau.html.annotation.HtmlLink @HtmlLink} annotation can also be useful
			for rendering custom hyperlinks:
		</p>
		<p class='bcode'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/htmlLinks"</js>)
	<jk>public</jk> ALink[] htmlLinks() {
		<jk>return new</jk> ALink[] {
			<jk>new</jk> ALink(<js>"apache"</js>, <js>"http://apache.org"</js>),
			<jk>new</jk> ALink(<js>"juneau"</js>, <js>"http://juneau.apache.org"</js>)
		};
	}
	
	<ja>@HtmlLink</ja>(nameProperty=<js>"n"</js>, hrefProperty=<js>"l"</js>)
	<jk>public static class</jk> ALink {
		<jk>public</jk> String <jf>n</jf>, <jf>l</jf>;
		<jk>public</jk> ALink(String n, String l) {
			<jk>this</jk>.<jf>n</jf> = n;
			<jk>this</jk>.<jf>l</jf> = l;
		}
	}
		</p>			
		<p>
			This example renders the following consisting of a list of hyperlinks:
		</p>
		<img class='bordered' src='doc-files/juneau-rest-server.PredefinedLabelBeans.3.png' style='width:92px'/>
		
		<h5 class='section'>See Also:</h5>
		<ul>
			<li class='jc'>{@link org.apache.juneau.dto.LinkString}
		</ul>
	</div>
	
	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server.OtherNotes"></a>
	<h3 class='topic' onclick='toggle(this)'>7.36 - Other Notes</h3>
	<div class='topic'>
		<ul class='spaced-list'>
			<li>
				Subclasses can use either {@link javax.servlet.http.HttpServlet#init(ServletConfig)} 
				or {@link javax.servlet.http.HttpServlet#init()} for initialization just like any other servlet.
			<li>
				The <l>X-Response-Headers</l> header can be used to pass through header values into the response.
				The value should be a URL-encoded map of key-value pairs.
				For example, to add a <l>"Refresh: 1"</l> header to the response to auto-refresh a page, the following 
				parameter can be specified:  <l>"/sample?X-Response-Headers={Refresh=1}"</l>
		</ul>
	</div>		
</div>

<!-- =========================================================================================================== -->
<a id="juneau-rest-server-jaxrs"></a>
<h2 class='topic' onclick='toggle(this)'>8 - juneau-rest-server-jaxrs</h2>
<div class='topic'>

	<h5 class='figure'>Maven Dependency</h5>
	<p class='bcode' style='width:500px;'>
	<xt>&lt;dependency&gt;</xt>
		<xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
		<xt>&lt;artifactId&gt;</xt>juneau-rest-server-jaxrs<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>7.0.0<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
	</p>	
	
	<h5 class='figure'>Java Library</h5>
	<p class='bcode' style='width:500px;'>
	juneau-rest-server-jaxrs-7.0.0.jar 
	</p>	
	
	<h5 class='figure'>OSGi Module</h5>
	<p class='bcode' style='width:500px;'>
	org.apache.juneau.rest.server_7.0.0.jar 
	</p>	
	
	<p>
		The <code>juneau-rest-server-jaxrs</code> library provides an implementation of a <code>MessageBodyReader</code>
		and <code>MessageBodyWriter</code> to allow any of the Juneau serializers and parsers to be used in a 
		JAX/RS environment. 
	</p>

	<!-- ======================================================================================================== -->
	<a id="juneau-rest-server-jaxrs.BaseProvider"></a>
	<h3 class='topic' onclick='toggle(this)'>8.1 - Juneau JAX-RS Provider</h3>
	<div class='topic'>
		<p>
			The Juneau framework contains the <l>juneau-rest-server-jaxrs</l> bundle for performing simple
			integration of Juneau serializers and parsers in JAX-RS compliant environments.
		</p>
		<p>
			It should be noted that although some of the functionality of the Juneau Server API is provided through the JAX-RS 
			integration components, it is not nearly as flexible as using the {@link org.apache.juneau.rest.RestServlet} class directly.
		</p>
		<p>
			What you can do with the Juneau JAX-RS provider classes:
		</p>
		<ul class='spaced-list'>
			<li>
				Use existing Juneau serializers and parsers for converting streams to POJOs and vis-versa.
			<li>
				Use annotations to specify filters and properties using the {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod}
				and {@link org.apache.juneau.rest.jaxrs.JuneauProvider} annotations.
		</ul>
		<p>
			What you can't do with the Juneau JAX-RS provider classes:
		</p>
		<ul class='spaced-list'>
			<li>
				Specify or override serializers/parsers at the Java class and method levels.
				<br>JAX-RS does not provide the capability to use different providers for the same media types
				at the class or method levels. 
			<li>
				Specify or override filters and properties at the Java class level.
			<li>
				Default stylesheets for the {@link org.apache.juneau.html.HtmlDocSerializer} class.
				<br>It will produce HTML, but it won't contain any styles applied.
			<li>
				The ability to specify HTTP method, headers, and content using GET parameters.
				<br>These make debugging REST interfaces using only a browser possible.
			<li>
				Class or method level encoding.
			<li>
				Class or method level guards.
			<li>
				Class or method level converters.
		</ul>
		
		<p>
			The Juneau JAX-RS provider API consists of the following classes:
		</p>
		<ul class='spaced-list'>
			<li class='jc'>
				{@link org.apache.juneau.rest.jaxrs.BaseProvider} - The base provider class that implements the JAX-RS 
				<code>MessageBodyReader</code> and <code>MessageBodyWriter</code> interfaces.
			<li class='jc'>
				{@link org.apache.juneau.rest.jaxrs.JuneauProvider} - Annotation that is applied to subclasses of <code>BaseProvider</code>
				to specify the serializers/parsers associated with a provider, and optionally filters and properties to 
				apply to those serializers and parsers.
			<li class='jc'>
				{@link org.apache.juneau.rest.jaxrs.DefaultProvider} - A default provider that provides the same level
				of media type support as the {@link org.apache.juneau.rest.RestServletDefault} class.
		</ul>
		<p>
			For the most part, when using these components, you'll either use the existing <l>DefaultProvider</l> or
			<l>JuneauProvider</l> providers, or define your own by subclassing <l>BaseProvider</l>.
		</p>
	</div>
</div>

<!-- =========================================================================================================== -->
<a id="juneau-rest-client"></a>
<h2 class='topic' onclick='toggle(this)'>9 - juneau-rest-client</h2>
<div class='topic'>

	<h5 class='figure'>Maven Dependency</h5>
	<p class='bcode' style='width:500px;'>
	<xt>&lt;dependency&gt;</xt>
		<xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
		<xt>&lt;artifactId&gt;</xt>juneau-rest-client<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>7.0.0<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
	</p>	
	
	<h5 class='figure'>Java Library</h5>
	<p class='bcode' style='width:500px;'>
	juneau-rest-client-7.0.0.jar 
	</p>	
	
	<h5 class='figure'>OSGi Module</h5>
	<p class='bcode' style='width:500px;'>
	org.apache.juneau.rest.client_7.0.0.jar 
	</p>	

	<p>
		The REST client API provides the ability to access remote REST interfaces and transparently convert the input 
		and output to and from POJOs using any of the provided serializers and parsers.
	</p>
	<p>
		Built upon the <l>Apache HttpClient</l> libraries, it extends that API and provides specialized APIs for working with 
		REST interfaces while maintaining all the functionality available in the HttpClient API.
	</p>
	<p class='bcode'>
	<jc>// Create a reusable JSON client.</jc>
	<jk>try</jk> (RestClient client = RestClient.<jsm>create</jsm>().build()) {
	
		<jc>// The address of the root resource.</jc>
		String url = <js>"http://localhost:9080/sample/addressBook"</js>;
		
		<jc>// Do a REST GET against a remote REST interface and convert
		// the response to an unstructured ObjectMap object.</jc>
		ObjectMap m1 = client.doGet(url).getResponse(ObjectMap.<jk>class</jk>);
		
		<jc>// Same as above, except parse the JSON as a bean.</jc>
		AddressBook a2 = client.doGet(url).getResponse(AddressBook.<jk>class</jk>);
	}
		
	<jk>try</jk> (RestClient client = RestClient.<jsm>create</jsm>().serializer(XmlSerializer.<jk>class</jk>).parser(XmlSerializer.<jk>class</jk>).build()) {
		<jc>// Add a person to the address book.
		// Use XML as the transport medium.</jc>
		Person p = <jk>new</jk> Person(<js>"Joe Smith"</js>, 21);
		<jk>int</jk> returnCode = client.doPost(url + <js>"/entries"</js>, p).run();
	}
	</p>
	<p>
		Juneau provides an HTTP client API that makes it extremely simple to connect to remote REST interfaces and 
		seemlessly send and receive serialized POJOs in requests and responses.  
	</p>
	
	<h5 class='topic'>Features</h5>
	<ul class='spaced-list'>
		<li>
			Converts POJOs directly to HTTP request message bodies using {@link org.apache.juneau.serializer.Serializer} 
			classes.
	 	<li>
	 		Converts HTTP response message bodies directly to POJOs using {@link org.apache.juneau.parser.Parser} 
	 		classes.
		<li>
			Exposes the full functionality of the Apache HttpClient API by exposing all methods defined on the 
			{@link org.apache.http.impl.client.HttpClientBuilder} class.
		<li>
			Provides various convenience methods for setting up common SSL and authentication methods.
		<li>
			Provides a fluent interface that allows you to make complex REST calls in a single line of code.
	</ul>	
	<p>
		The client API is designed to work as a thin layer on top of the proven Apache HttpClient API.  
		By leveraging the HttpClient library, details such as SSL certificate negotiation, proxies, encoding, etc...
		are all handled in Apache code. 
	</p>
	<p>
		The Juneau client API prereq's Apache HttpClient 4.5+. 
		At a minimum, the following jars are required:
	</p>
	<ul>
		<li><code>httpclient-4.5.jar</code>
		<li><code>httpcore-4.4.1.jar</code>
		<li><code>httpmime-4.5.jar</code>
	</ul>
	
	<h5 class='figure'>Example:</h5>
	<p class='bcode'>
	<jc>// Examples below use the Juneau Address Book resource example</jc>

	<jc>// Create a reusable client with JSON support</jc>
	<jk>try</jk> (RestClient client = RestClient.<jsm>create</jsm>().build()) {
	
		<jc>// GET request, ignoring output</jc>
		<jk>try</jk> {
			<jk>int</jk> rc = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>).run();
			<jc>// Succeeded!</jc>
		} <jk>catch</jk> (RestCallException e) {
			<jc>// Failed!</jc>
			System.<jsf>err</jsf>.println(
				String.<jsm>format</jsm>(<js>"status=%s, message=%s"</js>, e.getResponseStatus(), e.getResponseMessage())
			);
		}
				
		<jc>// Remaining examples ignore thrown exceptions.</jc>		
				
		<jc>// GET request, secure, ignoring output</jc>
		client.doGet(<js>"https://localhost:9443/sample/addressBook"</js>).run();
				
		<jc>// GET request, getting output as a String.  No POJO parsing is performed.
		// Note that when calling one of the getX() methods, you don't need to call connect() or disconnect(), since
		//	it's automatically called for you.</jc>
		String output = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
			.getResponseAsString();
				
		<jc>// GET request, getting output as a Reader</jc>
		Reader r = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
			.getReader();
				
		<jc>// GET request, getting output as an untyped map</jc>
		<jc>// Input must be an object (e.g. "{...}")</jc>
		ObjectMap m = client.doGet(<js>"http://localhost:9080/sample/addressBook/0"</js>)
			.getResponse(ObjectMap.<jk>class</jk>);
				
		<jc>// GET request, getting output as an untyped list</jc>
		<jc>// Input must be an array (e.g. "[...]")</jc>
		ObjectList l = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
			.getResponse(ObjectList.<jk>class</jk>);
				
		<jc>// GET request, getting output as a parsed bean</jc>
		<jc>// Input must be an object (e.g. "{...}")</jc>
		<jc>// Note that you don't have to do any casting!</jc>
		Person p = client.doGet(<js>"http://localhost:9080/sample/addressBook/0"</js>)
			.getResponse(Person.<jk>class</jk>);
				
		<jc>// GET request, getting output as a parsed bean</jc>
		<jc>// Input must be an array of objects (e.g. "[{...},{...}]")</jc>
		Person[] pa = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
			.getResponse(Person[].<jk>class</jk>);
				
		<jc>// Same as above, except as a List&lt;Person&gt;</jc>
		List&lt;Person&gt; pl = client.doGet(<js>"http://localhost:9080/sample/addressBook"</js>)
			.getResponse(List.<jk>class</jk>, Person.<jk>class</jk>);
				
		<jc>// GET request, getting output as a parsed string</jc>
		<jc>// Input must be a string (e.g. "&lt;string&gt;foo&lt;/string&gt;" or "'foo'")</jc>
		String name = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/name"</js>)
			.getResponse(String.<jk>class</jk>);
				
		<jc>// GET request, getting output as a parsed number</jc>
		<jc>// Input must be a number (e.g. "&lt;number&gt;123&lt;/number&gt;" or "123")</jc>
		<jk>int</jk> age = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/age"</js>)
			.getResponse(Integer.<jk>class</jk>);
				
		<jc>// GET request, getting output as a parsed boolean</jc>
		<jc>// Input must be a boolean (e.g. "&lt;boolean&gt;true&lt;/boolean&gt;" or "true")</jc>
		<jk>boolean</jk> isCurrent = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/addresses/0/isCurrent"</js>)
			.getResponse(Boolean.<jk>class</jk>);
	}
				
	<jc>// GET request, getting a filtered object</jc>
	<jk>try</jk> (RestClient client = RestClient.<jsm>create</jsm>().pojoSwaps(CalendarSwap.<jsf>ISO8601</jsf>.<jk>class</jk>).build()) {
		Calendar birthDate = client.doGet(<js>"http://localhost:9080/sample/addressBook/0/birthDate"</js>)
			.getResponse(GregorianCalendar.<jk>class</jk>);
	
		<jc>// PUT request on regular field</jc>
		String newName = <js>"John Smith"</js>;
		<jk>int</jk> rc = client.doPut(<js>"http://localhost:9080/addressBook/0/name"</js>, newName).run();
		
		<jc>// PUT request on filtered field</jc>
		Calendar newBirthDate = <jk>new</jk> GregorianCalendar(1, 2, 3, 4, 5, 6);
		rc = client.doPut(<js>"http://localhost:9080/sample/addressBook/0/birthDate"</js>, newBirthDate).run();
		
		<jc>// POST of a new entry to a list</jc>
		Address newAddress = <jk>new</jk> Address(<js>"101 Main St"</js>, <js>"Anywhere"</js>, <js>"NY"</js>, 12121, <jk>false</jk>);
		rc = client.doPost(<js>"http://localhost:9080/addressBook/0/addresses"</js>, newAddress).run();	
	}
	</p>
	
	<h5 class='section'>Notes:</h5>
	<ul class='spaced-list'>
		<li>
			The {@link org.apache.juneau.rest.client.RestClient} class exposes all the builder methods on the Apache 
			HttpClient {@link org.apache.http.impl.client.HttpClientBuilder} class.
			<br>Use these methods to provide any customized HTTP client behavior.
	</ul>

	<!-- ======================================================================================================= -->
	<a id="juneau-rest-client.3rdPartyProxies"></a>
	<h3 class='topic' onclick='toggle(this)'>9.1 - Interface Proxies Against 3rd-party REST Interfaces</h3>
	<div class='topic'>
		<p>
			The <code>juneau-rest-client</code> library can also be used to define interface proxies against 3rd-party REST interfaces.
			<br>This is an extremely powerful feature that allows you to quickly define easy-to-use interfaces against 
			virtually any REST interface.
		</p>
		<p>
			Similar in concept to remoteable services defined above, but in this case we simply define our interface with
			special annotations that tell us how to convert input and output to HTTP headers, query parameters, form 
			post parameters, or request/response bodies.
		</p>
		<p class='bcode'>	
	<jc>// Our interface.</jc>
	<ja>@Remoteable</ja>
	<jk>public interface</jk> MyProxyInterface {
		
		<ja>@RemoteMethod</ja>(httpMethod=<jsf>POST</jsf>, path=<js>"/method"</js>)
		String callMyMethod(<ja>@Header</ja>(<js>"E-Tag"</js>) UUID etag, <ja>@Query</ja>(<js>"debug"</js>) <jk>boolean</jk> debug, <ja>@Body</ja> MyPojo pojo);
	}
	
	<jc>// Use a RestClient with default JSON support.</jc>
	<jk>try</jk> (RestClient client = RestClient.<jsm>create</jsm>().build()) {
		MyProxyInterface p = client.getRemoteableProxy(MyProxyInterface.<jk>class</jk>, <js>"http://hostname/some/rest/interface"</js>);
		String response = p.callMyMethod(UUID.<jsm>randomUUID</jsm>(), <jk>true</jk>, <jk>new</jk> MyPojo());
	}
		</p>
		<p>
			The call above translates to the following REST call:
		</p>
		<p class='bcode'>
	POST http://hostname/some/rest/interface/method?debug=true HTTP/1.1
	Accept: application/json
	Content-Type: application/json
	E-Tag: 475588d4-0b27-4f56-9296-cc683251d314
	
	{ "foo": "bar", "baz": 123, "qux": true}
		</p>
	
		<p>
			The Java method arguments can be annotated with any of the following:
		</p>
		<ul class='spaced-list'>
			<li class='ja'>
				{@link org.apache.juneau.remoteable.Query} - A URL query parameter.
				<br>The argument can be any of the following types:
				<ul>
					<li class='normal'>Any serializable POJO 
						- Converted to text using {@link org.apache.juneau.httppart.SimpleUonPartSerializer#serialize(HttpPartType,Object)}.
					<li class='normal'><code>Map&lt;String,Object&gt;</code> 
						- Individual name-value pairs.
						<br>Values are converted to text using {@link org.apache.juneau.httppart.SimpleUonPartSerializer#serialize(HttpPartType,Object)}.
					<li class='normal'><code>String</code> 
						- Treated as a query string.
				</ul>
			<li class='ja'>
				{@link org.apache.juneau.remoteable.QueryIfNE} 
				- Same as <ja>@Query</ja> except skips the value if it's null/empty.
			<li class='ja'>
				{@link org.apache.juneau.remoteable.FormData} 
				- A form-data parameter.
				<br>Note that this is only available if the HTTP method is <code>POST</code>.
				<br>The argument can be any of the following types:
				<ul>
					<li class='normal'>Any serializable POJO 
						- Converted to text using {@link org.apache.juneau.httppart.SimpleUonPartSerializer#serialize(HttpPartType,Object)}.
					<li class='normal'>{@link org.apache.juneau.rest.client.NameValuePairs} 
						- Individual name-value pairs.
					<li class='normal'><code>Map&lt;String,Object&gt;</code> 
						- Individual name-value pairs.
						<br>Values are converted to text using {@link org.apache.juneau.httppart.SimpleUonPartSerializer#serialize(HttpPartType,Object)}.
				</ul>
			<li class='ja'>
				{@link org.apache.juneau.remoteable.FormDataIfNE} 
				- Same as <ja>@FormData</ja> except skips the value if it's null/empty.
			<li class='ja'>
				{@link org.apache.juneau.remoteable.Header} 
				- A request header.
				<br>The argument can be any of the following types:
				<ul>
					<li class='normal'>Any serializable POJO 
						- Converted to text using {@link org.apache.juneau.httppart.SimpleUonPartSerializer#serialize(HttpPartType,Object)}.
					<li class='normal'><code>Map&lt;String,Object&gt;</code> 
						- Individual name-value pairs.
						<br>Values are converted to text using {@link org.apache.juneau.httppart.SimpleUonPartSerializer#serialize(HttpPartType,Object)}.
				</ul>
			<li class='ja'>
				{@link org.apache.juneau.remoteable.HeaderIfNE} 
				- Same as <ja>@Header</ja> except skips the value if it's null/empty.
			<li class='ja'>
				{@link org.apache.juneau.remoteable.Body} 
				- The HTTP request body.
				<br>The argument can be any of the following types:
				<ul>
					<li class='normal'>Any serializable POJO 
						- Converted to text/bytes using the {@link org.apache.juneau.serializer.Serializer} registered 
						with the <code>RestClient</code>.
					<li class='normal'>{@link java.io.Reader} 
						- Raw contents of reader will be serialized to remote resource.
					<li class='normal'>{@link java.io.InputStream} 
						- Raw contents of input stream will be serialized to remote resource.
					<li class='normal'>{@link org.apache.http.HttpEntity} 
						- Bypass Juneau serialization and pass HttpEntity directly to HttpClient.
					<li class='normal'>{@link org.apache.juneau.rest.client.NameValuePairs} 
						- Converted to a URL-encoded FORM post.
				</ul>
		</ul>
		<p>
			The return type of the Java method can be any of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				<jk>void</jk> 
				- Don't parse any response.  
				<br>Note that the method will still throw a runtime exception if an error HTTP status is returned.
			<li>
				Any <a class='doclink' href='#juneau-marshall.PojoCategories'>parsable</a> POJO 
				- The body of the response will be converted to the POJO using the parser defined on the 
				<code>RestClient</code>.
			<li>
				<code>HttpResponse</code> 
				- Returns the raw <code>HttpResponse</code> returned by the inner <code>HttpClient</code>.
			<li>
				{@link java.io.Reader} 
				- Returns access to the raw reader of the response.
				<br>Note that if you don't want your response parsed as a POJO, you'll want to get the response reader 
				directly.
			<li>
				{@link java.io.InputStream} 
				- Returns access to the raw input stream of the response.
		</ul>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-rest-client.SSL"></a>
	<h3 class='topic' onclick='toggle(this)'>9.2 - SSL Support</h3>
	<div class='topic'>
		<p>
			The simplest way to enable SSL support in the client is to use the 
			{@link org.apache.juneau.rest.client.RestClientBuilder#enableSSL(SSLOpts)} method and one of the predefined 
			{@link org.apache.juneau.rest.client.SSLOpts} instances:
		</p>
		<ul class='doctree'>
			<li class='jf'>{@link org.apache.juneau.rest.client.SSLOpts#DEFAULT} - Normal certificate and hostname validation.
			<li class='jf'>{@link org.apache.juneau.rest.client.SSLOpts#LAX} - Allows for self-signed certificates.
		</ul>
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Create a client that ignores self-signed or otherwise invalid certificates.</jc>
	RestClientBuilder builder = RestClient.<jsm>create</jsm>() 
		.enableSSL(SSLOpts.<jsf>LAX</jsf>);
		
	<jc>// ...or...</jc>
	RestClientBuilder builder = RestClient.<jsm>create</jsm>() 
		.enableLaxSSL();
		</p>
		<p>
			This is functionally equivalent to the following:
		</p>
		<p class='bcode'>
	RestClientBuilder builder = RestClient.<jsm>create</jsm>();
	
	HostnameVerifier hv = <jk>new</jk> NoopHostnameVerifier();
	TrustManager tm = <jk>new</jk> SimpleX509TrustManager(<jk>true</jk>);

	<jk>for</jk> (String p : <jk>new</jk> String[]{<js>"SSL"</js>,<js>"TLS"</js>,<js>"SSL_TLS"</js>}) {
		SSLContext ctx = SSLContext.<jsm>getInstance</jsm>(p);
		ctx.init(<jk>null</jk>, <jk>new</jk> TrustManager[] { tm }, <jk>null</jk>);
		SSLConnectionSocketFactory sf = <jk>new</jk> SSLConnectionSocketFactory(ctx, hv);
		builder.setSSLSocketFactory(sf);
		Registry&lt;ConnectionSocketFactory&gt; r = RegistryBuilder.&lt;ConnectionSocketFactory&gt;<jsm>.create</jsm>()
			.register(<js>"https"</js>, sf).build();
		builder.setConnectionManager(<jk>new</jk> PoolingHttpClientConnectionManager(r));
	}
		</p>
		<p>
			More complex SSL support can be enabled through the various {@link org.apache.http.impl.client.HttpClientBuilder} 
			methods defined on the class.
		</p>
	
		<!-- ======================================================================================================= -->
		<a id="juneau-rest-client.SSLOpts"></a>
		<h4 class='topic' onclick='toggle(this)'>9.2.1 - SSLOpts Bean</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.client.SSLOpts} class itself is a bean that can be created by the 
				parsers.
				For example, SSL options can be specified in a config file and retrieved as a bean using the 
				{@link org.apache.juneau.config.Config} class.
			</p>
			
			<h5 class='figure'>Contents of <code>MyConfig.cfg</code></h5>
			<p class='bcode'>
	<cc>#================================================================================
	# My Connection Settings
	#================================================================================</cc>
	<cs>[Connection]</cs>
	<ck>url</ck> = <cv>https://myremotehost:9443</cv>
	<ck>ssl</ck> = <cv>{certValidate:'LAX',hostVerify:'LAX'}</cv>
			</p>
			
			<h5 class='figure'>Code that reads an <code>SSLOpts</code> bean from the config file</h5>
			<p class='bcode'>
	<jc>// Read config file and set SSL options based on what's in that file.</jc>
	Config cf = Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
	SSLOpts ssl = cf.getObject(SSLOpts.<jk>class</jk>, <js>"Connection/ssl"</js>);
	RestClient rc = RestClient.<jsm>create</jsm>().enableSSL(ssl).build();
			</p>
		</div>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-rest-client.Authentication"></a>
	<h3 class='topic' onclick='toggle(this)'>9.3 - Authentication</h3>
	<div class='topic'>
	
		<!-- ======================================================================================================= -->
		<a id="juneau-rest-client.BASIC"></a>
		<h4 class='topic' onclick='toggle(this)'>9.3.1 - BASIC Authentication</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.client.RestClientBuilder#basicAuth(String,int,String,String)} method 
				can be used to quickly enable BASIC authentication support.
			</p>
			
			<h5 class='figure'>Example:</h5>
			<p class='bcode'>
	<jc>// Create a client that performs BASIC authentication using the specified user/pw.</jc>
	RestClient restClient = RestClient.<jsm>create</jsm>() 
		.basicAuth(<jsf>HOST</jsf>, <jsf>PORT</jsf>, <jsf>USER</jsf>, <jsf>PW</jsf>)
		.build();
			</p>
			<p>
				This is functionally equivalent to the following:
			</p>
			<p class='bcode'>
	RestClientBuilder builder = RestClient.<jsm>create</jsm>();
	AuthScope scope = <jk>new</jk> AuthScope(<jsf>HOST</jsf>, <jsf>PORT</jsf>);
	Credentials up = <jk>new</jk> UsernamePasswordCredentials(<jsf>USER</jsf>, <jsf>PW</jsf>);
	CredentialsProvider p = <jk>new</jk> BasicCredentialsProvider();
	p.setCredentials(scope, up);
	builder.setDefaultCredentialsProvider(p);
			</p>
		</div>
		
		<!-- ======================================================================================================= -->
		<a id="juneau-rest-client.FORM"></a>
		<h4 class='topic' onclick='toggle(this)'>9.3.2 - FORM-based Authentication</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.rest.client.RestClientBuilder} class does not itself provide FORM-based 
				authentication since there is no standard way of providing such support. 
				<br>Typically, to perform FORM-based or other types of authentication, you'll want to create your own
				subclass of {@link org.apache.juneau.rest.client.RestClientBuilder} and override the 
				{@link org.apache.juneau.rest.client.RestClientBuilder#createHttpClient()} method to provide an 
				authenticated client.
			</p>
			<p>
				The following example shows how the <code>JazzRestClient</code> class provides FORM-based 
				authentication support.
			</p>
			<p class='bcode'>
	<jd>/**
	 * Constructor.
	 */</jd>
	<jk>public</jk> JazzRestClientBuilder(URI jazzUri, String user, String pw) <jk>throws</jk> IOException {
		...
	}

	<jd>/**
	 * Override the createHttpClient() method to return an authenticated client.
	 */</jd>
	<ja>@Override</ja> <jc>/* RestClientBuilder */</jc>
	<jk>protected</jk> CloseableHttpClient createHttpClient() <jk>throws</jk> Exception {
		CloseableHttpClient client = <jk>super</jk>.createHttpClient();
		formBasedAuthenticate(client);
		visitAuthenticatedURL(client);
		<jk>return</jk> client;
	}

	<jc>/*
	 * Performs form-based authentication against the Jazz server.
	 */</jc>
	<jk>private void</jk> formBasedAuthenticate(HttpClient client) <jk>throws</jk> IOException {

		URI uri2 = <jf>jazzUri</jf>.resolve(<js>"j_security_check"</js>);
		HttpPost request = <jk>new</jk> HttpPost(uri2);
		request.setConfig(RequestConfig.<jsm>custom</jsm>().setRedirectsEnabled(<jk>false</jk>).build());
		
		<jc>// Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.</jc>
		request.addHeader(<js>"Content-Type"</js>, <js>"application/x-www-form-urlencoded; charset=utf-8"</js>);

		NameValuePairs params = <jk>new</jk> NameValuePairs()
			.append(<jk>new</jk> BasicNameValuePair(<js>"j_username""</js>, <jf>user</jf>))
			.append(<jk>new</jk> BasicNameValuePair(<js>"j_password"</js>, <jf>pw</jf>));
		request.setEntity(<jk>new</jk> UrlEncodedFormEntity(params));

		HttpResponse response = client.execute(request);
		<jk>try</jk> {
			<jk>int</jk> rc = response.getStatusLine().getStatusCode();

			Header authMsg = response.getFirstHeader(<js>"X-com-ibm-team-repository-web-auth-msg"</js>);
			<jk>if</jk> (authMsg != <jk>null</jk>)
				<jk>throw new</jk> IOException(authMsg.getValue());

			<jc>// The form auth request should always respond with a 200 ok or 302 redirect code</jc>
			<jk>if</jk> (rc == <jsf>SC_MOVED_TEMPORARILY</jsf>) {
				<jk>if</jk> (response.getFirstHeader(<js>"Location"</js>).getValue().matches(<js>"^.*/auth/authfailed.*$"</js>))
					<jk>throw new</jk> IOException(<js>"Invalid credentials."</js>);
			} <jk>else if</jk> (rc != <jsf>SC_OK</jsf>) {
				<jk>throw new</jk> IOException(<js>"Unexpected HTTP status: "</js> + rc);
			}
		} <jk>finally</jk> {
			EntityUtils.<jsm>consume</jsm>(response.getEntity());
		}
	}

	<jc>/*
	 * This is needed for Tomcat because it responds with SC_BAD_REQUEST when the j_security_check URL is visited before an
	 * authenticated URL has been visited. This same URL must also be visited after authenticating with j_security_check
	 * otherwise tomcat will not consider the session authenticated
	 */</jc>
	<jk>private int</jk> visitAuthenticatedURL(HttpClient httpClient) <jk>throws</jk> IOException {
		HttpGet authenticatedURL = <jk>new</jk> HttpGet(<jf>jazzUri</jf>.resolve(<js>"authenticated/identity"</js>));
		HttpResponse response = httpClient.execute(authenticatedURL);
		<jk>try</jk> {
			<jk>return</jk> response.getStatusLine().getStatusCode();
		} <jk>finally</jk> {
			EntityUtils.<jsm>consume</jsm>(response.getEntity());
		}
	}
			</p>
		</div>
		
		<!-- ======================================================================================================= -->
		<a id="juneau-rest-client.OIDC"></a>
		<h4 class='topic' onclick='toggle(this)'>9.3.3 - OIDC Authentication</h4>
		<div class='topic'>
			<p>
				The following example shows how the <code>JazzRestClient</code> class provides OIDC authentication 
				support.
			</p>
	<p class='bcode'>
	<jd>/**
	 * Constructor.
	 */</jd>
	<jk>public</jk> JazzRestClientBuilder(URI jazzUri, String user, String pw) <jk>throws</jk> IOException {
		...
	}

	<jd>/**
	 * Override the createHttpClient() method to return an authenticated client.
	 */</jd>
	<ja>@Override</ja> <jc>/* RestClientBuilder */</jc>
	<jk>protected</jk> CloseableHttpClient createHttpClient() <jk>throws</jk> Exception {
		CloseableHttpClient client = <jk>super</jk>.createHttpClient();
		oidcAuthenticate(client);
			<jk>return</jk> client;
		}

	<jk>private void</jk> oidcAuthenticate(HttpClient client) <jk>throws</jk> IOException {

		HttpGet request = <jk>new</jk> HttpGet(<jf>jazzUri</jf>);
		request.setConfig(RequestConfig.<jsm>custom</jsm>().setRedirectsEnabled(<jk>false</jk>).build());
		
		<jc>// Charset must explicitly be set to UTF-8 to handle user/pw with non-ascii characters.</jc>
		request.addHeader(<js>"Content-Type"</js>, <js>"application/x-www-form-urlencoded; charset=utf-8"</js>);

		HttpResponse response = client.execute(request);
		<jk>try</jk> {
			<jk>int</jk> code = response.getStatusLine().getStatusCode();

			<jc>// Already authenticated</jc>
			<jk>if</jk> (code == <jsf>SC_OK</jsf>)
				<jk>return</jk>;

			<jk>if</jk> (code != <jsf>SC_UNAUTHORIZED</jsf>)
				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication: "</js> 
					+ response.getStatusLine());

			<jc>// x-jsa-authorization-redirect</jc>
			String redirectUri = getHeader(response, <js>"X-JSA-AUTHORIZATION-REDIRECT"</js>);

			<jk>if</jk> (redirectUri == <jk>null</jk>)
				<jk>throw new</jk> RestCallException(<js>"Expected a redirect URI during OIDC authentication: "</js> 
					+ response.getStatusLine());

			<jc>// Handle Bearer Challenge</jc>
			HttpGet method = <jk>new</jk> HttpGet(redirectUri + <js>"&amp;prompt=none"</js>);
			addDefaultOidcHeaders(method);

			response = client.execute(method);

			code = response.getStatusLine().getStatusCode();

			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 2: "</js> 
					+ response.getStatusLine());

			String loginRequired = getHeader(response, <js>"X-JSA-LOGIN-REQUIRED"</js>);

			<jk>if</jk> (! <js>"true"</js>.equals(loginRequired))
				<jk>throw new</jk> RestCallException(<js>"X-JSA-LOGIN-REQUIRED header not found on response during OIDC authentication phase 2: "</js> 
					+ response.getStatusLine());

			method = <jk>new</jk> HttpGet(redirectUri + <js>"&amp;prompt=none"</js>);

			addDefaultOidcHeaders(method);
			response = client.execute(method);

			code = response.getStatusLine().getStatusCode();

			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 3: "</js> 
					+ response.getStatusLine());

			<jc>// Handle JAS Challenge</jc>
			method = <jk>new</jk> HttpGet(redirectUri);
			addDefaultOidcHeaders(method);

			response = client.execute(method);

			code = response.getStatusLine().getStatusCode();

			<jk>if</jk> (code != <jsf>SC_OK</jsf>)
				<jk>throw new</jk> RestCallException(<js>"Unexpected response during OIDC authentication phase 4: "</js> 
					+ response.getStatusLine());

			<jf>cookie</jf> = getHeader(response, <js>"Set-Cookie"</js>);

			Header[] defaultHeaders = <jk>new</jk> Header[] {
				<jk>new</jk> BasicHeader(<js>"User-Agent"</js>, <js>"Jazz Native Client"</js>),
				<jk>new</jk> BasicHeader(<js>"X-com-ibm-team-configuration-versions"</js>, 
					<js>"com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0"</js>),
				<jk>new</jk> BasicHeader(<js>"Accept"</js>, <js>"text/json"</js>),
				<jk>new</jk> BasicHeader(<js>"Authorization"</js>, <js>"Basic "</js> 
					+ StringUtils.<jsm>base64EncodeToString</jsm>(<jf>user</jf> + <js>":"</js> + <jf>pw</jf>)),
				<jk>new</jk> BasicHeader(<js>"Cookie"</js>, cookie)
			};

			setDefaultHeaders(Arrays.<jsm>asList</jsm>(defaultHeaders));

		} <jk>finally</jk> {
			EntityUtils.<jsm>consume</jsm>(response.getEntity());
		}
	}

	<jk>private void</jk> addDefaultOidcHeaders(HttpRequestBase method) {
		method.addHeader(<js>"User-Agent"</js>, <js>"Jazz Native Client"</js>);
		method.addHeader(<js>"X-com-ibm-team-configuration-versions"</js>, 
			<js>"com.ibm.team.rtc=6.0.0,com.ibm.team.jazz.foundation=6.0"</js>);
		method.addHeader(<js>"Accept"</js>, <js>"text/json"</js>);

		<jk>if</jk> (<jf>cookie</jf> != <jk>null</jk>) {
			method.addHeader(<js>"Authorization"</js>, <js>"Basic "</js> 
				+ StringUtils.<jsm>base64EncodeToString</jsm>(<jf>user</jf> + <js>":"</js> + <jf>pw</jf>));
			method.addHeader(<js>"Cookie"</js>, cookie);
		}
	}
			</p>	
		</div>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-rest-client.ResponsePatterns"></a>
	<h3 class='topic' onclick='toggle(this)'>9.4 - Using Response Patterns</h3>
	<div class='topic'>
		<p>
			One issue with REST (and HTTP in general) is that the HTTP response code must be set as a header before the 
			body of the request is sent.  
			<br>This can be problematic when REST calls invoke long-running processes, pipes
			the results through the connection, and then fails after an HTTP 200 has already been sent.
		</p>
		<p>
			One common solution is to serialize some text at the end to indicate whether the long-running process 
			succeeded (e.g. <js>"FAILED"</js> or <js>"SUCCEEDED"</js>).
		</p>
		<p>
			The {@link org.apache.juneau.rest.client.RestClient} class has convenience methods for scanning the 
			response without interfering with the other methods used for retrieving output.  
		</p>
		<p>
			The following example shows how the {@link org.apache.juneau.rest.client.RestCall#successPattern(String)} 
			method can be used to look for a SUCCESS message in the output:
		</p>	
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Throw a RestCallException if SUCCESS is not found in the output.</jc>
	restClient.doPost(<jsf>URL</jsf>)
		.successPattern(<js>"SUCCESS"</js>)
		.run();
		</p>
		<p>
			The {@link org.apache.juneau.rest.client.RestCall#failurePattern(String)} method does the opposite.  
			It throws an exception if a failure message is detected.
		</p>	
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Throw a RestCallException if FAILURE or ERROR is found in the output.</jc>
	restClient.doPost(<jsf>URL</jsf>)
		.failurePattern(<js>"FAILURE|ERROR"</js>)
		.run();
		</p>
		<p>
			These convenience methods are specialized methods that use the 
			{@link org.apache.juneau.rest.client.RestCall#responsePattern(ResponsePattern)} method which uses regular 
			expression matching against the response body.
			<br>This method can be used to search for arbitrary patterns in the response body.
		</p>
		<p>
			The following example shows how to use a response pattern finder to find and capture patterns for 
			<js>"x=number"</js> and <js>"y=string"</js> from a response body.
		</p>	
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jk>final</jk> List&lt;Number&gt; xList = <jk>new</jk> ArrayList&lt;Number&gt;();
	<jk>final</jk> List&lt;String&gt; yList = <jk>new</jk> ArrayList&lt;String&gt;();
	
	String responseText = restClient.doGet(<jsf>URL</jsf>)
		.responsePattern(
			<jk>new</jk> ResponsePattern(<js>"x=(\\d+)"</js>) {
				<ja>@Override</ja>
				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
					xList.add(Integer.<jsm>parseInt</jsm>(m.group(1)));
				}
				<ja>@Override</ja>
				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
					<jk>throw new</jk> RestCallException(<js>"No X's found!"</js>);
				}
			}
		)
		.responsePattern(
			<jk>new</jk> ResponsePattern(<js>"y=(\\S+)"</js>) {
				<ja>@Override</ja>
				<jk>public void</jk> onMatch(RestCall restCall, Matcher m) <jk>throws</jk> RestCallException {
					yList.add(m.group(1));
				}
				<ja>@Override</ja>
				<jk>public void</jk> onNoMatch(RestCall restCall) <jk>throws</jk> RestCallException {
					<jk>throw new</jk> RestCallException(<js>"No Y's found!"</js>);
				}
			}
		)
		.getResponseAsString();
		</p>
		<p>
			Using response patterns does not affect the functionality of any of the other methods
			used to retrieve the response such as {@link org.apache.juneau.rest.client.RestCall#getResponseAsString()} 
			or {@link org.apache.juneau.rest.client.RestCall#getResponse(Class)}.
			<br>HOWEVER, if you want to retrieve the entire text of the response from inside the match methods,
			use {@link org.apache.juneau.rest.client.RestCall#getCapturedResponse()} since this method will not absorb 
			the response for those other methods.
		</p>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-rest-client.PipingOutput"></a>
	<h3 class='topic' onclick='toggle(this)'>9.5 - Piping Response Output</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.client.RestCall} class provides various convenience <code>pipeTo()</code> 
			methods to pipe output to output streams and writers.
		</p>
		<p>
			If you want to pipe output without any intermediate buffering, you can use the 
			{@link org.apache.juneau.rest.client.RestCall#byLines()} method.  
			This will cause the output to be piped and flushed after every line.  
			This can be useful if you want to display the results in real-time from a long running process producing
			output on a REST call.
		</p>
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Pipe output from REST call to System.out in real-time.</jc>
	restClient.doPost(<jsf>URL</jsf>).byLines().pipeTo(<jk>new</jk> PrintWriter(System.<jk>out</jk>)).run();
		</p>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-rest-client.Debugging"></a>
	<h3 class='topic' onclick='toggle(this)'>9.6 - Debugging</h3>
	<div class='topic'>
		<p>
			Use the {@link org.apache.juneau.rest.client.RestClientBuilder#debug()} method to enable logging for HTTP requests
			made from the client.
		</p>
		<p>
			Under-the-covers, this is simply a shortcut for adding the {@link org.apache.juneau.rest.client.RestCallLogger#DEFAULT} 
			interceptor to the client.  
			<br>This causes the following output to be generated by the Java <code>org.apache.juneau.rest.client</code> 
			logger at <jsf>WARNING</jsf> level:
		</p>
		<p class='bcode'>
	=== HTTP Call (outgoing) =======================================================
	=== REQUEST ===
	POST http://localhost:10000/testUrl HTTP/1.1
	---request headers---
		Debug: true
		No-Trace: true
		Accept: application/json
	---request entity---
		Content-Type: application/json
	---request content---
	{"foo":"bar","baz":123}
	=== RESPONSE ===
	HTTP/1.1 200 OK
	---response headers---
		Content-Type: application/json;charset=utf-8
		Content-Length: 21
		Server: Jetty(8.1.0.v20120127)
	---response content---
	{"message":"OK then"}
	=== END ========================================================================
		</p>
		<p>
			This setting also causes a <code>Debug: true</code> header value to trigger logging of the request on the 
			server side as well.
		</p>
		<p class='bcode'>
	=== HTTP Request (incoming) ====================================================
	HTTP POST /testUrl
	---Headers---
		Host: localhost:10000
		Transfer-Encoding: chunked
		Accept: application/json
		Content-Type: application/json
		User-Agent: Apache-HttpClient/4.5 (Java/1.6.0_65)
		Connection: keep-alive
		Debug: true
		Accept-Encoding: gzip,deflate
	---Default Servlet Headers---
	---Body---
	{"foo":"bar","baz":123}
	=== END ========================================================================
		</p>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-rest-client.Logging"></a>
	<h3 class='topic' onclick='toggle(this)'>9.7 - Logging</h3>
	<div class='topic'>
		<p>
			Use the {@link org.apache.juneau.rest.client.RestClientBuilder#logTo(Level,Logger)} and 
			{@link org.apache.juneau.rest.client.RestCall#logTo(Level,Logger)} methods to log HTTP calls.
			<br>These methods will cause the HTTP request and response headers and body to be logged to the specified logger.  
		</p>
		
		<h5 class='figure'>Example:</h5>
		<p class='bcode'>
	<jc>// Log the HTTP request/response to the specified logger.</jc>
	<jk>int</jk> rc = restClient.doGet(<jsf>URL</jsf>).logTo(<jsf>INFO</jsf>, getLogger()).run();
		</p>
		<p>
			The method call is ignored if the logger level is below the specified level.
		</p>
		<p>
			Customized logging can be handled by sub-classing the {@link org.apache.juneau.rest.client.RestCallLogger} 
			class and using the  {@link org.apache.juneau.rest.client.RestCall#interceptor(RestCallInterceptor)} method.
		</p>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-rest-client.Interceptors"></a>
	<h3 class='topic' onclick='toggle(this)'>9.8 - Interceptors</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.client.RestClientBuilder#interceptors(RestCallInterceptor...)} and 
			{@link org.apache.juneau.rest.client.RestCall#interceptor(RestCallInterceptor)} methods can be used to 
			intercept responses during specific connection lifecycle events.
		</p>
		<p>
			The {@link org.apache.juneau.rest.client.RestCallLogger} class is an example of an interceptor that uses 
			the various lifecycle methods to log HTTP requests.
		</p>
		<p class='bcode'>
	<jd>/**
	 * Specialized interceptor for logging calls to a log file.
	 */</jd>
	<jk>public class</jk> RestCallLogger <jk>extends</jk> RestCallInterceptor {
	
		<jk>private</jk> Level <jf>level</jf>;
		<jk>private</jk> Logger <jf>log</jf>;
	
		<jd>/**
		 * Constructor.
		 *
		 * <ja>@param</ja> level The log level to log messages at.
		 * <ja>@param</ja> log The logger to log to.
		 */</jd>
		<jk>protected</jk> RestCallLogger(Level level, Logger log) {
			<jk>this</jk>.<jf>level</jf> = level;
			<jk>this</jk>.<jf>log</jf> = log;
		}
	
		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
		<jk>public void</jk> onInit(RestCall restCall) {
			<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>))
				restCall.captureResponse();
		}
	
		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
		<jk>public void</jk> onConnect(RestCall restCall, <jk>int</jk> statusCode, HttpRequest req, HttpResponse res) {
			<jc>// Do nothing.</jc>
		}
	
		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
		<jk>public void</jk> onRetry(RestCall restCall, <jk>int</jk> statusCode, HttpRequest req, HttpResponse res) {
			<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>))
				<jf>log</jf>.log(level, MessageFormat.<jsm>format</jsm>(<js>"Call to {0} returned {1}.  Will retry."</js>, req.getRequestLine().getUri(), statusCode)); 
		}
	
		<ja>@Override</ja> <jc>/* RestCallInterceptor */</jc>
		<jk>public void</jk> onClose(RestCall restCall) <jk>throws</jk> RestCallException {
			<jk>try</jk> {
				<jk>if</jk> (<jf>log</jf>.isLoggable(<jf>level</jf>)) {
					String output = restCall.getCapturedResponse();
					StringBuilder sb = <jk>new</jk> StringBuilder();
					HttpUriRequest req = restCall.getRequest();
					HttpResponse res = restCall.getResponse();
					<jk>if</jk> (req != <jk>null</jk>) {
						sb.append(<js>"\n=== HTTP Call (outgoing) ========================================================="</js>);
	
						sb.append(<js>"\n=== REQUEST ===\n"</js>).append(req);
						sb.append(<js>"\n---request headers---"</js>);
						<jk>for</jk> (Header h : req.getAllHeaders())
							sb.append(<js>"\n"</js>).append(h);
						<jk>if</jk> (req <jk>instanceof</jk> HttpEntityEnclosingRequestBase) {
							sb.append(<js>"\n---request entity---"</js>);
							HttpEntityEnclosingRequestBase req2 = (HttpEntityEnclosingRequestBase)req;
							HttpEntity e = req2.getEntity();
							<jk>if</jk> (e == <jk>null</jk>)
								sb.append(<js>"\nEntity is null"</js>);
							<jk>else</jk> {
								<jk>if</jk> (e.getContentType() != <jk>null</jk>)
									sb.append(<js>"\n"</js>).append(e.getContentType());
								<jk>if</jk> (e.getContentEncoding() != <jk>null</jk>)
									sb.append(<js>"\n"</js>).append(e.getContentEncoding());
								<jk>if</jk> (e.isRepeatable()) {
									<jk>try</jk> {
										sb.append(<js>"\n---request content---\n"</js>).append(EntityUtils.<jsm>toString</jsm>(e));
									} <jk>catch</jk> (Exception ex) {
										<jk>throw new</jk> RuntimeException(ex);
									}
								}
							}
						}
					}
					<jk>if</jk> (res != <jk>null</jk>) {
						sb.append(<js>"\n=== RESPONSE ===\n"</js>).append(res.getStatusLine());
						sb.append(<js>"\n---response headers---"</js>);
						<jk>for</jk> (Header h : res.getAllHeaders())
							sb.append(<js>"\n"</js>).append(h);
						sb.append(<js>"\n---response content---\n"</js>).append(output);
						sb.append(<js>"\n=== END ========================================================================"</js>);
					}
					<jf>log</jf>.log(<jf>level</jf>, sb.toString());
				}
			} <jk>catch</jk> (IOException e) {
				<jf>log</jf>.log(Level.<jsf>SEVERE</jsf>, e.getLocalizedMessage(), e);
			}
		}
	}
		</p>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-rest-client.Remoteable"></a>
	<h3 class='topic' onclick='toggle(this)'>9.9 - Remoteable Proxies</h3>
	<div class='topic'>
		<p>
			Juneau provides the capability of calling methods on POJOs on a server through client-side proxy interfaces.
			<br>It offers a number of advantages over other similar remote proxy interfaces, such as being much simpler to 
			use and allowing much more flexibility.
		</p>
		<p>
			Proxy interfaces are retrieved using the {@link org.apache.juneau.rest.client.RestClient#getRemoteableProxy(Class)} 
			<br>method.
			The remoteable servlet is a specialized subclass of {@link org.apache.juneau.rest.RestServlet} that 
			provides a full-blown REST interface for calling interfaces remotely. 
		</p>
		<p>
			In this example, we have the following interface defined that we want to call from the client side against
			a POJO on the server side (i.e. a Remoteable Service)...
		</p>
		<p class='bcode'>
	<jk>public interface</jk> IAddressBook {
		Person createPerson(CreatePerson cp) <jk>throws</jk> Exception;
	}
		</p>			
		<p>
			The client side code for invoking this method is shown below...
		</p>
		<p class='bcode'>
	<jc>// Create a RestClient using JSON for serialization, and point to the server-side remoteable servlet.</jc>
	RestClient client = RestClient.<jsm>create</jsm>()
		.rootUrl(<js>"https://localhost:9080/juneau/sample/remoteable"</js>)
		.build();
	
	<jc>// Create a proxy interface.</jc>
	IAddressBook ab = client.getRemoteableProxy(IAddressBook.<jk>class</jk>);
	
	<jc>// Invoke a method on the server side and get the returned result.</jc>
	Person p = ab.createPerson(
		<jk>new</jk> CreatePerson(<js>"Test Person"</js>,
			AddressBook.<jsm>toCalendar</jsm>(<js>"Aug 1, 1999"</js>),
			<jk>new</jk> CreateAddress(<js>"Test street"</js>, <js>"Test city"</js>, <js>"Test state"</js>, 12345, <jk>true</jk>))
	);
		</p>
		<p>
			The requirements for a method to be callable through a remoteable service are:
		</p>
		<ul class='spaced-list'>
			<li>
				The method must be public.
			<li>
				The parameter and return types must be <a class='doclink' href='#juneau-marshall.PojoCategories'>serializable and parsable</a>.
		</ul>
		<p>
			One significant feature is that the remoteable services servlet is a full-blown REST interface.  
			<br>Therefore, in cases where the interface classes are not available on the client side, the same method calls 
			can be made through pure REST calls.  
			<br>This can also aid significantly in debugging since calls to the remoteable service can be called directly 
			from a browser with no code involved.
		</p>
	</div>
	
	<!-- ======================================================================================================= -->
	<a id="juneau-rest-client.Other"></a>
	<h3 class='topic' onclick='toggle(this)'>9.10 - Other Useful Methods</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.rest.client.RestClientBuilder#rootUrl(Object)} method can be used to specify a 
			root URL on all requests so that you don't have to use absolute paths on individual calls.
		</p>
		<p class='bcode'>
	<jc>// Create a rest client with a root URL</jc>
	RestClient rc = RestClient.<jsm>create</jsm>().rootUrl(<js>"http://localhost:9080/foobar"</js>).build();
	String r = rc.doGet(<js>"/baz"</js>).getResponseAsString();  <jc>// Gets "http://localhost:9080/foobar/baz"</jc>
		</p>
		<p>
			The {@link org.apache.juneau.rest.client.RestClientBuilder#set(String,Object)} method can be used to 
			set serializer and parser properties.
			<br>For example, if you're parsing a response into POJOs and you want to ignore fields that aren't on the
			POJOs, you can use the {@link org.apache.juneau.BeanContext#BEAN_ignoreUnknownBeanProperties} property.
		</p>
		<p class='bcode'>
	<jc>// Create a rest client that ignores unknown fields in the response</jc>
	RestClient rc = RestClient.<jsm>create</jsm>()
		.set(<jsf>BEAN_ignoreUnknownBeanProperties</jsf>, <jk>true</jk>)
		<jc>// or .ignoreUnknownBeanProperties(true)</jc>
		.build();
	MyPojo myPojo = rc.doGet(<jsf>URL</jsf>).getResponse(MyPojo.<jk>class</jk>);
		</p>
		<p>
			The {@link org.apache.juneau.rest.client.RestCall#retryable(int,long,RetryOn)} method can be used to 
			automatically retry requests on failures.
			<br>This can be particularly useful if you're attempting to connect to a REST resource that may be in the 
			process of still initializing.
		</p>
		<p class='bcode'>
	<jc>// Create a rest call that retries every 10 seconds for up to 30 minutes as long as a connection fails
	// or a 400+ is received.</jc>
	restClient.doGet(<jsf>URL</jsf>)
		.retryable(180, 10000, RetryOn.<jsf>DEFAULT</jsf>)
		.run();
		</p>
	</div>
</div>

<!-- =========================================================================================================== -->
<a id="juneau-microservice-server"></a>
<h2 class='topic' onclick='toggle(this)'>10 - juneau-microservice-server</h2>
<div class='topic'>

	<h5 class='figure'>Maven Dependency</h5>
	<p class='bcode' style='width:500px;'>
	<xt>&lt;dependency&gt;</xt>
		<xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
		<xt>&lt;artifactId&gt;</xt>juneau-microservice-server<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>7.0.0<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
	</p>	
	
	<h5 class='figure'>Java Library</h5>
	<p class='bcode' style='width:500px;'>
	juneau-microservice-server-7.0.0.jar 
	</p>	

	<h5 class='figure'>OSGi Module</h5>
	<p class='bcode' style='width:500px;'>
	org.apache.juneau.microservice.server_7.0.0.jar 
	</p>	

	<h5 class='figure'>Microservice Starter Project</h5>
	<p class='bcode' style='width:500px;'>
	my-microservice.zip 
	</p>	

	<p>
		Juneau Microservice is an API for creating stand-alone executable jars that can be used to 
		start lightweight configurable REST interfaces with all the power of the Juneau REST server and client APIs.
	</p>

	<!-- =========================================================================================================== -->
	<a id="juneau-microservice-server.Introduction"></a>
	<h3 class='topic' onclick='toggle(this)'>10.1 - Microservice Introduction</h3>
	<div class='topic'>
		<p>
			The Microservice API consists of a combination of the Juneau Core, Server, and Client APIs and an embedded
			Eclipse Jetty Servlet Container.  
			<br>It includes all libraries needed to execute in a Java 1.6+ environment.
		</p>
		<p>
			Features include:
		</p>
		<ul class='spaced-list'>
			<li>
				An out-of-the-box zipped Eclipse project to get started quickly.
			<li>
				Packaged as a simple executable jar and configuration file.
			<li>
				All the power of the Juneau Cloud Tools for defining REST servlets and clients with the ability to 
				serialize and parse POJOs as HTML, JSON, XML, RDF, URL-Encoding, and others.
			<li>
				An extensible API that allows you to hook into various lifecycle events.
			<li>
				Simple-to-use APIs for accessing manifest file entries, command-line arguments, and external configuration 
				file properties.
			<li>
				Predefined REST resources for configuring microservice and accessing log files.
		</ul>
		<p>
			The <code>juneau-microservice-server</code> library consists of the following classes:
		</p>
		<ul class='doctree'>
			<li class='jac'>
				{@link org.apache.juneau.microservice.Microservice} 
				- Defines basic lifecycle methods for microservices in general.
				<ul>
					<li class='jc'>
						{@link org.apache.juneau.microservice.RestMicroservice}
						- Defines additional lifecycle methods for REST microservices.
						<br>Starts up an externally-configured Jetty server, registers servlets, and sets up 
						other features such as logging.  
				</ul>
			<li class='jc'>
				{@link org.apache.juneau.microservice.Resource} 
				- A subclass of <code>RestServletDefault</code> with support for manfest-file and args variables
				and configured to use the external INI file.
			<li class='jc'>
				{@link org.apache.juneau.microservice.ResourceGroup} 
				- A subclass of <code>RestServletGroupDefault</code> with support for manfest-file and args variables
				and configured to use the external INI file.
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="juneau-microservice-server.GettingStarted"></a>
	<h3 class='topic' onclick='toggle(this)'>10.2 - Getting Started</h3>
	<div class='topic'>
		<p>
			The <l>my-microservice.zip</l> file is a zipped eclipse project that includes everything you 
			need to create a REST microservice in an Eclipse workspace.
		</p>	
	
		<!-- =========================================================================================================== -->
		<a id="juneau-microservice-server.Installing"></a>
		<h4 class='topic' onclick='toggle(this)'>10.2.1 - Installing in Eclipse</h4>
		<div class='topic'>
			<p>
				Follow these instructions to create a new template project in Eclipse.
			</p>		
			<ol class='spaced-list'>
				<li>
					Download the latest microservice-project zip file (e.g. <l>my-microservice.zip</l>).
				<li>
					In your Eclipse workspace, go to <b>File -&gt; Import -&gt; General -&gt; Existing Projects into Workspace</b> 
					and select the zip file and click <b>Finish</b>.
					<br><br>
					<img class='bordered' src="doc-files/juneau-microservice-server.Installing.1.png" style='width:549px'>
				<li>
					In your workspace, you should now see the following project:
					<br><br>
					<img class='bordered' src="doc-files/juneau-microservice-server.Installing.2.png" style='width:299px'>
			</ol>
			<p>
				The important elements in this project are:
			</p>
			<ul class='spaced-list'>
				<li>
					<l>RootResources.java</l> - The top-level REST resource. 
					<br>This class routes HTTP requests to child resources:
					<br><br>
					<p class='bcode'>
	<ja>@RestResource</ja>(
		path=<js>"/"</js>,
		title=<js>"My Microservice"</js>,
		description=<js>"Top-level resources page"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			widgets={
				ContentTypeMenuItem.<jk>class</jk>,
				StyleMenuItem.<jk>class</jk>
			},
			navlinks={
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		),
		children={
			HelloWorldResource.<jk>class</jk>,
			ConfigResource.<jk>class</jk>,
			LogsResource.<jk>class</jk>
		}
	)
	<jk>public class</jk> RootResources <jk>extends</jk> ResourceGroup {
		<jc>// No code</jc>
	}
					</p>
				<li>
					<l>my-microservice.cfg</l> - The external configuration file. 
					<br>Contains various useful settings.
					<br>Can be used for your own resource configurations.
					<br><br>
					<p class='bcode'>
	<cc>#=======================================================================================================================
	# Basic configuration file for REST microservices
	# Subprojects can use this as a starting point.
	#=======================================================================================================================</cc>
	
	<cc># What to do when the config file is saved.
	# Possible values:
	# 	NOTHING - Don't do anything. (default)
	#	RESTART_SERVER - Restart the Jetty server.
	#	RESTART_SERVICE - Shutdown and exit with code '3'.</cc>
	<ck>saveConfigAction</ck> = <cv>RESTART_SERVER</cv>
	
	<cc>#=======================================================================================================================
	# Jetty settings
	#=======================================================================================================================</cc>
	<cs>[Jetty]</cs>
	
	<cc># Path of the jetty.xml file used to configure the Jetty server.</cc>
	<ck>config</ck> = <cv>jetty.xml</cv>
	
	<cc># Resolve Juneau variables in the jetty.xml file.</cc>
	<ck>resolveVars</ck> = <cv>true</cv>
	
	<cc># Port to use for the jetty server.
	# You can specify multiple ports.  The first available will be used.  '0' indicates to try a random port.
	# The resulting available port gets set as the system property "availablePort" which can be referenced in the 
	# jetty.xml file as "$S{availablePort}" (assuming resolveVars is enabled).</cc>
	<ck>port</ck> = <cv>10000,0,0,0</cv>
	
	<cc>#=======================================================================================================================
	# REST settings
	#=======================================================================================================================</cc>
	<cs>[REST]</cs>
	
	<cc># Stylesheet to use for HTML views.
	# The default options are:
	#  - servlet:/styles/juneau.css
	#  - servlet:/styles/devops.css
	# Other stylesheets can be referenced relative to the servlet package or working directory.</cc>
	<ck>stylesheet</ck> = <cv>servlet:/styles/devops.css</cv>
	
	<cc>#=======================================================================================================================
	# Console settings
	#=======================================================================================================================</cc>
	<cs>[Console]</cs>
	
	<ck>enabled</ck> = <cv>true</cv>
	
	<cc># List of available console commands.
	# These are classes that implements ConsoleCommand that allow you to submit commands to the microservice via
	# the console.
	# When listed here, the implementations must provide a no-arg constructor.
	# They can also be provided dynamically by overriding the Microservice.createConsoleCommands() method.</cc>
	<ck>commands</ck> = 
		<cv>org.apache.juneau.microservice.console.ExitCommand,
		org.apache.juneau.microservice.console.RestartCommand,
		org.apache.juneau.microservice.console.HelpCommand</cv>
		
	<cc>#=======================================================================================================================
	# Logger settings
	#-----------------------------------------------------------------------------------------------------------------------
	# See FileHandler Java class for details.
	#=======================================================================================================================</cc>
	<cs>[Logging]</cs>

	...
	
	<cc>#=======================================================================================================================
	# System properties
	#-----------------------------------------------------------------------------------------------------------------------
	# These are arbitrary system properties that are set during startup.
	#=======================================================================================================================</cc>
	<cs>[SystemProperties]</cs>
	
	<cc># Configure Jetty for StdErrLog Logging
	# org.eclipse.jetty.util.log.class = org.eclipse.jetty.util.log.StrErrLog</cc>
	
	<cc># Configure Jetty to log using java-util logging</cc>
	<ck>org.eclipse.jetty.util.log.class</ck> = <cv>org.apache.juneau.microservice.JettyLogger</cv>
	
	<cc># Jetty logging level
	# Possible values:  ALL, DEBUG, INFO, WARN, OFF</cc>
	<ck>org.eclipse.jetty.LEVEL</ck> = <cv>WARN
	
	<ck>derby.stream.error.file</ck> = <cv>$C{Logging/logDir}/derby-errors.log</cv>					
				</p>
				<li>
					<l>jetty.xml</l> - The Jetty configuration file. 
					<br>A bare-bones config file that can be extended to use any Jetty features.
					<br><br>
					<p class='bcode'>
	<xt>&lt;Configure</xt> <xa>id</xa>=<xs>"ExampleServer"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.server.Server"</xs>&gt;</xt>
	
		<xt>&lt;Set</xt> <xa>name</xa>=<xs>"connectors"</xs><xt>&gt;</xt>
			<xt>&lt;Array</xt> <xa>type</xa>=<xs>"org.eclipse.jetty.server.Connector"</xs><xt>&gt;</xt>
				<xt>&lt;Item&gt;</xt>
					<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.ServerConnector"</xs><xt>&gt;</xt>
						<xt>&lt;Arg&gt;</xt>
							<xt>&lt;Ref</xt> <xa>refid</xa>=<xs>"ExampleServer"</xs><xt>/&gt;</xt>
						<xt>&lt;/Arg&gt;</xt>
						<xt>&lt;Set</xt> <xa>name</xa>=<xs>"port"</xs><xt>&gt;</xt>$S{availablePort,8080}<xt>&lt;/Set&gt;</xt>
					<xt>&lt;/New&gt;</xt>
				<xt>&lt;/Item&gt;</xt>
			<xt>&lt;/Array&gt;</xt>
		<xt>&lt;/Set&gt;</xt>
	
		<xt>&lt;New</xt> <xa>id</xa>=<xs>"context"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.servlet.ServletContextHandler"</xs><xt>&gt;</xt>
			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"contextPath"</xs><xt>&gt;/&lt;/Set&gt;</xt>
			<xt>&lt;Call</xt> <xa>name</xa>=<xs>"addServlet"</xs><xt>&gt;</xt>
				<xt>&lt;Arg&gt;</xt>org.apache.juneau.microservice.sample.RootResources<xt>&lt;/Arg&gt;</xt>
				<xt>&lt;Arg&gt;</xt>/*<xt>&lt;/Arg&gt;</xt>
			<xt>&lt;/Call&gt;</xt>
			<xt>&lt;Set</xt> <xa>name</xa>=<xs>"sessionHandler"</xs><xt>&gt;</xt>
				<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.session.SessionHandler"</xs><xt>/&gt;</xt>
			<xt>&lt;/Set&gt;</xt>
		<xt>&lt;/New&gt;</xt>
	
		<xt>&lt;Set</xt> <xa>name</xa>=<xs>"handler"</xs><xt>&gt;</xt>
			<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.handler.HandlerCollection"</xs><xt>&gt;</xt>
				<xt>&lt;Set</xt> <xa>name</xa>=<xs>"handlers"</xs><xt>&gt;</xt>
					<xt>&lt;Array</xt> <xa>type</xa>=<xs>"org.eclipse.jetty.server.Handler"</xs><xt>&gt;</xt>
						<xt>&lt;Item&gt;</xt>
							<xt>&lt;Ref</xt> <xa>refid</xa>=<xs>"context"</xs><xt>/&gt;</xt>
						<xt>&lt;/Item&gt;</xt>
						<xt>&lt;Item&gt;</xt>
							<xt>&lt;New</xt> <xa>class</xa>=<xs>"org.eclipse.jetty.server.handler.DefaultHandler"</xs><xt>/&gt;</xt>
						<xt>&lt;/Item&gt;</xt>
					<xt>&lt;/Array&gt;</xt>
				<xt>&lt;/Set&gt;</xt>
			<xt>&lt;/New&gt;</xt>
		<xt>&lt;/Set&gt;</xt>
	
		<xt>&lt;Set</xt> <xa>name</xa>=<xs>"requestLog"</xs><xt>&gt;</xt>
			<xt>&lt;New</xt> <xa>id</xa>=<xs>"RequestLogImpl"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.server.NCSARequestLog"</xs><xt>&gt;</xt>
				<xt>&lt;Set</xt> <xa>name</xa>=<xs>"filename"</xs><xt>&gt;&lt;Property</xt> <xa>name</xa>=<xs>"jetty.logs"</xs> <xa>default</xa>=<xs>"$C{Logging/logDir,logs}"</xs><xt>/&gt;</xt>/jetty-requests.log<xt>&lt;/Set&gt;</xt>
				<xt>&lt;Set</xt> <xa>name</xa>=<xs>"filenameDateFormat</xs><xt>"&gt;</xt>yyyy_MM_dd<xt>&lt;/Set&gt;</xt>
				<xt>&lt;Set</xt> <xa>name</xa>=<xs>"LogTimeZone"</xs><xt>&gt;</xt>GMT<xt>&lt;/Set&gt;</xt>
				<xt>&lt;Set</xt> <xa>name</xa>=<xs>"retainDays"</xs><xt>&gt;</xt>90<xt>&lt;/Set&gt;</xt>
				<xt>&lt;Set</xt> <xa>name</xa>=<xs>"append"</xs><xt>&gt;</xt>false<xt>&lt;/Set&gt;</xt>
				<xt>&lt;Set</xt> <xa>name</xa>=<xs>"LogLatency"</xs><xt>&gt;</xt>true<xt>&lt;/Set&gt;</xt>
			<xt>&lt;/New&gt;</xt>
		<xt>&lt;/Set&gt;</xt>
	
	    <xt>&lt;Get</xt> <xa>name</xa>=<xs>"ThreadPool"</xs><xt>&gt;</xt>
	        <xt>&lt;Set</xt> <xa>name</xa>=<xs>"minThreads"</xs> <xa>type</xa>=<xs>"int"</xs><xt>&gt;</xt>10<xt>&lt;/Set&gt;</xt>
	        <xt>&lt;Set</xt> <xa>name</xa>=<xs>"maxThreads"</xs> <xa>type</xa>=<xs>"int"</xs><xt>&gt;</xt>100<xt>&lt;/Set&gt;</xt>
	        <xt>&lt;Set</xt> <xa>name</xa>=<xs>"idleTimeout"</xs> <xa>type</xa>=<xs>"int"</xs><xt>&gt;</xt>60000<xt>&lt;/Set&gt;</xt>
	        <xt>&lt;Set</xt> <xa>name</xa>=<xs>"detailedDump"</xs><xt>&gt;</xt>true<xt>&lt;/Set&gt;</xt>
	    <xt>&lt;/Get&gt;</xt>
	<xt>&lt;/Configure&gt;</xt>
					</p>
			</ul>
			<p>
				At this point, you're ready to start the microservice from your workspace.
			</p>
		</div>
		
		<!-- =========================================================================================================== -->
		<a id="juneau-microservice-server.Running"></a>
		<h4 class='topic' onclick='toggle(this)'>10.2.2 - Running in Eclipse</h4>
		<div class='topic'>
			<p>
				The <l>my-microservice.launch</l> file is already provided to allow you to quickly start
				your new microservice.
			</p>
			<p>
				Go to <b>Run -&gt; Run Configurations -&gt; Java Application -&gt; my-microservice</b> and click <b>Run</b>.
				<br>In your console view, you should see the following output:
			</p>
			<p class='bcode'>
	Running class 'RestMicroservice' using config file 'my-microservice.cfg'.
	Server started on port 10000
	
	List of available commands:
		exit -- Shut down service
		restart -- Restarts service
		help -- Commands help
	
	> 			
			</p>
			<p>
				Now open your browser and point to <l>http://localhost:10000</l>.  
				You should see the following:
			</p>
			<img class='bordered' src="doc-files/MicroserviceServer.Running.6.png" style='width:800px;'>
			<p>
				You have started a REST interface on port 10000.
				<br>You can enter the command <code>exit</code> to shut it down.
			</p>
		</div>
		
		<!-- =========================================================================================================== -->
		<a id="juneau-microservice-server.Building"></a>
		<h4 class='topic' onclick='toggle(this)'>10.2.3 - Building and Running from Command-Line</h4>
		<div class='topic'>
			<p>
				The <l>pom.xml</l> file is a basic Maven build script for creating your microservice
				as an executable uber-jar.
			</p>
			<p>
				The easiest way to build your microservice is to run the following from the project root.
			</p>
			<p class='bcode'>
	mvn clean install
			</p>
			<p>
				Your <code>target</code> directory should now contain the following files:
			</p>
			<ul>
				<li><code>my-microservice-1.0.jar</code>
				<li><code>my-microservice.cfg</code>
				<li><code>jetty.xml</code>
			</ul>
			<p>
				To start from a command line, run the following command from inside your <code>target</code> directory:
			</p>
			<p class='bcode'>
	java -jar my-microservice-1.0.jar
			</p>
			<p>
				You should see the following console output:
			</p>
			<p class='bcode'>
	Running class 'RestMicroservice' using config file 'my-microservice.cfg'.
	Server started on port 10000
	
	List of available commands:
		exit -- Shut down service
		restart -- Restarts service
		help -- Commands help
	
	> 			
			</p>
			<p>
				If you get this error message: <code class='snippet'>java.net.BindException: Address already in use</code>, 
				then this microservice is already running elsewhere and so it cannot bind to port 10000.
			</p>
		</div>
		
	</div>

	<!-- =========================================================================================================== -->
	<a id="juneau-microservice-server.Manifest"></a>
	<h3 class='topic' onclick='toggle(this)'>10.3 - Manifest File</h3>
	<div class='topic'>
		<p>
			The generated <l>META-INF/MANIFEST.MF</l> file is used to describe the microservice. 
			<br>If you open it, you'll see the following:
		</p>
		<p class='bcode'>
	<mk>Main-Class</mk>: <mv>org.apache.juneau.microservice.RestMicroservice</mv>
	<mk>Main-ConfigFile</mk>: <mv>microservice.cfg</mv>
		<p>
		 	The <mk>Main-Class</mk> entry is the standard manifest entry describing the entry point for the executable jar.
		 	<br>In most cases, this value will always be <l>org.apache.juneau.microservice.RestMicroservice</l>.
		 	<br>However, it is possible to extend this class or implement your own microservice, in which case you'll need
		 	to modify this value to point to the new class.
		</p>
		<p>
			The <mk>Main-ConfigFile</mk> entry points to the location of an external configuration file for our microservice.
		</p>		
		<p>
			In addition to these predefined manifest entries, you can add your own particular entries to the manifest file
			and access them through the Manifest API described next. 
		</p>
	
		<!-- =========================================================================================================== -->
		<a id="juneau-microservice-server.ManifestApi"></a>
		<h4 class='topic' onclick='toggle(this)'>10.3.1 - Manifest API</h4>
		<div class='topic'>
			<p>
				The {@link org.apache.juneau.microservice.Microservice#getManifest()} method is a static method that
				can be used to retrieve the manifest file as a {@link org.apache.juneau.utils.ManifestFile}.  
			</p>
			<p class='bcode'>
	<jc>// Get Main-Class from manifest file.</jc>
	String mainClass = Microservice.<jsm>getInstance</jsm>().getManifest().getString(<js>"Main-Class"</js>, <js>"unknown"</js>);
	 
	<jc>// Get Rest-Resources from manifest file.</jc>
	String[] restResources = Microservice.<jsm>getInstance</jsm>().getManifest().getStringArray(<js>"Rest-Resources"</js>);
			</p>
			<p>
				The {@link org.apache.juneau.utils.ManifestFile} class extends {@link org.apache.juneau.ObjectMap}.
				<br>That makes it possible to retrieve entries as a wide variety of object types such as java primitives, arrays, collections, 
				maps, or even POJOs serialized as JSON.
			</p>
		</div>
		
	</div>

	<!-- =========================================================================================================== -->
	<a id="juneau-microservice-server.Config"></a>
	<h3 class='topic' onclick='toggle(this)'>10.4 - Config</h3>
	<div class='topic'>
		<p>
			The microservice config file is an external INI-style configuration file that is used to configure
			your microservice.
		</p>
		<p>
			If you open the <l>my-microservice.cfg</l> file, you'll see several predefined sections and settings.
			<br>The contents were shown in the previous sections.
		</p>
		<p>
			Although the config file looks deceptively simple, the config file API is a very powerful feature with many 
			capabilities, including:
		</p>
		<ul class='spaced-list'>
			<li>
				The ability to use variables to reference environment variables, system properties, other config file 
				entries, and a host of other types.
			<li>
				The ability to store and retrieve POJOs as JSON.
			<li>
				APIs for updating, modifying, and saving configuration files without losing comments or formatting.
			<li>
				Extensive listener APIs.
		</ul>
		
		<h5 class='figure'>Examples:</h5>
		<p class='bcode'>
	<cc>#--------------------------</cc>
	<cc># My section</cc>
	<cc>#--------------------------</cc>
	<cs>[MySection]</cs>
	
	<cc># An integer</cc>
	<ck>anInt</ck> = <cv>1 </cv>
	
	<cc># A boolean</cc>
	<ck>aBoolean</ck> = <cv>true </cv>
	
	<cc># An int array</cc>
	<ck>anIntArray</ck> = <cv>1,2,3 </cv>
	
	<cc># A POJO that can be converted from a String</cc>
	<ck>aURL</ck> = <cv>http://foo </cv>
	
	<cc># An encoded password</cc>
	<ck>aPassword*</ck> = <cv>{HRAaRQoT}</cv>

	<cc># A POJO that can be converted from JSON</cc>
	<ck>aBean</ck> = <cv>{foo:'bar',baz:123}</cv>
	
	<cc># A system property</cc>
	<ck>locale</ck> = <cv>$S{java.locale, en_US}</cv>
	
	<cc># An environment variable</cc>
	<ck>path</ck> = <cv>$E{PATH, unknown}</cv>
	
	<cc># A manifest file entry</cc>
	<ck>mainClass</ck> = <cv>$MF{Main-Class}</cv>
	
	<cc># Another value in this config file</cc>
	<ck>sameAsAnInt</ck> = <cv>$C{MySection/anInt}</cv>
	
	<cc># A command-line argument in the form "myarg=foo"</cc>
	<ck>myArg</ck> = <cv>$ARG{myarg}</cv>
	
	<cc># The first command-line argument</cc>
	<ck>firstArg</ck> = <cv>$ARG{0}</cv>

	<cc># Look for system property, or env var if that doesn't exist, or command-line arg if that doesn't exist.</cc>
	<ck>nested</ck> = <cv>$S{mySystemProperty,$E{MY_ENV_VAR,$ARG{0}}}</cv>

	<cc># A POJO with embedded variables</cc>
	<ck>aBean2</ck> = <cv>{foo:'$ARG{0}',baz:$C{MySection/anInt}}</cv>
	
	</p>
	<p class='bcode'>
	<jc>// Java code for accessing config entries above.</jc>
	Config cf = Microservice.<jsm>getInstance</jsm>().getConfig();
	
	<jk>int</jk> anInt = cf.getInt(<js>"MySection/anInt"</js>); 
	<jk>boolean</jk> aBoolean = cf.getBoolean(<js>"MySection/aBoolean"</js>); 
	<jk>int</jk>[] anIntArray = cf.getObject(<jk>int</jk>[].<jk>class</jk>, <js>"MySection/anIntArray"</js>); 
	URL aURL = cf.getObject(URL.<jk>class</jk>, <js>"MySection/aURL"</js>); 
	String aPassword = cf.getString(<js>"MySection/aPassword"</js>);
	MyBean aBean = cf.getObject(MyBean.<jk>class</jk>, <js>"MySection/aBean"</js>); 
	Locale locale = cf.getObject(Locale.<jk>class</jk>, <js>"MySection/locale"</js>); 
	String path = cf.getString(<js>"MySection/path"</js>); 
	String mainClass = cf.getString(<js>"MySection/mainClass"</js>); 
	<jk>int</jk> sameAsAnInt = cf.getInt(<js>"MySection/sameAsAnInt"</js>); 
	String myArg = cf.getString(<js>"MySection/myArg"</js>); 
	String firstArg = cf.getString(<js>"MySection/firstArg"</js>); 
		</p>
	
		<!-- =========================================================================================================== -->
		<a id="juneau-microservice-server.ConfigApi"></a>
		<h4 class='topic' onclick='toggle(this)'>10.4.1 - Config File API</h4>
		<div class='topic'>
			<p>
				There are 3 primary ways of getting access to the config file.
			</p>
			<ul class='doctree'>
				<li class='jm'>{@link org.apache.juneau.microservice.Microservice#getConfig()} 
					<br>Any <a class='doclink' href='#DefaultRestSvlVariables'>initialization-time variables</a> and <l>$ARG</l> and <l>$MF</l> variables can be used.
				<li class='jm'>{@link org.apache.juneau.rest.RestContext#getConfig()} 
					<br>Any <a class='doclink' href='#DefaultRestSvlVariables'>initialization-time variables</a> and <l>$ARG</l> and <l>$MF</l> variables can be used.
					<h5 class='figure'>Example usage:</h5>
					<p class='bcode'>
	<cc>#-------------------------------</cc>
	<cc># Properties for MyHelloResource </cc>
	<cc>#-------------------------------</cc>
	<cs>[MyHelloResource]</cs>
	<ck>greeting</ck> = <cv>Hello world!</cv> 
				</p>
				<p class='bcode'>
	<ja>@RestResource</ja>(...)
	<jk>public class</jk> MyHelloResource <jk>extends</jk> Resource {
		<jc>// Access config file when initializing fields.</jc>
		<jk>private</jk> String greeting = getConfig().getString(<js>"MyHelloResource/greeting"</js>); 
		
		<jc>// Or access config file in servlet init method.</jc>
		<ja>@Override</ja> <jc>/* Servlet */</jc>
		<jk>public void</jk> init() {
			String greeting = getConfig().getString(<js>"MyHelloResource/greeting"</js>); 
		}
	}		
					</p>
					<p>
						Additional user-defined variables can be defined at this level by adding a  
						{@link org.apache.juneau.rest.annotation.HookEvent#INIT} hook method
						and using the {@link org.apache.juneau.rest.RestContextBuilder#vars(Class...)} method.
					</p>
				<li class='jm'>
					{@link org.apache.juneau.rest.RestRequest#getConfig()} 
					- An instance method to access it from inside a REST method.
					<br>Any <a class='doclink' href='#DefaultRestSvlVariables'>initialization-time or request-time variables</a> and <l>$ARG</l> and <l>$MF</l> variables can be used.
					
					<h5 class='figure'>Example usage:</h5>
					<p class='bcode'>
	<cc>#-----------------------------</cc>
	<cc># Contents of microservice.cfg </cc>
	<cc>#-----------------------------</cc>
	<cs>[MyHelloResource]</cs>
	<ck>greeting</ck> = <cv>Hello $RP{person}!</cv> 
	<ck>localizedGreeting</ck> = <cv>$L{HelloMessage,$RP{person}}</cv> 
				</p>
				<p class='bcode'>
	<cc>#---------------------------------</cc>
	<cc># Contents of MyHelloResource.java </cc>
	<cc>#---------------------------------</cc>
	<ja>@RestResource</ja>(
		path=<js>"/hello"</js>,
		messages=<js>"nls/Messages"</js>,
		...
	)
	<jk>public class</jk> MyHelloResource <jk>extends</jk> Resource {

		<jd>/** Standard hello message. */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{person}"</js>)
		<jk>public</jk> String sayHello(RestRequest req) {
			<jk>return</jk> req.getConfig().getString(<js>"MyHelloResource/greeting"</js>);
		}

		<jd>/** Hello message in users language. */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/localized/{person}"</js>)
		<jk>public</jk> String sayLocalizedHello(RestRequest req) {
			<jk>return</jk> req.getConfig().getString(<js>"MyHelloResource/localizedGreeting"</js>);
		}
	}		
					</p>
					<p class='bcode'>
	<cc>#---------------------------------------</cc>
	<cc># Contents of nls/Messages_en.properties </cc>
	<cc>#---------------------------------------</cc>
	<ck>MyHelloResource.HelloMessage</ck> = <cv>Hello {0}!</cv> 
					</p>
					<p>
						Additional user-defined variables can be defined at this level by overriding the 
						{@link org.apache.juneau.rest.RestContextBuilder#vars(Class...)} method.
					</p>
			</ul>
			<p>
				That <l>sayLocalizedHello()</l> example might need some explanation since there's a lot going on there.
				<br>Here's what happens when an HTTP call is made to <l>GET /hello/localized/Bob</l>:
			</p>
			<ol class='spaced-list'>
				<li>
					The HTTP call matches the <l>/hello</l> path on the <l>MyHelloResource</l> class.
				<li>
					The HTTP call matches the <l>/localized/{person}</l> path on the <l>sayLocalizedHello()</l> method.
				<li>
					The request attribute <l>person</l> gets assigned the value <l>"Bob"</l>.
				<li>
					The call to <l>req.getConfig().getString("MyHelloResource/localizedGreeting")</l> 
					finds the value <l>"$L{HelloMessage,$RP{person}}"</l>.
				<li>
					The arguments in the <l>$L{}</l> variable get resolved, resulting in <l>"$L{HelloMessage,Bob}"</l>.
				<li>
					The <l>$L{}</l> variable gets resolved to the message <l>"Hello {0}!"</l> in the localized properties 
					file of the servlet based on the <l>Accept-Language</l> header on the request.
				<li>
					The arguments get replaced in the message resulting in <l>"Hello Bob!"</l>. 
				<li>
					The resulting message <l>"Hello Bob!"</l> is returned as a POJO to be serialized to whatever content 
					type was specified on the <l>Accept</l> header on the request.
			</ol>
			<p>
				This particular example is needlessly complex, but it gives an idea of how variables can be used 
				recursively to produce sophisticated results
			</p>
		</div>
		
	</div>

	<!-- =========================================================================================================== -->
	<a id="juneau-microservice-server.ResourceClasses"></a>
	<h3 class='topic' onclick='toggle(this)'>10.5 - Resource Classes</h3>
	<div class='topic'>
		<p>
			Now let's take a look at the resource classes themselves.  
			<br>The top-level page...
		</p>
		<img class='bordered' src='doc-files/MicroserviceServer.Running.6.png' style='width:800px;'>
		<p>
			...is generated by this class...
		<p class='bcode'>
	<ja>@RestResource</ja>(
		path=<js>"/"</js>,
		title=<js>"My Microservice"</js>,
		description=<js>"Top-level resources page"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			widgets={
				ContentTypeMenuItem.<jk>class</jk>,
				StyleMenuItem.<jk>class</jk>
			},
			navlinks={
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		),
		children={
			HelloWorldResource.<jk>class</jk>,
			ConfigResource.<jk>class</jk>,
			LogsResource.<jk>class</jk>
		}
	)
	<jk>public class</jk> RootResources <jk>extends</jk> ResourceGroup {
		<jc>// No code! </jc>
	}
		</p>
		<ul class='spaced-list'>
			<li>
				The </l>title</l> and <l>description</l> annotations define the titles on the page.
				<br>These can be globalized using <l>$L{...}</l> variables, or by defining specially-named properties in the 
				properties file for the resource.
			<li>
				In this case, the <l>path</l> annotation defines the context root of your application since it was 
				not specified in the manifest or config file.
				<br>Therefore, this resource is mapped to <l>http://localhost:10000</l>.
			<li>
				The <l>children</l> annotation make up the list of child resources.
				<br>These child resources can be anything that extends from <l>Servlet</l>, although usually
				they will be subclasses of {@link org.apache.juneau.microservice.Resource} or other resource groups.
		</ul>
		<p>
			If you click the <l>helloWorld</l> link in your application, you'll get a simple hello world message:
		</p>
		<img class='bordered' src='doc-files/juneau-microservice-server.ResourceClasses.1.png' style='width:800px;'>
		<p>
			...which is generated by this class...
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		path=<js>"/helloWorld"</js>,
		title=<js>"Hello World example"</js>,
		description=<js>"Simplest possible REST resource"</js>
	)
	<jk>public class</jk> HelloWorldResource <jk>extends</jk> Resource {
	
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>)
		<jk>public</jk> String sayHello() {
			<jk>return</jk> <js>"Hello world!"</js>;
		}
	}		
		</p>
		<p>
			The {@link org.apache.juneau.microservice.Resource} and {@link org.apache.juneau.microservice.ResourceGroup} 
			classes are powerful servlets designed specifically for creating REST APIs using nothing more than serialized 
			and parsed POJOs.
		</p>
	</div>

	<!-- =========================================================================================================== -->
	<a id="juneau-microservice-server.PredefinedResourceClasses"></a>
	<h3 class='topic' onclick='toggle(this)'>10.6 - Predefined Resource Classes</h3>
	<div class='topic'>
		<p>
			The following predefined resource classes are also provided for easy inclusion into your microservice:
		</p>
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.microservice.resources.ConfigResource}
				- View and modify the external INI config file.
			<li class='jc'>{@link org.apache.juneau.microservice.resources.DirectoryResource}
				- View and modify file system directories.
			<li class='jc'>{@link org.apache.juneau.microservice.resources.LogsResource}
				- View and control generated log files.
			<li class='jc'>{@link org.apache.juneau.microservice.resources.SampleRootResource}
				- A sample root resource class to get started from.
			<li class='jc'>{@link org.apache.juneau.microservice.resources.ShutdownResource}
				- Shutdown and/or restart the JVM.
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="juneau-microservice-server.RestMicroservice"></a>
	<h3 class='topic' onclick='toggle(this)'>10.7 - RestMicroservice</h3>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.microservice.RestMicroservice} class is the main application entry-point for REST 
			microservices. 
		</p>
		<p>
			The class hierarchy is:
		</p>
		<ul class='doctree'>
			<li class='jac'>
				{@link org.apache.juneau.microservice.Microservice} 
				- Abstract class that defines simple start/stop methods and access to the manifest file, config file, and 
				arguments.
				<ul>
					<li class='jc'>
						{@link org.apache.juneau.microservice.RestMicroservice} 
						- Specialized microservice for starting up REST interfaces using Jetty and specifying REST servlets
						through the manifest file or config file.
				</ul>
			</li>
		</ul>
		<p>
			Refer to the Javadocs for these class for more information.
		</p>

		<!-- =========================================================================================================== -->
		<a id="juneau-microservice-server.ExtendingRestMicroservice"></a>
		<h4 class='topic' onclick='toggle(this)'>10.7.1 - Extending RestMicroservice</h4>
		<div class='topic'>
			<p>
				This example shows how the {@link org.apache.juneau.microservice.RestMicroservice} class
				can be extended to implement lifecycle listener methods or override existing methods.
				<br>We'll create a new class <l>com.foo.SampleCustomRestMicroservice</l>.
			</p>
			<p>
				First, the manifest file needs to be modified to point to our new microservice:
			</p>
			<p class='bcode'>
	<mk>Main-Class:</mk> com.foo.SampleCustomRestMicroservice
			</p>
			<p>
				Then we define the following class:
			</p>
			<p class='bcode'>
	<jd>/**
	 * Sample subclass of a RestMicroservice that provides customized behavior.
	 * This class must be specified in the Main-Class entry in the manifest file and optionally
	 * 	a Main-ConfigFile entry.
	 */</jd>
	<jk>public class</jk> SampleCustomRestMicroservice <jk>extends</jk> RestMicroservice {
	
		<jd>/**
		 * Must implement a main method and call start()!
		 */</jd>
		<jk>public static void</jk> main(String[] args) <jk>throws</jk> Exception {
			<jk>new</jk> SampleCustomRestMicroservice(args).start().join();
		}
	
		<jd>/**
		 * Must implement a constructor!
		 * 
		 * <ja>@param</ja> args Command line arguments. 
		 * <ja>@throws</ja> Exception 
		 */</jd>
		<jk>public</jk> SampleCustomRestMicroservice(String[] args) <jk>throws</jk> Exception {
			<jk>super</jk>(args);
		}
			</p>
			<p>
				The microservice APIs provide several useful methods that can be used or extended.
			</p>
			<h5 class='section'>See Also:</h5>
			<ul class='doctree'>
				<li class='jac'>{@link org.apache.juneau.microservice.Microservice}
				<li class='jc'>{@link org.apache.juneau.microservice.RestMicroservice}
			</ul>
		</div>
	</div>
</div>

<!-- =========================================================================================================== -->
<a id="juneau-examples-core"></a>
<h2 class='topic' onclick='toggle(this)'>11 - juneau-examples-core</h2>
<div class='topic'>

	<h5 class='figure'>Archive File</h5>
	<p class='bcode' style='width:500px;'>
	juneau-examples-core-7.0.0.zip 
	</p>	
	
	<p>
		The <code>juneau-examples-core</code> project contains various code examples for using the core APIs. 
	</p>
	<p>
		The project project can be loaded into your workspace by importing the 
		<code>juneau-examples-core-7.0.0.zip</code> file. 
	</p>
	
	<h5 class='topic'>Instructions on how to install juneau-examples-core project</h5>
	<p>
		Download the <code>juneau-examples-core-7.0.0.zip</code> file from the downloads page
		(located in the binaries) and import it into your workspace as an existing project:
	</p>
	<img class='bordered' src='doc-files/juneau-examples-core.1.png' style='width:512px'>
	<p>
		Select the archive file and import the project:
	</p>
	<img class='bordered' src='doc-files/juneau-examples-core.2.png' style='width:523px'>
	<p>
		Once loaded, you should see the following project structure:
	</p>
	<img class='bordered' src='doc-files/juneau-examples-core.3.png' style='width:459px'>
	
	<p>
		The Core library samples are currently a work-in-progress so there's not much here yet.
		This section will be updated as new code is added.
	</p>
</div>

<!-- =========================================================================================================== -->
<a id="juneau-examples-rest"></a>
<h2 class='topic' onclick='toggle(this)'>12 - juneau-examples-rest</h2>
<div class='topic'>

	<h5 class='figure'>Archive File</h5>
	<p class='bcode' style='width:500px;'>
	juneau-examples-rest-7.0.0.zip 
	</p>	

	<p>
		The <code>juneau-examples-rest</code> project includes everything you need to start the Samples REST 
		microservice in an Eclipse workspace.
	</p>
	<p>
		This project is packaged as a Juneau Microservice project that allows REST resources to be started
		using embedded Jetty.
	</p>	
	
	<h5 class='topic'>Instructions on how to install juneau-examples-rest project</h5>
	<p>
		Download the <code>juneau-examples-rest-7.0.0.zip</code> file from the downloads page
		(located in the binaries) and import it into your workspace as an existing project:
	</p>
	<img class='bordered' src='doc-files/juneau-examples-rest.1.png' style='width:524px'>
	<p>
		Select the archive file and import the project:
	</p>
	<img class='bordered' src='doc-files/juneau-examples-rest.2.png' style='width:523px'>
	<p>
		Once loaded, you should see the following project structure:
	</p>
	<img class='bordered' src='doc-files/juneau-examples-rest.3.png' style='width:412px'>
	<p>
		The microservice can be started from the <code>juneau-examples-rest.launch</code> file.
		It will start up the microservice on port 10000 which you can then view through a browser:
	</p>
	<img class='bordered' src='doc-files/juneau-examples-rest.4.png' style='width:466px'>
		
	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.RootResources"></a>
	<h4 class='topic' onclick='toggle(this)'>12.1 - RootResources</h4>
	<div class='topic'>
		<p>
			The <l>RootResources</l> class is the main page for the REST microservice.
			It serves as the jumping-off point for the other resources.
		</p>
		<p>
			The class hierarchy for this class is:
		</p>
		<ul class='doctree'>
			<li class='jac'>
				{@link org.apache.juneau.rest.RestServlet org.apache.juneau.rest.RestServlet}
				<br>Contains all the REST servlet logic.
				<ul>
					<li class='jac'>
						{@link org.apache.juneau.rest.RestServletDefault org.apache.juneau.rest.RestServletDefault}
						<br>Defines default serializers and parsers, and OPTIONs page logic.
						<ul>
							<li class='jac'>
								{@link org.apache.juneau.rest.RestServletGroupDefault org.apache.juneau.rest.RestServletGroupDefault}
								<br>Specialized subclass for grouping other resources
								<ul>
									<li class='jac'>
										{@link org.apache.juneau.microservice.ResourceGroup org.apache.juneau.microservice.ResourceGroup}
										<br>Specialized subclass when using the Microservice API.
										<ul>
											<li class='jc'>
												<code>org.apache.juneau.rest.samples.RootResources</code>
										</ul>
									</li>
								</ul>
							</li>
						</ul>
					</li>
				</ul>
			</li>
		</ul>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.Running.3.png'>
		<p>
			The <l>RootResources</l> class can also be defined as a servlet in a <l>web.xml</l> file:
		</p>
		<p class='bcode'>
	<xt>&lt;web-app</xt> <xa>version</xa>=<xs>'2.3'</xs><xt>&gt;</xt>
		<xt>&lt;servlet&gt;</xt>
			<xt>&lt;servlet-name&gt;</xt>RootResources<xt>&lt;/servlet-name&gt;</xt>
			<xt>&lt;servlet-class&gt;</xt>org.apache.juneau.rest.samples.RootResources<xt>&lt;/servlet-class&gt;</xt>
		<xt>&lt;/servlet&gt;</xt>
		<xt>&lt;servlet-mapping&gt;</xt>
			<xt>&lt;servlet-name&gt;</xt>RootResources<xt>&lt;/servlet-name&gt;</xt>
			<xt>&lt;url-pattern&gt;</xt>/*<xt>&lt;/url-pattern&gt;</xt>
		<xt>&lt;/servlet-mapping&gt;</xt>
	<xt>&lt;/web-app&gt;</xt>
		</p>
		<p>
			The <l>RootResources</l> class consists entirely of annotations:
		</p>
		
		<h5 class='figure'>RootResources.java</h5>
		<p class='bcode'>
	<jd>/**
	 * Sample REST resource showing how to implement a "router" resource page.
	 */</jd>
	<ja>@RestResource</ja>(
		path=<js>"/"</js>,
		messages=<js>"nls/RootResources"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"options: ?method=OPTIONS"</js>
			}
		),
		children={
			HelloWorldResource.<jk>class</jk>, 
			MethodExampleResource.<jk>class</jk>, 
			RequestEchoResource.<jk>class</jk>, 
			TempDirResource.<jk>class</jk>, 
			AddressBookResource.<jk>class</jk>, 
			SampleRemoteableServlet.<jk>class</jk>, 
			PhotosResource.<jk>class</jk>, 
			AtomFeedResource.<jk>class</jk>, 
			JsonSchemaResource.<jk>class</jk>, 
			SqlQueryResource.<jk>class</jk>, 
			TumblrParserResource.<jk>class</jk>, 
			CodeFormatterResource.<jk>class</jk>, 
			UrlEncodedFormResource.<jk>class</jk>, 
			SourceResource.<jk>class</jk>, 
			ConfigResource.<jk>class</jk>, 
			LogsResource.<jk>class</jk>, 
			DockerRegistryResource.<jk>class</jk>, 
			ShutdownResource.<jk>class</jk> 		
		}
	)
	<jk>public class</jk> RootResources <jk>extends</jk> ResourceGroup {
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L;
	}
		</p>
		<p>
			The resource bundle contains the localized strings for the resource:
		</p>
		
		<h5 class='figure'>RootResources.properties</h5>
		<p class='bcode'>
	<cc>#--------------------------------------------------------------------------------
	# RootResources labels
	#--------------------------------------------------------------------------------</cc>
	<ck>title</ck> = <cv>Root resources</cv>
	<ck>description</ck> = <cv>This is an example of a router resource that is used to access other resources.</cv>
		</p>
		<p>
			The <l>title</l> and <l>description</l> keys identify the localized values
			return by the {@link org.apache.juneau.rest.RestRequest#getResourceTitle()} and 
			{@link org.apache.juneau.rest.RestRequest#getResourceDescription()} methods.
		</p>
		<p>
			The <l>children</l> annotation defines the child resources of this router resource.
			These are resources whose paths are relative to the parent resource.			
		</p>
		<p>
			Child resources must also be subclasses of {@link org.apache.juneau.rest.RestServlet}, and
			must specify a {@link org.apache.juneau.rest.annotation.RestResource#path() @RestResource.path()} annotation to 
			identify the subpath of the child.
			For example, the <l>HelloWorldResource</l> class is annotated as follows:
		</p>
		
		<h5 class='figure'>HelloWorldResource.java</h5>
		<p class='bcode'>
	<ja>@RestResource</ja>(messages=<js>"nls/HelloWorldResource"</js>, path=<js>"/helloWorld"</js>)
	<jk>public class</jk> HelloWorldResource <jk>extends</jk> Resource {
		</p>
		<p>
			It should be noted that child resources do not need to be defined this way.  
			They could also be defined as servlets in the same way as the root resource.  
			The <l>children</l> annotation approach simply makes it easier to define them without having to touch the 
			<l>web.xml</l> file again.
			Child resources can also be defined programmatically by using the 
			{@link org.apache.juneau.rest.RestContextBuilder#children(Class[])} method.
		</p>
		<p>
			Note that these router pages can be arbitrarily nested deep.  
			You can define many levels of router pages for arbitrarily hierarchical REST interfaces. 
		</p>
		<ul class='doctree'>
			<li class='info'>
				Let's step back and describe what's going on here:
				<br>During servlet initialization of the <l>RootResources</l> object, the toolkit looks for the 
				<l>@RestResource.children()</l> annotation.  
				If it finds it, it instantiates instances of each class and recursively performs servlet initialization 
				on them.  
				It then associates the child resource with the parent by the name specified by the 
				<l>@RestResource.path()</l> annotation on the child class.  
				When a request for the child URL (<l>/helloWorld</l>) is received, the <l>RootResources</l> servlet 
				gets the request and sees that the URL remainder matches one of its child resources.  
				It then forwards the request to the child resource for processing.  
				The request passed to the child resource is the same as if the child resource had been deployed 
				independently (e.g. path-info, resource-URI, and so forth).
		</ul>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.HelloWorldResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.2 - HelloWorldResource</h4>
	<div class='topic'>
		<p>
			The <l>HelloWorldResource</l> class is a simple resource that prints a "Hello world!" message.
		</p>
		
		<h5 class='figure'>HelloWorldResource.java</h5>
		<p class='bcode'>
	<jd>/** 
	* Sample REST resource that prints out a simple "Hello world!" message. 
	*/</jd> 
	<ja>@RestResource</ja>( 
		messages=<js>"nls/HelloWorldResource"</js>, 
		path=<js>"/helloWorld"</js>, 
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		)
	) 
	<jk>public class</jk> HelloWorldResource <jk>extends</jk> Resource { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
		
		<jd>/** GET request handler */</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>) 
		<jk>public</jk> String sayHello() { 
			<jk>return</jk> <js>"Hello world!"</js>; 
		} 
	}
		</p>
		
		<h5 class='figure'>HelloWorldResource.properties</h5>
		<p class='bcode'>
	<cc>#--------------------------------------------------------------------------------
	# HelloWorldResource labels
	#--------------------------------------------------------------------------------</cc>
	<ck>title</ck> = <cv>Hello World sample resource</cv>
	<ck>description</ck> = <cv>Simplest possible resource</cv>
	<ck>sayHello.summary</ck> = <cv>Responds with "Hello world!"</cv> 	
		</p>
		<p>
			The class hierarchy for this class is:
		</p>
		<ul class='doctree'>
			<li class='jac'>
				{@link org.apache.juneau.rest.RestServlet org.apache.juneau.rest.RestServlet}
				<br>Contains all the REST servlet logic.
				<ul>
					<li class='jac'>
						{@link org.apache.juneau.rest.RestServletDefault org.apache.juneau.rest.RestServletDefault}
						<br>Defines default serializers and parsers, and OPTIONs page logic.
						<ul>
							<li class='jac'>
								{@link org.apache.juneau.microservice.Resource org.apache.juneau.microservice.Resource}
								<br>Specialized subclass when using the Microservice API.
								<ul>
									<li class='jc'><code>org.apache.juneau.rest.samples.HelloWorldResource</code>
								</ul>
							</li>
						</ul>
					</li>
				</ul>
			</li>
		</ul>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.HelloWorldResource.1.png'>
		<p>
			Using the special <l>&amp;Accept=text/json</l> and <l>&amp;plainText=true</l> parameters
				allows us to see this page rendered as JSON:
		</p>		
		<img class='bordered' src='doc-files/Samples.HelloWorldResource.2.png'>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.MethodExampleResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.3 - MethodExampleResource</h4>
	<div class='topic'>
		<p>
			The <l>MethodExampleResource</l> class provides examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				Using the {@link org.apache.juneau.rest.Redirect} object to perform redirections.
			<li>
				Using the various Java method parameter annotations to retrieve request attributes, parameters, etc.
			<li>
				Using the annotation programmatic equivalents on the {@link org.apache.juneau.rest.RestRequest} object.
			<li>
				Setting response POJOs by either returning them or using the 
				{@link org.apache.juneau.rest.RestResponse#setOutput(Object)} method.
		</ul>
		<p>
			The resource is provided to show how various HTTP entities (e.g. parameters, headers) can be accessed
			as either annotated Java parameters, or through methods on the <l>RestRequest</l> object.
		</p>
		
		<h5 class='figure'>MethodExampleResource.java</h5>
		<p class='bcode'>				
	<jd>/** 
	* Sample REST resource that shows how to define REST methods and OPTIONS pages 
	*/</jd> 
	<ja>@RestResource</ja>( 
		path=<js>"/methodExample"</js>, 
		messages=<js>"nls/MethodExampleResource"</js>, 
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		)
	) 
	<jk>public class</jk> MethodExampleResource <jk>extends</jk> Resource { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
		
		<jd>/** Example GET request that redirects to our example method */</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>) 
		<jk>public</jk> Redirect doExample() <jk>throws</jk> Exception { 
			<jk>return new</jk> Redirect(<js>"example1/xxx/123/{0}/xRemainder?q1=123&amp;q2=yyy"</js>, 
				UUID.<jsm>randomUUID</jsm>()); 
		} 
		
		<jd>/** 
		 * Methodology #1 - GET request using annotated attributes.
		 * This approach uses annotated parameters for retrieving input.
		 */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/example1/{p1}/{p2}/{p3}/*"</js>)
		<jk>public</jk> String example1(
				<ja>@Method</ja> String method,                  <jc>// HTTP method.</jc>
				<ja>@Path</ja> String p1,                        <jc>// Path variables.</jc>
				<ja>@Path</ja> <jk>int</jk> p2,
				<ja>@Path</ja> UUID p3,
				<ja>@Query</ja>(<js>"q1"</js>) <jk>int</jk> q1,                    <jc>// Query parameters.</jc>
				<ja>@Query</ja>(<js>"q2"</js>) String q2,
				<ja>@Query</ja>(<js>"q3"</js>) UUID q3,
				<ja>@PathRemainder</ja> String remainder,        <jc>// Path remainder after pattern match.</jc>
				<ja>@Header</ja>(<js>"Accept-Language"</js>) String lang, <jc>// Headers.</jc>
				<ja>@Header</ja>(<js>"Accept"</js>) String accept,
				<ja>@Header</ja>(<js>"DNT"</js>) <jk>int</jk> doNotTrack
			) {
	
			<jc>// Send back a simple String response</jc>
			String output = String.<jsm>format</jsm>(
					<js>"method=%s, p1=%s, p2=%d, p3=%s, remainder=%s, q1=%d, q2=%s, q3=%s, lang=%s, accept=%s, dnt=%d"</js>,
					method, p1, p2, p3, remainder, q1, q2, q3, lang, accept, doNotTrack);
			<jk>return</jk> output;
		}

		<jd>/** 
		 * Methodology #2 - GET request using methods on RestRequest and RestResponse.
		 * This approach uses low-level request/response objects to perform the same as above.
		 */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/example2/{p1}/{p2}/{p3}/*"</js>)
		<jk>public</jk> String example2(
				RestRequest req,          <jc>// A direct subclass of HttpServletRequest.</jc>
				RestResponse res          <jc>// A direct subclass of HttpServletResponse.</jc>
			) {
			
			<jc>// HTTP method.</jc>
			String method = req.getMethod();
	
			<jc>// Path variables.</jc>
			RequestPathMatch path = req.getPathMatch();
			String p1 = path.get(<js>"p1"</js>, String.<jk>class</jk>);
			<jk>int</jk> p2 = path.get(<js>"p2"</js>, <jk>int</jk>.<jk>class</jk>);
			UUID p3 = path.get(<js>"p3"</js>, UUID.<jk>class</jk>);
	
			<jc>// Query parameters.</jc>
			RequestQuery query = req.getQuery();
			<jk>int</jk> q1 = query.get(<js>"q1"</js>, 0, <jk>int</jk>.<jk>class</jk>);
			String q2 = query.get(<js>"q2"</js>, String.<jk>class</jk>);
			UUID q3 = query.get(<js>"q3"</js>, UUID.<jk>class</jk>);
	
			<jc>// Path remainder after pattern match.</jc>
			String remainder = req.getPathMatch().getRemainder();
	
			<jc>// Headers.</jc>
			String lang = req.getHeader(<js>"Accept-Language"</js>);
			String accept = req.getHeader(<js>"Accept"</js>);
			<jk>int</jk> doNotTrack = req.getHeaders().get(<js>"DNT"</js>, <jk>int</jk>.<jk>class</jk>);
	
			<jc>// Send back a simple String response</jc>
			String output = String.format(
					<js>"method=%s, p1=%s, p2=%d, p3=%s, remainder=%s, q1=%d, q2=%s, q3=%s, lang=%s, accept=%s, dnt=%d"</js>,
					method, p1, p2, p3, remainder, q1, q2, q3, lang, accept, doNotTrack);
			res.setOutput(output);  <jc>// Or use getWriter().</jc>
		}

		<jd>/** 
		 * Methodology #3 - GET request using special objects.
		 * This approach uses intermediate-level APIs.
		 * The framework recognizes the parameter types and knows how to resolve them.
		 */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/example3/{p1}/{p2}/{p3}/*"</js>)
		<jk>public</jk> String example3(
				HttpMethod method,           <jc>// HTTP method.</jc>
				RequestPathMatch path,       <jc>// Path variables.</jc>
				RequestQuery query,          <jc>// Query parameters.</jc>
				RequestHeaders headers,      <jc>// Headers.</jc>
				AcceptLanguage lang,         <jc>// Specific header classes.</jc>
				Accept accept
			) {
			
			<jc>// Path variables.</jc>
			String p1 = path.get(<js>"p1"</js>, String.<jk>class</jk>);
			<jk>int</jk> p2 = path.get(<js>"p2"</js>, <jk>int</jk>.<jk>class</jk>);
			UUID p3 = path.get(<js>"p3"</js>, UUID.<jk>class</jk>);
	
			<jc>// Query parameters.</jc>
			<jk>int</jk> q1 = query.get(<js>"q1"</js>, 0, <jk>int</jk>.<jk>class</jk>);
			String q2 = query.get(<js>"q2"</js>, String.<jk>class</jk>);
			UUID q3 = query.get(<js>"q3"</js>, UUID.<jk>class</jk>);
	
			<jc>// Path remainder after pattern match.</jc>
			String remainder = path.getRemainder();
	
			<jc>// Headers.</jc>
			int doNotTrack = headers.get(<js>"DNT"</js>, <jk>int</jk>.<jk>class</jk>);
	
			<jc>// Send back a simple String response</jc>
			String output = String.format(
					<js>"method=%s, p1=%s, p2=%d, p3=%s, remainder=%s, q1=%d, q2=%s, q3=%s, lang=%s, accept=%s, dnt=%d"</js>,
					method, p1, p2, p3, remainder, q1, q2, q3, lang, accept, doNotTrack);
			res.setOutput(output);
		}
	}
		</p>
		<p>
			The class consists of 4 methods:
		</p>	
		<ul class='doctree'>
			<li class='jm'>
				<l>doExample()</l>
				<br>The root page. 
				<br>Performs a simple redirection to the <l>doGetExample1()</l> method using a 
				{@link org.apache.juneau.rest.Redirect} object.
			<li class='jm'>
				<l>example1()</l>
				<br>Shows how to use the following annotations:
				<ul>
					<li class='ja'>{@link org.apache.juneau.rest.annotation.Path @Path}
					<li class='ja'>{@link org.apache.juneau.rest.annotation.Query @Query}
					<li class='ja'>{@link org.apache.juneau.rest.annotation.Header @Header}
					<li class='ja'>{@link org.apache.juneau.rest.annotation.Method @Method}
					<li class='ja'>{@link org.apache.juneau.rest.annotation.PathRemainder @PathRemainder}
				</ul>
				Method returns a POJO to be serialized as the output.
			<li class='jm'>
				<l>example2()</l>
				<br>Identical to <l>doGetExample1()</l> but shows how to use the 
				{@link org.apache.juneau.rest.RestRequest} and {@link org.apache.juneau.rest.RestResponse} objects:
				<ul>
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getPathMatch()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getQuery()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getFormData()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getHeaders()}
					<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getMethod()}
					<li class='jm'>{@link org.apache.juneau.rest.RequestPathMatch#getRemainder()}
				</ul>
				Method sets the POJO to be serialized using the {@link org.apache.juneau.rest.RestResponse#setOutput(Object)} method.
			<li class='jm'>
				<l>example3()</l>
				<br>Identical to <l>doGetExample1()</l> but uses automatically resolved parameters based on class type.
				<br>Juneau automatically recognizes specific class types such as common header types and automatically
				resolves them to objects for you.  
				<br>See <a class='doclink' href='#juneau-rest-server.RestMethod'>@RestMethod</a> for the list of all automatically support parameter types, and 
				{@link org.apache.juneau.rest.annotation.RestResource#paramResolvers() @RestResource.paramResolvers()}
				for defining your own custom parameter type resolvers. 
		</ul>
		<p>
			There's a lot going on in this method.  
			Notice how you're able to access URL attributes, parameters, headers, and content as parsed POJOs.  
			All the input parsing is already done by the toolkit.  
			You simply work with the resulting POJOs.
		</p>
		<p>
			As you might notice, using annotations typically results in fewer lines of code and are therefore usually 
			preferred over the API approach, but both are equally valid.
		</p>	
		<p>
			When you visit this page through the router page, you can see the following (after the automatic 
			redirection occurs):
		</p>
		<img class='bordered' src="doc-files/Samples.MethodExampleResource.1.png">
		<p>
			Notice how the conversion to POJOs is automatically done for us, even for non-standard POJOs such as UUID.
		</p>
		
		<h5 class='topic'>Self-documenting design through Swagger OPTIONS pages</h5>
		<p>
			One of the main features of Juneau is that it produces OPTIONS pages for self-documenting design (i.e. REST 
			interfaces that document themselves).
		</p>
		<p>
			Much of the information populated on the OPTIONS page is determined through reflection.
			This basic information can be augmented with information defined through:
		</p>
		<ul class='spaced-list'>
			<li>
				Annotations - An example of this was shown in the <code>SystemPropertiesResource</code> example above.
				<br>Localized strings can be pulled from resource bundles using the <code>$L</code> localization variable.
			<li>
				Resource bundle properties - Described in detail in this section.
			<li>
				Swagger JSON files with the same name and location as the resource class (e.g. 
				<code>MethodExampleResource.json</code>).
				<br>Localized versions are defined by appending the locale to the file name (e.g. 
				<code>MethodExampleResource_ja_JP.json</code>);
		</ul>
		<p>
			OPTIONS pages are simply serialized {@link org.apache.juneau.dto.swagger.Swagger} DTO beans.
			Localized versions of these beans are retrieved using the 
			{@link org.apache.juneau.rest.RestRequest#getSwagger()} method.
		</p>
		<p>
			To define an OPTIONS request handler, the {@link org.apache.juneau.rest.RestServletDefault} class defines 
			the following Java method:
		</p>
		
		<h5 class='figure'>RestServletDefault.java</h5>
		<p class='bcode'>
	<jd>/** OPTIONS request handler */</jd>
	<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>)
	<jk>public</jk> Swagger getOptions(RestRequest req) {
		<jk>return</jk> req.getSwagger();
	}			
		</p>
		<p>
			The <l>OPTIONS</l> link that you see on the HTML version of the page is created 
				through a property defined by the {@link org.apache.juneau.html.HtmlDocSerializer} class
				and specified on the resource class annotation:
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>(
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		)
	)
		</p>
		<p>
			This simply creates a link that's the same URL as the resource URL appended with <l>"?method=OPTIONS"</l>, 
				which is a shorthand way that the framework provides of defining overloaded GET requests.
			Links using relative or absolute URLs can be defined this way.
		</p>
		<p>
			Metadata about the servlet class is combined with localized strings from a properties file associated 
				through a <code><ja>@RestResource</ja>(messages=<js>"nls/MethodExampleResources"</js>)</code> annotation.  
			The properties file contains localized descriptions for the resource, resource methods, and method
				parameters.
		</p> 	
			
		<h5 class='figure'>MethodExampleResource.properties</h5>
		<p class='bcode'>
	<cc>#--------------------------------------------------------------------------------
	# MethodExampleResource labels
	#--------------------------------------------------------------------------------</cc>
	<ck>title = <cv>A simple REST method example resource</cv>
	
	<ck>doGetExample.summary</ck> = <cv>Sample GET method</cv>
	<ck>doGetExample1.summary</ck> = <cv>Sample GET using annotations</cv>
	<ck>doGetExample1.req.path.a1.description</ck> = <cv>Sample variable</cv>
	<ck>doGetExample1.req.path.a2.description</ck> = <cv>Sample variable</cv>
	<ck>doGetExample1.req.path.a3.description</ck> = <cv>Sample variable</cv>
	<ck>doGetExample1.req.query.p1.description</ck> = <cv>Sample parameter</cv>
	<ck>doGetExample1.req.query.p2.description</ck> = <cv>Sample parameter</cv>
	<ck>doGetExample1.req.query.p3.description</ck> = <cv>Sample parameter</cv>
	<ck>doGetExample1.req.header.Accept-Language.description</ck> = <cv>Sample header</cv>
	<ck>doGetExample1.req.header.DNT.description</ck> = <cv>Sample header</cv>
	<ck>doGetExample2.summary</ck> = <cv>Sample GET using Java APIs</cv>
	<ck>doGetExample2.req.path.a1.description</ck> = <cv>Sample variable</cv>
	<ck>doGetExample2.req.path.a2.description</ck> = <cv>Sample variable</cv>
	<ck>doGetExample2.req.path.a3.description</ck> = <cv>Sample variable</cv>
	<ck>doGetExample2.req.query.p1.description</ck> = <cv>Sample parameter</cv>
	<ck>doGetExample2.req.query.p2.description</ck> = <cv>Sample parameter</cv>
	<ck>doGetExample2.req.query.p3.description</ck> = <cv>Sample parameter</cv>
	<ck>doGetExample2.req.header.Accept-Language.description</ck> = <cv>Sample header</cv>
	<ck>doGetExample2.req.header.DNT.description</ck> = <cv>Sample header</cv>
	<ck>getOptions.summary</ck> = <cv>View these options</cv>
		</p>
		<p>
			Clicking the <l>options</l> link on the page presents you with information about how to use this resource:
		</p>
		<img class='bordered' src="doc-files/Samples.MethodExampleResource.2.png">
		<p>
			This page (like any other) can also be rendered in JSON or XML by using the <l>&amp;Accept</l> URL parameter.
		</p>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.UrlEncodedFormResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.4 - UrlEncodedFormResource</h4>
	<div class='topic'>
		<p>
			The <l>UrlEncodedFormResource</l> class provides examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				How to use form entry beans to process form POSTs.
			<li>
				How to use the {@link org.apache.juneau.rest.RestRequest#getClasspathReaderResource(String)} method to 
				serve up static files with embedded string variables.
		</ul>
		<p>
			The class is shown below:
		</p>
		
		<h5 class='figure'>UrlEncodedFormResource.java</h5>
		<p class='bcode'>
	<jd>/** 
	* Sample REST resource for loading URL-Encoded form posts into POJOs. 
	*/</jd> 
	<ja>@RestResource</ja>( 
		path=<js>"/urlEncodedForm"</js>, 
		messages=<js>"nls/UrlEncodedFormResource"</js>
	) 
	<jk>public class</jk> UrlEncodedFormResource <jk>extends</jk> Resource { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
		
		<jd>/** GET request handler */</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>) 
		<jk>public</jk> ReaderResource doGet(RestRequest req) <jk>throws</jk> IOException { 
			<jk>return</jk> req.getClasspathReaderResource(<js>"UrlEncodedForm.html"</js>, <jk>true</jk>); 
		} 
		
		<jd>/** POST request handler */</jd> 
		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/"</js>) 
		<jk>public</jk> Object doPost(<ja>@Body</ja> FormInputBean input) <jk>throws</jk> Exception { 
			<jc>// Just mirror back the request</jc> 
			<jk>return</jk> input; 
		} 
		
		<jk>public static class</jk> FormInputBean { 
			<jk>public</jk> String aString; 
			<jk>public int</jk> aNumber; 
			<ja>@BeanProperty</ja>(pojoSwaps=CalendarSwap.<jsf>ISO8601DT</jsf>.<jk>class</jk>) 
			<jk>public</jk> Calendar aDate; 
		} 
	}		
		</p>
		<p>
			The {@link org.apache.juneau.rest.RestRequest#getClasspathReaderResource(String,boolean)} method pulls in the following
				file located in the same package as the class:
		</p>
		
		<h5 class='figure'>UrlEncodedForm.html</h5>
		<b>TODO - Needs update</b>
		<p class='bcode'>
	<xt>&lt;html&gt;</xt> 
	<xt>&lt;head&gt;</xt> 
		<xt>&lt;meta</xt> <xa>http-equiv</xa>=<xs>"Content-Type"</xs> <xa>content</xa>=<xs>"text/html;charset=UTF-8"</xs><xt>&gt;</xt> 
		<xt>&lt;style</xt> <xa>type</xa>=<xs>'text/css'</xs><xt>&gt;</xt> 
			<xt>@import</xt> <xs>'$R{servletURI}/style.css'</xs>; 
		<xt>&lt;/style&gt;</xt> 
		<xt>&lt;script</xt> <xa>type</xa>=<xs>"text/javascript"</xs><xt>&gt;</xt> 
			<jc>// Load results from IFrame into this document.</jc> 
			<jk>function</jk> loadResults(buff) { 
				<jk>var</jk> doc = buff.contentDocument || buff.contentWindow.document; 
				<jk>var</jk> buffBody = doc.getElementById(<js>'data'</js>); 
				document.getElementById(<js>'results'</js>).innerHTML = buffBody.innerHTML; 
			} 
		<xt>&lt;/script&gt;</xt> 
	<xt>&lt;/head&gt;</xt> 
	<xt>&lt;body&gt;</xt> 
		<xt>&lt;h1&gt;</xt>$R{resourceTitle}<xt>&lt;/h1&gt;</xt> 
		<xt>&lt;h2&gt;</xt>$R{resourceDescription}<xt>&lt;/h2&gt;</xt> 
		<xt>&lt;div</xt> <xa>class</xa>=<xs>'data'</xs><xt>&gt;</xt> 
			<xt>&lt;form</xt> <xa>id</xa>=<xs>'form'</xs> <xa>action</xa>=<xs>'$R{servletURI}'</xs> <xa>method</xa>=<xs>'POST'</xs> <xa>target</xa>=<xs>'buff'</xs><xt>&gt;</xt> 
				<xt>&lt;table&gt;</xt> 
					<xt>&lt;tr&gt;</xt> 
						<xt>&lt;th&gt;</xt>$L{aString}<xt>&lt;/th&gt;</xt> 
						<xt>&lt;td&gt;</xt><xt>&lt;input</xt> <xa>name</xa>=<xs>"aString"</xs> <xa>type</xa>=<xs>"text"</xs><xt>&gt;</xt><xt>&lt;/td&gt;</xt> 
					<xt>&lt;/tr&gt;</xt> 
					<xt>&lt;tr&gt;</xt> 
						<xt>&lt;th&gt;</xt>$L{aNumber}<xt>&lt;/th&gt;</xt> 
						<xt>&lt;td&gt;</xt><xt>&lt;input</xt> <xa>name</xa>=<xs>"aNumber"</xs> <xa>type</xa>=<xs>"number"</xs><xt>&gt;</xt><xt>&lt;/td&gt;</xt> 
					<xt>&lt;/tr&gt;</xt> 
					<xt>&lt;tr&gt;</xt> 
						<xt>&lt;th&gt;</xt>$L{aDate}<xt>&lt;/th&gt;</xt> 
						<xt>&lt;td&gt;</xt><xt>&lt;input</xt> <xa>name</xa>=<xs>"aDate"</xs> <xa>type</xa>=<xs>"datetime"</xs><xt>&gt;</xt> (ISO8601, e.g. "<xt>&lt;code&gt;</xt>2001-07-04T15:30:45Z<xt>&lt;/code&gt;</xt>")<xt>&lt;/td&gt;</xt> 
					<xt>&lt;/tr&gt;</xt> 
						<xt>&lt;tr&gt;</xt> 
						<xt>&lt;td</xt> <xa>colspan</xa>=<xs>'2'</xs> <xa>align</xa>=<xs>'right'</xs><xt>&gt;</xt><xt>&lt;button</xt> <xa>type</xa>=<xs>"submit"</xs><xt>&gt;</xt>$L{submit}<xt>&lt;/button&gt;</xt><xt>&lt;/td&gt;</xt> 
					<xt>&lt;/tr&gt;</xt> 
				<xt>&lt;/table&gt;</xt> 
			<xt>&lt;/form&gt;</xt> 
			<xt>&lt;br&gt;</xt> 
			<xt>&lt;div</xt> <xa>id</xa>=<xs>'results'</xs><xt>&gt;</xt> 
			<xt>&lt;/div&gt;</xt> 
		<xt>&lt;/div&gt;</xt> 
		<xt>&lt;iframe</xt> <xa>name</xa>=<xs>'buff'</xs> <xa>style</xa>=<xs>'display:none'</xs> <xa>onload</xa>=<xs>"parent.loadResults(this)"</xs><xt>&gt;</xt><xt>&lt;/iframe&gt;</xt> 
	<xt>&lt;/body&gt;</xt> 
	<xt>&lt;/html&gt;</xt> 		
		</p>
		<p>
			The <l>$L</l> variables are string variable that pull in localized values from the resource bundle:
		</p>
		
		<h5 class='figure'>UrlEncodedFormResource.properties</h5>
		<p class='bcode'>
	<cc>#--------------------------------------------------------------------------------
	# UrlEncodedFormResource labels
	#--------------------------------------------------------------------------------</cc>
	<ck>title</ck> = <cv>URL-Encoded Form Post Example</cv>
	<ck>description</ck> = <cv>Shows how URL-Encoded form input can be loaded into POJOs.  POJO is simply echoed back.</cv>
	<ck>aString</ck> = <cv>A String:</cv>
	<ck>aNumber</ck> = <cv>A Number:</cv>
	<ck>aDate</ck> = <cv>A Date:</cv>
	<ck>submit</ck> = <cv>submit</cv>		
		</p>
		<p>
			The <l>$R</l> variables are request string variables.  
			In this case, <l>$R{resourceTitle}</l> and <l>$R{resourceDescription}</l> resolve to the values returned by 
			{@link org.apache.juneau.rest.RestRequest#getResourceTitle()} and 
			{@link org.apache.juneau.rest.RestRequest#getResourceDescription()}.
		</p>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.UrlEncodedFormResource.1.png'>
		<p>
			Entering some values and clicking <l>submit</l> causes the form bean to be populated
				and returned back as a POJO response:
		</p>
		<img class='bordered' src='doc-files/Samples.UrlEncodedFormResource.2.png'>
		<p>
			Another option is to construct the HTML form in Java using <a class='doclink' 
			href='org/apache/juneau/dto/html5/package-summary.html#TOC'>HTML5 beans</a>.
			This is arguably a better approach since it's typically cleaner with less code, and the headers/links
			are already part of the page.
		</p>
		<p class='bcode'>
	<jk>import static</jk> org.apache.juneau.dto.html5.HtmlBuilder.*;

	<jd>/** GET request handler */</jd>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
	<jk>public</jk> Div doGet(RestRequest req) {
		<jk>return</jk> div(
			script(<js>"text/javascript"</js>,
				<js>"\n	// Load results from IFrame into this document."</js>
				+<js>"\n	function loadResults(buff) {"</js>
				+<js>"\n		var doc = buff.contentDocument || buff.contentWindow.document;"</js>
				+<js>"\n		var buffBody = doc.getElementById('data');"</js>
				+<js>"\n		document.getElementById('results').innerHTML = buffBody.innerHTML;"</js>
				+<js>"\n	}"</js>
			),
			<jsf>form</jsf>().id(<js>"form"</js>).action(req.getServletURI()).method(<jsf>POST</jsf>).target(<js>"buff"</js>).children(
				<jsf>table</jsf>(
					<jsf>tr</jsf>(
						<jsf>th</jsf>(req.getMessage(<js>"aString"</js>)),
						<jsf>td</jsf>(<jsf>input</jsf>().name(<js>"aString"</js>).type(<js>"text"</js>))
					),
					<jsf>tr</jsf>(
						<jsf>th</jsf>(req.getMessage(<js>"aNumber"</js>)),
						<jsf>td</jsf>(<jsf>input</jsf>().name(<js>"aNumber"</js>).type(<js>"number"</js>))
					),
					<jsf>tr</jsf>(
						<jsf>th</jsf>(req.getMessage(<js>"aDate"</js>)),
						<jsf>td</jsf>(<jsf>input</jsf>().name(<js>"aDate"</js>).type(<js>"datetime"</js>), <js>" (ISO8601, e.g. "</js>, code(<js>"2001-07-04T15:30:45Z"</js>), <js>\" )"</js>)
					),
					<jsf>tr</jsf>(
						<jsf>td</jsf>().colspan(2).style(<js>"text-align:right"</js>).children(
							<jsf>button</jsf>(<js>"submit"</js>, req.getMessage(<js>"submit"</js>))
						)
					)
				)
			),
			<jsf>br</jsf>(),
			<jsf>div</jsf>().id(<js>"results"</js>),
			<jsf>iframe</jsf>().name(<js>"buff"</js>).style(<js>"display:none"</js>).onload(<js>"parent.loadResults(this)"</js>)
		);
	}
		</p>
		
		<h5 class='toc'>Additional Information</h5>
		<ul class='toc'>
			<li class='jm'>
				{@link org.apache.juneau.rest.RestContextBuilder#vars(Class[])} 
				- Servlet and request variables.
			<li class='jm'>
				{@link org.apache.juneau.rest.RestCallHandler#getSessionObjects(RestRequest)} 
				- Var resolver session objects.
		</ul>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.RequestEchoResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.5 - RequestEchoResource</h4>
	<div class='topic'>
		<p>
			The <l>RequestEchoResource</l> class shows how existing complex POJOs can be serialized to a variety of 
			content types.
			The example simply takes the incoming <l>HttpServletRequest</l> object and serializes it. 
		</p>
		<p>
			It provides examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				Using the {@link org.apache.juneau.rest.annotation.RestResource#properties() @RestResource.properties()}
				annotation to set serializer properties.
			<li>
				Using the {@link org.apache.juneau.rest.annotation.RestResource#beanFilters() @RestResource.beanFilters()} 
				and {@link org.apache.juneau.rest.annotation.RestResource#pojoSwaps() @RestResource.pojoSwaps()}
				annotations to set serializer transforms.
			<li>
				Simply passing in an {@link org.apache.juneau.ObjectMap} parameter on the Java method.
				<br>This object map contains the modifiable properties on the request. 
		</ul>
		<p>
			The class is shown below:
		</p>
		
		<h5 class='figure'>RequestEchoResource.java</h5>
		<p class='bcode'>
	<jd>/** 
	 * Sample REST resource for echoing HttpServletRequests back to the browser
	 */</jd>
	<ja>@RestResource</ja>(
		path=<js>"/echo"</js>,
		messages=<js>"nls/RequestEchoResource"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		),
		properties={
			<ja>@Property</ja>(name=<jsf>SERIALIZER_maxDepth</jsf>, value=<js>"10"</js>),
			<ja>@Property</ja>(name=<jsf>SERIALIZER_detectRecursions</jsf>, value=<js>"true"</js>)
		},
		beanFilters={
			<jc>// Interpret these as their parent classes, not subclasses</jc>
			HttpServletRequest.<jk>class</jk>, HttpSession.<jk>class</jk>, ServletContext.<jk>class</jk>,
		},
		pojoSwaps={
			<jc>// Add a special POJO swap for Enumerations</jc>
			EnumerationSwap.<jk>class</jk>
		}
	)
	<jk>public class</jk> RequestEchoResource <jk>extends</jk> Resource {
	
		<jd>/** GET request handler */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>, converters={Queryable.<jk>class</jk>,Traversable.<jk>class</jk>})
		<jk>public</jk> HttpServletRequest doGet(RestRequest req, RestResponse res, ObjectMap properties) {
			<jc>// Set the HtmlDocSerializer title programmatically.</jc>
			res.setPageTitle(req.getPathInfo());
			
			<jc>// Just echo the request back as the response.</jc>
			<jk>return</jk> req;
		}
	}
		</p>
		<p>
			Again, there's a lot going on here that's new that requires some explanation.
			The <l>HttpServletRequest</l> object is not a tree-shaped POJO model.  
			Instead, it contains lots of loops that can cause stack overflow errors if you were to try
				to serialize it as-is.
			Also, you want to look only at the properties defined on the <l>HttpServletRequest</l> class, 
				not implementation-specific (i.e. WAS or Jetty) fields which can get messy.
		</p>
		<p>
			The {@link org.apache.juneau.rest.annotation.RestResource#properties() @RestResource.properties()}, 
				{@link org.apache.juneau.rest.annotation.RestResource#beanFilters() @RestResopurce.beanFilters()}, and
				{@link org.apache.juneau.rest.annotation.RestResource#pojoSwaps() @RestResopurce.pojoSwaps()} 
				annotations are used to set behavior properties on the resource's underlying bean context, serializers, 
				and parsers.  
			You're using them here to modify the behavior of serialization for all content types.  
			The annotations are functionally equivalent to using the {@link org.apache.juneau.rest.RestContextBuilder} class, 
			as follows:
		</p>
		
		<h5 class='figure'>Hypothetical RequestEchoResource.createSerializers() method</h5>
		<p class='bcode'>
	<jd>/** Override the default rest serializers to add some transforms through an INIT hook*/</jd>
	<ja>@RestHook</ja>(<jsf>INIT</jsf>)
	<jk>public void</jk> init(RestContextBuilder builder) throws Exception {
		<jc>// Add bean filters for the HttpServletRequest, HttpSession, and ServletContext objects
		//		so that you don't show vendor-specific properties on subclasses.
		// Add Enumeration POJO swap to be able to render the contents of Enumeration properties.
		// The max depth and detect recursion options prevent any possible runaway serializations.  
		// This shouldn't happen, but future JEE APIs may introduce deep hierarchies or loops.</jc>
		builder
			.beanFilters(HttpServletRequest.<jk>class</jk>, HttpSession.<jk>class</jk>, ServletContext.<jk>class</jk>)
			.pojoSwaps(EnumerationSwap.<jk>class</jk>)
			.setProperty(<jsf>SERIALIZER_maxDepth</jsf>, 10)
			.setProperty(<jsf>SERIALIZER_detectRecursions</jsf>, <jk>true</jk>)
			.pageLinks(<js>"{...}"</js>);
	}
		</p>
		<p>
			Note how the annotations generally require fewer lines of code.
		</p>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		
		<img class='bordered' src="doc-files/Samples.RequestEchoResource.1.png">
		<p>
			This gives you an idea of what kinds of POJO models can be serialized, since you are serializing a regular 
			old <l>HttpServletRequest</l> object.
		</p>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.AddressBookResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.6 - AddressBookResource</h4>
	<div class='topic'>
		<p>
			The <l>AddressBookResource</l> class is a proof-of-concept class that shows a true RESTful API using the 
			Juneau REST toolkit.  
			It provides examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				How to create RESTful interfaces using only POJOs.
			<li>
				How to use the {@link org.apache.juneau.xml.annotation.Xml @Xml} and
				{@link org.apache.juneau.xml.annotation.XmlSchema @XmlSchema} annotations to provide XML namespaces
				and alter how beans are handled by the XML serializer. 
			<li>
				How to use the {@link org.apache.juneau.jena.annotation.Rdf @Rdf} and
				{@link org.apache.juneau.xml.annotation.XmlSchema @RdfSchema} annotations to provide XML namespaces
				and alter how beans are handled by the Jena serializers. 
			<li>
				How to use the {@link org.apache.juneau.annotation.BeanProperty @BeanProperty} annotation
				to alter how bean properties are handled by the serializers.
			<li>
				How to use the {@link org.apache.juneau.rest.annotation.RestMethod#name() RestMethod.name()} annotation
				to create overloaded methods beyond the standard GET/PUT/POST/DELETE.
			<li>
				How to augment data in the OPTIONS page.
			<li>
				How to use the {@link org.apache.juneau.rest.client.RestClient} API to interact with the REST resource 
				using the same POJOs used to create the server-side API.
			<li>
				How to interact with the REST resource using only a browser.
			<li>
				Using the {@link org.apache.juneau.rest.converters.Traversable} converter to drill down into POJO models.
			<li>
				Using the {@link org.apache.juneau.rest.converters.Queryable} converter to provide search/view/sort 
				functionality against POJOs.
			<li>
				Using the {@link org.apache.juneau.rest.converters.Introspectable} converter to invoke methods on POJOs.
			<li>
				Using proxy interfaces.
		</ul>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.AddressBookResource.1.png'>
		
		<!-- ======================================================================================================= -->
		<a id="juneau-examples-rest.AddressBookResource.Classes"></a>
		<h4 class='topic' onclick='toggle(this)'>12.6.1 - Classes</h4>
		<div class='topic'>
			<p>
				The code is straightforward, consisting of the following classes:
			</p>
			<ul class='spaced-list'>
				<li>
					<l>package-info.java</l> - Used to define XML namespaces for POJOs in this package.
				<li>
					<l>IAddressBook</l> - An interface describing the address book.
				<li>
					<l>AddressBook</l> - A data structure consisting of a list of <code>Persons</code>.
				<li>
					<l>Person, Address</l> - In-memory representations of people and addresses.
				<li>
					<l>CreatePerson, CreateAddress</l> - POJOs for creating and updating people and address through the 
					REST interface.
				<li>
					<l>AddressBookResource</l> - The REST resource class.
			</ul>  
			<ul class='doctree'>
				<li class='info'>
					For the sake of brevity, bean properties are defined as public fields instead of the normal 
					getters/setters.
					Also, the examples are not the most efficient design and are not thread safe.
			</ul>		
			<p>
				The <l>package-info.java</l> file is used to define XML and RDF namespaces on beans and properties in 
				this package.
				Here you define a default XML and RDF namespaces and URL mappings for namespace short-names used 
				throughout this package.
				It should be noted that these features are entirely optional, and there are often several ways of 
				defining these namespaces.
			</p>
			
			<h5 class='figure'>package-info.java</h5>
			<p class='bcode'>		
	<jc>// XML and RDF namespaces used in this package</jc>
	<ja>@Xml</ja>(ns=<js>"ab"</js>,
		namespaces={
			<ja>@XmlNs</ja>(name=<js>"ab"</js>, uri=<js>"http://www.apache.org/addressBook/"</js>),
			<ja>@XmlNs</ja>(name=<js>"per"</js>, uri=<js>"http://www.apache.org/person/"</js>),
			<ja>@XmlNs</ja>(name=<js>"addr"</js>, uri=<js>"http://www.apache.org/address/"</js>),
			<ja>@XmlNs</ja>(name=<js>"mail"</js>, uri=<js>"http://www.apache.org/mail/"</js>)
		}
	)
	<ja>@Rdf</ja>(ns=<js>"ab"</js>,
		namespaces={
			<ja>@RdfNs</ja>(name=<js>"ab"</js>, uri=<js>"http://www.apache.org/addressBook/"</js>),
			<ja>@RdfNs</ja>(name=<js>"per"</js>, uri=<js>"http://www.apache.org/person/"</js>),
			<ja>@RdfNs</ja>(name=<js>"addr"</js>, uri=<js>"http://www.apache.org/address/"</js>),
			<ja>@RdfNs</ja>(name=<js>"mail"</js>, uri=<js>"http://www.apache.org/mail/"</js>)
		}
	)
	<jk>package</jk> org.apache.juneau.examples.addressBook;
	<jk>import</jk> org.apache.juneau.xml.annotation.*;
			</p>
			<p> 
				Our address book uses the following interface:
			</p>	
			
			<h5 class='figure'>IAddressBook.java</h5>
			<p class='bcode'>
	<jd>/** 
	* Interface used to help illustrate proxy interfaces. 
	* See {<ja>@link</ja> SampleRemoteableServlet}. 
	*/</jd> 
	<jk>public interface</jk> IAddressBook { 
	
		<jd>/** Return all people in the address book */</jd> 
		List&lt;Person&gt; getPeople(); 
		
		<jd>/** Return all addresses in the address book */</jd> 
		List&lt;Address&gt; getAddresses(); 
		
		<jd>/** Create a person in this address book */</jd> 
		Person createPerson(CreatePerson cp) <jk>throws</jk> Exception; 
		
		<jd>/** Find a person by id */</jd> 
		Person findPerson(<jk>int</jk> id); 
		
		<jd>/** Find an address by id */</jd> 
		Address findAddress(<jk>int</jk> id); 
		
		<jd>/** Find a person by address id */</jd> 
		Person findPersonWithAddress(<jk>int</jk> id); 
		
		<jd>/** Remove a person by id */</jd> 
		Person removePerson(<jk>int</jk> id); 
	} 
			</p>
			
			<h5 class='topic'>Notes</h5>
			<ul class='spaced-list'>
				<li>
					You interface an interface for our address book so that you can later
					use it to demonstrate the proxy interface support.
			</ul>
			<p> 
				The <l>AddressBook</l> class is our address book.  
				It maintains a list of <l>Person</l> objects with some additional convenience methods:
			</p>	
			
			<h5 class='figure'>AddressBook.java</h5>
			<p class='bcode'>
	<jd>/** Address book bean */</jd>
	<jk>public class</jk> AddressBook <jk>extends</jk> LinkedList&lt;Person&gt; <jk>implements</jk> IAddressBook {
	
		<jc>// The URL of this resource</jc>
		<jk>private</jk> URI <jf>uri</jf>;

		<jd>/** Bean constructor - Needed for instantiating on client side */</jd>
		<jk>public</jk> AddressBook () {}

		<jd>/** Normal constructor - Needed for instantiating on server side */</jd>
		<jk>public</jk> AddressBook (URI uri) {...}
		
		<ja>@Override</ja> <jc>/* IAddressBook */</jc>
		<jk>public</jk> List&lt;Person&gt; getPeople() { 
			<jk>return</jk> <jk>this</jk>; 
		} 
		
		<ja>@Override</ja> <jc>/* IAddressBook */</jc>
		<jk>public</jk> Person createPerson(CreatePerson cp) <jk>throws</jk> Exception { 
			Person p = <jk>new</jk> Person(uri, cp); 
			add(p); 
			<jk>return</jk> p; 
		} 
		
		<ja>@Override</ja> <jc>/* IAddressBook */</jc>
		<jk>public</jk> Person findPerson(<jk>int</jk> id) { 
			<jk>for</jk> (Person p : <jk>this</jk>) 
				<jk>if</jk> (p.<jf>id</jf> == id) 
					<jk>return</jk> p; 
			<jk>return null</jk>; 
		} 
		
		<ja>@Override</ja> <jc>/* IAddressBook */</jc>
		<jk>public</jk> Address findAddress(<jk>int</jk> id) { 
			<jk>for</jk> (Person p : <jk>this</jk>) 
				<jk>for</jk> (Address a : p.<jf>addresses</jf>) 
					<jk>if</jk> (a.<jf>id</jf> == id) 
						<jk>return</jk> a; 
			<jk>return null</jk>; 
		} 
		
		<ja>@Override</ja> <jc>/* IAddressBook */</jc>
		<jk>public</jk> Person findPersonWithAddress(<jk>int</jk> id) { 
			<jk>for</jk> (Person p : <jk>this</jk>) 
				<jk>for</jk> (Address a : p.<jf>addresses</jf>) 
					<jk>if</jk> (a.<jf>id</jf> == id) 
					<jk>return</jk> p; 
			<jk>return null</jk>; 
		} 
		
		<ja>@Override</ja> <jc>/* IAddressBook */</jc>
		<jk>public</jk> List&lt;Address&gt; getAddresses() { 
			Set&lt;Address&gt; s = <jk>new</jk> LinkedHashSet&lt;Address&gt;(); 
			<jk>for</jk> (Person p : <jk>this</jk>) 
				<jk>for</jk> (Address a : p.<jf>addresses</jf>) 
					s.add(a); 
			<jk>return new</jk> ArrayList&lt;Address&gt;(s); 
		} 
		
		<ja>@Override</ja> <jc>/* IAddressBook */</jc>
		<jk>public</jk> Person removePerson(<jk>int</jk> id) { 
			Person p = findPerson(id); 
			<jk>if</jk> (p != <jk>null</jk>) 
				remove(p); 
			<jk>return</jk> p; 
		} 
		
		<jd>/** Utility method */</jd> 
		<jk>public static</jk> Calendar toCalendar(String birthDate) <jk>throws</jk> Exception { 
			Calendar c = <jk>new</jk> GregorianCalendar(); 
			c.setTime(DateFormat.<jsm>getDateInstance</jsm>(DateFormat.<jsf>MEDIUM</jsf>, 
				Locale.<jsf>US</jsf>).parse(birthDate)); 
			<jk>return</jk> c; 
		}
	} 
			</p>
			
			<h5 class='topic'>Notes</h5>
			<ul class='spaced-list'>
				<li>
					The <code><ja>@Xml</ja>(elementName=<js>"addressBook"</js>)</code> annotation tells the toolkit that 
					when serialized as XML, the element name is <xt>&lt;addressBook&gt;</xt>. 
					Without this annotation, the element would revert to the generalized <xt>&lt;array&gt;</xt> tag.
				<li>
					The separate constructors are implementation specific and are needed because you're going to be 
					using this class in two ways, since you'll be demonstrating the client code as well as the server 
					code, and it eliminates having to define separate client-side and server-side POJOs:
					<ol>
						<li>The normal constructor is used to programmatically create this object in the REST servlet code.
						<li>The no-arg constructor is used by the Juneau parsers to construct this object in our client 
						side code.
					</ol>
				</li>
			</ul>
			<p>	
				The <l>Person</l> bean is defined as follows:
			</p>
			
			<h5 class='figure'>Person.java</h5>
			<p class='bcode'>
	<jd>/** Person bean */</jd>
	<ja>@Xml</ja>(ns=<js>"per"</js>)
	<ja>@Rdf</ja>(prefix=<js>"per"</js>)
	<ja>@Bean</ja>(typeName=<js>"person"</js>)
	<jk>public class</jk> Person {
	
		<jk>private static int</jk> <jsf>nextPersonId</jsf> = 1;

		<jc>// Bean properties.</jc>
		<ja>@Rdf</ja>(beanUri=<jk>true</jk>) public URI <jf>uri</jf>;
		<jk>public</jk> URI <jf>addressBookUri</jf>;
		<jk>public</jk> String <jf>id</jf>;
		<jk>public</jk> String <jf>name</jf>;
		<ja>@BeanProperty</ja>(swap=CalendarSwap.Medium.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
		<jk>public</jk> LinkedList&lt;Address&gt; <jf>addresses</jf> = new LinkedList&lt;Address&gt;();
		
		<jd>/** Bean constructor - Needed for instantiating on server side */</jd> 
		<jk>public</jk> Person() {} 
		
		<jd>/** Normal constructor - Needed for instantiating on client side */</jd> 
		<jk>public</jk> Person(URI addressBookUri, CreatePerson cp) <jk>throws</jk> Exception { 
			<jk>this</jk>.<jf>id</jf> = <jsf>nextPersonId</jsf>++; 
			<jk>this</jk>.<jf>addressBookUri</jf> = addressBookUri; 
			<jk>if</jk> (addressBookUri != <jk>null</jk>) 
				<jk>this</jk>.<jf>uri</jf> = addressBookUri.resolve(<js>"people/"</js> + <jf>id</jf>); 
			<jk>this</jk>.<jf>name</jf> = cp.<jf>name</jf>; 
			<jk>this</jk>.<jf>birthDate</jf> = cp.<jf>birthDate</jf>; 
			<jk>for</jk> (CreateAddress ca : cp.<jf>addresses</jf>) 
				<jk>this</jk>.<jf>addresses</jf>.add(<jk>new</jk> Address(addressBookUri, <jf>uri</jf>, ca)); 
		} 
		
		<jd>/** Extra read-only bean property */</jd> 
		<jk>public int</jk> getAge() { 
			<jk>return new</jk> GregorianCalendar().get(Calendar.<jsf>YEAR</jsf>) - birthDate.get(Calendar.<jsf>YEAR</jsf>); 
		} 
		
		<jd>/** Convenience method - Add an address for this person */</jd> 
		<jk>public</jk> Address createAddress(CreateAddress ca) <jk>throws</jk> Exception { 
			Address a = <jk>new</jk> Address(<jf>addressBookUri</jf>, <jf>uri</jf>, ca); 
			<jf>addresses</jf>.add(a); 
			<jk>return</jk> a; 
		} 
		
		<jd>/** Extra method (for method invocation example) */</jd> 
		<jk>public</jk> String sayHello(String toPerson, <jk>int</jk> age) { 
			<jk>return</jk> <jf>name</jf> + <js>" says hello to "</js> + toPerson + <js>" who is "</js> 
				+ age + <js>" years old"</js>; 
		} 
	}
			</p>
			
			<h5 class='topic'>Notes</h5>
			<ul class='spaced-list'>
				<li>
					The <l>ns="per"</l> annotations override the default <l>"ab"</l> namespace defined on the package.
					It applies to this class and all properties of this class.
				<li>
					The <code><ja>@Rdf</ja>(beanUri=<jk>true</jk>)</code> annotation identifies the <l>uri</l> property 
					as the resource URI for this resource.  
					This property has special meaning for the RDF serializer.  
					The RDF serializer uses this property for the value of the <l>rdf:resource</l> attribute.
				<li>
					The <code><ja>@BeanProperty</ja>(swap=CalendarSwap.Medium.<jk>class</jk>)</code> annotation causes 
					the date field to be serialized in the format <l>"MM dd, yyyy"</l>.
					This could have also been specified globally on the resource level through the 
					{@link org.apache.juneau.rest.annotation.RestResource#properties} annotation.
			</ul>
			<p>	
				The <l>Address</l> bean is defined as follows:
			</p>
			
			<h5 class='figure'>Address.java</h5>
			<p class='bcode'>
	<jd>/** 
	* Address bean 
	*/</jd> 
	<ja>@Xml</ja>(prefix=<js>"addr"</js>) 
	<ja>@Rdf</ja>(prefix=<js>"addr"</js>) 
	<ja>@Bean</ja>(typeName=<js>"address"</js>) 
	<jk>public class</jk> Address { 
		
		<jk>private static int</jk> <jsf>nextAddressId</jsf> = 1; 
		
		<jc>// Bean properties</jc> 
		<ja>@Rdf</ja>(beanUri=<jk>true</jk>) <jk>public</jk> URI <jf>uri</jf>; 
		<jk>public</jk> URI <jf>personUri</jf>; 
		<jk>public int</jk> <jf>id</jf>; 
		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <ja>@Rdf</ja>(prefix=<js>"mail"</js>) 
		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>; 
		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <ja>@Rdf</ja>(prefix=<js>"mail"</js>) 
		<jk>public int</jk> <jf>zip</jf>; 
		<jk>public boolean</jk> <jf>isCurrent</jf>; 
		
		<jd>/** Bean constructor - Needed for instantiating on client side */</jd> 
		<jk>public</jk> Address() {} 
		
		<jd>/** Normal constructor - Needed for instantiating on server side */</jd> 
		<jk>public</jk> Address(URI addressBookUri, URI personUri, CreateAddress ca) <jk>throws</jk> Exception { 
			<jk>this</jk>.<jf>id</jf> = <jsf>nextAddressId</jsf>++; 
			<jk>if</jk> (addressBookUri != <jk>null</jk>) 
				<jk>this</jk>.<jf>uri</jf> = addressBookUri.resolve(<js>"addresses/"</js> + <jf>id</jf>); 
			<jk>this</jk>.<jf>personUri</jf> = personUri</jf>; 
			<jk>this</jk>.<jf>street</jf> = ca.<jf>street</jf>; 
			<jk>this</jk>.<jf>city</jf> = ca.<jf>city</jf>; 
			<jk>this</jk>.<jf>state</jf> = ca.<jf>state</jf>; 
			<jk>this</jk>.<jf>zip</jf> = ca.<jf>zip</jf>; 
			<jk>this</jk>.<jf>isCurrent</jf> = ca.<jf>isCurrent</jf>; 
		} 
	}
			</p>
			
			<h5 class='topic'>Notes</h5>
			<ul class='spaced-list'>
				<li>
					This class shows how the namespace can be overridden at the property level through the 
					<code><ja>@Xml</ja>(ns=<js>"mail"</js>)</code> annotation.
			</ul>
			<p>	
				The <l>CreatePerson</l> bean is used as the input data for creating a person.
			</p>
			
			<h5 class='figure'>CreatePerson.java</h5>
			<p class='bcode'>
	<jd>/** Bean for creating a new person */</jd>
	<ja>@Xml</ja>(ns=<js>"per"</js>)
	<ja>@Rdf</ja>(ns=<js>"addr"</js>)
	<ja>@Bean</ja>(typeName=<js>"person"</js>)
	<jk>public class</jk> CreatePerson {
		
		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>name</jf>;
		<ja>@BeanProperty(</ja>swap=CalendarSwap.Medium.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
		<jk>public</jk> LinkedList&lt;CreateAddress&gt; <jf>addresses</jf>;
		
		<jd>/** Bean constructor - Needed for instantiating on server side */</jd>
		<jk>public</jk> CreatePerson() {}
		
		<jd>/** Normal constructor - Needed for instantiating on client side */</jd>
		<jk>public</jk> CreatePerson(String name, Calendar birthDate, CreateAddress...addresses) {...}
	}
			</p>
			<p>	
				The <l>CreateAddress</l> bean is used as the input data for creating an address.
			</p>
			
			<h5 class='figure'>CreateAddress.java</h5>
			<p class='bcode'>
	<jd>/** Bean for creating a new address */</jd>
	<ja>@Xml</ja>(ns=<js>"addr"</js>)
	<ja>@Rdf</ja>(ns=<js>"addr"</js>)
	<ja>@Bean</ja>(typeName=<js>"address"</js>)
	<jk>public class</jk> CreateAddress {
	
		<jc>// Bean properties</jc>
		<ja>@Xml</ja>(ns=<js>"mail"</js>) <ja>@Rdf</ja>(ns=<js>"mail"</js>) 
		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>, <jf>state</jf>;
		<ja>@Xml</ja>(ns=<js>"mail"</js>) <ja>@Rdf</ja>(ns=<js>"mail"</js>) 
		<jk>public int</jk> <jf>zip</jf>;
		<jk>public boolean</jk> <jf>isCurrent</jf>;
		
		<jd>/** Bean constructor -Needed for instantiating on server side */</jd>
		<jk>public</jk> CreateAddress() {}
		
		<jd>/** Normal constructor - Needed for instantiating on client side */</jd>
		<jk>public</jk> CreateAddress(String street, String city, String state, <jk>int</jk> zip, 
			<jk>boolean</jk> isCurrent) {...}
	}
			</p>
			<p>
				The <l>AddressBookResource</l> class is our REST resource class. 
			</p>
			
			<h5 class='figure'>AddressBookResource.java</h5>
			<p class='bcode'>
	<jd>/** 
	* Proof-of-concept resource that shows off the capabilities of working with POJO resources. 
	* Consists of an in-memory address book repository. 
	*/</jd> 
	<ja>@RestResource</ja>( 
		path=<js>"/addressBook"</js>, 
		messages=<js>"nls/AddressBookResource"</js>, 

		<jc>// Links on the HTML rendition page.
		// "request:/..." URIs are relative to the request URI.
		// "servlet:/..." URIs are relative to the servlet URI.
		// "$C{...}" variables are pulled from the config file.</jc>
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>,
				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java"</js>
			}
		),

		<jc>// Allow INIT as a method parameter.</jc>
		allowedMethodParams=<js>"*"</js>,
	
		<jc>// Properties that get applied to all serializers and parsers.</jc>
		properties={
			
			<jc>// Use single quotes.</jc>
			<ja>@Property</ja>(name=<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>),
			
			<jc>// Make RDF/XML readable.</jc>
			<ja>@Property</ja>(name=<jsf>RDF_rdfxml_tab</jsf>, value=<js>"5"</js>),
			
			<jc>// Make RDF parsable by adding a root node.</jc>
			<ja>@Property</ja>(name=<jsf>RDF_addRootProperty</jsf>, value=<js>"true"</js>),
			
			<jc>// Make URIs absolute so that we can easily reference them on the client side.</jc>
			<ja>@Property</ja>(name=<jsf>SERIALIZER_uriResolution</jsf>, value=<js>"ABSOLUTE"</js>)
		
			<jc>// Make the anchor text on URLs be just the path relative to the servlet.</jc>
			<ja>@Property</ja>(name=<jsf>HTML_uriAnchorText</jsf>, value=<js>"SERVLET_RELATIVE"</js>)
		},
		
		<jc>// Our stylesheet for the HTML rendition.</jc>
		stylesheet=<js>"styles/devops.css"</js>,
		
		<jc>// Support GZIP encoding on Accept-Encoding header.</jc>
		encoders=GzipEncoder.<jk>class</jk>,
		
		<jc>// Swagger info.</jc>
		contact=<js>"{name:'John Smith',email:'john@smith.com'}"</js>,
		license=<js>"{name:'Apache 2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'}"</js>,
		version=<js>"2.0"</js>,
		termsOfService=<js>"You're on your own."</js>,
		tags=<js>"[{name:'Java',description:'Java utility',externalDocs:{description:'Home page',
			url:'http://juneau.apache.org'}}]"</js>,
		externalDocs=<js>"{description:'Home page',url:'http://juneau.apache.org'}"</js>
	) 
	<jk>public class</jk> AddressBookResource <jk>extends</jk> ResourceJena { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
		
		<jc>// The in-memory address book</jc> 
		<jk>private</jk> AddressBook <jf>addressBook</jf>; 
		
		<ja>@Override</ja> /* Servlet */ 
		<jk>public void</jk> init() { 
		
			<jk>try</jk> { 
				<jc>// Create the address book</jc> 
				<jf>addressBook</jf> = <jk>new</jk> AddressBook(java.net.URI.create(<js>"servlet:/"</js>)); 
				
				<jc>// Add some people to our address book by default</jc> 
				<jf>addressBook</jf>.createPerson( 
					<jk>new</jk> CreatePerson( 
						<js>"Barack Obama"</js>, 
						<jsm>toCalendar</jsm>(<js>"Aug 4, 1961"</js>), 
						<jk>new</jk> CreateAddress(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, 
							<js>"DC"</js>, 20500, <jk>true</jk>), 
						<jk>new</jk> CreateAddress(<js>"5046 S Greenwood Ave"</js>, <js>"Chicago"</js>, 
							<js>"IL"</js>, 60615, <jk>false</jk>) 
					) 
				); 
				<jf>addressBook</jf>.createPerson( 
					<jk>new</jk> CreatePerson( 
						<js>"George Walker Bush"</js>, 
						<jsm>toCalendar</jsm>(<js>"Jul 6, 1946"</js>), 
						<jk>new</jk> CreateAddress(<js>"43 Prairie Chapel Rd"</js>, <js>"Crawford"</js>, 
							<js>"TX"</js>, 76638, <jk>true</jk>), 
						<jk>new</jk> CreateAddress(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, 
							<js>"DC"</js>, 20500, <jk>false</jk>) 
					) 
				); 
			
			} <jk>catch</jk> (Exception e) { 
				<jk>throw new</jk> RuntimeException(e); 
			} 
		} 
		
		<jd>/** 
		* [GET /] 
		* Get root page. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>, 
			converters=Queryable.<jk>class</jk> 
		) 
		<jk>public</jk> Link[] getRoot() <jk>throws</jk> Exception { 
			<jk>return new</jk> Link[] { 
				<jk>new</jk> Link(<js>"people"</js>, <js>"people"</js>), 
				<jk>new</jk> Link(<js>"addresses"</js>, <js>"addresses"</js>) 
			}; 
		} 
		
		<jd>/** 
		* [GET /people/*] 
		* Get all people in the address book. 
		* Traversable transforming enabled to allow nodes in returned POJO tree to be addressed. 
		* Introspectable transforming enabled to allow public methods on the returned object to be invoked. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/people/*"</js>, 
			converters={Traversable.<jk>class</jk>,Queryable.<jk>class</jk>,Introspectable.<jk>class</jk>} 
		) 
		<jk>public</jk> AddressBook getAllPeople() <jk>throws</jk> Exception { 
			<jk>return</jk> <jf>addressBook</jf>;
		} 
		
		<jd>/** 
		* [GET /people/{id}/*] 
		* Get a single person by ID. 
		* Traversable transforming enabled to allow nodes in returned POJO tree to be addressed. 
		* Introspectable transforming enabled to allow public methods on the returned object to be invoked. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/people/{id}/*"</js>, 
			converters={Traversable.<jk>class</jk>,Queryable.<jk>class</jk>,Introspectable.<jk>class</jk>} 
		) 
		<jk>public</jk> Person getPerson(<ja>@Path</ja> <jk>int</jk> id) <jk>throws</jk> Exception { 
			<jk>return</jk> findPerson(id); 
		} 
		
		<jd>/** 
		* [GET /addresses/*] 
		* Get all addresses in the address book. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/addresses/*"</js>, 
			converters={Traversable.<jk>class</jk>,Queryable.<jk>class</jk>} 
		) 
		<jk>public</jk> List&lt;Address&gt; getAllAddresses() <jk>throws</jk> Exception { 
			<jk>return</jk> <jf>addressBook</jf>.getAddresses(); 
		} 
		
		<jd>/** 
		* [GET /addresses/{id}/*] 
		* Get a single address by ID. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/addresses/{id}/*"</js>, 
			converters={Traversable.<jk>class</jk>,Queryable.<jk>class</jk>} 
		) 
		<jk>public</jk> Address getAddress(<ja>@Path</ja> <jk>int</jk> id) <jk>throws</jk> Exception { 
			<jk>return</jk> findAddress(id); 
		} 
		
		<jd>/** 
		* [POST /people] 
		* Create a new Person bean. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/people"</js>, 
			guards=AdminGuard.<jk>class</jk> 
		) 
		<jk>public</jk> Redirect createPerson(<ja>@Body</ja> CreatePerson cp) <jk>throws</jk> Exception { 
		Person p = <jf>addressBook</jf>.createPerson(cp); 
			<jk>return new</jk> Redirect(<js>"people/{0}"</js>, p.id); 
		} 
		
		<jd>/** 
		* [POST /people/{id}/addresses] 
		* Create a new Address bean. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/people/{id}/addresses"</js>, 
			guards=AdminGuard.<jk>class</jk> 
		) 
		<jk>public</jk> Redirect createAddress(<ja>@Path</ja> <jk>int</jk> id, <ja>@Body</ja> CreateAddress ca) <jk>throws</jk> Exception { 
			Person p = findPerson(id); 
			Address a = p.createAddress(ca); 
			<jk>return new</jk> Redirect(<js>"addresses/{0}"</js>, a.id); 
		} 
		
		<jd>/** 
		* [DELETE /people/{id}] 
		* Delete a Person bean. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>DELETE</jsf>, path=<js>"/people/{id}"</js>, 
			guards=AdminGuard.<jk>class</jk>, 
		) 
		<jk>public</jk> String deletePerson(<ja>@Path</ja> <jk>int</jk> id) <jk>throws</jk> Exception { 
			<jf>addressBook</jf>.removePerson(id); 
			<jk>return</jk> <js>"DELETE successful"</js>; 
		} 
		
		<jd>/** 
		* [DELETE /addresses/{id}] 
		* Delete an Address bean. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>DELETE</jsf>, path=<js>"/addresses/{id}"</js>, 
			guards=AdminGuard.<jk>class</jk> 
		) 
		<jk>public</jk> String deleteAddress(<ja>@Path</ja> <jk>int</jk> addressId) <jk>throws</jk> Exception { 
			Person p = <jf>addressBook</jf>.findPersonWithAddress(addressId); 
			<jk>if</jk> (p == <jk>null</jk>) 
				<jk>throw new</jk> RestException(<jsf>SC_NOT_FOUND</jsf>, <js>"Person not found"</js>); 
			Address a = findAddress(addressId); 
			p.addresses.remove(a); 
			<jk>return</jk> <js>"DELETE successful"</js>; 
		} 
		
		<jd>/** 
		* [PUT /people/{id}/*] 
		* Change property on Person bean. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/people/{id}/*"</js>, 
			guards=AdminGuard.<jk>class</jk> 
		) 
		<jk>public</jk> String updatePerson(RestRequest req, <ja>@Path</ja> <jk>int</jk> id, <ja>@PathRemainder</ja> 
				String remainder) <jk>throws</jk> Exception { 
			<jk>try</jk> { 
				Person p = findPerson(id); 
				PojoRest r = <jk>new</jk> PojoRest(p); 
				ClassMeta&lt;?&gt; cm = r.getClassMeta(remainder); 
				Object in = req.getBody().asType(cm); 
				r.put(remainder, in); 
				<jk>return</jk> <js>"PUT successful"</js>; 
			} <jk>catch</jk> (Exception e) { 
				<jk>throw new</jk> RestException(<jsf>SC_BAD_REQUEST</jsf>, <js>"PUT unsuccessful"</js>).initCause(e); 
			} 
		} 
		
		<jd>/** 
		* [PUT /addresses/{id}/*] 
		* Change property on Address bean. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/addresses/{id}/*"</js>, 
			guards=AdminGuard.<jk>class</jk> 
		) 
		<jk>public</jk> String updateAddress(RestRequest req, <ja>@Path</ja> <jk>int</jk> id, 
				<ja>@PathRemainder</ja> String remainder) <jk>throws</jk> Exception { 
			<jk>try</jk> { 
				Address a = findAddress(id); 
				PojoRest r = <jk>new</jk> PojoRest(a); 
				ClassMeta&lt;?&gt; cm = r.getClassMeta(remainder); 
				Object in = req.getBody().asType(cm); 
				r.put(remainder, in); 
				<jk>return</jk> <js>"PUT successful"</js>; 
			} <jk>catch</jk> (Exception e) { 
				<jk>throw new</jk> RestException(<jsf>SC_BAD_REQUEST</jsf>, <js>"PUT unsuccessful"</js>).initCause(e); 
			} 
		} 
		
		<jd>/** 
		* [INIT /] 
		* Reinitialize this resource. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<js>"INIT"</js>, path=<js>"/"</js>, 
			guards=AdminGuard.<jk>class</jk> 
		) 
		<jk>public</jk> String doInit() <jk>throws</jk> Exception { 
			init(); 
			<jk>return</jk> <js>"OK"</js>; 
		} 
		
		<jd>/** 
		* [GET /cognos] 
		* Get data in Cognos/XML format 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/cognos"</js>) 
		<jk>public</jk> DataSet getCognosData() <jk>throws</jk> Exception { 
		
			<jc>// The Cognos metadata</jc> 
			Column[] items = { 
				<jk>new</jk> Column(<js>"name"</js>, <js>"xs:String"</js>, 255), 
				<jk>new</jk> Column(<js>"age"</js>, <js>"xs:int"</js>), 
				<jk>new</jk> Column(<js>"numAddresses"</js>, <js>"xs:int"</js>) 
				.addPojoSwap( 
					<jk>new</jk> PojoSwap&lt;Person,Integer&gt;() { 
						<ja>@Override</ja> /* PojoSwap */ 
						<jk>public</jk> Integer swap(BeanSession session, Person p) { 
							<jk>return</jk> p.addresses.size(); 
						} 
					} 
				) 
			}; 
			
			<jk>return new</jk> DataSet(items, <jf>addressBook</jf>, <jk>this</jk>.getBeanContext()); 
		} 
		
		<jd>/** 
		* [OPTIONS /*] 
		* View resource options 
		*/</jd> 
		<ja>@Override</ja> <jc>/* RestServletDefault */</jc> 
		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>) 
		<jk>public</jk> Swagger getOptions(RestRequest req) { 
			<jk>return</jk> req.getSwagger(); 
		} 
		
		<jd>/** Convenience method - Find a person by ID */</jd> 
		<jk>private</jk> Person findPerson(<jk>int</jk> id) <jk>throws</jk> RestException { 
			Person p = <jf>addressBook</jf>.findPerson(id); 
			<jk>if</jk> (p == <jk>null</jk>) 
				<jk>throw new</jk> RestException(<jsf>SC_NOT_FOUND</jsf>, <js>"Person not found"</js>); 
			<jk>return</jk> p; 
		} 
		
		<jd>/** Convenience method - Find an address by ID */</jd> 
		<jk>private</jk> Address findAddress(<jk>int</jk> id) <jk>throws</jk> RestException { 
			Address a = <jf>addressBook</jf>.findAddress(id); 
			<jk>if</jk> (a == <jk>null</jk>) 
				<jk>throw new</jk> RestException(<jsf>SC_NOT_FOUND</jsf>, <js>"Address not found"</js>); 
			<jk>return</jk> a; 
		} 
	} 	
			</p>
			
			<h5 class='topic'>Notes</h5>
			<ul class='spaced-list'>
				<li>
					The <l>@RestResource.messages()</l> annotation identifies 
					<l>org/apache/juneau/samples/addressbook/nls/AddressBookResource.properties</l> as the resource 
					bundle for localized message for this class.
				<li>
					You are setting <l>XML_enableNamespaces</l> to <l>true</l> to enable XML namespaces. 
					By default, XML namespace support is disabled per 
					{@link org.apache.juneau.xml.XmlSerializer#XML_enableNamespaces}, so you have to explicitly 
					enable it on our serializers.
				<li>
					The <l>XML_autoDetectNamespaces</l> setting is needed to get the XML serializer to add <l>xmlns</l> 
					attributes to the root elements.
					This causes the XML serializer to scan the POJO objects for namespaces in order to populate the 
					root element.  
					There are other ways to do this, such as explicitly specifying the <l>XML_defaultNamespaceUris</l> 
					setting at either the resource or method level, which might be preferred in high-performance 
					environments.
					However, <l>XML_autoDetectNamespaces</l> produces the simplest code for our example.
				<li>
					The <l>updatePerson()</l> and <l>updateAddress()</l> methods use a guard to only allow 
					administrators access.
					For the sample code, the guard does nothing.  It's up to the implementer to decide how to restrict 
					access.  
				<li>
					The <l>updatePerson()</l> and <l>updateAddress()</l> methods use the 
					{@link org.apache.juneau.utils.PojoRest} class
					to locate and update individual nodes in a POJO tree using the path remainder on the request. 
				<li>
					The <l>doInit()</l> method shows an example of an overloaded method using the 
					<l>@RestMethod(name=<jsf>INIT</jsf>)</l> annotation.
				<li>
					The <l>getOptions()</l> method shows the default OPTIONS page augmented with some additional 
					information.
			</ul>
			<p>
				The OPTIONS page uses the servlet resource bundle to specify the labels so that they're globalizable.
			</p>
			
			<h5 class='figure'>AddressBookResource.properties</h5>
			<p class='bcode'>
	<ck>title</ck> = <cv>AddressBook sample resource</cv>
	<ck>description</ck> = <cv>Proof-of-concept resource that shows off the capabilities of working with POJO resources</cv>
	
	<ck>getRoot.summary</ck> = <cv>Get root page</cv>
	<ck>getRoot.description</ck> = <cv>Jumping off page for top-level Person and Address beans.</cv>
	
	<ck>doInit.summary</ck> = <cv>Reinitialize this resource</cv>
	<ck>doInit.description</ck> = <cv>Resets the address book to the original contents.</cv>
	<ck>doInit.res.200.description</ck> = <cv>Returns the string "OK"</cv>
	
	<ck>getAllPeople.summary</ck> = <cv>Get all people in the address book</cv>
	<ck>getAllPeople.res.200.description</ck> = <cv>Returns a serialized List&lt;Person&gt;</cv>
	<ck>getAllPeople.res.200.examples</ck> = <cv>{'text/json':"[\n\t{\n\t\turi:'http://hostname/addressBook/person/1',\n\t\taddressBookUri:'http://localhost/addressBook',\n\t\tid:1,\n\t\tname:'John Smith',\n\t\tbirthDate:'Jan 1, 2000',\n\t\taddresses:[\n\t\t\t{\n\t\t\t\turi:'http://localhost/addressBook/addresses/1',\n\t\t\t\tpersonUri:'http://localhost/addressBook/people/1',\n\t\t\t\tid:1,\n\t\t\t\tstreet:'101 Main St',\n\t\t\t\tcity:'Anywhere',\n\t\t\t\tstate:'NY',\n\t\t\t\tzip:12345,\n\t\t\t\tisCurrent:true\n\t\t\t}\n\t\t]\n\t}\n]"}</cv>
	
	<ck>getPerson.summary</ck> = <cv>Get a single person by ID</cv>
	<ck>getPerson.req.path.id.description</ck> = <cv>Person ID</cv>
	<ck>getPerson.req.path.id.type</ck> = <cv>integer</cv>
	<ck>getPerson.res.200.description</ck> = <cv>Returns a serialized Person bean</cv>
	<ck>getPerson.res.200.examples</ck> = <cv>{'text/json':"{\n\turi:'http://hostname/addressBook/person/1',\n\taddressBookUri:'http://localhost/addressBook',\n\tid:1,\n\tname:'John Smith',\n\tbirthDate:'Jan 1, 2000',\n\taddresses:[\n\t\t{\n\t\t\turi:'http://localhost/addressBook/addresses/1',\n\t\t\tpersonUri:'http://localhost/addressBook/people/1',\n\t\t\tid:1,\n\t\t\tstreet:'101 Main St',\n\t\t\tcity:'Anywhere',\n\t\t\tstate:'NY',\n\t\t\tzip:12345,\n\t\t\tisCurrent:true\n\t\t}\n\t]\n\}"}</cv>
	<ck>getPerson.res.404.description</ck> = <cv>Person ID not found</cv>
	
	<ck>getAllAddresses.summary</ck> = <cv>Get all addresses in the address book</cv>
	<ck>getAllAddresses.res.200.description</ck> = <cv>Returns a serialized List&lt;Address&gt;</cv>
	<ck>getAllAddresses.res.200.examples</ck> = <cv>{'text/json':"[\n\t{\n\t\turi:'http://localhost/addressBook/addresses/1',\n\t\tpersonUri:'http://localhost/addressBook/people/1',\n\t\tid:1,\n\t\tstreet:'101 Main St',\n\t\tcity:'Anywhere',\n\t\tstate:'NY',\n\t\tzip:12345,\n\t\tisCurrent:true\n\t}\n]"}</cv>
	
	<ck>getAddress.summary</ck> = <cv>Get a single address by ID</cv>
	<ck>getAddress.req.path.id.description</ck> = <cv>Address ID</cv>
	<ck>getAddress.req.path.id.type</ck> = <cv>integer</cv>
	<ck>getAddress.res.200.description</ck> = <cv>Returns a serialized Address bean</cv>
	<ck>getAddress.res.200.examples</ck> = <cv>{'text/json':"{\n\turi:'http://localhost/addressBook/addresses/1',\n\tpersonUri:'http://localhost/addressBook/people/1',\n\tid:1,\n\tstreet:'101 Main St',\n\tcity:'Anywhere',\n\tstate:'NY',\n\tzip:12345,\n\tisCurrent:true\n}"}</cv>
	<ck>getAddress.res.404.description</ck> = <cv>Address ID not found</cv>
	
	<ck>createPerson.summary</ck> = <cv>Create a new Person bean </cv>
	<ck>createPerson.req.body.description</ck> = <cv>Serialized CreatePerson bean</cv>
	<ck>createPerson.req.body.schema</ck> = <cv>{example:"{\n\tname:'John Smith',\n\tbirthDate:'Jan 1, 2000',\n\taddresses:[\n\t\t{\n\t\t\tstreet:'101 Main St',\n\t\t\tcity:'Anywhere',\n\t\t\tstate:'NY',\n\t\t\tzip:12345,\n\t\t\tisCurrent:true\n\t\t}\n\t]\n\}"}</cv>
	<ck>createPerson.res.307.header.Location.description</ck> = <cv>URL of new person</cv>
	
	<ck>createAddress.summary</ck> = <cv>Create a new Address bean</cv>
	<ck>createAddress.req.path.id.description</ck> = <cv>Person ID</cv>
	<ck>createAddress.req.path.id.type</ck> = <cv>integer</cv>
	<ck>createAddress.req.body.schema</ck> = <cv>{example:"{\n\tstreet:'101 Main St',\n\tcity:'Anywhere',\n\tstate:'NY',\n\tzip:12345,\n\tisCurrent:true\n}"}</cv>
	<ck>createAddress.res.307.header.Location.description</ck> = <cv>URL of new address</cv>
	
	<ck>deletePerson.summary</ck> = <cv>Delete a Person bean</cv>
	<ck>deletePerson.req.path.id.description</ck> = <cv>Person ID</cv>
	<ck>deletePerson.req.path.id.type</ck> = <cv>integer</cv>
	<ck>deletePerson.res.200.description</ck> = <cv>Returns the string "DELETE successful"</cv>
	<ck>deletePerson.res.404.description</ck> = <cv>Person ID not found</cv>
	
	<ck>deleteAddress.summary</ck> = <cv>Delete an Address bean</cv>
	<ck>deleteAddress.req.path.id.description</ck> = <cv>Address ID</cv>
	<ck>deleteAddress.res.200.description</ck> = <cv>Returns the string "DELETE successful"</cv>
	<ck>deleteAddress.res.404.description</ck> = <cv>Address ID not found</cv>
	
	<ck>updatePerson.summary</ck> = <cv>Change property on Person bean</cv>
	<ck>updatePerson.req.path.id.description</ck> = <cv>Person ID</cv>
	<ck>updatePerson.req.path.id.type</ck> = <cv>integer</cv>
	<ck>updatePerson.req.body.description</ck> = <cv>Any object matching the field</cv>
	<ck>updatePerson.res.200.description</ck> = <cv>Returns the string "PUT successful"</cv>
	<ck>updatePerson.res.400.description</ck> = <cv>Invalid object type used</cv>
	<ck>updatePerson.res.404.description</ck> = <cv>Person ID not found</cv>
	
	<ck>updateAddress.summary</ck> = <cv>Change property on Address bean</cv>
	<ck>updateAddress.req.path.id.description</ck> = <cv>Address ID</cv>
	<ck>updateAddress.req.path.id.type</ck> = <cv>integer</cv>
	<ck>updateAddress.req.body.description</ck> = <cv>Any object matching the field</cv>
	<ck>updateAddress.res.200.description</ck> = <cv>Returns the string "PUT successful"</cv>
	<ck>updateAddress.res.400.description</ck> = <cv>Invalid object type used</cv>
	<ck>updateAddress.res.404.description</ck> = <cv>Address ID not foundv
	
	<ck>getOptions.summary</ck> = <cv>View resource options</cv>
	
	<ck>getCognosData.summary</ck> = <cv>Get data in Cognos/XML format</cv>
	<ck>getCognosData.res.200.description</ck> = <cv>Returns a serialized DataSet</cv>
	
	<ck>otherNotes</ck> = <cv>GZip support enabled.  Public methods can be invoked by using the &amp;Method URL parameter.  'text/cognos+xml' support available under root resource only</cv>
			</p>
		</div>
	
		<!-- ======================================================================================================= -->
		<a id="juneau-examples-rest.AddressBookResource.Demo"></a>
		<h4 class='topic' onclick='toggle(this)'>12.6.2 - Demo</h4>
		<div class='topic'>
			<p>
				Pointing a browser to the resource shows the results of running the <l>getRoot()</l> method:
			</p>
			<img class='bordered' src="doc-files/Samples.AddressBookResource.Demo.1.png">
			<p>
				Clicking the <l>people</l> link shows you the result of running the <l>getAllPeople()</l> method:
			</p>
			<img class='bordered' src="doc-files/Samples.AddressBookResource.Demo.2.png">
			<p>
				Notice how the <l>URI</l> properties automatically became hyperlinks.  
			</p>
			<p>
				Also notice how the dates are formatted as readable strings.
				This was from the transform you added to the <l>Calendar</l> property.
			</p>
			<p>
				Let's see what the output looks like in other formats:
			</p>
			
			<h5 class='figure'>JSON</h5>
			<img class='bordered' src="doc-files/Samples.AddressBookResource.Demo.3.png">
			
			<h5 class='figure'>Lax JSON</h5>
			<img class='bordered' src="doc-files/Samples.AddressBookResource.Demo.4.png">
			
			<h5 class='figure'>XML</h5>
			<img class='bordered' src="doc-files/Samples.AddressBookResource.Demo.5.png">
			<p>
				Notice how our <l>XML_enableNamespaces</l> and <l>XML_autoDetectNamespaces</l> settings result
				in namespaces being used.
			</p>
			<p>
				Also notice how the <code><ja>@BeanProperty</ja>(uri=<jk>true</jk>)</code> annotations caused the
				<l>uri</l> properties to become XML attributes instead of elements.
			</p>
			
			<h5 class='figure'>RDF/XML</h5>
			<img class='bordered' src="doc-files/Samples.AddressBookResource.Demo.6.png">
			<p>
				Notice how the <code><ja>@BeanProperty</ja>(uri=<jk>true</jk>)</code> annotations are used to identify 
				values for <l>rdf:about</l> values.
			</p>
			<p>
				Also notice how <l>URI</l> properties are serialized as <l>rdf:resource</l> attributes.
			</p>
			<p>
				Now lets look at the schema outputs that can be rendered that show information about the POJO classes 
				themselves.
			</p>
			
			<h5 class='figure'>HTML Schema</h5>
			<img class='bordered' src="doc-files/Samples.AddressBookResource.Demo.7.png">
			
			<h5 class='figure'>JSON Schema</h5>
			<img class='bordered' src="doc-files/Samples.AddressBookResource.Demo.8.png">
			
			<h5 class='figure'>XML Schema</h5>
			<img class='bordered' src="doc-files/Samples.AddressBookResource.Demo.9.png">
			<p>
				Now let's see what else you can do.
			</p>
			<p>
				Clicking on the first <l>personUri</l> link executes the <l>getPerson()</l> method, which renders a 
				serialized <l>Person</l> object:
			</p>
			<img class='bordered' src="doc-files/Samples.AddressBookResource.Demo.10.png">
			<p>
				Clicking on the OPTIONS link on the page shows you the Swagger doc generated from our annotations and 
				resource bundle properties:
			</p>
			<img class='bordered' src="doc-files/Samples.AddressBookResource.Options.png">
		</div>
	
		<!-- ======================================================================================================= -->
		<a id="juneau-examples-rest.AddressBookResource.Traversable"></a>
		<h4 class='topic' onclick='toggle(this)'>12.6.3 - Traversable</h4>
		<div class='topic'>
			<p>
				Because you added the <l>Traversable</l> converter to the <l>getPerson</l> method, you can also address 
				child nodes in the POJO model through path remainders:
			</p>
			<img class="bordered" src="doc-files/Samples.AddressBookResource.Traversable.1.png">
			<br><br>
			<img class="bordered" src="doc-files/Samples.AddressBookResource.Traversable.2.png">
		</div>

		<!-- ======================================================================================================= -->
		<a id="juneau-examples-rest.AddressBookResource.Queryable"></a>
		<h4 class='topic' onclick='toggle(this)'>12.6.4 - Queryable</h4>
		<div class='topic'>
			<p>
				The <l>Queryable</l> converter on the <l>getAllPeople()</l> method allows us to perform search/view/sort 
				functions against the data structure before serialization:
			</p>
			
			<h5 class='figure'>Show only the name and addresses columns</h5>
			<img class="bordered" src="doc-files/Samples.AddressBookResource.Queryable.1.png">
			
			<h5 class='figure'>Show only names that start with 'B*'</h5>
			<img class="bordered" src="doc-files/Samples.AddressBookResource.Queryable.2.png">
			
			<h5 class='figure'>Show only entries with age greater than 60</h5>
			<img class="bordered" src="doc-files/Samples.AddressBookResource.Queryable.3.png">
		</div>
	
		<!-- ======================================================================================================= -->
		<a id="juneau-examples-rest.AddressBookResource.Introspectable"></a>
		<h4 class='topic' onclick='toggle(this)'>12.6.5 - Introspectable</h4>
		<div class='topic'>
			<p>
				The <l>Introspectable</l> converter on the <l>getPerson</l> method allows us to invoke public methods 
				on the addressed POJO (in this case, public methods on the <l>String</l> class):
			</p>
			<img class="bordered" src="doc-files/Samples.AddressBookResource.Introspectable.1.png">
		</div>
	
		<!-- ======================================================================================================= -->
		<a id="juneau-examples-rest.AddressBookResource.RestClient"></a>
		<h4 class='topic' onclick='toggle(this)'>12.6.6 - ClientTest</h4>
		<div class='topic'>
			<p>
				The <l>ClientTest</l> class is provided to demonstrate how POJOs can be serialized and parsed 
					through the REST interface using the <l>RestClient</l> class.
			</p>
			<p>
				You'll notice that the class is a stand-alone executable that can be invoked as a plain Java process.
			</p>
			
			<h5 class='figure'>ClientTest.java</h5>
			<p class='bcode'>		
	<jd>/** 
	* Sample client code for interacting with AddressBookResource 
	*/</jd> 
	<jk>public class</jk> ClientTest { 
		
		<jk>public static void</jk> main(String[] args) { 
		
			<jk>try</jk> { 
				System.<jsf>out</jsf>.println(<js>"Running client test..."</js>); 
				
				<jc>// Create a client to handle XML requests and responses.</jc> 
				RestClient client = RestClient.<jsm>create</jsm>().build(); 
				RestClient xmlClient = RestClient.<jsm>create</jsm>().serializer(XmlSerializer.<jsf>DEFAULT</jsf>)
					.parser(XmlParser.<jsf>DEFAULT</jsf>).build(); 
				
				String root = <js>"http://localhost:10000/addressBook"</js>; 
				
				<jc>// Get the current contents of the address book</jc> 
				AddressBook ab = client.doGet(root + <js>"/people"</js>).getResponse(AddressBook.<jk>class</jk>); 
				System.<jsf>out</jsf>.println(<js>"Number of entries = "</js> + ab.getPeople().size()); 
				
				<jc>// Same, but use XML as the protocol both ways</jc> 
				ab = xmlClient.doGet(root + <js>"/people"</js>).getResponse(AddressBook.<jk>class</jk>); 
				System.<jsf>out</jsf>.println(<js>"Number of entries = "</js> + ab.getPeople().size()); 
				
				
				<jc>// Delete the existing entries</jc> 
				<jk>for</jk> (Person p : ab.getPeople()) { 
					String r = client.doDelete(p.<jf>uri</jf>).getResponse(String.<jk>class</jk>); 
					System.<jsf>out</jsf>.println(<js>"Deleted person "</js> + p.<jf>name</jf> + <js>", response = "</js> + r); 
				} 
				
				<jc>// Make sure they're gone</jc> 
				ab = client.doGet(root + <js>"/people"</js>).getResponse(AddressBook.<jk>class</jk>); 
				System.<jsf>out</jsf>.println(<js>"Number of entries = "</js> + ab.getPeople().size()); 
				
				<jc>// Add 1st person again</jc> 
				CreatePerson cp = <jk>new</jk> CreatePerson( 
					<js>"Barack Obama"</js>, 
					<jsm>toCalendar</jsm>(<js>"Aug 4, 1961"</js>), 
					<jk>new</jk> CreateAddress(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, <js>"DC"</js>, 20500, <jk>true</jk>), 
					<jk>new</jk> CreateAddress(<js>"5046 S Greenwood Ave"</js>, <js>"Chicago"</js>, <js>"IL"</js>, 60615, <jk>false</jk>) 
				); 
				Person p = client.doPost(root + <js>"/people"</js>, cp).getResponse(Person.<jk>class</jk>); 
				System.<jsf>out</jsf>.println(<js>"Created person "</js> + p.<jf>name</jf> + <js>", uri = "</js> + p.<jf>uri</jf>); 
				
				<jc>// Add 2nd person again, but add addresses separately</jc> 
				cp = <jk>new</jk> CreatePerson( 
					<js>"George Walker Bush"</js>, 
					<jsm>toCalendar</jsm>(<js>"Jul 6, 1946"</js>) 
				); 
				p = client.doPost(root + <js>"/people"</js>, cp).getResponse(Person.<jk>class</jk>); 
				System.<jsf>out</jsf>.println(<js>"Created person "</js> + p.<jf>name</jf> + <js>", uri = "</js> + p.<jf>uri</jf>); 
				
				<jc>// Add addresses to 2nd person</jc> 
				CreateAddress ca = <jk>new</jk> CreateAddress(<js>"43 Prairie Chapel Rd"</js>, <js>"Crawford"</js>, <js>"TX"</js>, 76638, <jk>true</jk>); 
				Address a = client.doPost(p.uri + <js>"/addresses"</js>, ca).getResponse(Address.<jk>class</jk>); 
				System.<jsf>out</jsf>.println(<js>"Created address "</js> + a.<jf>uri</jf>); 
				
				ca = <jk>new</jk> CreateAddress(<js>"1600 Pennsylvania Ave"</js>, <js>"Washington"</js>, <js>"DC"</js>, 20500, <jk>false</jk>); 
				a = client.doPost(p.uri + <js>"/addresses"</js>, ca).getResponse(Address.<jk>class</jk>); 
				System.<jsf>out</jsf>.println(<js>"Created address "</js> + a.<jf>uri</jf>); 
				
				<jc>// Find 1st person, and change name</jc> 
				Person[] pp = client.doGet(root + <js>"/people?q=(name='Barack+Obama')"</js>).getResponse(Person[].<jk>class</jk>); 
				String r = client.doPut(pp[0].uri + <js>"/name"</js>, <js>"Barack Hussein Obama"</js>).getResponse(String.<jk>class</jk>); 
				System.<jsf>out</jsf>.println(<js>"Changed name, response = "</js> + r); 
				p = client.doGet(pp[0].<jf>uri</jf>).getResponse(Person.<jk>class</jk>); 
				System.<jsf>out</jsf>.println(<js>"New name = "</js> + p.<jf>name</jf>); 
			
			} <jk>catch</jk> (Exception e) { 
				e.printStackTrace(); 
			} 
		} 
		
		<jc>// Utility method</jc> 
		<jk>public static</jk> Calendar toCalendar(String birthDate) <jk>throws</jk> Exception { 
			Calendar c = <jk>new</jk> GregorianCalendar(); 
			c.setTime(DateFormat.getDateInstance(DateFormat.<jsf>MEDIUM</jsf>).parse(birthDate)); 
			<jk>return</jk> c; 
		} 
	} 
			</p>
			<p>
				The output from running this code is the following:
			</p>
			<p class='bcode'>
	Running client test...
	Number of entries = 2
	Deleted person Barack Obama, response = DELETE successful
	Deleted person George Walker Bush, response = DELETE successful
	Number of entries = 0
	Created person Barack Obama, uri = http://localhost:9081/sample/addressBook/people/3
	Created person George Walker Bush, uri = http://localhost:9081/sample/addressBook/people/4
	Created address http://localhost:9081/sample/addressBook/addresses/7
	Created address http://localhost:9081/sample/addressBook/addresses/8
	Changed name, response = PUT successful
	New name = Barack Hussein Obama		
			</p>
		</div>

		<!-- ======================================================================================================= -->
		<a id="juneau-examples-rest.AddressBookResource.Browser"></a>
		<h4 class='topic' onclick='toggle(this)'>12.6.7 - Browser Tips</h4>
		<div class='topic'>
			<p>
				The Juneau architecture is designed to make it easy to debug REST resources using nothing more than a 
				browser.
				The same actions done programmatically in the last section can also be done using URLs.
				By default, you can override the HTTP Method and Content through GET parameters, as shown below:
			</p>
			<p class='bcode'>
	<jc>// Delete the existing entries</jc>
	http://localhost:10000/addressBook/people/1?method=DELETE
	http://localhost:10000/addressBook/people/2?method=DELETE

	<jc>// Add 1st person again</jc>
	http://localhost:10000/addressBook/people?method=POST&amp;content={name:'Barack Obama',birthDate:'Aug 4, 1961',addresses:[{street:'1600 Pennsylvania Ave',city:'Washington',state:'DC',zip:20500,isCurrent:true},{street:'5046 S Greenwood Ave',city:'Chicago',state:'IL',zip:60615,isCurrent:false}]}
	
	<jc>// Add 2nd person again</jc>
	http://localhost:10000/addressBook/people?method=POST&amp;content={name:'George Walker Bush',birthDate:'Jul 6, 1946'}
	http://localhost:10000/addressBook/people/4/addresses?method=POST&amp;content={street:'43 Prairie Chapel Rd',city:'Crawford',state:'TX',zip:76638,isCurrent:true}
	http://localhost:10000/addressBook/people/4/addresses?method=POST&amp;content={street:'1600 Pennsylvania Ave',city:'Washington',state:'DC',zip:20500,isCurrent:false}
		
	<jc>// Change name of 1st person</jc>
	http://localhost:10000/addressBook/people/3/name?method=PUT&amp;content="'Barack Hussein Obama'"	
			</p>
			<p>
				The ability to overload methods is enabled through the 
				<code><del>RestResource.allowMethodParam()</del></code> setting.
			</p>
		</div>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.SampleRemoteableServlet"></a>
	<h4 class='topic' onclick='toggle(this)'>12.7 - SampleRemoteableServlet</h4>
	<div class='topic'>
		<p>	
			The <l>SampleRemoteableServlet</l> class shows examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				Extending the {@link org.apache.juneau.rest.remoteable.RemoteableServlet} class to create a proxy 
				service.
			<li>
				Using the {@link org.apache.juneau.rest.client.RestClient} class to create remoteable proxy interfaces. 
		</ul>
		<p>
			The <l>RemoteableServlet</l> class has a single abstract method, 
			{@link org.apache.juneau.rest.remoteable.RemoteableServlet#getServiceMap()}, that defines interface 
			keys and POJO values. 		
		</p>
		<p>
			The <l>SampleRemoteableServlet</l> exposes the <l>AddressBook</l> bean from the previous example as a 
			service.
		</p>
		<p class='bcode'>
	<ja>@RestResource</ja>( 
		path=<js>"/remoteable"</js>, 
		messages=<js>"nls/SampleRemoteableServlet"</js>, 
		title=<js>"Remoteable Service Proxy API"</js>, 
		description=<js>"Sample class showing how to use remoteable proxies. The list below are exposed services that 
			can be retrieved using RestClient.getProxyInterface(Class)."</js>, 
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		),
		<jc>// Allow us to use method=POST from a browser.</jc> 
		allowedMethodParams=<js>"*"</js> 
	) 
	<jk>public class</jk> SampleRemoteableServlet <jk>extends</jk> RemoteableServlet { 
	
		AddressBook <jf>addressBook</jf> = <jk>new</jk> AddressBook(); 
		
		<ja>@Override</ja> <jc>/* RemoteableServlet */</jc> 
		<jk>protected</jk> Map&lt;Class&lt;?&gt;,Object&gt; getServiceMap() <jk>throws</jk> Exception { 
			Map&lt;Class&lt;?&gt;,Object&gt; m = <jk>new</jk> LinkedHashMap&lt;Class&lt;?&gt;,Object&gt;(); 
			
			<jc>// In this simplified example, you expose the same POJO service under two different interfaces.</jc> 
			<jc>// One is IAddressBook which only exposes methods defined on that interface, and</jc> 
			<jc>// the other is AddressBook itself which exposes all methods defined on the class itself.</jc> 
			m.put(IAddressBook.<jk>class</jk>, <jf>addressBook</jf>); 
			m.put(AddressBook.<jk>class</jk>, <jf>addressBook</jf>); 

			<jk>return</jk> m; 
		} 
	}
		</p>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.SampleRemoteableServlet.1.png'>
		<p>
			Clicking the hyperlinks on each shows you the list of methods that can be invoked on that service.
			Note that the <l>IAddressBook</l> link shows that you can only invoke methods defined on that
			interface, whereas the <l>AddressBook</l> link shows ALL public methods defined on that class.
			Since <l>AddressBook</l> extends from <l>LinkedList</l>, you may notice familiar collections
			framework methods listed.
		</p>
		<img class='bordered' src='doc-files/Samples.SampleRemoteableServlet.2.png'>
		<br><br>
		<img class='bordered' src='doc-files/Samples.SampleRemoteableServlet.3.png'>
		<ul class='doctree'>
			<li class='info'>
				As good practice, you'll want to use interfaces to prevent all public methods from being exposed.
		</ul>
		<p>
			Proxy interfaces are then retrieved using the {@link org.apache.juneau.rest.client.RestClient#getRemoteableProxy(Class)} method.
		</p>
		<p>
			The client side code for invoking this method is shown below:
		</p>
		<p class='bcode'>
	<jc>// Create a RestClient using JSON for serialization, and point to the server-side remoteable servlet.</jc>
	RestClient client = RestClient.<jsm>create</jsm>()
		.rootUrl(<js>"http://localhost:10000/remoteable"</js>)
		.build();
	
	<jc>// Create a proxy interface.</jc>
	IAddressBook ab = client.getRemoteableProxy(IAddressBook.<jk>class</jk>);
	
	<jc>// Invoke a method on the server side and get the returned result.</jc>
	Person p = ab.createPerson(
		<jk>new</jk> CreatePerson(<js>"Test Person"</js>,
			AddressBook.<jsm>toCalendar</jsm>(<js>"Aug 1, 1999"</js>),
			<jk>new</jk> CreateAddress(<js>"Test street"</js>, <js>"Test city"</js>, <js>"Test state"</js>, 12345, <jk>true</jk>))
	);
		</p>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.TempDirResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.8 - TempDirResource</h4>
	<div class='topic'>
		<p>	
			The <l>TempDirResource</l> class shows examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				Extending the {@link org.apache.juneau.microservice.resources.DirectoryResource} class.
			<li>
				Using the Apache <l>ServletFileUpload</l> class to handle multi-part form posts.
			<li>
				Using a system property string variable.
			<li>
				Using {@link org.apache.juneau.rest.RestMatcher RestMatchers}.
		</ul>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.TempDirResource.1.png'>
		<p>
			Pointing a browser to the <l>upload</l> link shows a form entry page:
		</p>
		<img class='bordered' src='doc-files/Samples.TempDirResource.2.png'>
		
		<h5 class='figure'>TempDirResource.java</h5>
		<p class='bcode'>
	<jd>/** 
	* Sample resource that extends DirectoryResource to open up the temp directory as a REST resource. 
	*/</jd> 
	<ja>@RestResource</ja>( 
		path=<js>"/tempDir"</js>, 
		messages=<js>"nls/TempDirResource"</js>, 
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>,
				<js>"upload: servlet:/upload"</js>
			}
		),
		properties={ 
			<ja>@Property</ja>(name=<js>"DirectoryResource.rootDir"</js>, value=<js>"$S{java.io.tmpdir}"</js>), 
			<ja>@Property</ja>(name=<js>"DirectoryResource.allowViews"</js>, value=<js>"true"</js>), 
			<ja>@Property</ja>(name=<js>"DirectoryResource.allowDeletes"</js>, value=<js>"true"</js>), 
			<ja>@Property</ja>(name=<js>"DirectoryResource.allowPuts"</js>, value=<js>"false"</js>) 
		}, 
		stylesheet=<js>"styles/devops.css"</js> 
	) 
	<jk>public class</jk> TempDirResource <jk>extends</jk> DirectoryResource { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
	
		<jd>/** 
		* [GET /upload] - Display the form entry page for uploading a file to the temp directory. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/upload"</js>) 
		<jk>public</jk> ReaderResource getUploadPage(RestRequest req) <jk>throws</jk> IOException { 
			<jk>return</jk> req.getClasspathReaderResource(<js>"TempDirUploadPage.html"</js>, <jk>true</jk>); 
		} 
		
		<jd>/** 
		* [POST /upload] - Upload a file as a multipart form post. 
		* Shows how to use the Apache Commons ServletFileUpload class for handling multi-part form posts. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/upload"</js>, 
			matchers=TempDirResource.MultipartFormDataMatcher.<jk>class</jk>) 
		<jk>public</jk> Redirect uploadFile(RestRequest req) <jk>throws</jk> Exception { 
			ServletFileUpload upload = <jk>new</jk> ServletFileUpload(); 
			FileItemIterator iter = upload.getItemIterator(req); 
			<jk>while</jk> (iter.hasNext()) { 
				FileItemStream item = iter.next(); 
				<jk>if</jk> (item.getFieldName().equals(<js>"contents"</js>)) {
					File f = <jk>new</jk> File(getRootDir(), item.getName()); 
					IOPipe.<jsm>create</jsm>(item.openStream(), <jk>new</jk> FileOutputStream(f)).closeOut().run(); 
				} 
			} 
			<jk>return new</jk> Redirect(); <jc>// Redirect to the servlet root.</jc> 
		} 
		
		<jd>/** Causes a 404 if POST isn't multipart/form-data */</jd> 
		<jk>public static class</jk> MultipartFormDataMatcher <jk>extends</jk> RestMatcher { 
			<ja>@Override</ja> <jc>/* RestMatcher */</jc> 
			<jk>public boolean</jk> matches(RestRequest req) { 
				String contentType = req.getContentType(); 
				<jk>return</jk> contentType != <jk>null</jk> &amp;&amp; contentType.startsWith(<js>"multipart/form-data"</js>); 
			} 
		} 
	}		
		</p>
		
		<h5 class='figure'>TempDirResource.properties</h5>
		<p class='bcode'>
	<cc>#--------------------------------------------------------------------------------
	# TempDirResource labels
	#--------------------------------------------------------------------------------</cc>
	<ck>title</ck> = <cv>Temp Directory View Service</cv>
	<ck>description</ck> = <cv>View and download files in the '$S{java.io.tmpdir}' directory.</cv>
		</p>
		<p>
			Note how a system property variable can be defined in the properties file.
		</p>
		
		<h5 class='figure'>TempDirUploadPage.html</h5>
		<b>TODO - Needs update</b>
		<p class='bcode'>
	<xt>&lt;html&gt;</xt>
	<xt>&lt;head&gt;</xt>
		<xt>&lt;meta</xt> <xa>http-equiv</xa>=<xs>"Content-Type"</xs> <xa>content</xa>=<xs>"text/html; <xa>charset</xa>=UTF-8"</xs><xt>&gt;</xt>
		<xt>&lt;style</xt> <xa>type</xa>=<xs>'text/css'</xs><xt>&gt;</xt>
			<xt>@import</xt> <xs>'$R{servletURI}/style.css'</xs>;
		<xt>&lt;/style&gt;</xt>
	<xt>&lt;/head&gt;</xt>
	<xt>&lt;body&gt;</xt>
		<xt>&lt;h1&gt;</xt>$R{resourceTitle}<xt>&lt;/h1&gt;</xt>
		<xt>&lt;h2&gt;</xt>$R{resourceDescription}<xt>&lt;/h2&gt;</xt>
		<xt>&lt;div</xt> <xa>class</xa>=<xs>'data'</xs><xt>&gt;</xt>
			<xt>&lt;form</xt> <xa>id</xa>=<xs>'form'</xs> <xa>action</xa>=<xs>'$R{servletURI}/upload'</xs> <xa>method</xa>=<xs>'POST'</xs> <xa>target</xa>=<xs>'buff'</xs> <xa>enctype</xa>=<xs>"multipart/form-data"</xs><xt>&gt;</xt>
				<xt>&lt;input</xt> <xa>name</xa>=<xs>"contents"</xs> <xa>type</xa>=<xs>"file"</xs><xt>&gt;</xt><xt>&lt;button</xt> <xa>type</xa>=<xs>"submit"</xs><xt>&gt;</xt>Submit<xt>&lt;/button&gt;</xt>
			<xt>&lt;/form&gt;</xt>
		<xt>&lt;/div&gt;</xt>
	<xt>&lt;/body&gt;</xt>
	<xt>&lt;/html&gt;</xt>		
		</p>
		<p>
			Note how the HTML file contains localized variables for the servlet label and description.
		</p>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.AtomFeedResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.9 - AtomFeedResource</h4>
	<div class='topic'>
		<p>	
			The <l>AtomFeedResource</l> class shows examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				Using the <a class='doclink' href='org/apache/juneau/dto/atom/package-summary.html#TOC'>ATOM Feed DTO</a> API.
		</ul>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.AtomFeedResource.1.png'>
		<p>
			True ATOM feeds require using an <l>Accept:text/xml</l> header:
		</p>
		<img class='bordered' src='doc-files/Samples.AtomFeedResource.2.png'>
		<p>
			Other languages, such as JSON are also supported:
		</p>
		<img class='bordered' src='doc-files/Samples.AtomFeedResource.3.png'>
		
		<h5 class='figure'>AtomFeedResource.java</h5>
		<p class='bcode'>
	<jd>/** 
	* Sample resource that shows how to generate ATOM feeds. 
	*/</jd> 
	<ja>@RestResource</ja>( 
		path=<js>"/atom"</js>, 
		messages=<js>"nls/AtomFeedResource"</js>, 
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		),
		properties={ 
			<ja>@Property</ja>(name=<jsf>SERIALIZER_quoteChar</jsf>, value=<js>"'"</js>), 
			<ja>@Property</ja>(name=<jsf>RDF_rdfxml_tab</jsf>, value=<js>"5"</js>), 
			<ja>@Property</ja>(name=<jsf>RDF_addRootProperty</jsf>, value=<js>"true"</js>)
		}, 
		encoders=GzipEncoder.<jk>class</jk> 
	) 
	<jk>public class</jk> AtomFeedResource <jk>extends</jk> ResourceJena { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
	
		<jk>private</jk> Feed <jf>feed</jf>; <jc>// The root resource object</jc> 
		
		<ja>@Override</ja> <jc>/* Servlet */</jc> 
		<jk>public void</jk> init() { 
		
			<jk>try</jk> { 
				<jf>feed</jf> = <jk>new</jk> Feed() 
					.setTitle(<jk>new</jk> Text(<js>"text"</js>, <js>"Juneau ATOM specification"</js>)) 
					.setSubTitle(<jk>new</jk> Text(<js>"html"</js>, <js>"Decribes &lt;em&gt;stuff&lt;/em&gt; about Juneau"</js>)) 
					.setUpdated(<jsm>parseDateTime</jsm>(<js>"2016-01-02T03:04:05Z"</js>)) 
					.setId(<jk>new</jk> Id(<js>"tag:juneau.apache.org"</js>)) 
					.addLinks( 
						<jk>new</jk> Link(<js>"alternate"</js>, <js>"text/html"</js>, <js>"http://juneau.apache.org/"</js>).setHreflang(<js>"en"</js>), 
						<jk>new</jk> Link(<js>"self"</js>, <js>"application/atom+xml"</js>, <js>"http://juneau.apache.org/feed.atom"</js>)
					) 
					.setRights(<jk>new</jk> Text(<js>"Copyright (c) ..."</js>)) 
					.setGenerator(<jk>new</jk> Generator(<js>"Juneau"</js>).setUri(<jk>new</jk> URI(<js>"http://juneau.apache.org/"</js>)).setVersion(<js>"1.0"</js>)) 
					.addEntries( 
						<jk>new</jk> Entry() 
							.setTitle(<jk>new</jk> Text(<js>"Juneau ATOM specification snapshot"</js>)) 
							.addLinks( 
								<jk>new</jk> Link(<js>"alternate"</js>, <js>"text/html"</js>, <js>"http://juneau.apache.org/juneau.atom"</js>),
								<jk>new</jk> Link(<js>"enclosure"</js>, <js>"audio/mpeg"</js>, <js>"http://juneau.apache.org/audio/juneau_podcast.mp3"</js>).setLength(12345) 
					) 
					.setId(<jk>new</jk> Id(<js>"tag:juneau.apache.org"</js>)) 
					.setUpdated(<jsm>parseDateTime</jsm>(<js>"2016-01-02T03:04:05Z"</js>)) 
					.setPublished(<jsm>parseDateTime</jsm>(<js>"2016-01-02T03:04:05Z"</js>)) 
					.addAuthors(<jk>new</jk> Person(<js>"James Bognar"</js>).setUri(<jk>new</jk> URI(<js>"http://juneau.apache.org/"</js>)).setEmail(<js>"james.bognar@apache.org"</js>)) 
					.addContributors( 
						<jk>new</jk> Person(<js>"Barry M. Caceres"</js>) 
					) 
					.setContent( 
						<jk>new</jk> Content() 
							.setLang(<js>"en"</js>) 
							.setBase(<jk>new</jk> URI(<js>"http://www.apache.org/"</js>)) 
							.setType(<js>"xhtml"</js>) 
							.setText(<js>"&lt;div xmlns=\"http://www.w3.org/1999/xhtml\"&gt;&lt;p&gt;&lt;i&gt;[Update: Juneau supports ATOM.]&lt;/i&gt;&lt;/p&gt;&lt;/div&gt;"</js>) 
					) 
			); 
			} <jk>catch</jk> (Exception e) { 
				<jk>throw new</jk> RuntimeException(e); 
			} 
		} 
		
		<jd>/** 
		* GET request handler 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>) 
		<jk>public</jk> Feed getFeed() <jk>throws</jk> Exception { 
			<jk>return</jk> <jf>feed</jf>; 
		} 
		
		<jd>/** 
		* PUT request handler. 
		* Replaces the feed with the specified content, and then mirrors it as the response. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/"</js>) 
		<jk>public</jk> Feed setFeed(<ja>@org.apache.juneau.rest.annotation.Content</ja> Feed feed) <jk>throws</jk> Exception { 
			<jk>this</jk>.<jf>feed</jf> = feed; 
			<jk>return</jk> feed; 
		} 
	} 		
		</p>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.DockerRegistryResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.10 - DockerRegistryResource</h4>
	<div class='topic'>
		<p>	
			The <l>DockerRegistryResource</l> class shows examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				Accessing a docker registry REST API as POJOs using {@link org.apache.juneau.rest.client.RestClient}.
			<li>
				Using the {@link org.apache.juneau.rest.labels.ResourceDescription} class to implement a top-level 
				'router' page.
			<li>
				Using the {@link org.apache.juneau.rest.RestContext#getConfig()} method to access external 
				configuration file values.
		</ul>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.DockerRegistryResource.1.png'>
		<p>
			Clicking the <l>search</l> link provides you with the search results against the Docker registry:
		</p>
		<img class='bordered' src='doc-files/Samples.DockerRegistryResource.2.png'>
		
		<h5 class='figure'>DockerRegistryResource.java</h5>
		<p class='bcode'>
	<jd>/** 
	* Sample resource that shows how to mirror query results from a Docker registry. 
	*/</jd> 
	<ja>@RestResource</ja>( 
		path=<js>"/docker"</js>, 
		title=<js>"Sample Docker resource"</js>, 
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		)
	) 
	<jk>public class</jk> DockerRegistryResource <jk>extends</jk> Resource { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
		
		<jc>// Get registry URL from examples.cfg file.</jc>
		<jk>private</jk> String <jf>registryUrl</jf> = getConfig().getString(<js>"DockerRegistry/url"</js>); 
		RestClient <jf>rc</jf> = RestClient.<jsm>create</jsm>().build(); 
		
		<jd>/** [GET /] - Show child resources. */</jd> 
		<ja>@SuppressWarnings</ja>(<js>"nls"</js>) 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>) 
		<jk>public</jk> ResourceDescription[] getChildren(RestRequest req) { 
			<jk>return new</jk> ResourceDescription[] { 
				<jk>new</jk> ResourceDescription(req, <js>"search"</js>, <js>"Search Registry"</js>) 
			}; 
		} 
		
		<jd>/** 
		* PUT request handler. 
		* Replaces the feed with the specified content, and then mirrors it as the response. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/search"</js>) 
		<jk>public</jk> QueryResults query(<ja>@Query</ja>(<js>"q"</js>) String q) <jk>throws</jk> Exception { 
			String url = <jf>registryUrl</jf> + <js>"/search"</js> + (q == <jk>null</jk> ? <js>""</js> : <js>"?q="</js> + q); 
			<jk>return</jk> <jf>rc</jf>.doGet(url).getResponse(QueryResults.<jk>class</jk>); 
		} 
		
		<jk>public static class</jk> QueryResults { 
			<jk>public int</jk> <jf>num_results</jf>; 
			<jk>public</jk> String <jf>query</jf>; 
			<jk>public</jk> List&lt;DockerImage&gt; <jf>results</jf>; 
		} 
		
		<jk>public static class</jk> DockerImage { 
			<jk>public</jk> String <jf>name</jf>, <jf>description</jf>; 
		} 
	} 		
		</p>
		<p>
			The Docker registry URL is specified in the <l>examples.cfg</l> file:
		</p>
		
		<h5 class='figure'>examples.cfg</h5>
		<p class='bcode'>
	<cc>#================================================================================
	# DockerRegistryResource properties
	#================================================================================</cc>
	<cs>[DockerRegistry]</cs>
	<ck>url</ck> = <cv>http://clmdocker02.ratl.swg.usma.apache.org:5000/v1</cv>
		</p>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.TumblrParserResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.11 - TumblrParserResource</h4>
	<div class='topic'>
		<p>	
			The <l>TumblrParserResource</l> class shows examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				Using {@link org.apache.juneau.rest.client.RestClient} to retrieve information from other REST resources.
			<li>
				Using {@link org.apache.juneau.ObjectMap} and {@link org.apache.juneau.ObjectList} to produce
				generalized POJO models.
		</ul>
		<p>
			Pointing a browser at a Tumblr blog name, such as <l>ibmblr</l> causes a REST call to be make to the Tumblr
			blog and the results to be parsed:
		</p>
		<img class='bordered' src='doc-files/Samples.TumblrParserResource.1.png'>
		
		<h5 class='figure'>TumblrParserResource.java</h5>
		<p class='bcode'>
	<ja>@RestResource</ja>( 
		path=<js>"/tumblrParser"</js>, 
		messages=<js>"nls/TumblrParserResource"</js>, 
		title=<js>"Tumblr parser service"</js>, 
		description=<js>"Specify a URL to a Tumblr blog and parse the results."</js>, 
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		)
	) 
	<jk>public class</jk> TumblrParserResource <jk>extends</jk> Resource { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
	
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>) 
		<jk>public</jk> String getInstructions() <jk>throws</jk> Exception { 
			<jk>return</jk> <js>"Append the Tumblr blog name to the URL above (e.g. /tumblrParser/mytumblrblog)"</js>; 
		} 
		
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{blogName}"</js>) 
		<jk>public</jk> ObjectList parseBlog(<ja>@Path</ja> String blogName) <jk>throws</jk> Exception { 
			ObjectList l = <jk>new</jk> ObjectList(); 
			RestClient rc = RestClient.<jsm>create</jsm>().build(); 
			String site = <js>"http:<jc>//"</js> + blogName + <js>".tumblr.com/api/read/json"</js>;</jc> 
			ObjectMap m = rc.doGet(site).getResponse(ObjectMap.<jk>class</jk>); 
			<jk>int</jk> postsTotal = m.getInt(<js>"posts-total"</js>); 
			<jk>for</jk> (<jk>int</jk> i = 0; i &lt; postsTotal; i += 20) { 
				m = rc.doGet(site + <js>"?start="</js> + i + <js>"&amp;num=20&amp;transform=text"</js>).getResponse(ObjectMap.<jk>class</jk>); 
				ObjectList ol = m.getObjectList(<js>"posts"</js>); 
				<jk>for</jk> (<jk>int</jk> j = 0; j &lt; ol.size(); j++) { 
					ObjectMap om = ol.getObjectMap(j); 
					String type = om.getString(<js>"type"</js>); 
					Entry e = <jk>new</jk> Entry(); 
					e.date = om.getString(<js>"date"</js>); 
					<jk>if</jk> (type.equals(<js>"link"</js>)) 
						e.entry = <jk>new</jk> Link(om.getString(<js>"link-text"</js>), om.getString(<js>"link-url"</js>)); 
					<jk>else if</jk> (type.equals(<js>"audio"</js>)) 
						e.entry = <jk>new</jk> ObjectMap().append(<js>"type"</js>,<js>"audio"</js>).append(<js>"audio-caption"</js>, om.getString(<js>"audio-caption"</js>)); 
					<jk>else if</jk> (type.equals(<js>"video"</js>)) 
						e.entry = <jk>new</jk> ObjectMap().append(<js>"type"</js>,<js>"video"</js>).append(<js>"video-caption"</js>, om.getString(<js>"video-caption"</js>)); 
					<jk>else if</jk> (type.equals(<js>"quote"</js>)) 
						e.entry = <jk>new</jk> ObjectMap().append(<js>"type"</js>,<js>"quote"</js>).append(<js>"quote-source"</js>, om.getString(<js>"quote-source"</js>)).append(<js>"quote-text"</js>, om.getString(<js>"quote-text"</js>)); 
					<jk>else if</jk> (type.equals(<js>"regular"</js>)) 
						e.entry = om.getString(<js>"regular-body"</js>); 
					<jk>else if</jk> (type.equals(<js>"photo"</js>)) 
						e.entry = <jk>new</jk> Img(om.getString(<js>"photo-url-250"</js>)); 
					<jk>else</jk> 
						e.entry = <jk>new</jk> ObjectMap().append(<js>"type"</js>, type); 
					l.add(e); 
				} 
			} 
			<jk>return</jk> l; 
		} 
		
		<jk>public static class</jk> Entry { 
			<jk>public</jk> String <jf>date</jf>; 
			<jk>public</jk> Object <jf>entry</jf>; 
		} 
	} 		
		</p>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.PhotosResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.12 - PhotosResource</h4>
	<div class='topic'>
		<p>	
			The <l>PhotosResource</l> class shows examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				How to define custom serializers and parsers at the method level.
				In this case, you define a serializer and parser to handle images.
		</ul>
		<p>
			The resource consists of a simple registry of images with integer IDs.
		</p>
		<img class='bordered' src='doc-files/Samples.PhotosResource.1.png'>
		<p>
			It is initialized with a single entry, which can be accessed through a GET request.
		</p>
		<img class='bordered' src='doc-files/Samples.PhotosResource.2.png'>
		
		<h5 class='figure'>PhotosResource.java</h5>
		<p class='bcode'>
	<jd>/**
	 * Sample resource that allows images to be uploaded and retrieved.
	 */</jd>
	<ja>@RestResource</ja>(
		path=<js>"/photos"</js>,
		messages=<js>"nls/PhotosResource"</js>,
		title=<js>"Photo REST service"</js>,
		description=<js>"Use a tool like Poster to upload and retrieve jpeg and png images."</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		)
	)
	<jk>public class</jk> PhotosResource <jk>extends</jk> RestServletDefault {
	
		<jc>// Our cache of photos</jc>
		<jk>private</jk> Map&lt;Integer,Photo&gt; photos = <jk>new</jk> TreeMap&lt;Integer,Photo&gt;();
		
		<ja>@Override</ja> <jc>/* Servlet */</jc>
		<jk>public void</jk> init() {
			<jk>try</jk> {
				<jc>// Preload an image.</jc>
				InputStream is = getClass().getResourceAsStream(<js>"averycutedog.jpg"</js>);
				BufferedImage image = ImageIO.<jsm>read</jsm>(is);
				Photo photo = <jk>new</jk> Photo(0, image);
				<jf>photos</jf>.put(photo.<jf>id</jf>, photo);
			} <jk>catch</jk> (IOException e) {
				<jk>throw new</jk> RuntimeException(e);
			}
		}

		<jd>/** Bean class for storing photos */</jd>
		<jk>public static class</jk> Photo {
			<jk>private int</jk> <jf>id</jf>;
			BufferedImage <jf>image</jf>;
			
			Photo(int id, BufferedImage image) {
				<jk>this</jk>.<jf>id</jf> = id;
				<jk>this</jk>.<jf>image</jf> = image;
			}
			
			<jk>public</jk> URI getURI() <jk>throws</jk> URISyntaxException {
				<jk>return new</jk> URI(<js>"photos/"</js>+<jf>id</jf>);
			}
			
			<jk>public int</jk> getID() {
				<jk>return</jk> <jf>id</jf>;
			}
		}
		
		<jd>/** GET request handler for list of all photos */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
		<jk>public</jk> Collection&lt;Photo&gt; getAllPhotos(RestRequest req, RestResponse res) <jk>throws</jk> Exception {
			res.setPageTitle(<js>"Photo REST service"</js>);
			res.setPageText(<js>"Use a tool like Poster to upload and retrieve jpeg and png images."</js>);
			<jk>return</jk> photos.values();
		}
		
		<jd>/** GET request handler for single photo */</jd>
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{id}"</js>, serializers=ImageSerializer.<jk>class</jk>)
		<jk>public</jk> BufferedImage getPhoto(RestRequest req, <ja>@Path</ja> int id) <jk>throws</jk> Exception {
			Photo p = photos.get(id);
			if (p == <jk>null</jk>)
				<jk>throw new</jk> RestException(<jsf>SC_NOT_FOUND</jsf>, <js>"Photo not found"</js>);
			<jk>return</jk> p.image;
		}
		
		<jd>/** PUT request handler */</jd>
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/{id}"</js>, parsers=ImageParser.<jk>class</jk>)
		<jk>public</jk> String addPhoto(RestRequest req, <ja>@Path</ja> <jk>int</jk> id, <ja>@Body</ja> BufferedImage image) <jk>throws</jk> Exception {
			photos.put(id, <jk>new</jk> Photo(id, image));
			<jk>return</jk> <js>"OK"</js>;
		}
		
		<jd>/** POST request handler */</jd>
		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/"</js>, parsers=ImageParser.<jk>class</jk>)
		<jk>public</jk> Photo setPhoto(RestRequest req, <ja>@Body</ja> BufferedImage image) <jk>throws</jk> Exception {
			<jk>int</jk> id = photos.size();
			Photo p = <jk>new</jk> Photo(id, image);
			photos.put(id, p);
			<jk>return</jk> p;
		}
		
		<jd>/** DELETE request handler */</jd>
		<ja>@RestMethod</ja>(name=<jsf>DELETE</jsf>, path=<js>"/{id}"</js>)
		<jk>public</jk> String deletePhoto(RestRequest req, <ja>@Path</ja> <jk>int</jk> id) <jk>throws</jk> Exception {
			Photo p = photos.remove(id);
			if (p == <jk>null</jk>)
				<jk>throw new</jk> RestException(<jsf>SC_NOT_FOUND</jsf>, <js>"Photo not found"</js>);
			<jk>return</jk> <js>"OK"</js>;
		}
	
		<jd>/** OPTIONS request handler */</jd>
		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>)
		<jk>public</jk> Swagger getOptions(RestRequest req) {
			<jk>return</jk> req.getSwagger();
		}

		<jd>/** Serializer for converting images to byte streams */</jd>
		<ja>@Produces</ja>(<js>"image/png,image/jpeg"</js>)
		<jk>public static class</jk> ImageSerializer <jk>extends</jk> OutputStreamSerializer {

			<ja>@Override</ja> <jc>/* Serializer */</jc>
			<jk>public void</jk> serialize(Object o, OutputStream out, SerializerSession session) <jk>throws</jk> IOException, SerializeException {
				RenderedImage image = (RenderedImage)o;
				String mediaType = ctx.getMediaType();
				ImageIO.<jsm>write</jsm>(image, mediaType.substring(mediaType.indexOf(<js>'/'</js>)+1), out);
			}	
		}
		
		<jd>/** Parser for converting byte streams to images */</jd>
		<ja>@Consumes</ja>(<js>"image/png,image/jpeg"</js>)
		<jk>public static class</jk> ImageParser <jk>extends</jk> InputStreamParser {

			<ja>@Override</ja> <jc>/* Parser */</jc>
			<jk>public</jk> &lt;T&gt; T parse(InputStream in, ClassMeta&lt;T&gt; type, ParserSession session) <jk>throws</jk> ParseException, IOException {
				BufferedImage image = ImageIO.<jsm>read</jsm>(in);
				<jk>return</jk> (T)image;
			}
		}
	}
		</p>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.JsonSchemaResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.13 - JsonSchemaResource</h4>
	<div class='topic'>
		<p>	
			The <l>JsonSchemaResource</l> class shows examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				Using the <a class='doclink' 
				href='org/apache/juneau/dto/jsonschema/package-summary.html#TOC'>JSON Schema DTO</a> API.
		</ul>
		<p>
			The resource consists of a pre-initialized {@link org.apache.juneau.dto.jsonschema.Schema} object.
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.JsonSchemaResource.1.png'>
		<p>
			For true JSON-Schema, you need to specify the header <l>Accept: text/json</l>:
		</p>
		<img class='bordered' src='doc-files/Samples.JsonSchemaResource.2.png'>
		
		<h5 class='figure'>JsonSchemaResource.java</h5>
		<p class='bcode'>
	<jd>/** 
	* Sample resource that shows how to serialize JSON-Schema documents. 
	*/</jd> 
	<ja>@RestResource</ja>( 
		path=<js>"/jsonSchema"</js>, 
		messages=<js>"nls/JsonSchemaResource"</js>, 
		title=<js>"Sample JSON-Schema document"</js>, 
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		)
	) 
	<jk>public class</jk> JsonSchemaResource <jk>extends</jk> ResourceJena { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
		
		<jk>private</jk> Schema schema; <jc>// The schema document</jc> 
		
		<ja>@Override</ja> /* Servlet */ 
		<jk>public void</jk> init() { 
			
			<jk>try</jk> { 
				<jf>schema</jf> = <jk>new</jk> Schema() 
					.setId(<js>"http://example.com/sample-schema#"</js>) 
					.setSchemaVersionUri(<js>"http://json-schema.org/draft-04/schema#"</js>) 
					.setTitle(<js>"Example Schema"</js>) 
					.setType(JsonType.<jsf>OBJECT</jsf>) 
					.addProperties( 
						<jk>new</jk> SchemaProperty(<js>"firstName"</js>, JsonType.<jsf>STRING</jsf>), 
						<jk>new</jk> SchemaProperty(<js>"lastName"</js>, JsonType.<jsf>STRING</jsf>), 
						<jk>new</jk> SchemaProperty(<js>"age"</js>, JsonType.<jsf>INTEGER</jsf>) 
							.setDescription(<js>"Age in years"</js>) 
							.setMinimum(0) 
				) 
				.addRequired(<js>"firstName"</js>, <js>"lastName"</js>); 
			} <jk>catch</jk> (Exception e) { 
				<jk>throw new</jk> RuntimeException(e); 
			} 
		} 
		
		<jd>/** GET request handler */</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>) 
		<jk>public</jk> Schema getSchema() <jk>throws</jk> Exception { 
			<jk>return</jk> <jf>schema</jf>; 
		} 
		
		<jd>/** 
		* PUT request handler. 
		* Replaces the schema document with the specified content, and then mirrors it as the response. 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/"</js>) 
		<jk>public</jk> Schema setSchema(<ja>@Body</ja> Schema schema) <jk>throws</jk> Exception { 
			<jk>this</jk>.<jf>schema</jf> = schema; 
			<jk>return</jk> schema; 
		} 
	} 		
		</p>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.SqlQueryResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.14 - SqlQueryResource</h4>
	<div class='topic'>
		<p>	
			The <l>SqlQueryResource</l> class shows examples of the following:
		</p>
		<ul class='spaced-list'>
			<li>
				Using the {@link org.apache.juneau.dto.ResultSetList} to serialize database result sets.
			<li>
				Using {@link org.apache.juneau.rest.RestContext#getConfig()} to access config properties.
			<li>
				Using form entry beans.
		</ul>
		<p>
			The example uses embedded Derby to create a database whose name is defined in the external configuration 
			files.
		</p>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.SqlQueryResource.1.png'>
		<p>
			Running a query results in the following output:
		</p>
		<img class='bordered' src='doc-files/Samples.SqlQueryResource.2.png'>
		
		<h5 class='figure'>SqlQueryResource.java</h5>
		<p class='bcode'>
	<jd>/** 
	* Sample resource that shows how Juneau can serialize ResultSets. 
	*/</jd> 
	<ja>@RestResource</ja>( 
		path=<js>"/sqlQuery"</js>, 
		messages=<js>"nls/SqlQueryResource"</js>, 
		title=<js>"SQL query service"</js>, 
		description=<js>"Executes queries against the local derby '$C{SqlQueryResource/connectionUrl}' database"</js>, 
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		)
	) 
	<jk>public class</jk> SqlQueryResource <jk>extends</jk> Resource { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
		
		<jk>private</jk> Config <jf>cf</jf> = getConfig(); 
		
		<jk>private</jk> String <jf>driver</jf> = cf.getString(<js>"SqlQueryResource/driver"</js>); 
		<jk>private</jk> String <jf>connectionUrl</jf> = cf.getString(<js>"SqlQueryResource/connectionUrl"</js>); 
		<jk>private boolean</jk> 
			<jf>allowUpdates</jf> = cf.getBoolean(<js>"SqlQueryResource/allowUpdates"</js>, <jk>false</jk>), 
			<jf>allowTempUpdates</jf> = cf.getBoolean(<js>"SqlQueryResource/allowTempUpdates"</js>, <jk>false</jk>), 
			<jf>includeRowNums</jf> = cf.getBoolean(<js>"SqlQueryResource/includeRowNums"</js>, <jk>false</jk>); 
		
		<ja>@Override</ja> <jc>/* Servlet */</jc> 
		<jk>public void</jk> init() { 
			<jk>try</jk> { 
				Class.<jsm>forName</jsm>(driver).newInstance(); 
			} <jk>catch</jk> (Exception e) { 
				<jk>throw new</jk> RuntimeException(e); 
			} 
		} 
		
		<jd>/** GET request handler - Display the query entry page. */</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>) 
		<jk>public</jk> ReaderResource doGet(RestRequest req) <jk>throws</jk> IOException { 
			<jk>return</jk> req.getClasspathReaderResource(<js>"SqlQueryResource.html"</js>, <jk>true</jk>); 
		} 
		
		<jd>/** POST request handler - Execute the query. */</jd> 
		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/"</js>) 
		<jk>public</jk> List&lt;Object&gt; doPost(<ja>@Body</ja> PostInput in) <jk>throws</jk> Exception { 
			
			List&lt;Object&gt; results = <jk>new</jk> LinkedList&lt;Object&gt;(); 
			
			<jc>// Don't try to submit empty input.</jc> 
			<jk>if</jk> (StringUtils.<jsm>isEmpty</jsm>(in.<jf>sql</jf>))
				<jk>return</jk> results; 
			
			<jk>if</jk> (in.<jf>pos</jf> &lt; 1 || in.<jf>pos</jf> &gt; 10000) 
				<jk>throw new</jk> RestException(<jsf>SC_BAD_REQUEST</jsf>, <js>"Invalid value for position. Must be between 1-10000"</js>); 
			<jk>if</jk> (in.<jf>limit</jf> &lt; 1 || in.<jf>limit</jf> &gt; 10000) 
				<jk>throw new</jk> RestException(<jsf>SC_BAD_REQUEST</jsf>, <js>"Invalid value for limit. Must be between 1-10000"</js>); 
			
			<jc>// Create a connection and statement.</jc> 
			<jc>// If these fails, let the exception transform up as a 500 error.</jc> 
			Connection c = DriverManager.getConnection(<jf>connectionUrl</jf>); 
			c.setAutoCommit(<jk>false</jk>); 
			Statement st = c.createStatement(); 
			String sql = <jk>null</jk>; 
			
			<jk>try</jk> { 
				<jk>for</jk> (String s : in.<jf>sql</jf>.split(<js>";"</js>)) { 
					sql = s.trim(); 
					<jk>if</jk> (! sql.isEmpty()) { 
						Object o = <jk>null</jk>; 
						<jk>if</jk> (<jf>allowUpdates</jf> || (<jf>allowTempUpdates</jf> &amp;&amp; ! sql.matches(<js>"(?:i)commit.*"</js>))) { 
							<jk>if</jk> (st.execute(sql)) { 
								ResultSet rs = st.getResultSet(); 
								o = <jk>new</jk> ResultSetList(rs, in.<jf>pos</jf>, in.<jf>limit</jf>, <jf>includeRowNums</jf>); 
							} <jk>else</jk> { 
								o = st.getUpdateCount(); 
							} 
						} <jk>else</jk> { 
							ResultSet rs = st.executeQuery(sql); 
							o = <jk>new</jk> ResultSetList(rs, in.<jf>pos</jf>, in.<jf>limit</jf>, <jf>includeRowNums</jf>); 
						} 
						results.add(o); 
					} 
				} 
				<jk>if</jk> (<jf>allowUpdates</jf>) 
					c.commit(); 
				<jk>else if</jk> (<jf>allowTempUpdates</jf>) 
					c.rollback(); 
			} <jk>catch</jk> (SQLException e) { 
				c.rollback(); 
				<jk>throw new</jk> RestException(<jsf>SC_BAD_REQUEST</jsf>, <js>"Invalid query: {0}"</js>, sql).initCause(e); 
			} <jk>finally</jk> { 
				c.close(); 
			} 
			
			<jk>return</jk> results; 
		} 
		
		<jd>/** The parsed form post */</jd> 
		<jk>public static class</jk> PostInput { 
			<jk>public</jk> String <jf>sql</jf>; 
			<jk>public int</jk> <jf>pos</jf> = 1, <jf>limit</jf> = 100; 
		} 
	} 
			</p>
			
			<h5 class='figure'>SqlQueryResource.html</h5>
			<b>TODO - Needs update</b>
			<p class='bcode'>
	<xt>&lt;html&gt;</xt> 
	<xt>&lt;head&gt;</xt> 
		<xt>&lt;style</xt> <xa>type</xa>=<xs>'text/css'</xs><xt>&gt;</xt> 
			<xt>@import</xt> <xs>'$R{servletURI}/style.css'</xs>; 
		<xt>&lt;/style&gt;</xt> 
		<xt>&lt;script&gt;</xt> 
			<jc>// Quick and dirty function to allow tabs in textarea.</jc> 
			<jk>function</jk> checkTab(e) { 
				<jk>if</jk> (e.keyCode == 9) { 
					<jk>var</jk> t = e.target; 
					<jk>var</jk> ss = t.selectionStart, se = t.selectionEnd; 
					t.value = t.value.slice(0,ss).concat(<js>'\t'</js>).concat(t.value.slice(ss,t.value.length)); 
					e.preventDefault(); 
				} 
			} 
			<jc>// Load results from IFrame into this document.</jc> 
			<jk>function</jk> loadResults(b) { 
				<jk>var</jk> doc = b.contentDocument || b.contentWindow.document; 
				<jk>var</jk> data = doc.getElementById(<js>'data'</js>) || doc.getElementsByTagName(<js>'body'</js>)[0]; 
				document.getElementById(<js>'results'</js>).innerHTML = data.innerHTML; 
			} 
		<xt>&lt;/script&gt;</xt> 
	<xt>&lt;/head&gt;</xt> 
	<xt>&lt;body&gt;</xt> 
		<xt>&lt;h1&gt;</xt>SQL Query API<xt>&lt;/h1&gt;</xt> 
		<xt>&lt;div</xt> <xa>class</xa>=<xs>'data'</xs><xt>&gt;</xt> 
			<xt>&lt;form</xt> <xa>action</xa>=<xs>'sqlQuery'</xs> <xa>method</xa>=<xs>'POST'</xs> <xa>target</xa>=<xs>'buf'</xs><xt>&gt;</xt> 
				<xt>&lt;table&gt;</xt> 
					<xt>&lt;tr&gt;</xt> 
						<xt>&lt;th&gt;</xt>Position (1-10000):<xt>&lt;/th&gt;</xt> 
						<xt>&lt;td&gt;</xt><xt>&lt;input</xt> <xa>name</xa>=<xs>'pos'</xs> <xa>type</xa>=<xs>'number'</xs> <xa>value</xa>=<xs>'1'</xs><xt>&gt;</xt><xt>&lt;/td&gt;</xt> 
						<xt>&lt;th&gt;</xt>Limit (1-10000):<xt>&lt;/th&gt;</xt> 
						<xt>&lt;td&gt;</xt><xt>&lt;input</xt> <xa>name</xa>=<xs>'limit'</xs> <xa>type</xa>=<xs>'number'</xs> <xa>value</xa>=<xs>'100'</xs><xt>&gt;</xt><xt>&lt;/td&gt;</xt> 
						<xt>&lt;td&gt;</xt><xt>&lt;button</xt> <xa>type</xa>=<xs>'submit'</xs><xt>&gt;</xt>Submit<xt>&lt;/button&gt;</xt><xt>&lt;button</xt> <xa>type</xa>=<xs>'reset'</xs><xt>&gt;</xt>Reset<xt>&lt;/button&gt;</xt><xt>&lt;/td&gt;</xt> 
					<xt>&lt;/tr&gt;</xt> 
					<xt>&lt;tr&gt;</xt> 
						<xt>&lt;td</xt> <xa>colspan</xa>=<xs>"5"</xs><xt>&gt;</xt> 
							<xt>&lt;textarea</xt> <xa>name</xa>=<xs>'sql'</xs> <xa>style</xa>=<xs>'width:100%;height:200px;font-family:Courier;font-size:9pt;'</xs> <xa>onkeydown</xa>=<xs>'checkTab(event)'</xs><xt>&gt;</xt><xt>&lt;/textarea&gt;</xt> 
						<xt>&lt;/td&gt;</xt> 
					<xt>&lt;/tr&gt;</xt> 
				<xt>&lt;/table&gt;</xt> 
			<xt>&lt;/form&gt;</xt> 
			<xt>&lt;br&gt;</xt> 
			<xt>&lt;div</xt> <xa>id</xa>=<xs>'results'</xs><xt>&gt;</xt> 
			<xt>&lt;/div&gt;</xt> 
		<xt>&lt;/div&gt;</xt> 
		<xt>&lt;iframe</xt> <xa>name</xa>=<xs>'buf'</xs> <xa>style</xa>=<xs>'display:none'</xs> <xa>onload</xa>=<xs>"parent.loadResults(this)"</xs><xt>&gt;</xt><xt>&lt;/iframe&gt;</xt> 
	<xt>&lt;/body&gt;</xt> 
	<xt>&lt;/html&gt;</xt> 		
		</p>
		
		<h5 class='figure'>samples.cfg</h5>
		<p class='bcode'>
	<cc>#================================================================================
	# SqlQueryResource properties
	#================================================================================</cc>
	<cs>[SqlQueryResource]</cs>
	<ck>driver</ck> = <cv>org.apache.derby.jdbc.EmbeddedDriver</cv>
	<ck>connectionUrl</ck> = <cv>jdbc:derby:C:/testDB;create=true</cv>
	<ck>allowTempUpdates</ck> = <cv>true</cv>
	<ck>includeRowNums</ck> = <cv>true</cv>
		</p>
	</div>	

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.ConfigResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.15 - ConfigResource</h4>
	<div class='topic'>
		<!--p>
			The {@link org.apache.juneau.microservice.resources.ConfigResource} class is a predefined reusable resource.
			<br>It provides a REST interface for reading and altering the microservice config file.
		</p>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.ConfigResource.1.png'>
		<p>
			An edit page is provided for altering the raw config file:
		</p>
		<img class='bordered' src='doc-files/Samples.ConfigResource.3.png'>
		<p>
			The {@link org.apache.juneau.config.Config} class is a serializable POJO, which makes the resource
				relatively straightforward to implement.
		</p>
		
		<h5 class='figure'>ConfigResource.java</h5>
		<p class='bcode'>
	<jd>/** 
	* Shows contents of the microservice configuration file. 
	*/</jd> 
	<ja>@RestResource</ja>( 
		path=<js>"/config"</js>, 
		title=<js>"Configuration"</js>, 
		description=<js>"Contents of configuration file."</js>, 
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>,
				<js>"edit: servlet:/edit"</js>
			}
		)
	) 
	<jk>public class</jk> ConfigResource <jk>extends</jk> Resource { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
		
		<jd>/** 
		* [GET /] - Show contents of config file. 
		* 
		* <ja>@return</ja> The config file. 
		* <ja>@throws</ja> Exception 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>, description=<js>"Show contents of config file."</js>) 
		<jk>public</jk> Config getConfigContents() <jk>throws</jk> Exception { 
			<jk>return</jk> getConfig(); 
		} 
		
		<jd>/** 
		* [GET /edit] - Show config file edit page. 
		* 
		* <ja>@param</ja> req The HTTP request. 
		* <ja>@return</ja> The config file as a reader resource. 
		* <ja>@throws</ja> Exception 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/edit"</js>, description=<js>"Show config file edit page."</js>) 
		<jk>public</jk> ReaderResource getConfigEditPage(RestRequest req) <jk>throws</jk> Exception { 
			<jc>// Note that you don't want variables in the config file to be resolved,</jc> 
			<jc>// so you need to escape any $ characters that you see.</jc> 
			req.setAttribute(<js>"contents"</js>, getConfig().toString().replaceAll(<js>"\\$"</js>, <js>"\\\\\\$"</js>)); 
			<jk>return</jk> req.getClasspathReaderResource(<js>"ConfigEdit.html"</js>, <jk>true</jk>); 
		} 
		
		<jd>/** 
		* [GET /{section}] - Show config file section. 
		* 
		* <ja>@param</ja> section The section name. 
		* <ja>@return</ja> The config file section. 
		* <ja>@throws</ja> Exception 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{section}"</js>, 
			description=<js>"Show config file section."</js>, 
			parameters={ 
				<ja>@Parameter</ja>(in=<js>"path"</js>, name=<js>"section"</js>, description=<js>"Section name."</js>) 
			} 
		) 
		<jk>public</jk> ObjectMap getConfigSection(<ja>@Path</ja>(<js>"section"</js>) String section) <jk>throws</jk> Exception { 
			<jk>return</jk> getSection(section); 
		} 
		
		<jd>/** 
		* [GET /{section}/{key}] - Show config file entry. 
		* 
		* <ja>@param</ja> section The section name. 
		* <ja>@param</ja> key The section key. 
		* <ja>@return</ja> The value of the config file entry. 
		* <ja>@throws</ja> Exception 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{section}/{key}"</js>, 
			description=<js>"Show config file entry."</js>, 
			parameters={ 
				<ja>@Parameter</ja>(in=<js>"path"</js>, name=<js>"section"</js>, description=<js>"Section name."</js>), 
				<ja>@Parameter</ja>(in=<js>"path"</js>, name=<js>"key"</js>, description=<js>"Entry name."</js>) 
			} 
		) 
		<jk>public</jk> String getConfigEntry(<ja>@Path</ja>(<js>"section"</js>) String section, <ja>@Path</ja>(<js>"key"</js>) String key) <jk>throws</jk> Exception { 
			<jk>return</jk> getSection(section).getString(key); 
		} 
		
		<jd>/** 
		* [POST /] - Sets contents of config file from a FORM post. 
		* 
		* <ja>@param</ja> contents The new contents of the config file. 
		* <ja>@return</ja> The new config file contents. 
		* <ja>@throws</ja> Exception 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/"</js>, 
			description=<js>"Sets contents of config file from a FORM post."</js>, 
			parameters={ 
				<ja>@Parameter</ja>(in=<js>"formData"</js>, name=<js>"contents"</js>, description=<js>"New contents in INI file format."</js>) 
			} 
		) 
		<jk>public</jk> Config setConfigContentsFormPost(<ja>@FormData</ja>(<js>"contents"</js>) String contents) <jk>throws</jk> Exception { 
			<jk>return</jk> setConfigContents(<jk>new</jk> StringReader(contents)); 
		} 
		
		<jd>/** 
		* [PUT /] - Sets contents of config file. 
		* 
		* <ja>@param</ja> contents The new contents of the config file. 
		* <ja>@return</ja> The new config file contents. 
		* <ja>@throws</ja> Exception 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/"</js>, 
			description=<js>"Sets contents of config file."</js>, 
			parameters={ 
				<ja>@Parameter</ja>(in=<js>"body"</js>, description=<js>"New contents in INI file format."</js>) 
			} 
		) 
		<jk>public</jk> Config setConfigContents(<ja>@Body</ja> Reader contents) <jk>throws</jk> Exception { 
			Config cf2 = Config.<jsm>create</jsm>().build().load(contents); 
			<jk>return</jk> getConfig().merge(cf2).save(); 
		} 
		
		<jd>/** 
		* [PUT /{section}] - Add or overwrite a config file section. 
		* 
		* <ja>@param</ja> section The section name. 
		* <ja>@param</ja> contents The new contents of the config file section. 
		* <ja>@return</ja> The new section. 
		* <ja>@throws</ja> Exception 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/{section}"</js>, 
			description=<js>"Add or overwrite a config file section."</js>, 
			parameters={ 
				<ja>@Parameter</ja>(in=<js>"path"</js>, name=<js>"section"</js>, description=<js>"Section name."</js>), 
				<ja>@Parameter</ja>(in=<js>"body"</js>, description=<js>"New contents for section as a simple map with string keys and values."</js>) 
			} 
		) 
		<jk>public</jk> ObjectMap setConfigSection(<ja>@Path</ja>(<js>"section"</js>) String section, <ja>@Body</ja> Map&lt;String,String&gt; contents) <jk>throws</jk> Exception { 
			getConfig().setSection(section, contents); 
			<jk>return</jk> getSection(section); 
		} 
		
		<jd>/** 
		* [PUT /{section}/{key}] - Add or overwrite a config file entry. 
		* 
		* <ja>@param</ja> section The section name. 
		* <ja>@param</ja> key The section key. 
		* <ja>@param</ja> value The new value. 
		* <ja>@return</ja> The new value. 
		* <ja>@throws</ja> Exception 
		*/</jd> 
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/{section}/{key}"</js>, 
			description=<js>"Add or overwrite a config file entry."</js>, 
			parameters={ 
				<ja>@Parameter</ja>(in=<js>"path"</js>, name=<js>"section"</js>, description=<js>"Section name."</js>), 
				<ja>@Parameter</ja>(in=<js>"path"</js>, name=<js>"key"</js>, description=<js>"Entry name."</js>), 
				<ja>@Parameter</ja>(in=<js>"body"</js>, description=<js>"New value as a string."</js>) 
			} 
		) 
		<jk>public</jk> String setConfigSection(<ja>@Path</ja>(<js>"section"</js>) String section, <ja>@Path</ja>(<js>"key"</js>) String key, <ja>@Body</ja> String value) <jk>throws</jk> Exception { 
			getConfig().put(section, key, value, <jk>false</jk>); 
			<jk>return</jk> getSection(section).getString(key); 
		} 
		
		<jk>private</jk> ObjectMap getSection(String name) { 
			ObjectMap m = getConfig().getSectionMap(name); 
			<jk>if</jk> (m == <jk>null</jk>) 
				<jk>throw new</jk> RestException(SC_NOT_FOUND, <js>"Section not found."</js>); 
			<jk>return</jk> m; 
		} 
	} 		
		</p>
		
		<h5 class='figure'>ConfigEdit.html</h5>
		<b>TODO - Needs update</b>
		<p class='bcode'>
	<xt>&lt;html&gt;</xt> 
	<xt>&lt;head&gt;</xt> 
		<xt>&lt;meta</xt> <xa>http-equiv</xa>=<xs>'Content-Type'</xs> <xa>content</xa>=<xs>'text/html; <xa>charset</xa>=UTF-8'</xs><xt>&gt;</xt> 
		<xt>&lt;style</xt> <xa>type</xa>=<xs>'text/css'</xs><xt>&gt;</xt> 
			<xt>@import</xt> <xs>'$R{servletURI}/style.css'</xs>; 
		<xt>&lt;/style&gt;</xt> 
	<xt>&lt;/head&gt;</xt> 
	<xt>&lt;body&gt;</xt> 
		<xt>&lt;h1&gt;</xt>$R{resourceTitle}<xt>&lt;/h1&gt;</xt> 
		<xt>&lt;h2&gt;</xt>Edit config file<xt>&lt;/h2&gt;</xt> 
		<xt>&lt;p</xt> <xa>class</xa>=<xs>'links'</xs><xt>&gt;</xt><xt>&lt;a</xt> <xa>href</xa>=<xs>'$R{requestParentURI}'</xs><xt>&gt;</xt>up<xt>&lt;/a&gt;</xt> - <xt>&lt;a</xt> <xa>href=<xs>'$R{servletURI}?method</xa>=OPTIONS'</xs><xt>&gt;</xt>options<xt>&lt;/a&gt;</xt><xt>&lt;/p&gt;</xt> 
		<xt>&lt;form</xt> <xa>id</xa>=<xs>'form'</xs> <xa>action</xa>=<xs>'$R{servletURI}'</xs> <xa>method</xa>=<xs>'POST'</xs> <xa>enctype</xa>=<xs>'application/x-www-form-urlencoded'</xs><xt>&gt;</xt> 
			<xt>&lt;div</xt> <xa>class</xa>=<xs>'data'</xs><xt>&gt;</xt> 
				<xt>&lt;table&gt;</xt> 
					<xt>&lt;tr&gt;</xt><xt>&lt;td</xt> <xa>colspan</xa>=<xs>'2'</xs> <xa>align</xa>=<xs>'right'</xs><xt>&gt;</xt><xt>&lt;button</xt> <xa>type</xa>=<xs>'submit'</xs><xt>&gt;</xt>Submit<xt>&lt;/button&gt;</xt><xt>&lt;button</xt> <xa>type</xa>=<xs>'reset'</xs><xt>&gt;</xt>Reset<xt>&lt;/button&gt;</xt><xt>&lt;/td&gt;</xt><xt>&lt;/tr&gt;</xt> 
					<xt>&lt;tr&gt;</xt><xt>&lt;th</xt> <xa>colspan</xa>=<xs>'2'</xs><xt>&gt;</xt>Contents<xt>&lt;/th&gt;</xt><xt>&lt;/tr&gt;</xt> 
					<xt>&lt;tr&gt;</xt><xt>&lt;td</xt> <xa>colspan</xa>=<xs>'2'</xs><xt>&gt;</xt><xt>&lt;textarea</xt> <xa>name</xa>=<xs>'contents'</xs> <xa>rows</xa>=<xs>'40'</xs> <xa>cols</xa>=<xs>'120'</xs> <xa>style</xa>=<xs>'white-space: pre; word-wrap: normal; overflow-x: scroll;'</xs><xt>&gt;</xt>$SA{contents}<xt>&lt;/textarea&gt;</xt><xt>&lt;/td&gt;</xt><xt>&lt;/tr&gt;</xt> 
				<xt>&lt;/table&gt;</xt> 
			<xt>&lt;/div&gt;</xt> 
		<xt>&lt;/form&gt;</xt> 
	<xt>&lt;/body&gt;</xt> 
	<xt>&lt;/html&gt;</xt> 		
		</p-->
	</div>

	<!-- ======================================================================================================= -->
	<a id="juneau-examples-rest.LogsResource"></a>
	<h4 class='topic' onclick='toggle(this)'>12.16 - LogsResource</h4>
	<div class='topic'>
		<p>
			The {@link org.apache.juneau.microservice.resources.LogsResource} class is a reusable predefined resource.
			<br>It provides a REST interface for the log files generated by the microservice.
		</p>
		<p>
			Pointing a browser to the resource shows the following:
		</p>
		<img class='bordered' src='doc-files/Samples.LogsResource.1.png'>
		<p>
			The <l>highlighted</l> links show the contents of the log file with color highlighting:
		</p>
		<img class='bordered' src='doc-files/Samples.LogsResource.2.png'>
		<p>
			The <l>parsed</l> links parse the log file and return the entries as serialized POJOs:
		</p>
		<img class='bordered' src='doc-files/Samples.LogsResource.3.png'>
	</div>

</div>

<!-- =============================================================================================================== -->
<a id="Security"></a>
<h2 class='topic' onclick='toggle(this)'>13 - Security Best-Practices</h2>
<div class='topic'>
	<p>
		Security is always an ongoing concern in any library.  
		If you discover any security vulnerabilities in this code, please refer to the instructions found here:
	</p>
	<ul class='spaced-list'>
		<li class='extlink'><a class='doclink' href='http://www.apache.org/security'>SECURITY</a>
	</ul>

	<!-- =========================================================================================================== -->
	<a id="Security.juneau-marshall"></a>
	<h3 class='topic' onclick='toggle(this)'>13.1 - juneau-marshall</h3>
	<div class='topic'>

		<h5 class='topic'>Demarshalling vulnerabilities</h5>
		<p>
			One common security vulnerability is the ability to create arbitrary Java object instances through crafted
			user input.  For example, support for constructing POJOs based on an input attribute defining a 
			fully-qualified class name like <js>"{class:'com.foo.MyBean',...}"</js>
		</p>
		<p>
			Fortunately, Juneau does not support an open-ended <js>"class</js> attribute.  
			As a rule, it should not be possible to create arbitrary POJOs by any of the parsers.
			The demarshalled object types are inferred via reflection of the class objects passed in through the parser 
			method (e.g. <code>JsonParser.<jsf>DEFAULT</jsf>.parse(input, MyBean.<jk>class</jk>)</code>).
			As long as the <code>Class</code> object passed into this method is not constructed from user-generated input,
			it should be free from demarshalling vulnerabilities.   
		</p> 
		<p>
			The following example shows a potential vector that circumvents the restriction above:
		</p>
		<p class='bcode'>
	<jc>// Don't do this!</jc>
	Class c = Class.<jsf>forName</jsf>(someUserInputString);
	JsonParser.<jsf>DEFAULT</jsf>.parse(input, c);  <jc>// Oops!  Security hole!</jc>
		</p>
		<p>
			Juneau does support something similar to a <js>"class"</js> attribute that allows you to define the
			POJO type at runtime.
			This is the <js>"type"</js> attribute.
			The difference is that it's not possible to specify fully-qualified class names in <js>"type"</js> attributes,
			and instead can only specify type keys defined through bean dictionaries. 
			Instead of serializing the fully-qualified class names in the output, we instead serialize type
			names that represent those POJO types.
			<br>i.e. instead of <js>"class='com.foo.MyBean'"</js>, we instead serialize <js>"type='MyBeanIdentifier'"</js>.
			<br>Since bean types are defined at compile time, it's impossible to instantiate arbitrary POJOs.
		</p>
		<p>
			POJO types of generalized input are also inferred through swaps.
			Again, since the POJO types are hardcoded at compile time, these should not be subject to demarshalling
			vulnerabilities.  However, it is possible to circumvent this through your swap implementation as shown
			below: 	
		</p>
		<p class='bcode'>
	<jc>// Don't do this!</jc>
	<jk>public class</jk> MyInsecureSwap <jk>extends</jk> PojoSwap&lt;ObjectMap,Object&gt; {
		<jk>public</jk> Object swap(BeanSession session, ObjectMap input) <jk>throws</jk> Exception {
			<jc>// Security hole!</jc>
			<jk>return</jk> Class.<jsf>forName</jsf>(input.getString(<js>"class"</js>)).newInstance();
		}
	}
		</p>
		<p>
			Note that the {@link org.apache.juneau.jso.JsoParser}, a thin layer of the Juneau Parser API written on 
			top of plain-old Java Object Serialization which itself is vulnerable to demarshalling issues.  
			Due to this, the JSO parser is not included in any of the default REST servlet implementations. 
			Be especially careful when using this parser, particularly if you want to use it for handing 
			<code>application/x-java-serialized-object</code> input through REST servlets. 
		</p>
		<p>
			All other parsers (JSON, URL-Encoding, MessagePack, etc...) work the same way in determining POJO types, so
			should be safe from demarshalling vulnerabilities.  
		</p>
		
		<h5 class='topic'>Dependent libraries</h5>
		<p>
			When accessing security vulnerabilities of any library, dependent libraries must also be taken into account:
		</p>
		<ul>
			<li>The JSON, HTML, MsgPack, URL-Encoding, and UON parsers are written from scratch and do not rely on
				any other parsing technologies.
			<li>The XML and HTML parsers uses the built-in Java StAX parser.
				This *should* be free from vulnerabilities.    
			<li>The RDF parsers rely on Apache Jena 2.7.1.  
				As of <code>7.0.1</code>, no known security vulnerabilities exist that affect Juneau at this time.
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="Security.juneau-svl"></a>
	<h3 class='topic' onclick='toggle(this)'>13.2 - juneau-svl</h3>
	<div class='topic'>
		<p>
			Care must be used when defining new {@link org.apache.juneau.svl.Var Vars} using the SVL API since mistakes 
			could potentially expose system properties, environment variables, or even file system files.
		</p>
		<p>
			For recap, the SVL support allows you to embed variables of the form <js>"$X{key}"</js> inside strings that
			get resolved to other strings.  The resolved strings themselves can also contain variables that also
			get recursively resolved.  
		</p>
		<p>
			An example of a potential security hole is shown below that could potentially expose any file on a file
			system through a REST request:
		</p>
		<p class='bcode'>
	<jk>public</jk> String doUnsafeGet(RestRequest req) {
		<jc>// Security hole!</jc>
		<jk>return</jk> req.getVarResolver().resolve(<js>"$RQ{foo}"</js>);
	}
		</p>
		<p>
			This code is simply echoing the value of the <code>foo</code> query parameter.
			Now say for example that a bad actor passes in the query string <js>"foo=$F{/some/file/on/file/system}"</js>.
			The <code>$F</code> variable allows you to resolve the contents of files using SVL, and is provided
			by default using the built-in variable resolver returned by the <code>RestRequest</code> object.
			You've potentially just exposed the contents of that file through your REST interface.
		</p>
		<p>
			In reality, the above security hole does not exist because of the following restrictions:
		</p>
		<ul class='spaced-list'>
			<li>
				<code>Vars</code> have two methods {@link org.apache.juneau.svl.Var#allowNested()} and 
				{@link org.apache.juneau.svl.Var#allowRecurse()} that can be overridden to prevent recursive processing
				of string variables.  These are both <jk>false</jk> for the <code>$R</code> variable, so the <code>$F</code>
				variable in the result will never get processed and instead be treated as plain text. 
			<li>
				The <code>$F</code> variable only allows you to retrieve files within the JVM starting directory. 
		</ul>
		<p>
			Even though the built-in Juneau variables are safe, special care is needed when defining your own custom
			variables.  If your variable resolves user input in any way, it's HIGHLY recommended that you override the
			{@link org.apache.juneau.svl.Var#allowNested()} and {@link org.apache.juneau.svl.Var#allowRecurse()} 
			methods to prevent recursive handling of variables.
		</p>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="Security.juneau-rest-server"></a>
	<h3 class='topic' onclick='toggle(this)'>13.3 - juneau-rest-server</h3>
	<div class='topic'>
		<p>
			Denial of service attacks can be alleviated through the {@link org.apache.juneau.rest.annotation.RestResource#maxInput() maxInput()}
			setting.  Arbitrarily-large input will trigger an exception before causing out-of-memory errors.
			The default value for this setting is 100MB.  
		</p>
		<p>
			Since the parsers do not use intermediate DOMs and instead parse directly into Java objects,  
			deeply nested data structures will almost always trigger stack overflow errors long before memory consumption
			becomes an issue.  However, this is NOT true of the RDF parsers that use an intermediate DOM.  If parsing 
			RDF, you may want to consider lowering the max-input value above.
		</p>
	</div>

</div>

<!-- =============================================================================================================== -->
<a id="ReleaseNotes"></a>
<h2 class='topic' onclick='toggle(this)'>14 - Release Notes</h2>
<div class='topic'>
	
	<h5 class='toc'>What's new in each release</h5>
	<ul class='toc'>
		<li><p><a class='doclink' href='#7.1.0'>7.1.0 (TBD)</a></p>
		<li><p><a class='doclink' href='#7.0.1'>7.0.1 (Dec 24, 2017)</a></p>
		<li><p><a class='doclink' href='#7.0.0'>7.0.0 (Oct 25, 2017)</a></p>
		<li><p><a class='doclink' href='#6.4.0'>6.4.0 (Oct 5, 2017)</a></p>
		<li><p><a class='doclink' href='#6.3.1'>6.3.1 (Aug 1, 2017)</a></p>
		<li><p><a class='doclink' href='#6.3.0'>6.3.0 (Jun 30, 2017)</a></p>
		<li><p><a class='doclink' href='#6.2.0'>6.2.0 (Apr 28, 2017)</a></p>
		<li><p><a class='doclink' href='#6.1.0'>6.1.0 (Feb 25, 2017)</a></p>
		<li><p><a class='doclink' href='#6.0.1'>6.0.1 (Jan 3, 2017)</a></p>
		<li><p><a class='doclink' href='#6.0.0'>6.0.0 (Oct 3, 2016)</a></p>
		<li><p><a class='doclink' href='#5.2.0.1'>5.2.0.1 (Mar 23, 2016)</a></p>
		<li><p><a class='doclink' href='#5.2.0.0'>5.2.0.0 (Dec 30, 2015)</a></p>
		<li><p><a class='doclink' href='#5.1.0.20'>5.1.0.20 (Sept 5, 2015)</a></p>
		<li><p><a class='doclink' href='#5.1.0.19'>5.1.0.19 (Aug 15, 2015)</a></p>
		<li><p><a class='doclink' href='#5.1.0.18'>5.1.0.18 (Aug 5, 2015)</a></p>
		<li><p><a class='doclink' href='#5.1.0.17'>5.1.0.17 (Aug 3, 2015)</a></p>
		<li><p><a class='doclink' href='#5.1.0.16'>5.1.0.16 (June 28, 2015)</a></p>
		<li><p><a class='doclink' href='#5.1.0.15'>5.1.0.15 (May 24, 2015)</a></p>
		<li><p><a class='doclink' href='#5.1.0.14'>5.1.0.14 (May 10, 2015)</a></p>
		<li><p><a class='doclink' href='#5.1.0.13'>5.1.0.13 (Apr 24, 2015)</a></p>
		<li><p><a class='doclink' href='#5.1.0.12'>5.1.0.12 (Mar 28, 2015)</a></p>
		<li><p><a class='doclink' href='#5.1.0.11'>5.1.0.11 (Feb 14, 2015)</a></p>
		<li><p><a class='doclink' href='#5.1.0.10'>5.1.0.10 (Dec 23, 2014)</a></p>
		<li><p><a class='doclink' href='#5.1.0.9'>5.1.0.9 (Dec 1, 2014)</a></p>
		<li><p><a class='doclink' href='#5.1.0.8'>5.1.0.8 (Oct 25, 2014)</a></p>
		<li><p><a class='doclink' href='#5.1.0.7'>5.1.0.7 (Oct 5, 2014)</a></p>
		<li><p><a class='doclink' href='#5.1.0.6'>5.1.0.6 (Sept 21, 2014)</a></p>
		<li><p><a class='doclink' href='#5.1.0.5'>5.1.0.5 (Sept 1, 2014)</a></p>
		<li><p><a class='doclink' href='#5.1.0.4'>5.1.0.4 (Aug 25, 2014)</a></p>
		<li><p><a class='doclink' href='#5.1.0.3'>5.1.0.3 (Jun 28, 2014)</a></p>
		<li><p><a class='doclink' href='#5.1.0.2'>5.1.0.2 (Apr 27, 2014)</a></p>
		<li><p><a class='doclink' href='#5.1.0.1'>5.1.0.1 (Jan 25, 2014)</a></p>
		<li><p><a class='doclink' href='#5.1.0.0'>5.1.0.0 (Jan 18, 2014)</a></p>
		<li><p><a class='doclink' href='#5.0.0.36'>5.0.0.36 (Dec 18, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.35'>5.0.0.35 (Nov 26, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.34'>5.0.0.34 (Nov 10, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.33'>5.0.0.33 (Oct 20, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.32'>5.0.0.32 (Oct 5, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.31'>5.0.0.31 (Aug 9, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.30'>5.0.0.30 (Aug 8, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.29'>5.0.0.29 (Aug 2, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.28'>5.0.0.28 (July 9, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.27'>5.0.0.27 (July 7, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.26'>5.0.0.26 (Jun 5, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.25'>5.0.0.25 (May 11, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.24'>5.0.0.24 (May 9, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.23'>5.0.0.23 (Apr 14, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.22'>5.0.0.22 (Apr 12, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.21'>5.0.0.21 (Apr 9, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.20'>5.0.0.20 (Apr 7, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.19'>5.0.0.19 (Apr 1, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.18'>5.0.0.18 (Mar 27, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.17'>5.0.0.17 (Mar 25, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.16'>5.0.0.16 (Mar 25, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.15'>5.0.0.15 (Mar 24, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.14'>5.0.0.14 (Mar 23, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.13'>5.0.0.13 (Mar 14, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.12'>5.0.0.12 (Mar 10, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.11'>5.0.0.11 (Mar 8, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.10'>5.0.0.10 (Mar 7, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.9'>5.0.0.9 (Feb 26, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.8'>5.0.0.8 (Jan 30, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.7'>5.0.0.7 (Jan 20, 2013)</a></p>
		<li><p><a class='doclink' href='#5.0.0.6'>5.0.0.6 (Oct 30, 2012)</a></p>
		<li><p><a class='doclink' href='#5.0.0.5'>5.0.0.5 (Oct 29, 2012)</a></p>
		<li><p><a class='doclink' href='#5.0.0.4'>5.0.0.4 (Oct 7, 2012)</a></p>
		<li><p><a class='doclink' href='#5.0.0.3'>5.0.0.3 (Oct 3, 2012)</a></p>
		<li><p><a class='doclink' href='#5.0.0.2'>5.0.0.2 (Sept 28, 2012)</a></p>
		<li><p><a class='doclink' href='#5.0.0.1'>5.0.0.1 (Jun 14, 2012)</a></p>
		<li><p><a class='doclink' href='#5.0.0.0'>5.0.0.0 (Jun 11, 2012)</a></p>
	</ul>

	<!-- =========================================================================================================== -->
	<a id="7.1.0"></a>
	<h3 class='topic' onclick='toggle(this)'>7.1.0 (TBD)</h3>
	<div class='topic'>
		<p>
		</p>
	
		<h5 class='topic'>juneau-marshall</h5>
		<ul class='spaced-list'>
			<li>
				Significant improvements made to the internals of the Serializer and Parser classes.
				<ul>
					<li>
						Caching improvements on serializers and parsers have reduced execution time of the core
						JUnits by approximately 1/3.
						<br>The 17000+ JUnit tests now execute in less than 10 seconds and have a cache-reuse hit rate
						of 98% (164104 serializers/parsers/bean-contexts retrieved, but only 1801 created from scratch).
					<li>
						All the various separate <code>Context</code> classes (e.g. <code>JsonSerializerContext</code>) have been folded into
						their respective serializer or parser classes (e.g. <code>JsonSerializer</code>).
						<br>Additionally, these classes are their own bean contexts.
						<br>For example, the class hierarchy of <code>JsonSerializer</code> is now:
						<ul class='doctree'>
							<li class='jac'>{@link org.apache.juneau.Context}
							<ul>
								<li class='jc'>{@link org.apache.juneau.BeanContext}
								<ul>
									<li class='jac'>{@link org.apache.juneau.serializer.Serializer}
									<ul>
										<li class='jac'>{@link org.apache.juneau.serializer.WriterSerializer}
										<ul>
											<li class='jc'>{@link org.apache.juneau.json.JsonSerializer}
										</ul>
									</ul>
								</ul>
							</ul>
						</ul>
						All <code>Context</code> objects are thread-safe and read-only.
					<li>
						Session objects also now have a consistent class hierarchy.
						<br>For example, the class hierarchy of <code>JsonSerializerSession</code> is now:
						<ul class='doctree'>
							<li class='jac'>{@link org.apache.juneau.Session}
							<ul>
								<li class='jc'>{@link org.apache.juneau.BeanSession}
								<ul>
									<li class='jac'>{@link org.apache.juneau.serializer.SerializerSession}
									<ul>
										<li class='jac'>{@link org.apache.juneau.serializer.WriterSerializerSession}
										<ul>
											<li class='jc'>{@link org.apache.juneau.json.JsonSerializerSession}
										</ul>
									</ul>
								</ul>
							</ul>
						</ul>
						Session objects are transient objects that live for the duration of a single parse.
					<li>
						Builder objects also now have a consistent class hierarchy.
						<br>For example, the class hierarchy of <code>JsonSerializerBuilder</code> is now:
						<ul class='doctree'>
							<li class='jac'>{@link org.apache.juneau.ContextBuilder}
							<ul>
								<li class='jc'>{@link org.apache.juneau.BeanContextBuilder}
								<ul>
									<li class='jac'>{@link org.apache.juneau.serializer.SerializerBuilder}
									<ul>
										<li class='jc'>{@link org.apache.juneau.json.JsonSerializerBuilder}
									</ul>
								</ul>
							</ul>
						</ul>
						Builder objects are used for building up and creating <code>Context</code> objects.
					<li>
						The {@link org.apache.juneau.PropertyStore} class has been completely rewritten.
						It is now a read-only configuration store build using the {@link org.apache.juneau.PropertyStoreBuilder}
						class.
						<br>The previous <code>PropertyStore</code> class was overly-complicated with many read/write
						locks to ensure thread-safety. 
						<br>The new design shifts to a builder-based model with read-only <code>PropertyStore</code> objects
						that can be used as hash keys.
				</ul>
			<li>
				New SVL variables:
				<ul>
					<li>{@link org.apache.juneau.svl.vars.CoalesceVar}
					<li>{@link org.apache.juneau.svl.vars.CoalesceAndRecurseVar}
				</ul>
			<li>
				Improvements to the HTTP-Part APIs.
				<br>The existing <code>PartSerializer</code>/<code>PartParser</code> classes
				have been replaced with the following all located in the new <code>org.apache.juneau.httppart</code> package:
				<ul class='doctree'>
					<li class='jp'>{@link org.apache.juneau.httppart}
					<ul>
						<li class='jc'>{@link org.apache.juneau.httppart.HttpPartType}
						<li class='jic'>{@link org.apache.juneau.httppart.HttpPartSerializer}
						<ul>
							<li class='jc'>{@link org.apache.juneau.httppart.UonPartSerializer}
							<li class='jc'>{@link org.apache.juneau.httppart.SimpleUonPartSerializer}
							<li class='jc'>{@link org.apache.juneau.httppart.SimplePartSerializer}
						</ul>
						<li class='jic'>{@link org.apache.juneau.httppart.HttpPartParser}
						<ul>
							<li class='jc'>{@link org.apache.juneau.httppart.UonPartParser}
							<li class='jc'>{@link org.apache.juneau.httppart.SimplePartParser}
						</ul>
					</ul>
				</ul>
				Code for marshalling of parts have been removed from the URL-Encoding serializers and parsers.
			<li>	
				<code>ContextBuilder.property(String,Object)</code> renamed to {@link org.apache.juneau.ContextBuilder#set(String,Object)}.
			<li>
				<code>ResourceFinder</code> class has been replaced with the following:
				<ul>
					<li>{@link org.apache.juneau.utils.ClasspathResourceFinder}
					<li>{@link org.apache.juneau.utils.ClasspathResourceFinderSimple}
					<li>{@link org.apache.juneau.utils.ClasspathResourceFinderBasic}
					<li>{@link org.apache.juneau.utils.ClasspathResourceFinderRecursive}
					<li>{@link org.apache.juneau.utils.ClasspathResourceManager}
				</ul>
			<li>
				New methods on {@link org.apache.juneau.serializer.SerializerSession}:
				<ul>
					<li>{@link org.apache.juneau.serializer.SerializerSession#getListener() getListener()}
					<li>{@link org.apache.juneau.serializer.SerializerSession#getListener(Class) getListener(Class)}
				</ul>
			<li>
				New methods on {@link org.apache.juneau.parser.ParserSession}:
				<ul>
					<li>{@link org.apache.juneau.parser.ParserSession#getListener() getListener()}
					<li>{@link org.apache.juneau.parser.ParserSession#getListener(Class) getListener(Class)}
				</ul>
			<li>
				New {@link org.apache.juneau.parser.Parser#PARSER_unbuffered} setting allows you to disable internal
				buffering on the JSON and UON parsers so that they can be used to read continous streams of objects.
			<li>
				New {@link org.apache.juneau.json.JsonParser#JSON_validateEnd} and {@link org.apache.juneau.uon.UonParser#UON_validateEnd} 
				settings allow you to control whether we validate that there is no garbage at the end of the parsed input.
			<li>
				New {@link org.apache.juneau.parser.Parser#PARSER_autoCloseStreams} setting allows input streams and
				readers passed into parsers to be automatically closed after parsing.
			<li>
				Syntax changed on unswap method on {@link org.apache.juneau.transform.Surrogate} classes.
				<br>It's now a regular method instead of a static method.
			<li>
				{@link org.apache.juneau.annotation.Swap @Swap} annotation can now be used with 
				{@link org.apache.juneau.transform.Surrogate} classes.
			<li>
				New support for <a class='doclink' href='#juneau-marshall.PojoBuilders'>POJO Builders</a>.	
		</ul>

		<h5 class='topic'>juneau-config</h5>
		<ul class='spaced-list'>
			<li>
				The Config API has been completely revamped.
				<br>New features include:
				<ul>
					<li>Support for pluggable storage.
					<li>File-system watcher integration support.
						<br>Changes made to file system files now automatically reflected in configurations
						and interface proxies.
					<li>New builder-based design.
				</ul>
		</ul>
		
		<h5 class='topic'>juneau-dto</h5>
		<ul class='spaced-list'>
			<li>
				Enhancements to Swagger DTO:
				<ul>
					<li>New methods for setting and retrieving properties via name:
						<ul>
							<li>{@link org.apache.juneau.dto.swagger.SwaggerElement#get(String,Class)}
							<li>{@link org.apache.juneau.dto.swagger.SwaggerElement#set(String,Object)}
						</ul>
					<li>
						Support for setting non-standard fields such as <js>"$ref"</js> via getter and setter
						above.
					<li>
						Setter methods that take in beans and collections of beans can now take in 
						JSON strings.
				</ul>
		</ul>
		
		<h5 class='topic'>juneau-rest-server</h5>
		<ul class='spaced-list'>
			<li>
				The <js>"$R{...}"</js> variable has been split into the following:
				<ul>
					<li><js>"$RA{key1[,key2...]}"</js> - {@link org.apache.juneau.rest.vars.RequestAttributeVar}, first non-null value returned by <code>HttpServletRequest.getAttribute(String)</code>.
					<li><js>"$RF{key1[,key2...]}"</js> - {@link org.apache.juneau.rest.vars.RequestFormDataVar}, first non-null value returned by {@link org.apache.juneau.rest.RestRequest#getFormData(String)}.
					<li><js>"$RH{key1[,key2...]}"</js> - {@link org.apache.juneau.rest.vars.RequestHeaderVar}, first non-null value returned by {@link org.apache.juneau.rest.RestRequest#getHeader(String)}.
					<li><js>"$RI{key1[,key2...]}"</js> - {@link org.apache.juneau.rest.vars.RestInfoVar}, first non-null value returned by {@link org.apache.juneau.rest.RestRequest#getInfoProvider()}.
						<br>The possible values are:
						<ul>
							<li><js>"contact"</js> - Value returned by {@link org.apache.juneau.dto.swagger.Info#getContact()}
							<li><js>"description"</js> - Value returned by {@link org.apache.juneau.rest.RestInfoProvider#getDescription(RestRequest)}
							<li><js>"externalDocs"</js> - Value returned by {@link org.apache.juneau.dto.swagger.Swagger#getExternalDocs()}
							<li><js>"license"</js> - Value returned by {@link org.apache.juneau.dto.swagger.Info#getLicense()}
							<li><js>"methodDescription"</js> - Value returned by {@link org.apache.juneau.rest.RestInfoProvider#getMethodDescription(Method,RestRequest)}
							<li><js>"methodSummary"</js> - Value returned by {@link org.apache.juneau.rest.RestInfoProvider#getMethodSummary(Method,RestRequest)}
							<li><js>"siteName"</js> - Value returned by {@link org.apache.juneau.rest.RestInfoProvider#getSiteName(RestRequest)}
							<li><js>"tags"</js> - Value returned by {@link org.apache.juneau.dto.swagger.Swagger#getTags()}
							<li><js>"termsOfService"</js> - Value returned by {@link org.apache.juneau.dto.swagger.Info#getTermsOfService()}
							<li><js>"title"</js> - See {@link org.apache.juneau.rest.RestInfoProvider#getTitle(RestRequest)}
							<li><js>"version"</js> - See {@link org.apache.juneau.dto.swagger.Info#getVersion()}
						</ul>					
					<li><js>"$RP{key1[,key2...]}"</js> - {@link org.apache.juneau.rest.vars.RequestPathVar}, first non-null value returned by {@link org.apache.juneau.rest.RestRequest#getPath(String)}.
					<li><js>"$RQ{key1[,key2...]}"</js> - {@link org.apache.juneau.rest.vars.RequestQueryVar}, first non-null value returned by {@link org.apache.juneau.rest.RestRequest#getQuery(String)}
					<li><js>"$R{key1[,key2...]}"</js> - {@link org.apache.juneau.rest.vars.RequestVar}, first non-null other request variable.
						<br>The possible values are:
						<ul>
							<li><js>"contextPath"</js> - Value returned by {@link org.apache.juneau.rest.RestRequest#getContextPath()}
							<li><js>"method"</js> - Value returned by {@link org.apache.juneau.rest.RestRequest#getMethod()}
							<li><js>"methodDescription"</js> - Value returned by {@link org.apache.juneau.rest.RestRequest#getMethodDescription()}
							<li><js>"methodSummary"</js> - Value returned by {@link org.apache.juneau.rest.RestRequest#getMethodSummary()}
							<li><js>"pathInfo"</js> - Value returned by {@link org.apache.juneau.rest.RestRequest#getPathInfo()}
							<li><js>"requestParentURI"</js> - Value returned by {@link org.apache.juneau.UriContext#getRootRelativePathInfoParent()}
							<li><js>"requestURI"</js> - Value returned by {@link org.apache.juneau.rest.RestRequest#getRequestURI()}
							<li><js>"resourceDescription"</js> - Value returned by {@link org.apache.juneau.rest.RestRequest#getResourceDescription()}
							<li><js>"resourceTitle"</js> - See {@link org.apache.juneau.rest.RestRequest#getResourceTitle()}
							<li><js>"servletParentURI"</js> - Value returned by {@link org.apache.juneau.UriContext#getRootRelativeServletPathParent()}
							<li><js>"servletPath"</js> - See {@link org.apache.juneau.rest.RestRequest#getServletPath()}
							<li><js>"servletURI"</js> - See {@link org.apache.juneau.UriContext#getRootRelativeServletPath()}
							<li><js>"siteName"</js> - See {@link org.apache.juneau.rest.RestRequest#getSiteName()}
						</ul>
				</ul>
			<li>
				Refactored the <code>RestConfig</code> class into {@link org.apache.juneau.rest.RestContextBuilder}.
				<br>Settings on {@link org.apache.juneau.rest.RestContext} objects can now be set declaratively through the 
					following new properties:
				<ul>
					<li>{@link org.apache.juneau.rest.RestContext#REST_allowHeaderParams REST_allowHeaderParams}
					<li>{@link org.apache.juneau.rest.RestContext#REST_allowBodyParam REST_allowBodyParam}
					<li>{@link org.apache.juneau.rest.RestContext#REST_allowedMethodParams REST_allowedMethodParams}
					<li>{@link org.apache.juneau.rest.RestContext#REST_renderResponseStackTraces REST_renderResponseStackTraces}
					<li>{@link org.apache.juneau.rest.RestContext#REST_useStackTraceHashes REST_useStackTraceHashes}
					<li>{@link org.apache.juneau.rest.RestContext#REST_defaultCharset REST_defaultCharset}
					<li>{@link org.apache.juneau.rest.RestContext#REST_maxInput REST_maxInput}
					<li>{@link org.apache.juneau.rest.RestContext#REST_paramResolvers REST_paramResolvers}
					<li>{@link org.apache.juneau.rest.RestContext#REST_converters REST_converters}
					<li>{@link org.apache.juneau.rest.RestContext#REST_guards REST_guards}
					<li>{@link org.apache.juneau.rest.RestContext#REST_responseHandlers REST_responseHandlers}
					<li>{@link org.apache.juneau.rest.RestContext#REST_defaultRequestHeaders REST_defaultRequestHeaders}
					<li>{@link org.apache.juneau.rest.RestContext#REST_defaultResponseHeaders REST_defaultResponseHeaders}
					<li>{@link org.apache.juneau.rest.RestContext#REST_produces REST_produces}
					<li>{@link org.apache.juneau.rest.RestContext#REST_consumes REST_consumes}
					<li>{@link org.apache.juneau.rest.RestContext#REST_clientVersionHeader REST_clientVersionHeader}
					<li>{@link org.apache.juneau.rest.RestContext#REST_resourceResolver REST_resourceResolver}
					<li>{@link org.apache.juneau.rest.RestContext#REST_logger REST_logger}
					<li>{@link org.apache.juneau.rest.RestContext#REST_callHandler REST_callHandler}
					<li>{@link org.apache.juneau.rest.RestContext#REST_infoProvider REST_infoProvider}
					<li>{@link org.apache.juneau.rest.RestContext#REST_path REST_path}
					<li>{@link org.apache.juneau.rest.RestContext#REST_contextPath REST_contextPath}
					<li>{@link org.apache.juneau.rest.RestContext#REST_staticFiles REST_staticFiles}
					<li>{@link org.apache.juneau.rest.RestContext#REST_staticFileResponseHeaders REST_staticFileResponseHeaders}
					<li>{@link org.apache.juneau.rest.RestContext#REST_classpathResourceFinder REST_classpathResourceFinder}
					<li>{@link org.apache.juneau.rest.RestContext#REST_useClasspathResourceCaching REST_useClasspathResourceCaching}
					<li>{@link org.apache.juneau.rest.RestContext#REST_widgets REST_widgets}
					<li>{@link org.apache.juneau.rest.RestContext#REST_mimeTypes REST_mimeTypes}
				</ul>
			<li>
				Support for static files has been simplified and improved.
				<ul>
					<li>Syntax on {@link org.apache.juneau.rest.annotation.RestResource#staticFiles() @RestResource.staticFiles()} has been simplified, and
						now allows you to specify response headers in the strings.
					<li>Response headers for static files can also be configured through 
						{@link org.apache.juneau.rest.RestContext#REST_staticFileResponseHeaders REST_staticFileResponseHeaders}.
					<li>Static file in-memory caching now configurable through 
						{@link org.apache.juneau.rest.RestContext#REST_useClasspathResourceCaching REST_useClasspathResourceCaching}.
					<li>Static file retrieval can be customized through 
						{@link org.apache.juneau.rest.RestContext#REST_classpathResourceFinder REST_classpathResourceFinder}
				</ul>
			<li>
				Eliminated the <code>RestMatcherReflecting</code> class.
				<br>You can now simply create a {@link org.apache.juneau.rest.RestMatcher} that has a public constructor that 
				takes in the server and method arguments.
			<li>
				<code>@RestResource.allowMethodParam</code> renamed to {@link org.apache.juneau.rest.annotation.RestResource#allowedMethodParams}.
			<li>
				<code>@RestMethod.serializersInherit</code> and <code>@RestMethod.parsersInherit</code> replaced with
				simplified {@link org.apache.juneau.rest.annotation.RestMethod#inherit() @RestMethod.inherit()}. 
			<li>
				Changes to {@link org.apache.juneau.rest.RequestFormData}:
				<ul>
					<li>{@link org.apache.juneau.rest.RequestFormData#addDefault(Map) addDefault(Map)} takes in a 
						<code>Map&lt;String,Object&gt;</code> instead of <code>Map&lt;String,String&gt;</code>.
				</ul>
			<li>
				Changes to {@link org.apache.juneau.rest.RequestHeaders}:
				<ul>
					<li>{@link org.apache.juneau.rest.RequestHeaders#addDefault(Map) addDefault(Map)} takes in a 
						<code>Map&lt;String,Object&gt;</code> instead of <code>Map&lt;String,String&gt;</code>.
				</ul>
			<li>
				Changes to {@link org.apache.juneau.rest.RequestQuery}:
				<ul>
					<li>{@link org.apache.juneau.rest.RequestQuery#addDefault(Map) addDefault(Map)} takes in a 
						<code>Map&lt;String,Object&gt;</code> instead of <code>Map&lt;String,String&gt;</code>.
				</ul>
			<li>
				Changes to {@link org.apache.juneau.rest.RestContext}:
				<ul>
					<li><code>getResource(String,Locale)</code> renamed to {@link org.apache.juneau.rest.RestContext#getClasspathResource(String,Locale) getClasspathResource(String,Locale)}
					<li><code>getResourceAsString(String,Locale)</code> renamed to {@link org.apache.juneau.rest.RestContext#getClasspathResourceAsString(String,Locale) getClasspathResourceAsString(String,Locale)}
					<li><code>getResource(Class,MediaType,String,Locale)</code> renamed to {@link org.apache.juneau.rest.RestContext#getClasspathResource(Class,MediaType,String,Locale) getClasspathResourceAsString(Class,MediaType,String,Locale)}
					<li>New method {@link org.apache.juneau.rest.RestContext#getClasspathResource(Class,String,Locale) getClasspathResource(Class,String,Locale)}.
					<li>New method {@link org.apache.juneau.rest.RestContext#getClasspathResourceAsString(Class,String,Locale) getClasspathResourceAsString(Class,String,Locale)}.
					<li>New method {@link org.apache.juneau.rest.RestContext#getClasspathResource(Class,Class,MediaType,String,Locale) getClasspathResource(Class,Class,MediaType,String,Locale)}.
					<li>{@link org.apache.juneau.rest.RestContext#getDefaultRequestHeaders() getDefaultRequestHeaders} returns a 
						<code>Map&lt;String,Object&gt;</code> instead of <code>Map&lt;String,String&gt;</code>.
					<li>{@link org.apache.juneau.rest.RestContext#getDefaultResponseHeaders() getDefaultRequestHeaders} returns a 
						<code>Map&lt;String,Object&gt;</code> instead of <code>Map&lt;String,String&gt;</code>.
				</ul>
			<li>
				Changes to {@link org.apache.juneau.rest.RestRequest}:
				<ul>	
					<li><code>getSupportedMediaTypes()</code> replaced with
						{@link org.apache.juneau.rest.RestRequest#getConsumes() getConsumes()} and
						{@link org.apache.juneau.rest.RestRequest#getProduces() getProduces()}.
					<li><code>getReaderResource(String,boolean,MediaType)</code> renamed to 
						{@link org.apache.juneau.rest.RestRequest#getClasspathReaderResource(String,boolean,MediaType) getClasspathReaderResource(String,boolean,MediaType)}
					<li><code>getReaderResource(String,boolean)</code> renamed to 
						{@link org.apache.juneau.rest.RestRequest#getClasspathReaderResource(String,boolean) getClasspathReaderResource(String,boolean)}
					<li><code>getReaderResource(String)</code> renamed to 
						{@link org.apache.juneau.rest.RestRequest#getClasspathReaderResource(String) getClasspathReaderResource(String)}
				</ul>
			<li>
				Changes to {@link org.apache.juneau.rest.annotation.RestResource @RestResource}:
				<ul>
					<li>New {@link org.apache.juneau.rest.annotation.RestResource#mimeTypes() mimeTypes()} annotation.
				</ul>
			<li>
				Changes to {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod}:
				<ul>
					<li>New {@link org.apache.juneau.rest.annotation.RestMethod#consumes() consumes()} and
						{@link org.apache.juneau.rest.annotation.RestMethod#produces() produces()}
						for overriding the supported media types inferred from the serializers and parsers.
				</ul>
			<li>
				<code>RestCallHandler</code> split up into {@link org.apache.juneau.rest.RestCallHandler} and 
				{@link org.apache.juneau.rest.RestCallHandlerDefault}
			<li>
				<code>RestInfoProvider</code> split up into {@link org.apache.juneau.rest.RestInfoProvider} and 
				{@link org.apache.juneau.rest.RestInfoProviderDefault}
			<li>
				<code>RestLogger</code> split up into {@link org.apache.juneau.rest.RestLogger}, 
				{@link org.apache.juneau.rest.RestLoggerDefault} and {@link org.apache.juneau.rest.RestLoggerNoOp}
			<li>
				<code>RestResourceResolverSimple</code> renamed to {@link org.apache.juneau.rest.RestResourceResolverDefault}
			<li>
				Introduced the following classes that helps make the code more understandable:
				<ul>
					<li>{@link org.apache.juneau.rest.RestContextProperties}
					<li>{@link org.apache.juneau.rest.RestMethodProperties}
					<li>{@link org.apache.juneau.rest.RequestProperties}
				</ul>
			<li>
				Eliminated the <code>@Messages</code> and <code>@Properties</code> REST java method parameter
				annotations.
				<br>These aren't needed anymore since you can just pass in <code>MessageBundle</code> and
				<code>RestRequestProperties</code> as unannotated parameters.
			<li>
				Revamped the {@link org.apache.juneau.rest.RestInfoProvider} class.
			<li>
				New builder classes:
				<ul>
					<li>{@link org.apache.juneau.rest.ReaderResourceBuilder}
					<li>{@link org.apache.juneau.rest.StreamResourceBuilder}
				</ul>
			<li>
				{@link org.apache.juneau.rest.RestResponse#getNegotiatedOutputStream()} now returns a 
				{@link org.apache.juneau.rest.FinishableServletOutputStream} and {@link org.apache.juneau.rest.RestResponse#getNegotiatedWriter()}
				now returns a {@link org.apache.juneau.rest.FinishablePrintWriter} that allows you to finish the output
				without closing the stream.
				<br>The {@link org.apache.juneau.rest.response.DefaultHandler} class now calls <code>finish()</code>
				instead of <code>close()</code> on the stream.
			<li>
				Added the following annotations to the {@link org.apache.juneau.rest.RestServletDefault} class
				(which were previously defined on the {@link org.apache.juneau.microservice.Resource} class):
				<p class='bcode'>
	<ja>@RestResource</ja>(
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			},
			stylesheet=<js>"$C{REST/stylesheet,servlet:/styles/devops.css}"</js>
		),
		
		<jc>// Optional external configuration file.</jc>
		config=<js>"$S{juneau.configFile}"</js>
	)
				</p>
		</ul>

		<h5 class='topic'>juneau-rest-client</h5>
		<ul class='spaced-list'>
			<li>
				New configuration property {@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_query} and
				builder method {@link org.apache.juneau.rest.client.RestClientBuilder#query(String,Object)}.
			<li>
				API changes to replace <code>PartSerializer</code> with {@link org.apache.juneau.httppart.HttpPartSerializer}.
				<br>The default value is now {@link org.apache.juneau.httppart.SimpleUonPartSerializer} which will
				serialize strings as plain-text and collections/arrays as comma-delimited lists.
				<br>We decided to change the default behavior in favor of practicality over purity.
			<li>
				New methods on {@link org.apache.juneau.rest.client.RestCall} class:
				<ul>
					<li>{@link org.apache.juneau.rest.client.RestCall#getResponseHeader(String) getResponseHeader(String)}
					<li>{@link org.apache.juneau.rest.client.RestCall#getResponseCode() getResponseCode()}
				</ul>
			<li>
				{@link org.apache.juneau.rest.client.RestCall} and {@link org.apache.juneau.rest.client.RestClient}
				now implement the <code>Closeable</code> interface.
		</ul>

		<h5 class='topic'>Documentation</h5>
		<ul class='spaced-list'>
			<li>
				New and updated sections in overview document:
				<ul>
					<li><p><a class='doclink' href='#juneau-marshall.PojoSwaps'>PojoSwaps</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.PerMediaTypePojoSwaps'>Per-media-type PojoSwaps</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.OneWayPojoSwaps'>One-way PojoSwaps</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.SwapAnnotation'>@Swap Annotation</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.SwapMethods'>Swap Methods</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.SurrogateClasses'>Surrogate Classes</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.BeanAnnotation'>@Bean Annotation</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.BeanPropertyAnnotation'>@BeanProperty Annotation</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.BeanConstructorAnnotation'>@BeanConstructor Annotation</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.BeanIgnoreAnnotation'>@BeanIgnore Annotation</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.NamePropertyAnnotation'>@NameProperty Annotation</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.ParentPropertyAnnotation'>@ParentProperty Annotation</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.URIs'>URIs</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.BeanFilters'>BeanFilters</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.StopClasses'>Stop Classes</a></p>
					<li><p><a class='doclink' href='#juneau-marshall.BypassSerialization'>Bypass Serialization</a></p>
				</ul>		
			<li>
				Updated javadocs:
				<ul>
					<li>{@link org.apache.juneau.BeanContext}
					<li>{@link org.apache.juneau.BeanContextBuilder}
					<li>{@link org.apache.juneau.rest.RestContext}
					<li>{@link org.apache.juneau.rest.RestContextBuilder}
					<li>Swagger DTOs.
				</ul>		
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="7.0.1"></a>
	<h3 class='topic' onclick='toggle(this)'>7.0.1 (Dec 24, 2017)</h3>
	<div class='topic'>
		<p>
			This release is a minor update.
			It includes the following prereq updates:
		</p>
		<ul class='spaced-list'>
			<li>Apache HttpClient:  4.5.3 to 4.5.4
			<li>Eclipse Jetty:  9.4.6.v20170531 to 9.4.8.v20171121
		</ul>
	
		<h5 class='topic'>juneau-marshall</h5>
		<ul class='spaced-list'>
			<li>New static <code>create()</code> methods for builders on serializers and parsers.
				<br>This simplifies the syntax of creation of serializers and parsers by scratch.
				<p class='bcode'>
	<jc>// Old way</jc>
	JsonSerializer s1 = <jk>new</jk> JsonSerializerBuilder().ws().build();
	
	<jc>// New way</jc>
	JsonSerializer s2 = JsonSerializer.<jsm>create</jsm>().ws().build();
				</p>
				<br>The same static create methods have also been added to the following classes:
				<ul>
					<li>{@link org.apache.juneau.serializer.SerializerGroup#create()}
					<li>{@link org.apache.juneau.parser.ParserGroup#create()}
					<li>{@link org.apache.juneau.encoders.EncoderGroup#create()}
					<li>{@link org.apache.juneau.rest.client.RestClient#create()}
					<li><code><del>ConfigFile.create()</del></code>
				</ul>
			<li>
				The order of the parameters in {@link org.apache.juneau.serializer.SerializerSession#serialize(Object,Object)}
				has been change to match {@link org.apache.juneau.serializer.Serializer#serialize(Object,Object)}.	
			<li>
				Fixed some bugs in the XML parser related to whitespace and comments.
		</ul>

		<h5 class='topic'>juneau-svl</h5>
		<ul class='spaced-list'>
			<li>New methods on {@link org.apache.juneau.svl.Var} class to restrict when nested and embedded variables
			are resolved.
				<ul>
					<li>{@link org.apache.juneau.svl.Var#allowNested()}
					<li>{@link org.apache.juneau.svl.Var#allowRecurse()}
				</ul>
		</ul>

		<h5 class='topic'>juneau-rest-server</h5>
		<ul class='spaced-list'>
			<li>
				New {@link org.apache.juneau.rest.annotation.RestResource#maxInput() @RestResource.maxInput()} and 
				{@link org.apache.juneau.rest.annotation.RestMethod#maxInput() @RestMethod.maxInput()} for alleviating
				potential DoS attacks.
		</ul>

		<h5 class='topic'>juneau-microservice-server</h5>
		<ul class='spaced-list'>
			<li>
				New pluggable console commands.
				<br>When you start up the microservice, you'll now see the following:
				<p class='bcode'>
	Running class 'RestMicroservice' using config file 'examples.cfg'.
	Server started on port 10000

	List of available commands:
		exit -- Shut down service
		restart -- Restarts service
		help -- Commands help
		echo -- Echo command

	&gt; <span style='color:green'>help help</span>
	NAME
		help -- Commands help
	
	SYNOPSIS
		help [command]
	
	DESCRIPTION
		When called without arguments, prints the descriptions of all available commands.
		Can also be called with one or more arguments to get detailed information on a command.
	
	EXAMPLES
		List all commands:
			&gt; help
		
		List help on the help command:
			&gt; help help
			
	&gt; 
				</p>
				<p>
				Commands are pluggable and extensible through the config file. 
	<p class='bcode'>
	<cc>#=======================================================================================================================
	# Console settings
	#=======================================================================================================================</cc>
	<cs>[Console]</cs>
	
	<ck>enabled</ck> = <cv>true</cv>
	
	<cc># List of available console commands.
	# These are classes that implements ConsoleCommand that allow you to submit commands to the microservice via
	# the console.
	# When listed here, the implementations must provide a no-arg constructor.
	# They can also be provided dynamically by overriding the Microservice.createConsoleCommands() method.</cc>
	<ck>commands</ck> = 
		<cv>org.apache.juneau.microservice.console.ExitCommand,
		org.apache.juneau.microservice.console.RestartCommand,
		org.apache.juneau.microservice.console.HelpCommand</cv>
	</p>
				<ul>
					<li>New classes:
						<ul>
							<li>{@link org.apache.juneau.microservice.console.ConsoleCommand}
							<li>{@link org.apache.juneau.microservice.console.ExitCommand}
							<li>{@link org.apache.juneau.microservice.console.RestartCommand}
							<li>{@link org.apache.juneau.microservice.console.HelpCommand}
						</ul>
					<li>New methods on {@link org.apache.juneau.microservice.Microservice}
						<ul>
							<li>{@link org.apache.juneau.microservice.Microservice#startConsole() startConsole()}
							<li>{@link org.apache.juneau.microservice.Microservice#createConsoleCommands() createConsoleCommands()}
							<li>{@link org.apache.juneau.microservice.Microservice#getConsoleReader() getConsoleReader()}
							<li>{@link org.apache.juneau.microservice.Microservice#getConsoleWriter() getConsoleWriter()}
						</ul>	
				</ul>
			<li>
				Console input reader and output writer can now be overridden.
			<li>
				Console strings are now internationalized.
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="7.0.0"></a>
	<h3 class='topic' onclick='toggle(this)'>7.0.0 (Oct 25, 2017)</h3>
	<div class='topic'>
		<p>
			This release ups the Java prerequisite to Java 7.
		</p>
		
		<h5 class='topic'>juneau-marshall</h5>
		<ul class='spaced-list'>
			<li>
				New class {@link org.apache.juneau.http.HttpMethodName} with valid static string HTTP method names.
		</ul>
		
		<h5 class='topic'>juneau-dto</h5>
		<ul class='spaced-list'>
			<li>
				Class <code>org.apache.juneau.dto.Link</code> renamed to {@link org.apache.juneau.dto.LinkString}.
				Helps avoid confusion since there are other Link classes in the library.
		</ul>

		<h5 class='topic'>juneau-rest-server</h5>
		<ul class='spaced-list'>
			<li>
				Annotation <code><ja>@HtmlDoc</ja>(links)</code> renamed to {@link org.apache.juneau.rest.annotation.HtmlDoc#navlinks() navlinks}.
			<li>
				New annotation {@link org.apache.juneau.rest.annotation.HtmlDoc#head() @HtmlDoc.head()}.
				<br>Allows you to specify arbitrary HTML content in the <xt>&lt;head&gt;</xt> section of the page.
			<li>
				Removed annotation <code><ja>@HtmlDoc</ja>(favIcon)</code>.
				<br>This was a discouraged way of defining fav-icons anyway, and with the addition of 
				<code><ja>@HtmlDoc</ja>(head)</code>, you can define them using:
				<p class='bcode'>
	head={
		<js>"&lt;link rel='icon' href='$U{servlet:/htdocs/juneau.png}'/&gt;"</js>
	}
				</p>
			<li>
				Removed several of the HTMLDOC-related methods from the <code>RestResponse/RestConfig/RestContext</code>
				classes and moved it into the new {@link org.apache.juneau.rest.HtmlDocBuilder} class.
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="6.4.0"></a>
	<h3 class='topic' onclick='toggle(this)'>6.4.0 (Oct 5, 2017)</h3>
	<div class='topic'>
		<p>
			The major change in this release is the project structure.
		</p>
		<p>
			The library now consists of the following artifacts found in the Maven group <code>"org.apache.juneau"</code>:
		</p>
		<table class='styled' style='min-width:800px;'>
			<tr>
				<th>Category</th><th>Maven Artifacts</th><th>Description</th><th>Prereqs</th>
			</tr>
			<tr class='dark bb'>
				<td rowspan="5" style='text-align:center;font-weight:bold;padding:20px;'>Juneau Core</td>
				<td class='code'>juneau-marshall</td>
				<td>Serializers and parsers for:
					<ul style='margin:0px 10px;'>
						<li>JSON
						<li>XML
						<li>HTML
						<li>UON
						<li>URL-Encoding
						<li>MessagePack
						<li>SOAP/XML
						<li>CSV
						<li>BSON (coming soon)
						<li>YAML (coming soon)
						<li>Protobuf (coming soon)
					</ul>
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
					</ul>
				</td>
			</tr>
			<tr class='dark bb'>
				<td class='code'>juneau-marshall-rdf</td>
				<td>
					Serializers and parsers for:
					<ul style='margin:0px 10px;'>
						<li>RDF/XML
						<li>RDF/XML-Abbrev 
						<li>N-Triple
						<li>Turtle
						<li>N3
					</ul>				
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
						<li>Apache Jena 2.7.1
					</ul>
				</td>
			</tr>
			<tr class='dark bb'>
				<td class='code'>juneau-dto</td>
				<td>
					Data Transfer Objects for:
					<ul style='margin:0px 10px;'>
						<li>HTML5
						<li>Atom
						<li>Cognos
						<li>JSON-Schema
						<li>Swagger 2.0
					</ul>				
				</td>
				<td><ul style='margin:0px 10px;'><li>Java 6</li></ul></td>
			</tr>
			<tr class='dark bb'>
				<td class='code'>juneau-svl</td>
				<td>
					Simple Variable Language API
				</td>
				<td><ul style='margin:0px 10px;'><li>Java 6</li></ul></td>
			</tr>
			<tr class='dark bb'>
				<td class='code'>juneau-config</td>
				<td>
					Configuration file API
				</td>
				<td><ul style='margin:0px 10px;'><li>Java 6</li></ul></td>
			</tr>
			<tr class='light bb'>
				<td rowspan="3" style='text-align:center;font-weight:bold;padding:20px;'>Juneau REST</td>
				<td class='code'>juneau-rest-server</td>
				<td>
					REST Servlet API
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
						<li>Servlet 3.1
					</ul>
				</td>
			</tr>
			<tr class='light bb'>
				<td class='code'>juneau-rest-server-jaxrs</td>
				<td>
					Optional JAX-RS support
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
						<li>JAX-RS 2.0
					</ul>
				</td>
			</tr>
			<tr class='light bb'>
				<td class='code'>juneau-rest-client</td>
				<td>
					REST Client API
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
						<li>Apache HttpClient 4.5
					</ul>
				</td>
			</tr>
			<tr class='dark bb'>
				<td rowspan="2" style='text-align:center;font-weight:bold;padding:20px;'>Juneau Microservice</td>
				<td class='code'>juneau-microservice-server</td>
				<td>
					REST Microservice Server API
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 8
						<li>Eclipse Jetty 9.4.3
					</ul>
				</td>
			</tr>
			<tr class='dark bb'>
				<td class='code'>juneau-microservice-template</td>
				<td>
					Developer template project
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 8
						<li>Eclipse Jetty 9.4.3
					</ul>
				</td>
			</tr>
			<tr class='light bb'>
				<td rowspan="2" style='text-align:center;font-weight:bold;padding:20px;'>Examples</td>
				<td class='code'><code>juneau-examples-core</code></td>
				<td>
					Core code examples
				</td>
				<td></td>
			</tr>
			<tr class='light bb'>
				<td class='code'><code>juneau-examples-rest</code></td>
				<td>
					REST code examples
				</td>
				<td></td>
			</tr>
			<tr class='dark bb'>
				<td rowspan="1" style='text-align:center;font-weight:bold;padding:20px;'>Juneau All</td>
				<td class='code'><code>juneau-all</code></td>
				<td>
					Combination of the following:
					<ul style='margin:0px 10px;'>
						<li>juneau-marshall
						<li>juneau-dto
						<li>juneau-svl
						<li>juneau-config
						<li>juneau-rest-server
						<li>juneau-rest-client
					</ul>
				</td>
				<td>
					<ul style='margin:0px 10px;'>
						<li>Java 6
						<li>Servlet 3.1
						<li>Apache HttpClient 4.5
					</ul>
				</td>
			</tr>
		</table>

		<h5 class='topic'>juneau-marshall</h5>
		<ul class='spaced-list'>
			<li>
				Improvements to swap support.
				<ul>
					<li>New {@link org.apache.juneau.annotation.Swap @Swap} annotation.
						<br>Replaces the <code>@Pojo</code> and <code>@BeanProperty.swap()</code> annotations.
					<li>Support for per-media-type swaps.
						<br>Programmatic example:
						<p class='bcode'>
	<ja>@Swap</ja>(MyJsonOnlySwap.<jk>class</jk>)			
	<jk>public class</jk> MyPojo {}

	<jk>public class</jk> MyJsonOnlySwap <jk>extends</jk> PojoSwap&lt;MyPojo,String&gt; {

			<jk>public</jk> MediaType[] forMediaTypes() {
				<jk>return</jk> MediaType.<jsm>forStrings</jsm>(<js>"&#42;/json"</js>);
			}

			<jk>public</jk> String swap(BeanSession session, MyPojo o) <jk>throws</jk> Exception {
				<jk>return</jk> <js>"It's JSON!"</js>;
 		}
						</p>
						<br>Annotated example:
						<p class='bcode'>
	<ja>@Swap</ja>(impl=ToStringSwap.<jk>class</jk>, mediaTypes=<js>"&#42;/json"</js>)
	<jk>public class</jk> MyBean { ... }

	<jk>public class</jk> ToStringSwap <jk>extends</jk> PojoSwap&lt;Object,String&gt; {
		<jk>public</jk> String swap(BeanSession session, Object o) <jk>throws</jk> Exception {
			<jk>return</jk> o.toString();
		}
	}
						</p>
					<li>Support for templated swaps which provide additional context information for a swap.
						<br>The following is an example of a templated swap class used to serialize POJOs to HTML using FreeMarker:
						<p class='bcode'>
	<jc>// Our abstracted templated swap class.</jc>
	<jk>public abstract class</jk> FreeMarkerSwap <jk>extends</jk> PojoSwap&lt;Object,Reader&gt; {

		<jk>public</jk> MediaType[] forMediaTypes() {
			<jk>return</jk> MediaType.<jsm>forStrings</jsm>(<js>"&#42;/html"</js>);
		}

		<jk>public</jk> Reader swap(BeanSession session, Object o, String template) <jk>throws</jk> Exception {
			<jk>return</jk> getFreeMarkerReader(template, o);  <jc>// Some method that creates raw HTML.</jc>
		}
	}
						</p>
						<p class='bcode'>
		<ja>@Swap</ja>(impl=FreeMarkerSwap.<jk>class</jk>, template=<js>"MyPojo.div.ftl"</js>)
		<jk>public class</jk> MyPojo {}
						</p>
					<li>New {@link org.apache.juneau.annotation.Swaps @Swaps} annotation for defining multiple swaps
						against the same POJO when they're differentiated by media types:
						<p class='bcode'>
	<ja>@Swaps</ja>(
		{
			<ja>@Swap</ja>(MyJsonSwap.<jk>class</jk>),
			<ja>@Swap</ja>(MyXmlSwap.<jk>class</jk>),
			<ja>@Swap</ja>(MyOtherSwap.<jk>class</jk>)
		}
	)
	<jk>public class</jk> MyPojo {}
						</p>
				</ul>
			<li>
				New {@link org.apache.juneau.transform.Surrogate} interface for identifying surrogate classes.
			<li>
				Serializers can now serialize to {@link java.util.StringBuilder StringBuilders}.
			<li>
				Serializers now serialize the contents of {@link java.io.Reader Readers} and {@link java.io.InputStream InputStreams}
				directly to the output stream or writer.
				<br>When used with conjunction with <code>PojoSwaps</code>, this can be used to provide customized
				output for specific content types.
				<p class='bcode'>
	<ja>@Pojo</ja>(swap=MyBeanSwap.<jk>class</jk>)
	<jk>public class</jk> MyBean {...}
	
	<jk>public class</jk> MyBeanSwap <jk>extends</jk> PojoSwap&lt;MyBean,Object&gt; {
		<jk>public</jk> Object swap(BeanSession session, MyPojo o) <jk>throws</jk> Exception {
			MediaType mt = session.getMediaType();
			<jk>if</jk> (mt.hasSubType(<js>"json"</js>))
				<jk>return new</jk> StringReader(<js>"{foo:'bar'}"</js>);  <jc>// Custom JSON output</jc>
			<jk>return</jk> o; <jc>// Otherwise treat as normal bean</jc>
		}
	}
	
	<jc>// Produces "{foo:'bar'}"</jc>
	String json = JsonSerializer.<jsf>DEFAULT_LAX</jsf>.toString(<jk>new</jk> MyBean());
				</p>
				<br>This feature helps with the implementation of language-agnostic template support such as for
				using FreeMaker to serialize POJOs to HTML.
			<li>
				{@link org.apache.juneau.serializer.SerializerSession} and {@link org.apache.juneau.parser.ParserSession}
				objects are now reusable if used within the same thread.
				<p class='bcode'>
	<jc>// Old way (still works)</jc>
	JsonSerializer.<jsf>DEFAULT</jsf>.serialize(writer1, pojo1);
	JsonSerializer.<jsf>DEFAULT</jsf>.serialize(writer2, pojo2);
	
	<jc>// Same, but using a session object</jc>
	SerializerSession session = JsonSerializer.<jsf>DEFAULT</jsf>.createSession();
	<jk>try</jk> {
		session.serialize(writer1, pojo1);
		session.serialize(writer2, pojo2);
	} <jk>finally</jk> {
		session.close();
	}  			
				</p>
				This is mostly an internal change and doesn't affect the existing APIs.
			<li>
				{@link org.apache.juneau.transform.PojoSwap#swap(BeanSession,Object)} and {@link org.apache.juneau.transform.PojoSwap#unswap(BeanSession,Object,ClassMeta)} 
				can now throw arbitrary exceptions instead of having to wrap them in <code>SerializeException</code>/<code>ParseException</code>.
			<li>
				New {@link org.apache.juneau.utils.CalendarUtils} class that encapsulates serialization/parsing logic from {@link org.apache.juneau.transforms.CalendarSwap} and 
				{@link org.apache.juneau.transforms.DateSwap}.
			<li>
				New annotation {@link org.apache.juneau.html.annotation.Html#anchorText}.
			<li>
				New methods on {@link org.apache.juneau.ObjectList}:
				<ul>
					<li>{@link org.apache.juneau.ObjectList#get(int,Class) get(int,Class)}
					<li>{@link org.apache.juneau.ObjectList#get(int,Type,Type...) get(int,Type,Type...)}
					<li>{@link org.apache.juneau.ObjectList#getMap(int,Class,Class) getMap(int,Class,Class)}
					<li>{@link org.apache.juneau.ObjectList#getList(int,Class) getList(int,Class)}
				</ul>
			<li>
				New methods on {@link org.apache.juneau.ObjectMap}:
				<ul>
					<li>{@link org.apache.juneau.ObjectMap#get(String,Class) get(String,Class)}
					<li>{@link org.apache.juneau.ObjectMap#get(String,Type,Type...) get(String,Type,Type...)}
					<li>{@link org.apache.juneau.ObjectMap#getWithDefault(String,Object) getWithDefault(String,Object)}
					<li>{@link org.apache.juneau.ObjectMap#getWithDefault(String,Object,Class) getWithDefault(String,Object,Class)}
					<li>{@link org.apache.juneau.ObjectMap#getWithDefault(String,Object,Type,Type...) getWithDefault(String,Object,Type,Type...)}
					<li>{@link org.apache.juneau.ObjectMap#getSwapped(String,PojoSwap) getSwapped(String,PojoSwap)}
					<li>{@link org.apache.juneau.ObjectMap#getAt(String,Class) getAt(String,Class)}
					<li>{@link org.apache.juneau.ObjectMap#getAt(String,Type,Type...) getAt(String,Type,Type...)}
					<li>{@link org.apache.juneau.ObjectMap#getMap(String,Class,Class,Map) getMap(String,Class,Class,Map)}
					<li>{@link org.apache.juneau.ObjectMap#getList(String,Class,List) getList(String,Class,List)}
				</ul>
			<li>
				New methods on {@link org.apache.juneau.utils.PojoRest}:
				<ul>
					<li>{@link org.apache.juneau.utils.PojoRest#get(String,Class) get(String,Class)}
					<li>{@link org.apache.juneau.utils.PojoRest#get(String,Type,Type...) get(String,Type,Type...)}
					<li>{@link org.apache.juneau.utils.PojoRest#getWithDefault(String,Object) getWithDefault(String,Object)}
					<li>{@link org.apache.juneau.utils.PojoRest#getWithDefault(String,Object,Class) getWithDefault(String,Object,Class)}
					<li>{@link org.apache.juneau.utils.PojoRest#getWithDefault(String,Object,Type,Type...) getWithDefault(String,Object,Type,Type...)}
				</ul>
			<li>
				Fixed bug where {@link org.apache.juneau.BeanSession#getMediaType()} wasn't returning a value.
			<li>
				Eliminated the <ja>@Consumes</ja> and <ja>@Produces</ja> annotations.
				<br>The supported media types are now passed in through the constructors.
				<br>This was changed to eliminate a performance issue where a field could not be set as final because
				the call to <code>getClass()</code> to retrieve the annotation value could not be called before calling
				the <code><jk>super</jk>()</code> method.
			<li>
				New class: {@link org.apache.juneau.utils.PojoMerge}
			<li>
				New doc: <del>2.6.2 - @Pojo annotation</del>
			<li>
				New doc: <del>2.6.5 - Serializing Readers and InputStreams</del>
		</ul>
		
		<h5 class='topic'>juneau-dto</h5>
		<ul class='spaced-list'>
			<li>
				{@link org.apache.juneau.dto.html5.HtmlElementMixed#children(Object...)} can now take in collections
				of objects.
			<li>
				The DTO beans can now be serialized to strings of their typical language by calling the <code>toString()</code> method.
				<br>For example, <code>Swagger.toString()</code> produces JSON and the HTML5 <code>Form.toString()</code>
				produces HTML.
		</ul>


		<h5 class='topic'>juneau-rest-server</h5>
		<ul class='spaced-list'>
			<li>
				Revamped and simplified servlet and REST-call lifecycle handling through new
				{@link org.apache.juneau.rest.annotation.RestHook @RestHook} annotation.
				<ul>
					<li>The {@link org.apache.juneau.rest.RestServlet#init(ServletConfig)} method is now final and can
						no longer be extended.
						<br>Instead, use {@link org.apache.juneau.rest.annotation.HookEvent#INIT} or 
						{@link org.apache.juneau.rest.annotation.HookEvent#POST_INIT} for initialization.
					<li>The following methods on {@link org.apache.juneau.rest.RestServlet} have been removed:
						<ul>
							<li><code>init(RestConfig)</code> 
								- Use {@link org.apache.juneau.rest.annotation.HookEvent#INIT} instead.
							<li><code>onSuccess(RestRequest, RestResponse, long)</code>
								- Use {@link org.apache.juneau.rest.annotation.HookEvent#END_CALL} instead.
							<li><code>onPreCall(RestRequest)</code>
								- Use {@link org.apache.juneau.rest.annotation.HookEvent#PRE_CALL} instead.
							<li><code>onPostCall(RestRequest, RestResponse)</code>
								- Use {@link org.apache.juneau.rest.annotation.HookEvent#POST_CALL} instead.
						</ul> 	
				</ul>
			<li>
				Simplified {@link org.apache.juneau.rest.widget.MenuItemWidget}.
				<br>Exposes an abstract method {@link org.apache.juneau.rest.widget.MenuItemWidget#getContent(RestRequest)} that
				can return raw HTML via readers or char-sequences, or any other object (such as HTML5 beans) that will
				get converted to HTML using {@link org.apache.juneau.html.HtmlSerializer#DEFAULT}.
			<li>
				{@link org.apache.juneau.rest.RestResourceResolver} instances are now inherited from parent resources to child resources
				unless explicitly overridden at the child level.
				<br>It's also been changed to an interface.
			<li>New annotations on {@link org.apache.juneau.rest.annotation.RestResource @RestResource}:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.RestResource#resourceResolver() resourceResolver()}
						<br>Allows you to specify a resource resolver on the servlet context to make it easier to work with
						dependency injection frameworks.
					<li>{@link org.apache.juneau.rest.annotation.RestResource#contextPath() contextPath()} - 
						<br>Allows you to override the context path value inherited from the servlet container.
					<li>{@link org.apache.juneau.rest.annotation.RestResource#allowHeaderParams() allowHeaderParams()} - 
						<br>Replaces the <code>RestContext.REST_allowHeaderParams</code> setting.
					<li><code><del>RestResource.allowMethodParam()</del></code> - 
						<br>Replaces the <code>RestContext.REST_allowMethodParam</code> setting.
					<li>{@link org.apache.juneau.rest.annotation.RestResource#allowBodyParam() allowBodyParam()} - 
						<br>Replaces the <code>RestContext.REST_allowBodyParam</code> setting.
					<li>{@link org.apache.juneau.rest.annotation.RestResource#renderResponseStackTraces() renderResponseStackTraces()} - 
						<br>Replaces the <code>RestContext.REST_xxx</code> setting.
					<li>{@link org.apache.juneau.rest.annotation.RestResource#useStackTraceHashes() useStackTraceHashes()} - 
						<br>Replaces the <code>RestContext.REST_useStackTraceHashes</code> setting.
					<li>{@link org.apache.juneau.rest.annotation.RestResource#defaultCharset() defaultCharset()} - 
						<br>Replaces the <code>RestContext.REST_defaultCharset</code> setting.
					<li><code><del>RestResource.paramFormat()</del></code> - 
						<br>Replaces the <code>RestContext.REST_paramFormat</code> setting.
				</ul>
			<li>New annotations on {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod}:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#defaultCharset() defaultCharset()} - 
						<br>Replaces the <code>RestContext.REST_defaultCharset</code> setting.
					<li><code><del>RestMethod.paramFormat()</del></code> - 
						<br>Replaces the <code>RestContext.REST_paramFormat</code> setting.
				</ul>
			<li>
				The following implementation classes can now be defined as non-static inner classes of servlets/resources:
				<ul>
					<li>{@link org.apache.juneau.rest.widget.Widget}
					<li>{@link org.apache.juneau.rest.RestConverter}
					<li>{@link org.apache.juneau.rest.RestGuard}
					<li>{@link org.apache.juneau.rest.ResponseHandler}
					<li>{@link org.apache.juneau.rest.RestCallHandler}
					<li>{@link org.apache.juneau.rest.RestInfoProvider}
					<li>{@link org.apache.juneau.rest.RestResourceResolver}
					<li>{@link org.apache.juneau.rest.RestLogger}
					<li>{@link org.apache.juneau.html.HtmlDocTemplate}
				</ul>
			<li>
				New tooltip template: {@link org.apache.juneau.rest.widget.Tooltip}
			<li>
				New dark theme:
				<br><img src='doc-files/ReleaseNotes.632.DarkStyle.png'>
			<li>
				Stylesheet selection now stored in HTTP session when passed in via <code>?stylesheet</code> query parameter.
			<li>
				New doc: <del>Lifecycle Hooks</del>
			<li>
				Eliminated the <code>RestServletJenaDefault</code> class to remove the Jena dependency class on 
				the <code>juneau-rest-server</code> artifact. 
				<br>It's simple enough to simply extend <code>RestServletDefault</code> and add the RDF serializers and
				parsers.
		</ul>

		<h5 class='topic'>juneau-microservice</h5>
		<ul class='spaced-list'>
			<li>
				The microservice has been significantly modified to be configured via a <code>jetty.xml</code> file
				for maximum flexibility instead of the hodge-podge of support in the config file.
				<br>Top-level servlets should now be defined in the provided <code>jetty.xml</code> file.
			<li>
				New methods on {@link org.apache.juneau.microservice.RestMicroservice}:
				<ul>
					<li>{@link org.apache.juneau.microservice.RestMicroservice#addServlet(Servlet,String) addServlet(Servlet,String)}
					<li>{@link org.apache.juneau.microservice.RestMicroservice#addServletAttribute(String,Object) addServletAttribute(String,Object)}
					<li>{@link org.apache.juneau.microservice.RestMicroservice#getServer() getServer()}
					<li>{@link org.apache.juneau.microservice.RestMicroservice#getInstance() getInstance()}
					<li>{@link org.apache.juneau.microservice.RestMicroservice#getPort() getPort()}
					<li>{@link org.apache.juneau.microservice.RestMicroservice#getContextPath() getContextPath()}
					<li>{@link org.apache.juneau.microservice.RestMicroservice#getProtocol() getProtocol()}
					<li>{@link org.apache.juneau.microservice.RestMicroservice#getHostName() getHostName()}
				</ul>
			<li>
				New methods on {@link org.apache.juneau.microservice.Microservice}:
				<ul>
					<li>{@link org.apache.juneau.microservice.Microservice#getInstance() getInstance()}
				</ul>
			<li>
				New class {@link org.apache.juneau.microservice.JettyLogger} for directing Jetty logging to the
				java.util.logging framework.
			<li>
				New class {@link org.apache.juneau.microservice.resources.DebugResource} for viewing and generating
				Jetty thread dumps through REST calls.
		</ul>

		<h5 class='topic'>org.apache.juneau.rest.examples</h5>
		<ul class='spaced-list'>
			<li>
				New example of adding a menu-item widget to the Pet Store resource (including tooltips):
				<br><img src='doc-files/ReleaseNotes.632.PetStoreAdd.png'>
		</ul>
	
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="6.3.1"></a>
	<h3 class='topic' onclick='toggle(this)'>6.3.1 (Aug 1, 2017)</h3>
	<div class='topic'>
		<p>
			Juneau 6.3.1 is a minor release.
		</p>

		<h5 class='topic'>org.apache.juneau</h5>
		<ul class='spaced-list'>
			<li>
				{@link org.apache.juneau.utils.PojoQuery} improvements.
			<li>
				New {@link org.apache.juneau.remoteable.RemoteMethod#returns()} annotation.
				<br>Allows you to specify whether the remote method returns the HTTP body or status code.
			<li>
				Fixed bugs with {@link org.apache.juneau.BeanContext#BEAN_includeProperties} and {@link org.apache.juneau.BeanContext#BEAN_excludeProperties} settings.
			<li>
				New/modified settings in <code><del>HtmlDocSerializerContext</del></code>:
				<ul>
					<li><code><del>HTMLDOC_script</del></code>
					<li><code><del>HTMLDOC_style</del></code> - Was <jsf>HTMLDOC_css</jsf>.
					<li><code><del>HTMLDOC_stylesheet</del></code> - Was <jsf>HTMLDOC_cssUrl</jsf>.  Now an array.
				</ul>
			<li>
				New <code><del>ResourceFinder</del></code> utility class.
				Allows you to search for resources up the parent hierarchy chain.
				Also allows you to search for localized resources.
			<li>
				Eliminated the following properties from <code><del>HtmlDocSerializerContext</del></code>:
				<jsf>HTMLDOC_title</jsf>, <jsf>HTMLDOC_description</jsf>, <jsf>HTMLDOC_description</jsf>
				<br>See below on changes to simplify HTML headers.
			<li>
				{@link org.apache.juneau.svl.Var} implementations can now throw exceptions and will be converted to
				<js>""{exceptionMessage}"</js> values.
		</ul>

		<h5 class='topic'>org.apache.juneau.rest</h5>
		<ul class='spaced-list'>
			<li>
				New 'light' stylesheet:
				<br><img src='doc-files/ReleaseNotes.631.LightStyle.png'>
				<br>Compared with previous 'devops':
				<br><img src='doc-files/ReleaseNotes.631.DevopsStyle.png'>
				<br>For those nolstalgic for old times, there's also 'original':
				<br><img src='doc-files/ReleaseNotes.631.OriginalStyle.png'>
			<li>
				Simplified the stylesheets and HTML code.
				<br>For example, the nav links are now an ordered list of elements which makes rendering as as side-bar
				(for example) easier to do in CSS.
			<li>
				Modifications to the following <ja>@HtmlDoc</ja> annotations:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.HtmlDoc#navlinks() navlinks()} - Now an array of strings instead of a JSON object.  Simplified syntax.
						<br>For example:
						<p class='bcode'>
	<jc>// Old syntax</jc>
	htmldoc=<ja>@HtmlDoc</ja>(
		links=<js>"{"</js>
			+ <js>"up:'request:/..',"</js>
			+ <js>"options:'servlet:/?method=OPTIONS',"</js>
			+ <js>"contentTypes:'$W{ContentTypeMenuItem}',"</js>
			+ <js>"styles:'$W{StyleMenuItem}',"</js>
			+ <js>"source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/PetStoreResource.java'"</js>
		+ <js>"}"</js>
	)
	
	<jc>// New syntax</jc>
	htmldoc=<ja>@HtmlDoc</ja>(
		navlinks={
			<js>"up: request:/.."</js>,
			<js>"options: servlet:/?method=OPTIONS"</js>,
			<js>"$W{ContentTypeMenuItem}"</js>,
			<js>"$W{StyleMenuItem}"</js>,
			<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/PetStoreResource.java"</js>
		}
	)
						</p>
						Previous syntax will still work, but you're encouraged to use the simplified syntax.
					<li>Several annotations are now arrays of strings instead of simple strings.
						Values are simply concatenated with newlines which makes multi-line values cleaner.
						<ul>
							<li>{@link org.apache.juneau.rest.annotation.HtmlDoc#header() header()}
							<li>{@link org.apache.juneau.rest.annotation.HtmlDoc#nav() nav()}
							<li>{@link org.apache.juneau.rest.annotation.HtmlDoc#aside() aside()}
							<li>{@link org.apache.juneau.rest.annotation.HtmlDoc#footer() footer()}
							<li>{@link org.apache.juneau.rest.annotation.HtmlDoc#script() script()}
							<li>{@link org.apache.juneau.rest.annotation.HtmlDoc#style() style()}
						</ul>
						Additionally, the <js>"INHERIT"</js> string literal can be used to combine the value with
						the value defined on the servlet or parent class.  Links can also be inserted at specific
						index positions.
				</ul>
			<li>
				Improvements made to the {@link org.apache.juneau.rest.widget.Widget} API.
				<ul>
					<li>
						You can now add arbitrary CSS and Javascript along with your widgets through new methods:
						<ul>
							<li>{@link org.apache.juneau.rest.widget.Widget#getHtml(RestRequest)}
							<li>{@link org.apache.juneau.rest.widget.Widget#getScript(RestRequest)}
							<li>{@link org.apache.juneau.rest.widget.Widget#getStyle(RestRequest)}
						</ul>
					</li>
					<li>
						Declaration of widgets moved to {@link org.apache.juneau.rest.annotation.HtmlDoc#widgets() @HtmlDoc.widgets()} 
						instead of separately on <ja>@RestResource</ja> and <ja>@RestMethod</ja> annotations.
					<li>
						{@link org.apache.juneau.rest.widget.Widget#getName()} now defaults to the simple class name.
						<br>So now you can just refer to the class name: <js>"$W{ContentTypeMenuItem}"</js>.
					<li>
						Renamed widgets:
						<ul>
							<li><code>PoweredByApacheWidget</code> -&gt; <code>PoweredByApache</code>  
							<li><code>PoweredByJuneauWidget</code> -&gt; <code>PoweredByJuneau</code>  
						</ul>
					<li>
						New {@link org.apache.juneau.rest.widget.MenuItemWidget} can be used as a starting point for creatint pull-down menu items.
					<li>
						New {@link org.apache.juneau.rest.widget.ContentTypeMenuItem} widget that provides a pull-down menu 
						with hyperlinks for all supported languages for that page:
						<br><img src='doc-files/ReleaseNotes.631.ContentTypeMenuItem.png'>
					<li>
						Improved {@link org.apache.juneau.rest.widget.QueryMenuItem} widget that provides a pull-down menu
						of a search/view/order-by/page form:
						<br><img src='doc-files/ReleaseNotes.631.QueryMenuItem.png'>
						<br>Fields are now pre-filled with current query parameters.
					<li>
						New {@link org.apache.juneau.rest.widget.StyleMenuItem} widget that provides a pull-down menu 
						with hyperlinks to show the content in the default stylesheets:
						<br><img src='doc-files/ReleaseNotes.631.StyleMenuItem.png'>
				</ul>
			<li>
				New/modified annotations on {@link org.apache.juneau.rest.annotation.HtmlDoc @HtmlDoc}:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.HtmlDoc#style() style()} - Renamed from <code>css()</code>.
					<li>{@link org.apache.juneau.rest.annotation.HtmlDoc#stylesheet() stylesheet()} - Renamed from <code>cssUrl()</code>.
						<br>Can now be a comma-delimited list of URLs.
					<li>{@link org.apache.juneau.rest.annotation.HtmlDoc#script() script()} - Add arbitrary Javascript to page header.
				</ul>
		
			<li>
				Bug fix with {@link org.apache.juneau.rest.annotation.HtmlDoc#nowrap() @HtmlDoc.nowrap()} so that the setting only applies
				to the data contents, not the whole page.
			<li>
				Two convenience methods added to {@link org.apache.juneau.rest.RestRequest}:
				<ul>
					<li>{@link org.apache.juneau.rest.RestRequest#attr(String,Object) attr(String,Object)}
					<li>{@link org.apache.juneau.rest.RestRequest#prop(String,Object) prop(String,Object)}
				</ul>
			</li>
			<li>
				Annotations added:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.RestResource#siteName() @RestResource.siteName()}
					<li>{@link org.apache.juneau.rest.annotation.RestResource#flags() @RestResource.flags()}
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#flags() @RestMethod.flags()}
				</ul>
			</li>
			<li>
				Eliminated the <code>@RestResource.stylesheet()</code> annotation.  
				It's no longer needed now that you can easily specify styles via <ja>@Htmldoc</ja>.
			<li>
				Eliminated the following annotations since they are now redundant with {@link org.apache.juneau.rest.annotation.HtmlDoc#header() @HtmlDoc.header()}:
				<ul>
					<li><code>title()</code>
					<li><code>description()</code>
					<li><code>branding()</code>
				</ul>
				Instead, the {@link org.apache.juneau.rest.RestServletDefault} class defines the following default header
				that can be easily overridden: 
				<p class='bcode'>
	htmldoc=<ja>@HtmlDoc</ja>(
		header={
			<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,
			<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>,
			<js>"&lt;a href='http://juneau.apache.org'&gt;&lt;img src='$U{servlet:/htdocs/juneau.png}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;&lt;/a&gt;"</js>
		}
	)
				</p>
				Note that the subtitle first tries using the method summary and then the servlet description.
			<li>
				New {@link org.apache.juneau.rest.vars.FileVar $F} variable resolver for resolving the contents of 
				files in the classpath.
				<br>The <code>DockerRegistryResource</code> examples shows how it can be used to pull in a localized
				file from the classpath to populate the aside section of a page.
				<p class='bcode'>
	htmldoc=<ja>@HtmlDoc</ja>(
		<jc>// Pull in aside contents from file.</jc>
		aside=<js>"$F{resources/DockerRegistryResourceAside.html}"</js>
	)
				</p>
			<li>
				New {@link org.apache.juneau.rest.ReaderResource#toCommentStrippedString()} method.
			<li>
				The <code>bpIncludes()</code> and <code>bpExcludes()</code> annotations on <ja>@RestMethod</ja>
				has been replaced with the following:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#bpi() bpi()} - Now an array of simplified values instead of LAX JSON.
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#bpx() bpx()} - Now an array of simplified values instead of LAX JSON.
				</ul>
			<li>
				Two new variables added to <code>$R</code> variable: <js>"$R{servletClass}"</js>, <js>"$R{servletClassSimple}"</js>
		</ul>

		<h5 class='topic'>org.apache.juneau.rest.examples</h5>
		<ul class='spaced-list'>
			<li>
				Added CONTENT-TYPE and STYLES menu items to most pages.
			<li>
				Added improved QUERY menu item to PetStore page.
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="6.3.0"></a>
	<h3 class='topic' onclick='toggle(this)'>6.3.0 (Jun 30, 2017)</h3>
	<div class='topic'>
		<p>
			Juneau 6.3.0 is a major update with significant new functionality for defining proxy interfaces against
			arbitrary 3rd-party REST interfaces.
		</p>

		<h5 class='topic'>org.apache.juneau</h5>
		<ul class='spaced-list'>
			<li>
				New package:  {@link org.apache.juneau.http}.
			<li>
				Support for dynamic beans.  See {@link org.apache.juneau.annotation.BeanProperty#name() @BeanProperty.name()}.
			<li>
				New doc: <code><del>2.8 - Virtual Beans</del></code>
			<li>
				New doc: <code><del>2.13 - Comparison with Jackson</del></code>
			<li>
				All parsers now allow for numeric types with <js>'K'</js>/<js>'M'</js>/<js>'G'</js> suffixes to represent
				kilobytes, megabytes, and gigabytes.
				<p class='bcode'>
	<jc>// Example</jc>
	<jk>int</jk> i = JsonParser.<jsf>DEFAULT</jsf>.parse(<js>"123M"</js>);  <jc>// 123MB</jc>
				</p>
			<li>New/modified methods on <code><del>ConfigFile</del></code>:
				<ul>
					<li><code><del>ConfigFile.put(String,String,String,boolean)</del></code>
					<li><code><del>ConfigFile.put(String,String,Object,Serializer,boolean,boolean)</del></code>
					<li><code><del>ConfigFile.getObject(String,Type,Type...)</del></code>
					<li><code><del>ConfigFile.getObject(String,Parser,Type,Type...)</del></code>
					<li><code><del>ConfigFile.getObject(String,Class)</del></code>
					<li><code><del>ConfigFile.getObject(String,Parser,Class)</del></code>
					<li><code><del>ConfigFile.getObject(String,String,Type,Type...)</del></code>
					<li><code><del>ConfigFile.getObject(String,String,Parser,Type,Type...)</del></code>
					<li><code><del>ConfigFile.getObject(String,String,Class)</del></code>
					<li><code><del>ConfigFile.getObject(String,String,Parser,Class)</del></code>
					<li><code><del>ConfigFile.getObjectWithDefault(String,Object,Type,Type...)</del></code> 
					<li><code><del>ConfigFile.getObjectWithDefault(String,Parser,Object,Type,Type...)</del></code>
					<li><code><del>ConfigFile.getObjectWithDefault(String,Object,Class)</del></code>
					<li><code><del>ConfigFile.getObjectWithDefault(String,Parser,Object,Class)</del></code> 
				</ul>
			<li>New ability to interact with config file sections with proxy interfaces with new method <code><del>ConfigFile.getSectionAsInterface(String,Class)</del></code>.
			<li>{@link org.apache.juneau.annotation.BeanProperty @BeanProperty} annotation can now be applied to getters
				and setters defined on interfaces.
			<li>New methods on {@link org.apache.juneau.serializer.SerializerSession} and {@link org.apache.juneau.parser.ParserSession}
				for retrieving context and runtime-override properties:
				<ul>
					<li><code><del>Session.getProperty(String)</del></code>
					<li><code><del>Session.getProperty(String,String)</del></code>
					<li><code><del>Session.getProperty(Class,String)</del></code>
					<li><code><del>Session.getProperty(Class,String,Object)</del></code>
				</ul>	
			<li>New <code><del>org.apache.juneau.serializer.PartSerializer</del></code> interface particularly tailored to HTTP
				headers, query parameters, form-data parameters, and path variables.  
				<br>Allows easy user-defined serialization of these objects.
				<br>The interface can be used in the following locations:
				<ul>
					<li>{@link org.apache.juneau.rest.client.RestClientBuilder#partSerializer(Class)}
					<li>{@link org.apache.juneau.remoteable.Path#serializer} 
					<li>{@link org.apache.juneau.remoteable.Query#serializer} 
					<li>{@link org.apache.juneau.remoteable.QueryIfNE#serializer} 
					<li>{@link org.apache.juneau.remoteable.FormData#serializer} 
					<li>{@link org.apache.juneau.remoteable.FormDataIfNE#serializer} 
					<li>{@link org.apache.juneau.remoteable.Header#serializer} 
					<li>{@link org.apache.juneau.remoteable.HeaderIfNE#serializer} 
				</ul>
			<li>Across-the-board improvements to the URI-resolution support (i.e. how URIs get serialized).
				<ul>
					<li>New support for resolving URIs with the following newly-recognized protocols:
						<ul>
							<li><js>"context:/..."</js> - Relative to context-root of the application.
							<li><js>"servlet:/..."</js> - Relative to the servlet URI.
							<li><js>"request:/..."</js> - Relative to the request URI.
						</ul>
						For example, currently we define HTML page links using variables and servlet-relative URIs...
						<p class='bcode'>
	pages=<js>"{up:'$R{requestParentURI}', options:'?method=OPTIONS', upload:'upload'}"</js>
						</p>
						With these new protocols, we can define them like so:
						<p class='bcode'>
	links=<js>"{top:'context:/', up:'request:/..' ,options:'servlet:/?method=OPTIONS', upload:'servlet:/upload'}"</js>
						</p>
						The old method of using variables and servlet-relative URIs will still be supported, but using 
						these new protocols should (hopefully) be easier to understand.
						<br>
						These protocols work on all serialized URL and URI objects, as well as classes and properties 
						annotated with {@link org.apache.juneau.annotation.URI @URI}.
					<li>New classes:
						<ul>
							<li>{@link org.apache.juneau.UriContext}
							<li>{@link org.apache.juneau.UriRelativity}
							<li>{@link org.apache.juneau.UriResolution}
							<li>{@link org.apache.juneau.UriResolver}
						</ul>
					<li>New configuration properties:
						<li><code><del>SerializerContext.SERIALIZER_uriContext</del></code>
						<li><code><del>SerializerContext.SERIALIZER_uriRelativity</del></code>
						<li><code><del>SerializerContext.SERIALIZER_uriResolution</del></code>
						<li><code><del>SerializerContext.SERIALIZER_maxIndent</del></code>
				</ul>
			<li>New annotation property: {@link org.apache.juneau.annotation.BeanProperty#value() @BeanProperty.value()}.
				<br>The following two annotations are considered equivalent:
				<p class='bcode'>
	<ja>@BeanProperty</ja>(name=<js>"foo"</js>)
	
	<ja>@BeanProperty</ja>(<js>"foo"</js>)
				</p>
			<li>Fixed a race condition in ClassMeta.
			<li><jsf>URLENC_paramFormat</jsf> has been moved to <code><del>UonSerializer.UON_paramFormat</del></code>, 
				and the UON/URL-Encoding serializers will now always serialize all values as plain text.
				<br>This means that arrays and maps are converted to simple comma-delimited lists.
			<li>Listener APIs added to serializers and parsers:
				<ul>
					<li>{@link org.apache.juneau.serializer.SerializerListener}
					<li>{@link org.apache.juneau.serializer.SerializerBuilder#listener(Class)}
					<li>{@link org.apache.juneau.rest.annotation.RestResource#serializerListener() @RestResource.serializerListener()}
					<li><code><del>RestConfig.serializerListener(Class)</del></code>
					<li>{@link org.apache.juneau.parser.ParserListener}
					<li>{@link org.apache.juneau.parser.ParserBuilder#listener(Class)}
					<li>{@link org.apache.juneau.rest.annotation.RestResource#parserListener() @RestResource.parserListener()}
					<li><code><del>RestConfig.parserListener(Class)</del></code>
					<li><code><del>RestClientBuilder.listeners(Class,Class)</del></code>
				</ul>juneau-examples-core.import1.pngjuneau-examples-core.import1.png
			<li>The {@link org.apache.juneau.BeanContext#BEAN_debug} flag will now capture parser input and make it
				available through the <code><del>ParserSession.getInputAsString()</del></code> method so that it can be used
				in the listeners.
			<li>Significant new functionality introduced to the HTML serializer.  
				<br>Lots of new options for customizing the HTML output.
				<ul>
					<li>New {@link org.apache.juneau.html.annotation.Html#render() @Html.render()} annotation and {@link org.apache.juneau.html.HtmlRender} class that allows you
						to customize the HTML output and CSS style on bean properties:
						<br><img class='bordered' src='doc-files/ReleaseNotes.630.1.png'>
						<br>Annotation can be applied to POJO classes and bean properties.
					<li>Several new properties for customizing parts of the HTML page:
						<ul>
							<li><code><del>HtmlDocSerializerContext.HTMLDOC_title</del></code>
							<li><code><del>HtmlDocSerializerContext.HTMLDOC_description</del></code>
							<li><code><del>HtmlDocSerializerContext.HTMLDOC_branding</del></code>
							<li><code><del>HtmlDocSerializerContext.HTMLDOC_header</del></code>
							<li><code><del>HtmlDocSerializerContext.HTMLDOC_nav</del></code>
							<li><code><del>HtmlDocSerializerContext.HTMLDOC_aside</del></code>
							<li><code><del>HtmlDocSerializerContext.HTMLDOC_footer</del></code>
							<li><code><del>HtmlDocSerializerContext.HTMLDOC_noResultsMessage</del></code>
							<li><code><del>HtmlDocSerializerContext.HTMLDOC_cssUrl</del></code>
							<li><code><del>HtmlDocSerializerContext.HTMLDOC_css</del></code>
							<li><code><del>HtmlDocSerializerContext.HTMLDOC_template</del></code>
						</ul>
					<li>New interface {@link org.apache.juneau.html.HtmlDocTemplate} that allows full control over rendering
						of HTML produced by {@link org.apache.juneau.html.HtmlDocSerializer}.
					
				</ul>
			<li>{@link org.apache.juneau.annotation.NameProperty @NameProperty} and {@link org.apache.juneau.annotation.ParentProperty @ParentProperty}
				can now be applied to fields.  
			<li>New properties on {@link org.apache.juneau.BeanContext}:
				<ul>
					<li>{@link org.apache.juneau.BeanContext#BEAN_includeProperties BEAN_includeProperties}
					<li>{@link org.apache.juneau.BeanContext#BEAN_excludeProperties BEAN_excludeProperties}
				</ul>
			<li>New annotation property: {@link org.apache.juneau.annotation.BeanProperty#format() @BeanProperty.format()}.
		</ul>

		<h5 class='topic'>org.apache.juneau.rest</h5>
		<ul class='spaced-list'>
			<li>
				MAJOR enhancements made to the REST API.
			<li>
				The {@link org.apache.juneau.rest.RestRequest} class functionality has been broken up into the following
				functional pieces to reduce its complexity:
				<ul>
					<li>{@link org.apache.juneau.rest.RestRequest#getBody()} - The request body.
					<li>{@link org.apache.juneau.rest.RestRequest#getHeaders()} - The request headers.
					<li>{@link org.apache.juneau.rest.RestRequest#getQuery()} - The request query parameters.
					<li>{@link org.apache.juneau.rest.RestRequest#getFormData()} - The request form data parameters.
					<li>{@link org.apache.juneau.rest.RestRequest#getPathMatch()} - The path variables and remainder.
				</ul>	
				The following classes have been introduced:
				<ul>
					<li>{@link org.apache.juneau.rest.RequestBody}
					<li>{@link org.apache.juneau.rest.RequestHeaders}
					<li>{@link org.apache.juneau.rest.RequestQuery}
					<li>{@link org.apache.juneau.rest.RequestFormData}
					<li>{@link org.apache.juneau.rest.RequestPathMatch}
				</ul>						
			<li>
				The un-annotated parameter types that can be passed in through REST Java methods has been significantly expanded.
				<br>For reference, the previous supported types were:
				<ul>
					<li>{@link org.apache.juneau.rest.RestRequest} - The request object.
					<li>{@link javax.servlet.http.HttpServletRequest} - The superclass of <code>RestRequest</code>.
					<li>{@link org.apache.juneau.rest.RestResponse} - The response object.
					<li>{@link javax.servlet.http.HttpServletResponse} - The superclass of <code>RestResponse</code>.
				</ul>
				The new supported types are:
				<ul>
					<li>{@link org.apache.juneau.http.Accept}
					<li>{@link org.apache.juneau.http.AcceptCharset}
					<li>{@link org.apache.juneau.http.AcceptEncoding}
					<li>{@link org.apache.juneau.http.AcceptLanguage}
					<li>{@link org.apache.juneau.http.Authorization}
					<li>{@link org.apache.juneau.http.CacheControl}
					<li>{@link org.apache.juneau.http.Connection}
					<li>{@link org.apache.juneau.http.ContentLength}
					<li>{@link org.apache.juneau.http.ContentType}
					<li>{@link org.apache.juneau.http.Date}
					<li>{@link org.apache.juneau.http.Expect}
					<li>{@link org.apache.juneau.http.From}
					<li>{@link org.apache.juneau.http.Host}
					<li>{@link org.apache.juneau.http.IfMatch}
					<li>{@link org.apache.juneau.http.IfModifiedSince}
					<li>{@link org.apache.juneau.http.IfNoneMatch}
					<li>{@link org.apache.juneau.http.IfRange}
					<li>{@link org.apache.juneau.http.IfUnmodifiedSince}
					<li>{@link org.apache.juneau.http.MaxForwards}
					<li>{@link org.apache.juneau.http.Pragma}
					<li>{@link org.apache.juneau.http.ProxyAuthorization}
					<li>{@link org.apache.juneau.http.Range}
					<li>{@link org.apache.juneau.http.Referer}
					<li>{@link org.apache.juneau.http.TE}
					<li>{@link org.apache.juneau.http.UserAgent}
					<li>{@link org.apache.juneau.http.Upgrade}
					<li>{@link org.apache.juneau.http.Via}
					<li>{@link org.apache.juneau.http.Warning}
					<li>{@link java.util.TimeZone}
					<li>{@link java.io.InputStream}
					<li>{@link javax.servlet.ServletInputStream}
					<li>{@link java.io.Reader}
					<li>{@link java.io.OutputStream}
					<li>{@link javax.servlet.ServletOutputStream}
					<li>{@link java.io.Writer}
					<li>{@link java.util.ResourceBundle} - Client-localized resource bundle.
					<li>{@link org.apache.juneau.utils.MessageBundle} - A resource bundle with additional features.
					<li>{@link java.util.Locale} - Client locale.
					<li>{@link org.apache.juneau.rest.RequestHeaders} - API for accessing request headers.
					<li>{@link org.apache.juneau.rest.RequestQuery} - API for accessing request query parameters.
					<li>{@link org.apache.juneau.rest.RequestFormData} - API for accessing request form data.
					<li>{@link org.apache.juneau.rest.RequestPathMatch} - API for accessing path variables.
					<li>{@link org.apache.juneau.rest.RequestBody} - API for accessing request body.
					<li>{@link org.apache.juneau.http.HttpMethod} - The method name matched (when using <code><ja>@RestMethod</ja>(name=<js>"*"</js>)</code>)
					<li>{@link java.util.logging.Logger} - The logger to use for logging.
					<li>{@link org.apache.juneau.internal.JuneauLogger} - Logger with additional features.
					<li>{@link org.apache.juneau.rest.RestContext} - The resource read-only context.
					<li>{@link org.apache.juneau.parser.Parser} - The parser matching the request content type.
					<li>{@link org.apache.juneau.dto.swagger.Swagger} - The auto-generated Swagger doc.
					<li><code><del>ConfigFile</del></code> - The external config file for the resource.
				</ul>
				So, for example...
				<p class='bcode'>
	<jd>/** Old way */</jd> 
	<ja>@RestMethod</ja>(name=<js>"*"</js>, path=<js>"/example1/{a1}/{a2}/{a3}/*"</js>) 
	<jk>public</jk> String example1( 
		<ja>@Method</ja> String method, 
		<ja>@Path</ja> String a1, 
		<ja>@Path</ja> <jk>int</jk> a2, 
		<ja>@Path</ja> UUID a3, 
		<ja>@Query</ja>(<js>"p1"</js>) <jk>int</jk> p1, 
		<ja>@Query</ja>(<js>"p2"</js>) String p2, 
		<ja>@Query</ja>(<js>"p3"</js>) UUID p3, 
		<ja>@Header</ja>(<js>"Accept-Language"</js>) String lang, 
		<ja>@Header</ja>(<js>"Accept"</js>) String accept 
	) 

	<jd>/** New way */</jd> 
	<ja>@RestMethod</ja>(name=<js>"*"</js>, path=<js>"/example2/{a1}/{a2}/{a3}/*"</js>) 
	<jk>public</jk> String example2(
		HttpMethod httpMethod,
		RequestPathParams pathParams,
		RequestQuery query,
		AcceptLanguage acceptLanguage,
		Accept accept
	)
				</p>
			<li>
				A new annotation {@link org.apache.juneau.rest.annotation.RestResource#paramResolvers() @RestResource.paramResolvers()}
				that allows you to define your own custom Java method parameter resolvers.
			<li>
				Fixed bug where Writer returned by {@link org.apache.juneau.rest.RestResponse#getWriter()} was not being flushed automatically
				at the end of the HTTP call.
			<li>
				New annotations added to {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod}:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#defaultQuery() defaultQuery()}
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#defaultFormData() defaultFormData()}
					<li><code><del>bpIncludes()</del></code>
					<li><code><del>bpExcludes()</del></code>
				</ul>
			<li>
				Default values on header, query, and form-data annotations:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.Header#def @Header.def()} - Default header value.
					<li>{@link org.apache.juneau.rest.annotation.Query#def @Query.def()} - Default query parameter value.
					<li>{@link org.apache.juneau.rest.annotation.FormData#def @FormData.def()} - Default form data parameter value.
				</ul>
			<li>
				New attributes on {@link org.apache.juneau.rest.annotation.RestResource @RestResource}:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.RestResource#serializerListener() serializerListener()}
					<li>{@link org.apache.juneau.rest.annotation.RestResource#parserListener() parserListener()}
					<li><code><del>widgets()</del></code>
					<li>{@link org.apache.juneau.rest.annotation.RestResource#swagger() swagger()}
					<li>{@link org.apache.juneau.rest.annotation.RestResource#htmldoc() htmldoc()}
				</ul>
			<li>
				New attributes on {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod}:
				<ul>
					<li><code><del>widgets()</del></code>
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#swagger() swagger()}
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#htmldoc() htmldoc()}
				</ul>
			<li>
				New string vars:
				<ul>
					<li>{@link org.apache.juneau.rest.vars.UrlVar} - Resolve <js>"$U{...}"</js> variables to URLs.
					<li>{@link org.apache.juneau.rest.vars.WidgetVar} - Resolve <js>"$W{...}"</js> variables to widget contents.
				</ul>
			<li>
				New methods on <code><del>RestConfig</del></code>:
				<ul>
					<li><code><del>setHtmlTitle(String)</del></code>
					<li><code><del>setHtmlDescription(String)</del></code>
					<li><code><del>setHtmlBranding(String)</del></code>
					<li><code><del>setHtmlHeader(String)</del></code>
					<li><code><del>setHtmlLinks(String)</del></code>
					<li><code><del>setHtmlNav(String)</del></code>
					<li><code><del>setHtmlAside(String)</del></code>
					<li><code><del>setHtmlFooter(String)</del></code>
					<li><code><del>setHtmlCss(String)</del></code>
					<li><code><del>setHtmlCssUrl(String)</del></code>
					<li><code><del>setHtmlNoWrap(boolean)</del></code>
					<li><code><del>setHtmlNoResultsMessage(String)</del></code>
					<li><code><del>setHtmlTemplate(Class)</del></code>
					<li><code><del>setHtmlTemplate(HtmlDocTemplate)</del></code>
					<li><code><del>addWidget(Class)</del></code>
				</ul>
			<li>
				New methods on {@link org.apache.juneau.rest.RestResponse}:
				<ul>
					<li><code><del>setHtmlTitle(Object)</del></code>
					<li><code><del>setHtmlDescription(Object)</del></code>
					<li><code><del>setHtmlBranding(Object)</del></code>
					<li><code><del>setHtmlHeader(Object)</del></code>
					<li><code><del>setHtmlLinks(Object)</del></code>
					<li><code><del>setHtmlNav(Object)</del></code>
					<li><code><del>setHtmlAside(Object)</del></code>
					<li><code><del>setHtmlFooter(Object)</del></code>
					<li><code><del>setHtmlCss(Object)</del></code>
					<li><code><del>setHtmlCssUrl(Object)</del></code>
					<li><code><del>setHtmlNoWrap(boolean)</del></code>
					<li><code><del>setHtmlNoResultsMessage(Object)</del></code>
					<li><code><del>setHtmlTemplate(Class)</del></code>
					<li><code><del>setHtmlTemplate(HtmlDocTemplate)</del></code>
				</ul>
			<li>
				<code>&amp;plainText=true</code> parameter now works on byte-based serializers by converting the output to hex.
			<li>
				New classes for widget support:
				<ul>
					<li>{@link org.apache.juneau.rest.widget.Widget}
					<li><code><del>PoweredByJuneauWidget</del></code>
					<li><code><del>ContentTypeLinksColumnWidget</del></code>
					<li><code><del>ContentTypeLinksRowWidget</del></code>
					<li><code><del>QueryWidget</del></code>
				</ul>
			<li>
				<code>devops.css</code> cleaned up.
			<li>
				Removed a bunch of URL-related methods from {@link org.apache.juneau.rest.RestRequest}.  
				These all have equivalents in {@link org.apache.juneau.rest.RestRequest#getUriContext()}.
			<li>
				New annotation attributes:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.Query#name() @Query.name()}
					<li>{@link org.apache.juneau.rest.annotation.FormData#name() @FormData.name()}
					<li>{@link org.apache.juneau.rest.annotation.Header#name() @Header.name()}
					<li>{@link org.apache.juneau.rest.annotation.Path#name() @Path.name()}
					<li>{@link org.apache.juneau.rest.annotation.HasQuery#name() @HasQuery.name()}
					<li>{@link org.apache.juneau.rest.annotation.HasFormData#name() @HasFormData.name()}
				</ul>
			</li>
		</ul>

		<h5 class='topic'>org.apache.juneau.rest.client</h5>
		<ul class='spaced-list'>
			<li>
				New {@link org.apache.juneau.remoteable.Path @Path} annotation for specifying path variables on remoteable interfaces.
			<li>
				New {@link org.apache.juneau.remoteable.RequestBean @RequestBean} annotation for specifying beans with remoteable annotations
				defined on properties.
			<li>
				The following annotations (and related methods on RestCall) can now take <code>NameValuePairs</code> and beans as input 
				when using <js>"*"</js> as the name.
				<br>{@link org.apache.juneau.remoteable.FormData @FormData},{@link org.apache.juneau.remoteable.FormDataIfNE @FormDataIfNE},
				{@link org.apache.juneau.remoteable.Query @Query},{@link org.apache.juneau.remoteable.QueryIfNE @QueryIfNE},
				{@link org.apache.juneau.remoteable.Header @Header},{@link org.apache.juneau.remoteable.HeaderIfNE @HeaderIfNE}, 
		</ul>

		<h5 class='topic'>org.apache.juneau.microservice</h5>
		<ul class='spaced-list'>
		</ul>

		<h5 class='topic'>org.apache.juneau.examples.rest</h5>
		<ul class='spaced-list'>
			<li>
				Many code enhancements make to examples to reflect new functionality.
			<li>All pages now render aside comments to help explain what feature they're trying to explain using the 
				new features that allow you to customize various elements of the page.
				<br>
				<img class='bordered' width="50%" src='doc-files/ReleaseNotes.630.2.png'>
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="6.2.0"></a>
	<h3 class='topic' onclick='toggle(this)'>6.2.0 (Apr 28, 2017)</h3>
	<div class='topic'>
		<p>
			Juneau 6.2.0 is a major update.
		</p>

		<h5 class='topic'>org.apache.juneau</h5>
		<ul class='spaced-list'>
			<li>
				Revamped the serializer, parser classes to use builders for creation.
				Serializers and parsers are now unmodifiable objects once they are created.
				This is a breaking code change that will require adoption.
				<p class='bcode'>
	<jc>/* Creating a new serializer or parser */ </jc>
	
	<jc>// Old way</jc>
	WriterSerializer s = <jk>new</jk> JsonSerializer().setUseWhitespace(<jk>true</jk>).pojoSwaps(BSwap.<jk>class</jk>).lock();

	<jc>// New way</jc>
	WriterSerializer s = JsonSerializer.<jsm>create</jsm>().ws().pojoSwaps(BSwap.<jk>class</jk>).build();

	<jc>/* Cloning an existing serializer or parser */ </jc>
	
	<jc>// Old way</jc>
	WriterSerializer s = JsonSerializer.<jsf>DEFAULT_LAX</jsf>.clone().setUseWhitespace(<jk>true</jk>).pojoSwaps(BSwap.<jk>class</jk>).lock();

	<jc>// New way</jc>
	WriterSerializer s = JsonSerializer.<jsf>DEFAULT_LAX</jsf>.builder().ws().pojoSwaps(BSwap.<jk>class</jk>).build();
				</p>	
			<li>Also introduced the following builder classes and related architecture changes to make the built objects unmodifiable:
				<ul>
					<li>{@link org.apache.juneau.serializer.SerializerGroupBuilder}
					<li>{@link org.apache.juneau.parser.ParserGroupBuilder}
					<li>{@link org.apache.juneau.encoders.EncoderGroupBuilder}
				</ul>
			<li>Revamped the config file API to use a build:  <code><del>ConfigFileBuilder</del></code>.
			<li>Removed the <code><del>Lockable</del></code> interface.
			<li>New <code>addBeanTypeProperties</code> setting added to serializers to override the 
				<code><del>SerializerContext.SERIALIZER_addBeanTypeProperties</del></code> setting
				for individual serializers in a serializer group:
				<ul>
					<li><code><del>HtmlSerializerContext.HTML_addBeanTypeProperties</del></code>
					<li><code><del>JsonSerializerContext.JSON_addBeanTypeProperties</del></code>
					<li><code><del>MsgPackSerializerContext.MSGPACK_addBeanTypeProperties</del></code>
					<li><code><del>UonSerializerContext.UON_addBeanTypeProperties</del></code>
					<li><code><del>XmlSerializerContext.#XML_addBeanTypeProperties</del></code>
					<li><code><del>RdfSerializerContext.RDF_addBeanTypeProperties</del></code>
				</ul>
			<li>UON notation serializers and parsers moved into the new <code>org.apache.juneau.uon</code> package.
			<li>New {@link org.apache.juneau.xml.annotation.XmlFormat#VOID} format to identify HTML void elements.
			<li>Tweaks to HTML5 support.
				<ul>
					<li>Fixed handling of empty non-void elements in HTML serializer.
					<li>Added <code>style()</code> override methods to all elements.
				</ul>
			<li>Improvements to Swagger support.
				<ul>
					<li>New {@link org.apache.juneau.dto.swagger.SwaggerBuilder} class.
					<li>Fluent-style setters added to the Swagger beans.
					<li>Added Swagger examples <code><del>here</del></code> and in the <del>org.apache.juneau.dto.swagger</del> javadocs.
				</ul>
			<li>Improvements to {@link org.apache.juneau.svl.VarResolver}.
				<ul>
					<li>New {@link org.apache.juneau.svl.vars.IfVar $IF} variable for if-else block logic.
					<li><code><del>$SWITCH</del></code> variable for switch block logic.
					<li>Whitespace wasn't being ignored in some cases.
				</ul>
			<li>{@link org.apache.juneau.html.HtmlParser} can now parse full body contents generated by {@link org.apache.juneau.html.HtmlDocSerializer}. 
			<li>Parse-args supported added to {@link org.apache.juneau.msgpack.MsgPackParser} to allow it to be used in remoteable proxies. 
			<li>Added some convenience classes for constructing collections using a fluent interface:
				<ul>
					<li>{@link org.apache.juneau.utils.AList}
					<li>{@link org.apache.juneau.utils.ASet}
					<li>{@link org.apache.juneau.utils.AMap}
				</ul>
			<li>New {@link org.apache.juneau.annotation.Bean#typePropertyName @Bean.typePropertyName()} annotation allows you to 
				specify the name of the <js>"_type"</js> property at the class level.
			<li>New methods added to HTML5 container beans:
				<ul>
					<li>{@link org.apache.juneau.dto.html5.HtmlElementContainer#getChild(int...)}
					<li>{@link org.apache.juneau.dto.html5.HtmlElementMixed#getChild(int...)}
				</ul>
			<li>New common serializer setting: <code><del>SerializerContext.SERIALIZER_abridged</del></code>.
			<li>Support for defining interface proxies against 3rd-party REST interfaces.
				<br>New package {@link org.apache.juneau.remoteable} for all remoteable proxy interface annotations.
				<br><ja>@Remoteable</ja> annotation has been moved to this package.
			<li>Updated doc: <code><del>6 - Remoteable Services</del></code>
			<li>New doc: <code><del>6.1 -  Interface proxies against 3rd-party REST interfaces</del></code>
			<li>New URL-encoding serializer setting: <code><del>UrlEncodingSerializerContext.URLENC_paramFormat</del></code>.
			<li>New methods on {@link org.apache.juneau.urlencoding.UrlEncodingSerializerBuilder}:
			<ul>
				<li><code><del>UrlEncodingSerializerBuilder.paramFormat(String)</del></code>	
				<li><code><del>UrlEncodingSerializerBuilder.plainTextParams()</del></code>	
			</ul> 		
		</ul>
		
		<h5 class='topic'>org.apache.juneau.rest</h5>
		<ul class='spaced-list'>
			<li>{@link org.apache.juneau.rest.annotation.RestResource @RestResource} annotation can now be applied to 
				any class!  You're no longer restricted to subclassing your resources from {@link org.apache.juneau.rest.RestServlet}.
				<br>This is a major enhancement in the API.  Anything you could do by subclassing from <code>RestServlet</code>
				should have an equivalent for non-<code>RestServlet</code> classes.
				<br>The only restriction is that the top-level resource must subclass from <code>RestServlet</code>.
				Child resources do not.
				<br><br>
				The majority of code has been split up into two separate classes:
				<ul>
					<li><code><del>RestConfig</del></code> - A modifiable configuration of a resource.  Subclasses from {@link javax.servlet.ServletConfig}.
					<li>{@link org.apache.juneau.rest.RestContext} - A read-only configuration that's the result of a snapshot of the config.
				</ul>
				<br><br>
				The {@link org.apache.juneau.rest.RestServlet} class now has the following initialization method that allows you to override
				the config settings define via annotations:
				<ul>
					<li><code><del>RestServlet.init(RestConfig)</del></code> - A modifiable configuration of a resource.
				</ul>
				Non-<code>RestServlet</code> classes must have one of the following to allow it to be instantiated:
				<ul>
					<li>A <code><jk>public</jk> T(RestConfig)</code> constructor.
					<li>A <code><jk>public</jk> T()</code> constructor.
					<li>The parent resource must have a customized {@link org.apache.juneau.rest.RestResourceResolver} for instantiating it.
				</ul>
				<br>
				Non-<code>RestServlet</code> classes can optionally include the following init methods to gain access to the config and context:
				<ul>
					<li><code><del><jk>public</jk> init(RestConfig)</del></code>
					<li><code><del><jk>public</jk> init(RestContext)</del></code>
				</ul>
			<li>New annotations added to {@link org.apache.juneau.rest.annotation.RestResource @RestResource} to allow non-<code>RestServlet</code>
				resources to do the same as subclassing directly from <code>RestServlet</code>:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.RestResource#resourceResolver() resourceResolver()} 
						- Specify a {@link org.apache.juneau.rest.RestResourceResolver} class for resolving child resources.
					<li>{@link org.apache.juneau.rest.annotation.RestResource#callHandler() callHandler()} 
						- Specify a {@link org.apache.juneau.rest.RestCallHandler} class for handling the lifecycle of a REST call.
					<li>{@link org.apache.juneau.rest.annotation.RestResource#infoProvider() infoProvider()} 
						- Specify a {@link org.apache.juneau.rest.RestInfoProvider} class for customizing title/description/Swagger information on a REST resource.
					<li>{@link org.apache.juneau.rest.annotation.RestResource#logger() logger()} 
						- Specify a {@link org.apache.juneau.rest.RestLogger} class for handling logging.
				</ul>
			<li>New annotations added to {@link org.apache.juneau.rest.annotation.RestResource @RestResource} and {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod}
				to simplify defining page title, text, and links on HTML views:
				<ul>
					<li><code><del>@RestResource.pageTitle()</del></code>
					<li><code><del>@RestMethod.pageTitle()</del></code> 
					<li><code><del>@RestResource.pageText()</del></code> 
					<li><code><del>@RestMethod.pageText()</del></code> 
					<li><code><del>@RestResource.pageLinks()</del></code> 
					<li><code><del>@RestMethod.pageLinks()</del></code> 
				</ul>				
				<p class='bcode'>
	<jc>// Old method</jc>
	<ja>@RestResource</ja>(
		properties={
			<ja>@Property</ja>(name=<jsf>HTMLDOC_title</jsf>, value=<js>"System properties resource"</js>),
			<ja>@Property</ja>(name=<jsf>HTMLDOC_description</jsf>, value=<js>"REST interface for performing CRUD operations on system properties."</js>),
			<ja>@Property</ja>(name=<jsf>HTMLDOC_navlinks</jsf>, value=<js>"{up:'$R{requestParentURI}',options:'?method=OPTIONS'}"</js>)
		}
	)
		
	<jc>// New method</jc>
	<ja>@RestResource</ja>(
		pageTitle=<js>"System properties resource"</js>,
		pageDescription=<js>"REST interface for performing CRUD operations on system properties."</js>,
		pageLinks=<js>"{up:'$R{requestParentURI}',options:'?method=OPTIONS'}"</js>
	)
				</p>		
				<p>
					Typically you're going to simply want to use the <code>title</code> and <code>description</code> annotations
					which apply to both the page title/text and the swagger doc:		
				</p>
				<p class='bcode'>
	<ja>@RestResource</ja>(
		title=<js>"System properties resource"</js>,
		description=<js>"REST interface for performing CRUD operations on system properties."</js>,
		pageLinks=<js>"{up:'$R{requestParentURI}',options:'?method=OPTIONS'}"</js>
	)
				</p>
			<li><code><del>RestResource.stylesheet()</del></code> can now take in a comma-delimited list of stylesheet paths.
			<li>{@link org.apache.juneau.rest.StreamResource} can now contain multiple sources from a variety of source types (e.g. <code><jk>byte</jk>[]</code> arrays, <code>InputStreams</code>, <code>Files</code>, etc...)
				and is now immutable.  It also includes a new {@link org.apache.juneau.rest.StreamResourceBuilder} class.
			<li>Simplified remoteable proxies using the <code><ja>@RestMethod</ja>(name=<js>"PROXY"</js>)</code> annotation on REST methods.
				Used to expose interface proxies without the need for {@link org.apache.juneau.rest.remoteable.RemoteableServlet}.
			<p class='bcode'>
	<jc>// Server side</jc>
	<ja>@RestMethod</ja>(name=<js>"PROXY"</js>, path=<js>"/myproxy/*"</js>)
	<jk>public</jk> IAddressBook getProxy() {
		<jk>return</jk> <jf>addressBook</jf>;
	}

	<jc>// Client side</jc>
	RestClient client = RestClient.<jsm>create</jsm>().rootUrl(<jf>samplesUrl</jf>).build();			
	IAddressBook ab = client.getRemoteableProxy(IAddressBook.<jk>class</jk>, <js>"/addressBook/myproxy"</js>);
			</p>
				See {@link org.apache.juneau.rest.annotation.RestMethod#name() @RestMethod.name()} for more information.
			<li>{@link org.apache.juneau.rest.RestRequest#toString()} can be called at any time to view the headers and content of the request
				without affecting functionality.  Very useful for debugging.
			<li>You can now use numeric values in path annotations.  
				<br>When using numeric variable names, you don't need to specify the variable name in the <ja>@Path</ja> annoation:
				<p class='bcode'>
	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/myurl/{0}/{1}/{2}/*"</js>)
	<jk>public void</jk> doGet(RestRequest req, RestResponse res,
			<ja>@Path</ja> String foo, <ja>@Path</ja> <jk>int</jk> bar, <ja>@Path</ja> UUID baz) {
		...
	}
				</p>
			<li>{@link org.apache.juneau.rest.annotation.RestMethod#name() @RestMethod.name()} annotation is now optional.  Defaults to <js>"GET"</js>.
		</ul>

		<h5 class='topic'>org.apache.juneau.rest.client</h5>
		<ul class='spaced-list'>
			<li>Revamped the client API to use builders.
			<li>New doc: <del>1.5 - Debugging</del>
			<li>The <code>RestClient</code> class <code>doX(Object url)</code> methods now handle HttpClient <code>URIBuilder</code> instances.
			<li>New methods added/updated to {@link org.apache.juneau.rest.client.RestClient}:
			<ul>
				<li>{@link org.apache.juneau.rest.client.RestClient#getRemoteableProxy(Class,Object) getRemoteableProxy(Class,Object)} - For interface proxies defined using <code><ja>@RestMethod</ja>(name=<js>"PROXY"</js>)</code>.
				<li>{@link org.apache.juneau.rest.client.RestClient#getRemoteableProxy(Class,Object,Serializer,Parser) getRemoteableProxy(Class,Object,Serializer,Parser)} - Same as above, but overrides the serializer and parser defined on the client.
				<li>{@link org.apache.juneau.rest.client.RestClient#doPost(Object) doPost(Object)} 
				<li>{@link org.apache.juneau.rest.client.RestClient#doCall(HttpMethod,Object,Object) doCall(HttpMethod,Object,Object)} - Can now pass in instances of {@link org.apache.juneau.rest.client.NameValuePairs} for easy form posts.
					<br>This extends to all methods that take in the input.
			</ul>
			<li>New methods on {@link org.apache.juneau.rest.client.RestCall}:
				<ul>
					<li>{@link org.apache.juneau.rest.client.RestCall#uri(Object) uri(Object)}
					<li><code><del>query(String,Object,boolean,PartSerializer)</del></code>
					<li>{@link org.apache.juneau.rest.client.RestCall#query(String,Object) query(String,Object)}
					<li>{@link org.apache.juneau.rest.client.RestCall#queryIfNE(String,Object) queryIfNE(String,Object)}
					<li>{@link org.apache.juneau.rest.client.RestCall#query(Map) query(Map)}
					<li>{@link org.apache.juneau.rest.client.RestCall#queryIfNE(Map) queryIfNE(Map)}
					<li>{@link org.apache.juneau.rest.client.RestCall#query(String) query(String)}
					<li><code><del>formData(String,Object,boolean,PartSerializer)</del></code>
					<li>{@link org.apache.juneau.rest.client.RestCall#formData(String,Object) formData(String,Object)}
					<li>{@link org.apache.juneau.rest.client.RestCall#formDataIfNE(String,Object) formDataIfNE(String,Object)}
					<li>{@link org.apache.juneau.rest.client.RestCall#formData(Map) formData(Map)}
					<li>{@link org.apache.juneau.rest.client.RestCall#formDataIfNE(Map) formDataIfNE(Map)}
					<li><code><del>header(String,Object,boolean,PartSerializer)</del></code>
					<li>{@link org.apache.juneau.rest.client.RestCall#header(String,Object) header(String,Object)}
					<li>{@link org.apache.juneau.rest.client.RestCall#headerIfNE(String,Object) headerIfNE(String,Object)}
					<li>{@link org.apache.juneau.rest.client.RestCall#headers(Map) headers(Map)}
					<li>{@link org.apache.juneau.rest.client.RestCall#headersIfNE(Map) headersIfNE(Map)}
					<li>{@link org.apache.juneau.rest.client.RestCall#host(String) host(String)}
					<li>{@link org.apache.juneau.rest.client.RestCall#port(int) port(int)}
					<li>{@link org.apache.juneau.rest.client.RestCall#userInfo(String,String) userInfo(String,String)}
					<li>{@link org.apache.juneau.rest.client.RestCall#userInfo(String) userInfo(String)}
					<li>{@link org.apache.juneau.rest.client.RestCall#scheme(String) scheme(String)}
				</ul>
			<li>New methods added to {@link org.apache.juneau.rest.client.RestClientBuilder}:
				<ul>
					<li>{@link org.apache.juneau.rest.client.RestClientBuilder#executorService(ExecutorService,boolean) executorService(ExecutorService,boolean)}
					<li>{@link org.apache.juneau.rest.client.RestClientBuilder#paramFormat(String) paramFormat(ExecutorService,boolean)}
					<li><code><del>RestClientBuilder.plainTextParams()</del></code>
					<li>{@link org.apache.juneau.rest.client.RestClientBuilder#noTrace() noTrace()} - Adds a <code>No-Trace: true</code> header on all requests to prevent
						the servlet from logging errors.
						<br>Useful for testing scenarios when you don't want the console to end up showing errors done on purpose.
					<li>{@link org.apache.juneau.rest.client.RestClientBuilder#debug() debug()} now adds a <code>Debug: true</code> header on all requests.
				</ul>
			<li>New methods added/updated to {@link org.apache.juneau.rest.client.RestCall}:
				<ul>
					<li>{@link org.apache.juneau.rest.client.RestCall#runFuture() runFuture()}
					<li>{@link org.apache.juneau.rest.client.RestCall#getResponseFuture(Class) getResponseFuture(Class)}
					<li>{@link org.apache.juneau.rest.client.RestCall#getResponseFuture(Type,Type...) getResponseFuture(Type,Type...)}
					<li>{@link org.apache.juneau.rest.client.RestCall#getResponseAsStringFuture() getResponseAsStringFuture()}
					<li>{@link org.apache.juneau.rest.client.RestCall#serializer(Serializer) serializer(Serializer)} - Override the serializer defined on the client for a single call.
					<li>{@link org.apache.juneau.rest.client.RestCall#parser(Parser) parser(Parser)} - Override the parser defined on the client for a single call.
					<li>{@link org.apache.juneau.rest.client.RestCall#input(Object) input(Object)} - Now accepts instances of {@link org.apache.juneau.rest.client.NameValuePairs}.
					<li>{@link org.apache.juneau.rest.client.RestCall#getResponse(Class) getResponse(Class)} - Can now pass in any of the following:
						<ul>
							<li>{@link org.apache.http.HttpResponse} - Returns the raw <code>HttpResponse</code> returned by the inner <code>HttpClient</code>.
							<li>{@link java.io.Reader} - Returns access to the raw reader of the response.
							<li>{@link java.io.InputStream} - Returns access to the raw input stream of the response.
						</ul>
				</ul>
			<li>New methods added to {@link org.apache.juneau.rest.client.NameValuePairs}:
				<ul>
					<li>{@link org.apache.juneau.rest.client.NameValuePairs#append(String,Object) append(String,Object)}
					<li><code><del>append(String,Object,PartSerializer)</del></code>
				</ul>
			<li>{@link org.apache.juneau.rest.client.RetryOn} is now an abstract class with an additional method:
				<ul>
					<li>{@link org.apache.juneau.rest.client.RetryOn#onResponse(HttpResponse) onResponse(HttpResponse)}
				</ul>			
		</ul>
		
		<h5 class='topic'>org.apache.juneau.microservice</h5>
		<ul class='spaced-list'>
			<li><js>"REST/port"</js> configuration setting can now be a comma-limited list of port numbers to try.
				<br>You can also specify one or more <code>0</code>s to try a random port.
			<li>Methods added to {@link org.apache.juneau.microservice.RestMicroservice} class:
			<ul>
				<li>{@link org.apache.juneau.microservice.RestMicroservice#getPort()}
				<li>{@link org.apache.juneau.microservice.RestMicroservice#getURI()}
				<li>Override methods added from {@link org.apache.juneau.microservice.Microservice} class for easier method chaining.
			</ul>
		</ul>		
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="6.1.0"></a>
	<h3 class='topic' onclick='toggle(this)'>6.1.0 (Feb 25, 2017)</h3>
	<div class='topic'>
		<p>
			Juneau 6.1.0 is a major update.
		</p>
		<p>
			In particular, this release cleans up the {@link org.apache.juneau.BeanContext} API to match
			the {@link org.apache.juneau.PropertyStore}/{@link org.apache.juneau.Context}/{@link org.apache.juneau.Session} paradigm
			previously used in the serializer and parser APIs.
			It also makes several improvements to the HTML and XML serialization support and introduces HTML5 DTO beans.
		</p>

		<h5 class='topic'>org.apache.juneau</h5>
		<ul class='spaced-list'>
			<li>Improvements to XML serialization support.
				<ul>
					<li>New supported XML formats:
					<ul>
						<li>{@link org.apache.juneau.xml.annotation.XmlFormat#ATTRS} format can now be applied to bean classes to have all bean properties serialized
							as attributes instead of elements by default.
						<li>{@link org.apache.juneau.xml.annotation.XmlFormat#ELEMENT} format can now be applied to bean properties to override the {@link org.apache.juneau.xml.annotation.XmlFormat#ATTRS}
							setting above on specific bean properties.
						<li>New {@link org.apache.juneau.xml.annotation.XmlFormat#ELEMENTS} format can be applied to a bean property of type array/Collection to represent the child elements.
						<li>New {@link org.apache.juneau.xml.annotation.XmlFormat#MIXED} format can be applied to a bean property of type array/Collection to represent mixed content (text + child elements).
						<li>New {@link org.apache.juneau.xml.annotation.XmlFormat#MIXED_PWS} format.  Identical to <jsf>MIXED</jsf> except preserves whitespace.
						<li>New {@link org.apache.juneau.xml.annotation.XmlFormat#TEXT} format can be applied to a bean property of a single object to represent a text node as a child.
						<li>New {@link org.apache.juneau.xml.annotation.XmlFormat#TEXT_PWS} format.  Identical to <jsf>TEXT</jsf> except preserves whitespace.
						<li>New {@link org.apache.juneau.xml.annotation.XmlFormat#XMLTEXT} format that's identical to {@link org.apache.juneau.xml.annotation.XmlFormat#TEXT} except 
							XML content is not escaped and serialized directly as the child content.  The parser will reconvert this to the original XML text during parsing.
					</ul>
					<li>New support methodology and other improvements to <a class='doclink' href='org/apache/juneau/xml/package-summary.html#TOC'>org.apache.juneau.xml</a> documentation.
					<li>Eliminated unnecessary <xt>&lt;string&gt;</xt> elements.
					<li>Eliminated <code><del>XmlContentHandler</del></code> class.
					<li>Parser efficiency improvements through reuse of string builders.
					<li>Reworked and simplified the default XML serializers.  The {@link org.apache.juneau.xml.XmlSerializer#DEFAULT} serializer now has namespaces disabled,
						and {@link org.apache.juneau.xml.XmlSerializer#DEFAULT_NS} has namespaces enabled.  The 'XML-JSON' serializers have been eliminated.
					<li>Eliminated the <code>addJsonTypeAttrs</code> and <code>addJsonStringTypeAttrs</code> settings.
					<li>Namespace support is now disabled by default.
				</ul>
			<li>Significant modifications and improvements to HTML serialization support.
				<ul>
					<li>Parser converted from <code>XMLEventReader</code>-based to <code>XMLStreamReader</code>.
					<li>Eliminated many unnecessary type tags and <xt>&lt;string&gt;</xt> elements and improved the readable layout.  
						The new format is much leaner.
					<li>New exhaustive support methodology section added to <a class='doclink' href='org/apache/juneau/html/package-summary.html#TOC'>org.apache.juneau.html</a> documentation.
				</ul>
			<li>New HTML5 DTO support:  <a class='doclink' href='org/apache/juneau/dto/html5/package-summary.html#TOC'>org.apache.juneau.dto.html5</a>.
			<li>{@link org.apache.juneau.BeanContext} class split into separate {@link org.apache.juneau.BeanContext} and {@link org.apache.juneau.BeanSession} classes.
			<ul>
				<li>Session object meant to be single-use that can be discarded after use and contains session-level object cache and overridable Locale and TimeZone.
			</ul>  
			<li><code><del>SerializerContext</del></code> and <code><del>ParserContext</del></code>
				now extend directly from {@link org.apache.juneau.BeanContext}.
			<li>{@link org.apache.juneau.serializer.SerializerSession} and {@link org.apache.juneau.parser.ParserSession}
				now extend directly from {@link org.apache.juneau.BeanSession}.
			<li>New settings in {@link org.apache.juneau.BeanContext}:
			<ul>
				<li>{@link org.apache.juneau.BeanContext#BEAN_debug} - Debug setting.  Replaces individual debug properties in the serializer and parser contexts.
				<li>{@link org.apache.juneau.BeanContext#BEAN_locale} - Specifies a default locale at the context level.
				<li>{@link org.apache.juneau.BeanContext#BEAN_timeZone} - Specifies a default timezone at the context level.
				<li>{@link org.apache.juneau.BeanContext#BEAN_mediaType} - Specifies a default media type at the context level.
			</ul>
			<li>Improvements to Parser class:  
			<ul>
				<li>Simplified the parse methods (e.g. <code>parseMap()</code>, <code>parseCollection()</code>)
				by replacing them with two simple methods: 
				<ul>
					<li>{@link org.apache.juneau.parser.Parser#parse(Object,Class)} - Normal method.
					<li>{@link org.apache.juneau.parser.Parser#parse(Object,Type,Type...)} - Method for parsing into parameterized maps and collections.
				</ul>
				Using these methods, you can construct arbitrarily complex objects consisting of maps and collections.
				You could do this before, but it required constructing a <code>ClassMeta</code> object.  
				<br>For example:
					<p class='bcode'>
	<jc>// Old way:</jc>
	ClassMeta&lt;?&gt; cm = parser.getMapClassMeta(
		HashMap.<jk>class</jk>, 
		String.<jk>class</jk>, 
		parser.getCollectionClassMeta(
			LinkedList.<jk>class</jk>, 
			MyBean.<jk>class</jk>
		)
	);
	Map&lt;String,List&lt;MyBean&gt;&gt; map = (Map&lt;String,List&lt;MyBean&gt;&gt;)parser.parse(input, cm);	
	
	<jc>// New way:</jc>
	Map&lt;String,List&lt;MyBean&gt;&gt; map = parser.parse(input, HashMap.<jk>class</jk>, String.<jk>class</jk>, LinkedList.<jk>class</jk>, MyBean.<jk>class</jk>);
					</p>
				<li>Arbitrarily-complex parameterized maps and collections can now be parsed without the need for creating intermediate <code>ClassMeta</code> objects.
				<li>No need for casting anymore if you were using the old <code>parseMap()</code> and <code>parseCollection()</code> methods!
				<li>Changes allow me to eliminate <code>BeanContext.normalizeClassMeta()</code> method.
				<li>Convenience methods added for setting parser properties:
					<p class='bcode'>
	<jc>// Old way:</jc>
	<jk>new</jk> JsonParser().setProperty(<jsf>PARSER_strict</jsf>, <jk>true</jk>).setProperty(<jsf>BEAN_locale</jsf>, mylocale);
	
	<jc>// New way:</jc>
	<jk>new</jk> JsonParser().setStrict(<jk>true</jk>).setLocale(mylocale);
					</p>
			</ul>
			<li>Improvements to Serializer class:
			<ul>
				<li>Convenience methods added for setting serializer properties:
					<p class='bcode'>
	<jc>// Old way:</jc>
	<jk>new</jk> JsonSerializer().setProperty(<jsf>JSON_simpleMode</jsf>, <jk>true</jk>).setProperty(<jsf>SERIALIZER_quoteChar</jsf>, <js>'"'</js>);
	
	<jc>// New way:</jc>
	<jk>new</jk> JsonSerializer().setSimpleMode(<jk>true</jk>).setQuoteChar(<js>'"'</js>);
					</p>
			</ul>
			<li>Simplified {@link org.apache.juneau.transform.PojoSwap} class.  Now just two methods:
			<ul>
				<li>{@link org.apache.juneau.transform.PojoSwap#swap(BeanSession,Object)}
				<li>{@link org.apache.juneau.transform.PojoSwap#unswap(BeanSession,Object,ClassMeta)}
			</ul>
			<li>General code improvements made to {@link org.apache.juneau.ClassMeta} class.
			<ul>
				<li>All fields are now final which should improve overall performance.
				<li>Replaced support for <code>toObjectMap()</code> and <code>fromObjectMap()/T(ObjectMap)</code> methods with
					generalized <code>swap(BeanSession)</code>/<code>unswap(BeanSession,X)</code>/<code>T(BeanSession,X)</code> methods.<br>
					See new section <code><del>Swap methods</del></code> for information.
			</ul>
			<li>Session-level media type now available through {@link org.apache.juneau.BeanSession#getMediaType()} method.
				Allows for swaps and serializer/parser behavior to be tailored to individual media types.
			<li>Several new {@link java.util.Calendar} and {@link java.util.Date} swaps:
			<ul>
				<li>{@link org.apache.juneau.transforms.CalendarSwap.ToString},{@link org.apache.juneau.transforms.DateSwap.ToString} - To {@link java.lang.String Strings} using the {@code Date.toString()} method.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.ISO8601DT},{@link org.apache.juneau.transforms.DateSwap.ISO8601DT} - To ISO8601 date-time strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.ISO8601DTZ},{@link org.apache.juneau.transforms.DateSwap.ISO8601DTZ} - Same as <jsf>ISO8601DT</jsf>, except always serializes in GMT.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.ISO8601DTP},{@link org.apache.juneau.transforms.DateSwap.ISO8601DTP} - Same as <jsf>ISO8601DT</jsf> except with millisecond precision.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.ISO8601DTPZ},{@link org.apache.juneau.transforms.DateSwap.ISO8601DTPZ} - Same as <jsf>ISO8601DTZ</jsf> except with millisecond precision.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.RFC2822DT},{@link org.apache.juneau.transforms.DateSwap.RFC2822DT} - To RFC2822 date-time strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.RFC2822DTZ},{@link org.apache.juneau.transforms.DateSwap.RFC2822DTZ} - Same as <jsf>RFC2822DT</jsf>, except always serializes in GMT.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.RFC2822D},{@link org.apache.juneau.transforms.DateSwap.RFC2822D} - To RFC2822 date strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.DateTimeSimple},{@link org.apache.juneau.transforms.DateSwap.DateTimeSimple} - To simple <js>"yyyy/MM/dd HH:mm:ss"</js> date-time strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.DateSimple},{@link org.apache.juneau.transforms.DateSwap.DateSimple} - To simple <js>"yyyy/MM/dd"</js> date strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.TimeSimple},{@link org.apache.juneau.transforms.DateSwap.TimeSimple} - To simple <js>"HH:mm:ss"</js> time strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.DateFull},{@link org.apache.juneau.transforms.DateSwap.DateFull} - To {@link java.text.DateFormat#FULL} date strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.DateLong},{@link org.apache.juneau.transforms.DateSwap.DateLong} - To {@link java.text.DateFormat#LONG} date strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.DateMedium},{@link org.apache.juneau.transforms.DateSwap.DateMedium} - To {@link java.text.DateFormat#MEDIUM} date strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.DateShort},{@link org.apache.juneau.transforms.DateSwap.DateShort} - To {@link java.text.DateFormat#SHORT} date strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.TimeFull},{@link org.apache.juneau.transforms.DateSwap.TimeFull} - To {@link java.text.DateFormat#FULL} time strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.TimeLong},{@link org.apache.juneau.transforms.DateSwap.TimeLong} - To {@link java.text.DateFormat#LONG} time strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.TimeMedium},{@link org.apache.juneau.transforms.DateSwap.TimeMedium} - To {@link java.text.DateFormat#MEDIUM} time strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.TimeShort},{@link org.apache.juneau.transforms.DateSwap.TimeShort} - To {@link java.text.DateFormat#SHORT} time strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.DateTimeFull},{@link org.apache.juneau.transforms.DateSwap.DateTimeFull} - To {@link java.text.DateFormat#FULL} date-time strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.DateTimeLong},{@link org.apache.juneau.transforms.DateSwap.DateTimeLong} - To {@link java.text.DateFormat#LONG} date-time strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.DateTimeMedium},{@link org.apache.juneau.transforms.DateSwap.DateTimeMedium} - To {@link java.text.DateFormat#MEDIUM} date-time strings.
				<li>{@link org.apache.juneau.transforms.CalendarSwap.DateTimeShort},{@link org.apache.juneau.transforms.DateSwap.DateTimeShort} - To {@link java.text.DateFormat#SHORT} date-time strings.
			</ul>  
			<li>New method {@link org.apache.juneau.serializer.SerializerGroup#getSerializerMatch(String)} that returns the matched serializer and media type.
			<li>New method {@link org.apache.juneau.parser.ParserGroup#getParserMatch(String)} that returns the matched parser and media type.
			<li>New method {@link org.apache.juneau.encoders.EncoderGroup#getEncoderMatch(String)} that returns the matched encoder and encoding.
			<li>General improvements to Bean Dictionary support.
				<ul>
					<li>New {@link org.apache.juneau.BeanDictionaryList} class can be used for defining reusable sets of bean dictionaries consisting
						of classes annotated with {@link org.apache.juneau.annotation.Bean#typeName() @Bean.typeName()}.
					<li>New {@link org.apache.juneau.BeanDictionaryMap} class can be used for defining reusable sets of bean dictionaries consisting
						of classes not annotated with {@link org.apache.juneau.annotation.Bean#typeName() @Bean.typeName()}.
					<li>New {@link org.apache.juneau.annotation.Bean#beanDictionary() @Bean.beanDictionary()} annotation.
				</ul>
			<li>Removed restriction on getters and setters to be prefixed with "getX/setX/isX" if a {@link org.apache.juneau.annotation.BeanProperty#name() @BeanProperty.name()} annotation is used.
			<li>Improvements to ATOM DTO:
				<ul>
					<li>New {@link org.apache.juneau.dto.atom.AtomBuilder} class.
					<li>New setter method names for a better fluent design.
					<li>Updated <a class='doclink' href='org/apache/juneau/dto/atom/package-summary.html#TOC'>org.apache.juneau.dto.atom</a> documentation.
				</ul>
			<li>New {@link org.apache.juneau.transform.MapSwap} and {@link org.apache.juneau.transform.StringSwap} classes.
			<li>New {@link org.apache.juneau.serializer.WriterSerializer#println(Object)} method.  Useful for debugging purposes.
			<li>New {@link org.apache.juneau.BeanContext#getClassMeta(Type,Type...)} and {@link org.apache.juneau.BeanSession#getClassMeta(Type,Type...)}
				methods for retrieving Map and Collection class metas.  
				Replaces the various <code>getMapClassMeta()</code>/<code>getCollectionClassMeta()</code> methods.  
			<li>New section added to this document:	<code><del>Juneau Data Transfer Objects (org.apache.juneau.dto)</del></code>
			<li>Modified the UON specification to work with mixed content.
			<ul>
				<li>The new specification is considerably cleaner and eliminates the need for separate normal/simple modes.
					<br>It also allows for arbitrary whitespace to be added to the output without any confusion.
				<li>Eliminated the <code>UonParser.<jsf>DEFAULT_WS_AWARE</jsf></code> and <code>UrlEncodingParser.<jsf>DEFAULT_WS_AWARE</jsf></code> parsers.
					<br>The normal {@link org.apache.juneau.uon.UonParser#DEFAULT} and {@link org.apache.juneau.urlencoding.UrlEncodingParser#DEFAULT} parsers will now handle whitespace.
				<li>Eliminated the <code>UonParserContext.<jsf>UON_whitespaceAware</jsf></code> configuration setting.
				<li>Eliminated the <code>UonSerializer.<jsf>DEFAULT_SIMPLE</jsf></code>, <code>UonSerializer.<jsf>DEFAULT_SIMPLE_ENCODING</jsf></code>
					and <code>UrlEncodingSerializer.<jsf>DEFAULT_SIMPLE</jsf></code>
					serializers since there is no separate simple mode anymore.
				<li>Eliminated the <code>UonParserContext.<jsf>UON_simpleMode</jsf></code> configuration setting.
			</ul>
			<li>Added new {@link org.apache.juneau.serializer.OutputStreamSerializer#serializeToHex(Object)} method. 
				<br>Useful mostly for testing purposes.
				<br>Equivalently, the {@link org.apache.juneau.parser.InputStreamParser#parse(Object,Class)} method can now 
					read the output from this method.
			<li>Eliminated the <code><ja>@Bean</ja>(subTypeProperty)</code> and <code><ja>@Bean</ja>(subTypes)</code> annotations
				and replaced them with the ability to define subtypes using the existing {@link org.apache.juneau.annotation.Bean#beanDictionary() @Bean.beanDictionary()}
				annotation on parent classes and interfaces.
				<br>This has the added benefit of simplifying the overall code.
			<li>The <code><del>SerializerContext.SERIALIZER_addBeanTypeProperties</del></code> setting is now enabled by default.
			<li>Combined the <code>SERIALIZER_addIndentation</code>/<code>JSON_addWhitespace</code>/<code>UON_addWhitespace</code>
				properties into a single <code><del>SerializerContext.SERIALIZER_useWhitespace</del></code> setting.
		</ul>
		
		<h5 class='topic'>org.apache.juneau.rest</h5>
		<ul class='spaced-list'>
			<li>{@link org.apache.juneau.rest.RestRequest} now passes locale and timezone to serializers/parsers/transforms.
			<li><code><del>RestRequest.getTimeZone()</del></code> method.
			<li>Standardized the following methods in {@link org.apache.juneau.rest.RestRequest} to remove dependency on <code>ClassMeta</code>
				objects and eliminate the need for casts:
				<ul>
					<li><code><del>RestRequest.getHeader(String,Class)</del></code>
					<li><code><del>RestRequest.getHeader(String,Object,Class)</del></code>
					<li><code><del>RestRequest.getHeader(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getQueryParameter(String,Class)</del></code>
					<li><code><del>RestRequest.getQueryParameter(String,Object,Class)</del></code>
					<li><code><del>RestRequest.getQueryParameter(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getQueryParameter(String,Object,Type,Type...)</del></code>
					<li><code><del>RestRequest.getQueryParameters(String,Class)</del></code>
					<li><code><del>RestRequest.getQueryParameters(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getFormDataParameter(String,Class)</del></code>
					<li><code><del>RestRequest.getFormDataParameter(String,Object,Class)</del></code>
					<li><code><del>RestRequest.getFormDataParameters(String,Class)</del></code>
					<li><code><del>RestRequest.getFormDataParameter(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getFormDataParameters(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getPathParameter(String,Class)</del></code>
					<li><code><del>RestRequest.getPathParameter(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getBody(Class)</del></code>
					<li><code><del>RestRequest.getBody(Type,Type...)</del></code>
				</ul>
			<li>New methods on {@link org.apache.juneau.rest.client.NameValuePairs}
			<li>Fixed issue where whitespace was not added to UON/URL-Encoding output when <code>&amp;plainText=true</code> specified.
		</ul>
	</div>
	
	
	<!-- =========================================================================================================== -->
	<a id="6.0.1"></a>
	<h3 class='topic' onclick='toggle(this)'>6.0.1 (Jan 3, 2017)</h3>
	<div class='topic'>
		<p>
			Juneau 6.0.1 is a minor update.
		</p>

		<h5 class='topic'>org.apache.juneau</h5>
		<ul class='spaced-list'>
			<li>General improvements to JSON parser.
				<ul>
					<li>Several fixes to handle obscure edge cases.
				</ul>
			<li>New properties in <code><del>ParserContext</del></code>.
				<ul>
					<li><code><del>ParserContext.PARSER_strict</del></code>
					<li><code><del>ParserContext.PARSER_inputStreamCharset</del></code>
					<li><code><del>ParserContext.PARSER_fileCharset</del></code>
				</ul>
			<li>Removed <code>JsonParserContext.JSON_strictMode</code>.  Replaced by <code>PARSER_strict</code>.		
			<li><code><jk>byte[]</jk></code> arrays can now be passed to {@link org.apache.juneau.parser.Parser#parse(Object,Class)} for reader-based parsers.	
		</ul>			

	</div>
	
	<!-- =========================================================================================================== -->
	<a id="6.0.0"></a>
	<h3 class='topic' onclick='toggle(this)'>6.0.0 (Oct 3, 2016)</h3>
	<div class='topic'>
		<p>
			Juneau 6.0.0 is a major update.
		</p>
		<p>
			The major change is rebranding from "Juno" to "Juneau" in preparation for donation to the Apache Foundation.
		</p>

		<h5 class='topic'>org.apache.juneau</h5>
		<ul class='spaced-list'>
			<li>Major changes around how serializer and parser class properties are defined to improve performance
				and concurrency.
				<ul>
					<li>New {@link org.apache.juneau.PropertyStore} class - Used for creating context objects.
					<li>New {@link org.apache.juneau.Context} class - Read-only configurations for serializers and parsers.
					<li>New {@link org.apache.juneau.Session} class - One-time use objects used by serializers and parsers.
					<li>All context context properties can now also be specified via system properties.
				</ul>
			</li>
			<li>Refactored serializer and parser APIs for more consistency between stream-based and character-based serializers
				and parsers.
				<ul>
					<li>More consistent handling of exceptions.
					<li>More consistent method declarations.
				</ul>
			<li>Refactored var resolver API and added them to a new package - <code>org.apache.juneau.svl</code>.
				<ul>
					<li>Support for stream-based variables - {@link org.apache.juneau.svl.StreamedVar}.
					<li>Added support for context and session objects.
				</ul>
			<li>Eliminated <js>"_class"</js> properties and replaced them with <js>"_type"</js> properties.
				The class properties were a little-used feature where we would serialize fully-qualified class names when the class type could not be inferred through reflection.  
				It's been replaced with bean type names and bean dictionaries.
				Instead of class names, we serialize <js>"_type"</js> properties whose name is the type name defined on the bean being serialized.  
				The parsers use a 'dictionary' of bean classes to resolve those names to actual bean classes.
				The following features were added to enable this support:
				<ul>
					<li>{@link org.apache.juneau.annotation.Bean#typeName() @Bean.typeName()} - Annotation that defines an identifying name for a bean class.
					<li>{@link org.apache.juneau.transform.BeanFilterBuilder#typeName(String)} - Programmatic equivalent to annotation above.
					<li>{@link org.apache.juneau.BeanContext#BEAN_beanDictionary} - List of bean classes that make up the bean dictionary for lookup
						during parsing. 
					<li>{@link org.apache.juneau.BeanContext#BEAN_beanTypePropertyName} - The overridable type property name.  Default is <js>"_type"</js>.
					<li>{@link org.apache.juneau.annotation.BeanProperty#beanDictionary() @BeanProperty.beanDictionary()} - Define a type dictionary
						for a particular bean property value.  This overrides the value specified using {@link org.apache.juneau.BeanContext#BEAN_beanDictionary}.
					<li><code><del>SerializerContext.SERIALIZER_addBeanTypeProperties</del></code> - Controls whether type properties are serialized.
				</ul>
				In addition, the {@link org.apache.juneau.annotation.Bean#typeName() @Bean.typeName()} value replaces the <code>@Xml.name()</code> annotation, and the 
				<js>"type"</js> and <js>"_class"</js> attributes in the XML and HTML serializers have been standardized on a single <js>"_type"</js> attribute.
			<li>Refactor bean filter support to use {@link org.apache.juneau.transform.BeanFilterBuilder} class.
				Allows the <code>BeanFilter</code> class to use final fields.
			<li>{@link org.apache.juneau.msgpack MessagePack} support.
			<li>Serializers can now serialize directly to {@link java.io.File Files}.
				See {@link org.apache.juneau.serializer.Serializer#serialize(Object,Object)}
			<li>Parsers can now parse directly from {@link java.io.File Files} and other types.
				See {@link org.apache.juneau.parser.Parser#parse(Object,ClassMeta)}
			<li>Parsers will automatically covert numeric input to POJOs that have numeric constructors (e.g. <code>java.util.Date</code>).
			<li>Renamed 'Filters' to 'BeanFilters' and 'PojoSwaps'.  Filters is just too overloaded a term.
			<li>Internal utility classes moved to a new <code>org.apache.juneau.internal</code> package.
				These internal utility classes are not meant for consumption outside the Juneau codebase.
			<li>New methods on {@link org.apache.juneau.parser.Parser}:
				<ul>
					<li><code>org.apache.juneau.parser.Parser.createSession(ObjectMap,Method,Object)</code>
					<li><code><del>Parser.getMediaRanges()</del></code>
				</ul>
			</li>
			<li>New methods on {@link org.apache.juneau.serializer.Serializer}:
				<ul>
					<li><code>org.apache.juneau.serializer.Serializer.createSession(ObjectMap,Method)</code>
					<li><code><del>Serializer.getMediaRanges()</del></code>
				</ul>
			</li>
			<li>New {@link org.apache.juneau.annotation.Bean#sort() @Bean.sort()} annotation.
			<li>Added <ja>@Bean.properties</ja> annotations on various DTO beans to make the ordering consistent
				between IBM and Oracle JVMs.<br>
				IBM JVMs maintain the order of methods in a class, whereas Oracle JVMs do not.
			<li>Serializers and parsers now automatically convert {@link java.lang.Class} objects to readable names via {@link org.apache.juneau.internal.ClassUtils#getReadableClassName(Class)}.
			<li>Eliminated the <code>ClassFilter</code> class since it's no longer needed.
			<li>Code and concurrency improvements to {@link org.apache.juneau.serializer.SerializerGroup} and {@link org.apache.juneau.parser.ParserGroup}.
			<li>Various enhancements to <code><del>BeanContext.convertToType(Object,Class)</del></code>.
			<li>New properties on {@link org.apache.juneau.html.HtmlSerializer}:
				<ul>
					<li><code><del>HtmlSerializerContext.HTML_detectLinksInStrings</del></code> - Automatically detect hyperlinks in strings.
					<li><code><del>HtmlSerializerContext.HTML_lookForLabelParameters</del></code> - Specify anchor text by appending <code>&amp;label=MyLabel</code> to URL.
					<li><code><del>HtmlSerializerContext.HTML_labelParameter</del></code> - Specify what URL parameter to use as the anchor text label.
					<li><code><del>HtmlSerializerContext.URI_ANCHOR</del></code> option for <code><del>HtmlSerializerContext.HTML_uriAnchorText</del></code>.				
				</ul>
			</li>
			<li>Removed generics from {@link org.apache.juneau.BeanPropertyMeta}.
			<li>Introduced new classes to eliminate the references to language-specific metadata in the core metadata classes:
				<ul>
					<li>{@link org.apache.juneau.ClassMetaExtended} / {@link org.apache.juneau.ClassMeta#getExtendedMeta(Class)} 
					<li>{@link org.apache.juneau.BeanMetaExtended} / {@link org.apache.juneau.BeanMeta#getExtendedMeta(Class)} 
					<li>{@link org.apache.juneau.BeanPropertyMetaExtended} / {@link org.apache.juneau.BeanPropertyMeta#getExtendedMeta(Class)} 
				</ul>
			</li>
			<li>Renamed <code>@Transform</code> annotation to <code><del>@Pojo</del></code> so that it can be used for various POJO-related behavior, not just associating transforms.  
			<li>Introduced {@link org.apache.juneau.dto.swagger Swagger DTOs}.
		</ul>		

		<h5 class='topic'>org.apache.juneau.rest</h5>
		<ul class='spaced-list'>
			<li>OPTIONS pages replaced with Swagger documents.
				Lots of changes related to supporting Swagger.
				<ul>
					<li>Annotation name changes to conform to Swagger specs:  <ja>@Attr</ja>-&gt;<ja>@Path</ja>, <ja>@QParam</ja>-&gt;<ja>@Query</ja>, <ja>@Param</ja>-&gt;<ja>@FormData</ja>, <ja>@Content</ja>-&gt;<ja>@Body</ja>
					<li>Eliminated <code>ResourceOptions</code> and related code.
					<li>New annotations and related methods:
						<ul>
							<li>{@link org.apache.juneau.rest.annotation.RestResource#title() @RestResource.title()} / {@link org.apache.juneau.rest.RestInfoProvider#getTitle(RestRequest)}
							<li>{@link org.apache.juneau.rest.annotation.RestResource#description() @RestResource.description()} / {@link org.apache.juneau.rest.RestInfoProvider#getDescription(RestRequest)}
							<li><code><del>@RestResource.termsOfService()</del></code> / <code><del>RestInfoProvider.getTermsOfService(RestRequest)</del></code>
							<li><code><del>@RestResource.contact()</del></code> / <code><del>RestInfoProvider.getContact(RestRequest)</del></code>
							<li><code><del>@RestResource.license()</del></code> / <code><del>RestInfoProvider.getLicense(RestRequest)</del></code>
							<li><code><del>@RestResource.version()</del></code> / <code><del>RestInfoProvider.getVersion(RestRequest)</del></code>
							<li><code><del>@RestResource.tags()</del></code> / <code><del>RestInfoProvider.getTags(RestRequest)</del></code>
							<li><code><del>@RestResource.externalDocs()</del></code> / <code><del>RestInfoProvidergetExternalDocs(RestRequest)</del></code>
							<li>{@link org.apache.juneau.rest.annotation.RestMethod#summary() @RestMethod.summary()} / <code><del>RestInfoProvider.getMethodSummary(String,RestRequest)</del></code>
							<li>{@link org.apache.juneau.rest.annotation.RestMethod#description() @RestMethod.description()} /<code><del>RestInfoProvider.getMethodDescription(String,RestRequest)</del></code>
							<li><code><del>@RestMethod.externalDocs()</del></code>
							<li><code><del>@RestMethod.tags()</del></code>
							<li><code><del>@RestMethod.deprecated()</del></code> 
							<li><code><del>@RestMethod.parameters()</del></code> 
							<li><code><del>@RestMethod.responses()</del></code>
						</ul>
					</li>					
				</ul>
			<li>New <code><del>RestServletContext.paramFormat</del></code> context property.
			<li>New/updated methods on {@link org.apache.juneau.rest.RestServlet}:
				<ul>
					<li><code><del>RestServlet.createProperties()</del></code>
					<li><code><del>RestServlet.createBeanContext(ObjectMap,Class[],Class[])</del></code>
					<li><code><del>RestServlet.createBeanFilters()</del></code>
					<li><code><del>RestServlet.createPojoSwaps()</del></code>
					<li><code><del>RestServlet.createParsers(ObjectMap,Class[],Class[])</del></code>
					<li><code><del>RestServlet.createUrlEncodingSerializer(ObjectMap,Class[],Class[])</del></code>
					<li><code><del>RestServlet.createUrlEncodingParser(ObjectMap,Class[],Class[])</del></code>
					<li><code><del>RestServlet.createConverters(ObjectMap)</del></code>
					<li><code><del>RestServlet.createDefaultRequestHeaders(ObjectMap)</del></code>
					<li><code><del>RestServlet.createDefaultResponseHeaders(ObjectMap)</del></code>
					<li><code><del>RestServlet.createEncoders(ObjectMap)</del></code>
					<li><code><del>RestServlet.createGuards(ObjectMap)</del></code>
					<li><code><del>RestServlet.createMimetypesFileTypeMap(ObjectMap)</del></code>
					<li><code><del>RestServlet.createResponseHandlers(ObjectMap)</del></code>
				</ul>
			</li>
			<li>New client-version annotations:
				<ul>
					<li>{@link org.apache.juneau.rest.annotation.RestResource#clientVersionHeader}  - The name of the header used to identify the client version.
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#clientVersion}  - The client version range applied to a Java method.
				</ul>
			</li>
		</ul>
		
		<h5 class='topic'>org.apache.juneau.rest.client</h5>
		<ul class='spaced-list'>
			<li>Removed the <code>JazzRestClient</code> class.
			<li>New method <code><del>RestClient.setClientVersion(String)</del></code>.
		</ul>		
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.2.0.1"></a>
	<h3 class='topic' onclick='toggle(this)'>5.2.0.1 (Mar 23, 2016)</h3>
	<div class='topic'>
		<p>
			Juno 5.2.0.1 is a moderate update.
		</p>

		<h5 class='topic'>com.ibm.team.juno</h5>
		<ul class='spaced-list'>
			<li>Improved support for multi-line values in config files.
				Any line that begins with whitespace is interpreted as a continuation of the previous line.
			<li>Support for <js>'\uXXXX'</js> character sequences in config files.
			<li>Fixed issue in {@link org.apache.juneau.xml.XmlSerializer} where <js>'\r'</js> and <js>'\n'</js> characters were not being handled per XML specs.
			<li>New methods on {@link org.apache.juneau.ObjectList}:  
				<ul>
					<li><code><del>ObjectList.getAt(Class,String)</del></code>
					<li>{@link org.apache.juneau.ObjectList#putAt(String,Object)}
					<li>{@link org.apache.juneau.ObjectList#postAt(String,Object)}
					<li>{@link org.apache.juneau.ObjectList#deleteAt(String)}
				</ul>
			<li>New methods on {@link org.apache.juneau.ObjectMap}:  
				<ul>
					<li><code><del>ObjectMap.getAt(Class,String)</del></code>
					<li>{@link org.apache.juneau.ObjectMap#putAt(String,Object)}
					<li>{@link org.apache.juneau.ObjectMap#postAt(String,Object)}
					<li>{@link org.apache.juneau.ObjectMap#deleteAt(String)}
				</ul>
			<li><code><del>@ThreadSafe</del></code> annotation.
			<li>New <code>ClassFilter</code> class.
			<li><del><code>ConfigFile.getResolving(StringVarResolver,boolean)</code></del> method.
			<li><del><code>ConfigFile.getStringVar()</code></del> method.
			<li>New <code><del>ParserContext.PARSER_trimStrings</del></code> property.
			<li>New <code><del>SerializerContext.SERIALIZER_trimStrings</del></code> property.
			<li><del><code>Args.getStringVar()}</code></del> method.
			<li>New {@link org.apache.juneau.utils.ManifestFile} class
			<li>New {@link org.apache.juneau.utils.MessageBundle} class.  Replaces <l>SafeResourceBundle</l>/<l>SafeResourceMultiBundle</l>/<l>RestNls</l>.
			<li>New <del><code>StringMapVar</code></del> class.
			<li>New <del><code>StringVars</code></del> class with reusable common <del><code>StringVar</code></del> instances.
			<li>New {@link org.apache.juneau.internal.JuneauLogger} class.
			<li>Default value for <code><del>XmlParserContext.XML_trimWhitespace</del></code> changed to <jk>true</jk>.			
		</ul>

		<h5 class='topic'>Server</h5>
		<ul class='spaced-list'>
			<li>New methods on {@link org.apache.juneau.rest.RestContext}:
				<ul>
					<li>{@link org.apache.juneau.rest.RestContext#getMessages()}
				</ul>
		</ul>

		<h5 class='topic'>Client</h5>
		<ul class='spaced-list'>
			<li>Fixed potential issue in {@link org.apache.juneau.rest.client.RestClient} where the HTTP connection pool could end up exhausted if an error occurred.
			<li>Improved thread safety on {@link org.apache.juneau.rest.client.RestClient}.
			<li>New warning message is logged if a {@link org.apache.juneau.rest.client.RestClient} is garbage collected without being closed:  
				<js>"WARNING:  RestClient garbage collected before it was finalized."</js>
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.2.0.0"></a>
	<h3 class='topic' onclick='toggle(this)'>5.2.0.0 (Dec 30, 2015)</h3>
	<div class='topic'>
		<p>
			Juno 5.2.0.0 is a major update.
			Major changes have been made to the microservice architecture and config INI file APIs.
		</p>
		
		<h5 class='topic'>Core</h5>
		<ul class='spaced-list'>
			<li>Significant changes and enhancements to the <code>org.apache.juneau.config</code> API.
				<ul>
					<li>More consistent handling of comma-delimited lists of objects.
					<li>New methods in <code><del>ConfigFile</del></code>:
						<ul>
							<li><code><del>ConfigFile.getStringArray(String)</del></code>,<code><del>ConfigFile.getStringArray(String,String[])</del></code>
							<li><code><del>ConfigFile.getSectionAsBean(String,Class)</del></code> - Instantiate a new bean with property values in the specified section..
							<li><code><del>ConfigFile.writeProperties(String,Object,boolean,Class[])</del></code> - Copy the properties in a config file section into properties on an existing bean or POJO.
							<li><code><del>ConfigFile.getSectionMap(String)</del></code> - Get all the resolved values in a section.
							<li><code><del>ConfigFile.containsNonEmptyValue(String)</del></code> 
							<li><code><del>ConfigFile.isEncoded(String)</del></code> 
							<li><code><del>ConfigFile.addListener(ConfigFileListener)</del></code> - Listen for modification events on the config file.
							<li><code><del>ConfigFile.merge(ConfigFile)} - Merge the contents of another config file into this config file.
							<li><code><del>ConfigFile.getResolving()}, <del><code>ConfigFile.getResolving(StringVarResolver)</code></del> - Return an instance of the config file that resolves string variables.
								Much more efficient than the previous design since the same underlying config file object is shared.
							<li><code><del>ConfigFile.toWritable()</del></code> - Wraps the config file in a {@link org.apache.juneau.Writable} interface so that it can be serialized by the REST interface as a plain-text INI file instead of as a serialized POJO.
							<li><code><del>ConfigFile.getInt(String)</del></code> - Now supports <js>"M"</js> and <js>"K"</js> to identify millions and thousands.
						</ul>
					<li>New methods in <code><del>ConfigMgr</del></code>:
						<ul>
							<li><code><del>ConfigMgr.create()</del></code>, <code><del>ConfigMgr.create(Reader)</del></code>, <code><del>ConfigMgr.create(File)</del></code>
							<li><code><del>ConfigMgr.deleteAll()</del></code>	
						</ul>
					<li>New methods in <code><del>Section</del></code>:
						<ul>
							<li><code><del>Section.setParent(ConfigFileImpl)</del></code> - Used by parsers to set the config file for this section.
							<li><code><del>Section.setName(String)</del></code> - Used by parsers to set the name for this section.
						</ul>
					<li>New interfaces:
						<ul>
							<li><code><del>org.apache.juneau.config.ConfigFileListener</del></code>
							<li><code><del>org.apache.juneau.config.SectionListener</del></code>
							<li><code><del>org.apache.juneau.config.EntryListener</del></code> 
						</ul>
					<li><code><del>org.apache.juneau.config.Encoder</del></code> methods have access to field names to use them as salt values.
					<li>The name of the default section is now <js>"default"</js>.  Before it was just <jk>null</jk>.
					<li><code><del>org.apache.juneau.config.XorEncoder</del></code> XOR key can be overridden through the <js>"org.apache.juneau.config.XorEncoder.key"</js> system property.
				</ul> 
			<li>Support for converting Strings to POJOs if the POJO class has any of the following static methods: 
				<ul>
					<li><code>fromString(String)</code>
					<li><code>valueOf(String)</code> (e.g. enums)
					<li><code>parse(String)</code> (e.g. logging <code>Level</code> class)
					<li><code>parseString(String)</code>
					<li><code>forName(String)</code> (e.g. <code>Class</code> and <code>Charset</code> classes)
				</ul>
			<li>Support for parsing into objects with unbound type variables.
				For example, if you have a class <code>Pair&lt;S,T&gt;</code> and you try to parse into this
				class (e.g. <code>parser.parse(in, Pair.<jk>class</jk>)</code>), the unbound type variables
				is interpreted as <code>Object</code> instead of throwing an exception.
			<li>Support for serializing/parsing the following new types:
				<ul>
					<li><code>AtomicInteger</code>
					<li><code>AtomicLong</code>
					<li><code>BigInteger</code>
					<li><code>BigDecimal</code>
				</ul>
			<li>Parsers have been enhanced to allow parent POJOs and field names to be passed into child POJOs.
				New {@link org.apache.juneau.annotation.NameProperty @NameProperty} and {@link org.apache.juneau.annotation.ParentProperty @ParentProperty}
					annotations are provided for identifying methods for setting names and parent POJOs on child POJOs.
				For example, the config file <code><del>Section</del></code> class represents a section
				in a config file.  It needs to know it's own name and have a link to the <code><del>ConfigFile</del></code> 
				that it belongs to.  With these new annotations, config files can be reconstructed using any of the parsers.
			<li>New classes and interfaces:
				<ul>
					<li>{@link org.apache.juneau.Streamable} interface for identifying objects that can be serialized directly to an output stream.
					<li>{@link org.apache.juneau.Writable} interface for identifying objects that can be serialized directly to a writer.
					<li><code><del>StringObject</del></code> class that can be used for delayed object serialization.
					<li>{@link org.apache.juneau.internal.ByteArrayCache}
					<li>{@link org.apache.juneau.internal.ByteArrayInOutStream} 
					<li>{@link org.apache.juneau.internal.FileUtils}
					<li>{@link org.apache.juneau.internal.ThrowableUtils}
					<li><del><code>StringVarMultipart</code></del>
					<li><del><code>StringVarWithDefault</code></del>
				</ul> 
			<li>New fields on {@link org.apache.juneau.ObjectList}:
				<ul>
					<li>{@link org.apache.juneau.ObjectList#EMPTY_LIST}
				</ul>
			<li>New fields and methods on {@link org.apache.juneau.ObjectMap}:
				<ul>
					<li>{@link org.apache.juneau.ObjectMap#EMPTY_MAP}
					<li>{@link org.apache.juneau.ObjectMap#getStringArray(String)}
					<li>{@link org.apache.juneau.ObjectMap#getStringArray(String,String[])}
					<li>{@link org.apache.juneau.ObjectMap#putIfNull(String,Object)}
					<li>{@link org.apache.juneau.ObjectMap#putIfEmpty(String,Object)}
				</ul>
			<li>New methods in {@link org.apache.juneau.internal.ArrayUtils}:
				<ul>
					<li>{@link org.apache.juneau.internal.ArrayUtils#contains(Object,Object[])}
					<li>{@link org.apache.juneau.internal.ArrayUtils#indexOf(Object,Object[])}
					<li>{@link org.apache.juneau.internal.ArrayUtils#toPrimitiveArray(Object)}
				</ul>	
			<li>New methods in {@link org.apache.juneau.internal.IOUtils}:
				<ul>
					<li>{@link org.apache.juneau.internal.IOUtils#pipe(Reader,Writer)}
					<li>{@link org.apache.juneau.internal.IOUtils#read(File)}
					<li>{@link org.apache.juneau.internal.IOUtils#readFile(String)}
					<li>{@link org.apache.juneau.internal.IOUtils#write(File,Reader)}
				</ul>
			<li>New methods on {@link org.apache.juneau.utils.PojoRest}:
				<ul>
					<li><code><del>PojoRest.get(Class,String,Object)</del></code>
					<li>{@link org.apache.juneau.utils.PojoRest#getString(String)}
					<li>{@link org.apache.juneau.utils.PojoRest#getString(String,String)}
					<li>{@link org.apache.juneau.utils.PojoRest#getInt(String)}
					<li>{@link org.apache.juneau.utils.PojoRest#getInt(String,Integer)}
					<li>{@link org.apache.juneau.utils.PojoRest#getLong(String)}
					<li>{@link org.apache.juneau.utils.PojoRest#getLong(String,Long)}
					<li>{@link org.apache.juneau.utils.PojoRest#getBoolean(String)}
					<li>{@link org.apache.juneau.utils.PojoRest#getBoolean(String,Boolean)}
					<li>{@link org.apache.juneau.utils.PojoRest#getMap(String)}
					<li>{@link org.apache.juneau.utils.PojoRest#getMap(String,Map)}
					<li>{@link org.apache.juneau.utils.PojoRest#getList(String)}
					<li>{@link org.apache.juneau.utils.PojoRest#getList(String,List)}
					<li>{@link org.apache.juneau.utils.PojoRest#getObjectMap(String)}
					<li>{@link org.apache.juneau.utils.PojoRest#getObjectMap(String,ObjectMap)}
					<li>{@link org.apache.juneau.utils.PojoRest#getObjectList(String)}
					<li>{@link org.apache.juneau.utils.PojoRest#getObjectList(String,ObjectList)}
				</ul>
			<li>New methods on {@link org.apache.juneau.utils.ProcBuilder}:
				<ul>
					<li>{@link org.apache.juneau.utils.ProcBuilder#pipeTo(Writer,boolean)}
					<li>{@link org.apache.juneau.utils.ProcBuilder#pipeTo(Writer)}
					<li>{@link org.apache.juneau.utils.ProcBuilder#logTo(Writer,boolean)}
					<li>{@link org.apache.juneau.utils.ProcBuilder#logTo(Writer)}
					<li>{@link org.apache.juneau.utils.ProcBuilder#logTo(Level,Logger)}
					<li>{@link org.apache.juneau.utils.ProcBuilder#maxExitStatus(int)}
				</ul>
			<li>New methods on {@link org.apache.juneau.internal.StringUtils}:
				<ul>
					<li>{@link org.apache.juneau.internal.StringUtils#isEmpty(Object)}
					<li>{@link org.apache.juneau.internal.StringUtils#nullIfEmpty(String)}
					<li>{@link org.apache.juneau.internal.StringUtils#base64EncodeToString(String)}
					<li>{@link org.apache.juneau.internal.StringUtils#base64Encode(byte[])}
					<li>{@link org.apache.juneau.internal.StringUtils#base64DecodeToString(String)}
					<li>{@link org.apache.juneau.internal.StringUtils#base64Decode(String)}
					<li>{@link org.apache.juneau.internal.StringUtils#generateUUID(int)}
					<li>{@link org.apache.juneau.internal.StringUtils#trim(String)}
					<li>{@link org.apache.juneau.internal.StringUtils#parseISO8601Date(String)}
					<li>{@link org.apache.juneau.internal.StringUtils#replaceVars(String,Map)}
					<li>{@link org.apache.juneau.internal.StringUtils#pathStartsWith(String,String)}
					<li>{@link org.apache.juneau.internal.StringUtils#pathStartsWith(String,String[])}
				</ul>
			<li>New <del><code>StringVar.doResolve(String)</code></del> method.
			<li>New <del><code>StringVarResolver.DEFAULT</code></del> field.
			<li>Eliminated dependency on <code>javax.mail.internet.MimeUtility</code> by implementing our own {@link org.apache.juneau.internal.StringUtils#base64Encode(byte[])} method.
			<li>{@link org.apache.juneau.transforms.CalendarSwap} and {@link org.apache.juneau.transforms.DateSwap} classes now handle blank input better.  Returns <jk>null</jk> instead of throwing an exception.
			<li>{@link org.apache.juneau.html.HtmlDocSerializer} specifies the default CSS location as <code>/servletPath/style.css</code> instead of <code>/servletPath/htdocs/juneau.css</code>.  
				This coincides with enhancements made in the server code for specifying styles.
			<li>{@link org.apache.juneau.html.HtmlDocSerializer} wraps output in two div tags instead of one (e.g. <code>&lt;div class='outerdata'&gt;&lt;div class='data' id='data'&gt;...&lt;/div&gt;&lt;/div&gt;</code>).
				Needed for supporting the new devops look-and-feel.
			<li>Fixed indentation inconsistencies in {@link org.apache.juneau.html.HtmlDocSerializer}.
			<li>Renamed <del>HtmlSchemaSerializer</del> to {@link org.apache.juneau.html.HtmlSchemaDocSerializer}.
			<li>RDF serializers and parsers now support <code>RdfProperties.RDF_looseCollection</code> loose collections.
			<li>RDF parser handles case where resources point to themselves (an unfortunate behavior in JFS RDF documents).
			<li>JSON parser with throw an exception in strict mode if it encounters numbers that are valid in Java but invalid in JSON (e.g. octal, hexadecimal numbers).
			<li>{@link org.apache.juneau.parser.Parser} methods now check for <jk>null</jk> input.
			<li>{@link org.apache.juneau.serializer.SerializerGroup} and {@link org.apache.juneau.parser.ParserGroup} ignores serializers and parsers if they throw <code>NoClassDefFoundErrors</code>.
			<li>{@link org.apache.juneau.urlencoding.UrlEncodingParser} creates lists if the same attribute name is encountered more than once.  Before it would just replace the previous value with the new value.
			<li>New <code><del>UrlEncodingSerializer.DEFAULT_SIMPLE_EXPANDED</del></code> serializer.
			<li>Changes to {@link org.apache.juneau.utils.Args}:
				<ul>
					<li><code>getMainArg(int)</code> changed to {@link org.apache.juneau.utils.Args#getArg(int)}.  
						Non-existent arguments are returned as <jk>null</jk> instead of blank strings.  
						This is more inline with the behavior of the rest of the library.
					<li>New {@link org.apache.juneau.utils.Args#hasArg(int)} method.
				</ul> 
			<li>Removed <code>org.apache.juneau.utils.CharsetUtils</code> class.
			<li>Removed <code>org.apache.juneau.utils.ConcurrentIdentityList</code> class.
			<li>Fixed bug in {@link org.apache.juneau.internal.MultiIterable} class.
			<li>{@link org.apache.juneau.utils.PojoIntrospector} must now be instantiated with a <code>ReaderParser</code>.
				Simplifies the API on the class.
			<li>{@link org.apache.juneau.utils.PojoRest} must now be instantiated with a <code>ReaderParser</code>.
				Simplifies the API on the class.
			<li>{@link org.apache.juneau.utils.MessageBundle} and <code>SafeResourceMultiBundle</code> moved from server component.
			<li>Several bug fixes and performance improvements in <del><code>StringVarResolver</code></del>.
			<li>Various enhancements to {@link org.apache.juneau.internal.TeeWriter} and {@link org.apache.juneau.internal.TeeOutputStream}.
			<li>Renamed <del>CharSet</del> to {@link org.apache.juneau.internal.AsciiSet}.
			<li>{@link org.apache.juneau.serializer.SerializerGroup} and {@link org.apache.juneau.parser.ParserGroup} now ignores <code>NoClassDefFoundErrors</code>
				so that resources that include Jena support can continue to operate even if the Jena libraries are not present.
			<li>New {@link org.apache.juneau.internal.FileUtils#createTempFile(String)} method.
			<li>New {@link org.apache.juneau.utils.PojoQuery} modified to handle bean getters that throw exceptions.
		</ul>

		<h5 class='topic'>Client</h5>
		<ul class='spaced-list'>
			<li>Upgraded to use Apache HttpClient 4.5.
			<li>New classes:
				<ul>
					<li>{@link org.apache.juneau.rest.client.AllowAllRedirects}
					<li>{@link org.apache.juneau.rest.client.HttpMethod}
					<li>{@link org.apache.juneau.rest.client.ResponsePattern}
					<li>{@link org.apache.juneau.rest.client.SimpleX509TrustManager}
					<li>{@link org.apache.juneau.rest.client.SSLOpts}
				</ul>
			<li>Removed <code>org.apache.juneau.rest.client.LaxRedirectStrategy</code>.  Use HTTP Client equivalent.
			<li>New methods on {@link org.apache.juneau.rest.client.RestCall}:
				<ul>
					<li><code><del>RestCall#addInterceptor(RestCallInterceptor)</del></code>
					<li>{@link org.apache.juneau.rest.client.RestCall#pipeTo(Writer)}
					<li>{@link org.apache.juneau.rest.client.RestCall#pipeTo(Writer,boolean)}
					<li>{@link org.apache.juneau.rest.client.RestCall#pipeTo(String,Writer,boolean)}
					<li>{@link org.apache.juneau.rest.client.RestCall#getWriter(String)}
					<li>{@link org.apache.juneau.rest.client.RestCall#pipeTo(OutputStream)}
					<li>{@link org.apache.juneau.rest.client.RestCall#pipeTo(OutputStream,boolean)}
					<li>{@link org.apache.juneau.rest.client.RestCall#pipeTo(String,OutputStream,boolean)}
					<li>{@link org.apache.juneau.rest.client.RestCall#getOutputStream(String)}
					<li>{@link org.apache.juneau.rest.client.RestCall#byLines()}
					<li>{@link org.apache.juneau.rest.client.RestCall#captureResponse()}
					<li>{@link org.apache.juneau.rest.client.RestCall#successPattern(String)}
					<li>{@link org.apache.juneau.rest.client.RestCall#failurePattern(String)}
					<li><code><del>RestCall#addResponsePattern(ResponsePattern)</del></code>
					<li>{@link org.apache.juneau.rest.client.RestCall#run()} - Renamed from <code>execute()</code>.
					<li>{@link org.apache.juneau.rest.client.RestCall#getCapturedResponse()}
					<li>{@link org.apache.juneau.rest.client.RestCall#getResponsePojoRest(Class)}
					<li>{@link org.apache.juneau.rest.client.RestCall#getResponsePojoRest()}
					<li>{@link org.apache.juneau.rest.client.RestCall#logTo(Level,Logger)}
					<li>{@link org.apache.juneau.rest.client.RestCall#setConfig(RequestConfig)}
				</ul>
			<li>New lifecycle listener methods on {@link org.apache.juneau.rest.client.RestCallInterceptor}:
				<ul>
					<li>{@link org.apache.juneau.rest.client.RestCallInterceptor#onInit(RestCall)}
					<li>{@link org.apache.juneau.rest.client.RestCallInterceptor#onClose(RestCall)}
				</ul>
			<li>New methods on {@link org.apache.juneau.rest.client.RestClient}:
				<ul>
					<li><code><del>RestClient.setBasicAuth(String,int,String,String)</del></code>
					<li><code><del>RestClient.logTo(Level,Logger)</del></code>
					<li><code><del>RestClient.setRootUrl(String)</del></code>
					<li><code><del>RestClient.enableSSL(SSLOpts)</del></code>
					<li><code><del>RestClient.enableLaxSSL()</del></code>
					<li>{@link org.apache.juneau.rest.client.RestClient#doCall(HttpMethod,Object,Object)}
					<li><code><del>RestClient.createHttpClientBuilder()</del></code>
				</ul>
			<li>New passthrough methods on {@link org.apache.juneau.rest.client.RestClient} defined on <code>HttpClientBuilder</code>:
				<ul>
					<li><code><del>RestClient.setRedirectStrategy(RedirectStrategy)</del></code>
					<li><code><del>RestClient.setDefaultCookieSpecRegistry(Lookup)</del></code>
					<li><code><del>RestClient.setRequestExecutor(HttpRequestExecutor)</del></code>
					<li><code><del>RestClient.setSSLHostnameVerifier(HostnameVerifier)</del></code>
					<li><code><del>RestClient.setPublicSuffixMatcher(PublicSuffixMatcher)</del></code>
					<li><code><del>RestClient.setSSLContext(SSLContext)</del></code>
					<li><code><del>RestClient.setSSLSocketFactory(LayeredConnectionSocketFactory)</del></code>
					<li><code><del>RestClient.setMaxConnTotal(int)</del></code>
					<li><code><del>RestClient.setMaxConnPerRoute(int)</del></code>
					<li><code><del>RestClient.setDefaultSocketConfig(SocketConfig)</del></code>
					<li><code><del>RestClient.setDefaultConnectionConfig(ConnectionConfig)</del></code>
					<li><code><del>RestClient.setConnectionTimeToLive(long,TimeUnit)</del></code>
					<li><code><del>RestClient.setConnectionManager(HttpClientConnectionManager)</del></code>
					<li><code><del>RestClient.setConnectionManagerShared(boolean)</del></code>
					<li><code><del>RestClient.setConnectionReuseStrategy(ConnectionReuseStrategy)</del></code>
					<li><code><del>RestClient.setKeepAliveStrategy(ConnectionKeepAliveStrategy)</del></code>
					<li><code><del>RestClient.setTargetAuthenticationStrategy(AuthenticationStrategy)</del></code>
					<li><code><del>RestClient.setProxyAuthenticationStrategy(AuthenticationStrategy)</del></code>
					<li><code><del>RestClient.setUserTokenHandler(UserTokenHandler)</del></code>
					<li><code><del>RestClient.disableConnectionState()</del></code>
					<li><code><del>RestClient.setSchemePortResolver(SchemePortResolver)</del></code>
					<li><code><del>RestClient.setUserAgent(String userAgent)</del></code>
					<li><code><del>RestClient.setDefaultHeaders(Collection)</del></code>
					<li><code><del>RestClient.addInterceptorFirst(HttpResponseInterceptor)</del></code>
					<li><code><del>RestClient.addInterceptorLast(HttpResponseInterceptor)</del></code>
					<li><code><del>RestClient.addInterceptorFirst(HttpRequestInterceptor)</del></code>
					<li><code><del>RestClient.addInterceptorLast(HttpRequestInterceptor)</del></code>
					<li><code><del>RestClient.disableCookieManagement()</del></code>
					<li><code><del>RestClient.disableContentCompression()</del></code>
					<li><code><del>RestClient.disableAuthCaching()</del></code>
					<li><code><del>RestClient.setHttpProcessor(HttpProcessor)</del></code>
					<li><code><del>RestClient.setRetryHandler(HttpRequestRetryHandler)</del></code>
					<li><code><del>RestClient.disableAutomaticRetries()</del></code>
					<li><code><del>RestClient.setProxy(HttpHost)</del></code>
					<li><code><del>RestClient.setRoutePlanner(HttpRoutePlanner)</del></code>
					<li><code><del>RestClient.disableRedirectHandling()</del></code>
					<li><code><del>RestClient.setConnectionBackoffStrategy(ConnectionBackoffStrategy)</del></code>
					<li><code><del>RestClient.setBackoffManager(BackoffManager)</del></code>
					<li><code><del>RestClient.setServiceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy)</del></code>
					<li><code><del>RestClient.setDefaultCookieStore(CookieStore)</del></code>
					<li><code><del>RestClient.setDefaultCredentialsProvider(CredentialsProvider)</del></code>
					<li><code><del>RestClient.setDefaultAuthSchemeRegistry(Lookup)</del></code>
					<li><code><del>RestClient.setContentDecoderRegistry(Map)</del></code>
					<li><code><del>RestClient.setDefaultRequestConfig(RequestConfig)</del></code>
					<li><code><del>RestClient.useSystemProperties()</del></code>
					<li><code><del>RestClient.evictExpiredConnections()</del></code>
					<li><code><del>RestClient.evictIdleConnections(long,TimeUnit)</del></code>
				</ul>
			<li><code>JazzRestClient</code> now supports OIDC authentication.
			<li>These classes are now deprecated and will be removed in a future release:
				<ul>
					<li><code>org.apache.juneau.rest.client.jazz.CertificateStore</code>
					<li><code>org.apache.juneau.rest.client.jazz.ICertificateValidator</code>
					<li><code>org.apache.juneau.rest.client.jazz.ITrustStoreProvider</code>
					<li><code>org.apache.juneau.rest.client.jazz.LenientCertificateValidator</code>
					<li><code>org.apache.juneau.rest.client.jazz.SharedTrustStoreProvider</code>
					<li><code>org.apache.juneau.rest.client.jazz.ValidatingX509TrustManager</code>
				</ul>
		</ul>

		<h5 class='topic'>Server</h5>
		<ul class='spaced-list'>
			<li>New {@link org.apache.juneau.rest.ReaderResource} class.   
				Represents the contents of a text file with convenience methods for resolving
				<del><code>StringVar</code></del> variables and adding HTTP response headers.	
				REST Java methods can return instances of these to serialize <code>Readers</code>
					containing text with <del><code>StringVarResolver</code></del> variables in them.
			<li>New {@link org.apache.juneau.rest.StreamResource} class.   
				REST Java methods can return instances of these to serialize <code>OutputStreams</code>.
			<li>Fixed a bug in the stack trace hash algorithm in {@link org.apache.juneau.rest.RestException}.
			<li>New methods in {@link org.apache.juneau.rest.RestRequest}:
				<ul>
					<li><code><del>RestRequest.getReaderResource(String)</del></code> - Replaces <code>getVarResource(String)</code>.
					<li><code><del>RestRequest.getReaderResource(String,boolean)</del></code> 
					<li><code><del>RestRequest.getReaderResource(String,boolean,String)</del></code>
				</ul>
			<li>Changes in {@link org.apache.juneau.rest.RestResponse}:
				<ul>
					<li>Don't set <code>Content-Encoding: identity</code> when no encoding is used.  Some clients don't interpret it correctly.
				</ul>
			<li>New methods in {@link org.apache.juneau.rest.RestServlet}:
				<ul>
					<li><code><del>RestServlet.getChildClasses()</del></code>  - Programmatic equivalent to {@link org.apache.juneau.rest.annotation.RestResource#children() @RestResource.children()} annotation.
					<li><code><del>RestServlet.shouldLog(HttpServletRequest,HttpServletResponse,RestException)</del></code> 
					<li><code><del>RestServlet.shouldLogStackTrace(HttpServletRequest,HttpServletResponse,RestException)</del></code> 
					<li><code><del>RestServlet.logObjects(Level,String,Object[])</del></code> 
					<li><code><del>RestServlet.resolveStaticFile(String)</del></code> 
					<li><code><del>RestServlet.createStyleSheet()</del></code> 
					<li><code><del>RestServlet.createFavIcon()</del></code> 
					<li><code><del>RestServlet.createStaticFilesMap()</del></code> 
					<li><code><del>RestServlet.getConfigMgr()</del></code>
				</ul>
			<li>Removed {@link org.apache.juneau.jso.JsoParser}
				from {@link org.apache.juneau.rest.RestServletDefault} and <code><del>RestServletJenaDefault</del></code>.  
				These may represent a security risk if not handled correctly, so removed
				them as a precaution.
			<li>Removed <code>RestServletProperties.REST_htDocsFolder</code>.  Replaced with {@link org.apache.juneau.rest.annotation.RestResource#staticFiles() @RestResource.staticFiles()}.
			<li>New annotations on {@link org.apache.juneau.rest.annotation.RestResource @RestResource}.
				<ul>
					<li><code><del>RestResource.stylesheet()</del></code>
					<li><code><del>RestResource.favicon()</del></code>
					<li>{@link org.apache.juneau.rest.annotation.RestResource#staticFiles() @RestResource.staticFiles()}
				</ul>
			<li>Eliminated <code>org.apache.juneau.rest.jaxrs.JsonProvider</code> class.  
				Some JAX-RS implementations use code scanning to find providers, so if you were using <code>DefaultJenaProvider</code>, it would
				pick up <code>JsonProvider</code> as well.  It's easy enough to create your own implementation if needed.
			<li>OPTIONS pages now specify <code>consumes</code> and <code>produces</code> fields instead of <code>accept</code> and <code>contentType</code> which was confusing.  
			<li>Eliminated <code>properties</code> from OPTIONS pages. 
			<li>New <code><del>ResourceLink.ResourceLink(String,RestRequest,String,Object[])</del></code> constructor.
			<li>New response handlers:
				<ul>
					<li>{@link org.apache.juneau.rest.response.StreamableHandler} - Allows REST Java methods to return instances of {@link org.apache.juneau.Streamable}.
					<li>{@link org.apache.juneau.rest.response.WritableHandler} - Allows REST Java methods to return instances of {@link org.apache.juneau.Writable}.
				</ul>
			<li>New DevOps stylesheet.
			<li>Servlet initialization and HTTP requests are now logged at <JSF>FINE</JSF> level.
			<li>Added <jk>abstract</jk> modifier on various <l>RestServlet</l> subclasses to indicate that they're meant to be subclassed.
			<li>New {@link org.apache.juneau.rest.RestUtils#trimPathInfo(StringBuffer,String,String)} method.
		</ul>

		<h5 class='topic'>Microservice</h5>
		<ul class='spaced-list'>
			<li>Completely revamped API.
			<li>New {@link org.apache.juneau.microservice.Microservice} class that serves as a generic
				interface for microservices and their lifecycles.
			<li>New {@link org.apache.juneau.microservice.RestMicroservice} class that implements a microservice
				consisting of a REST interface.
				<ul>
					<li>REST resources and configuration settings can be defined through either manifest files
						or config files.
					<li>Enhanced logging support.
					<li>Easy-to-configure SSL support.
					<li>BASIC auth support.
					<li>Automatic restartability if the config file changes.
				</ul>
			<li>Eliminated <code>org.apache.juneau.microservice.Main</code> class.  This is replaced by
				the microservice classes defined above.
			<li>{@link org.apache.juneau.microservice.Resource} and {@link org.apache.juneau.microservice.ResourceGroup}
				classes now support the following new string variables:
				<ul>
					<li><js>"$ARG{key,default}""</js> - Command line arguments.
					<li><js>"$MF{key,default}""</js> - Manifest file entries.
				</ul> 
			<li>CSS stylesheet now configurable through config file entry <js>"REST/stylesheet"</js>.
			<li>New {@link org.apache.juneau.microservice.ResourceJena} class if you want your REST interface to support RDF.
			<li>Eliminated the following classes:
				<ul>
					<li><code>org.apache.juneau.microservice.RootResource</code>
					<li><code>org.apache.juneau.microservice.SampleResource</code>
				</ul> 
			<li>New predefined reusable resources:
				<ul>
					<li>{@link org.apache.juneau.microservice.resources.ConfigResource} - REST resource for viewing and editing microservice config file.
					<li>{@link org.apache.juneau.microservice.resources.LogsResource} - REST resource for viewing log files.
					<li>{@link org.apache.juneau.microservice.resources.SampleRootResource} - Sample REST resource that contains the config and logs resource as children.
					<li>{@link org.apache.juneau.microservice.resources.ShutdownResource} - REST resource for stopping the microservice JVM.  Useful for testing purposes.
				</ul>
		</ul>
		
		<h5 class='topic'>Samples</h5>
		<ul class='spaced-list'>
			<li>Converted to a REST microservice.
			<li>Look-and-feel changed to IBM DevOps.
		</ul>
		
		<h5 class='topic'>Documentation Updates</h5>
		<ul class='spaced-list'>
			<li><del>org.apache.juneau.microservice</del> - New package-level javadoc.
			<li><del>org.apache.juneau.config</del> - New package-level javadoc.
			<li><del><code>StringVarResolver</code></del> - New documentation.
			<li><del>org.apache.juneau.rest.client</del> - New package-level javadoc.
			<li><code><del>Overview / Samples</del></code> - New section.
			<li><del>org.apache.juneau.transform / Stop Classes</del> - New section.
			<li><del>org.apache.juneau.rest</del> - Extensive updates.
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.1.0.20"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.20 (Sept 5, 2015)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.20 is a moderate update.
			The biggest improvement is the ability to associate external INI config files with REST servlets using the <code><del>ConfigFile</del></code> functionality.
		</p>
		
		<h5 class='topic'>Core</h5>
		<ul class='spaced-list'>
			<li>Significant API changes to <code>org.apache.juneau.config</code> API.
				<ul>
					<li><code><del>ConfigFile</del></code> is now thread safe and can be shared across multiple threads.
					<li>New <code><del>ConfigMgr</del></code> class for managing configuration files.
					<li>Serializers and parsers can be associated with config files for storing and retrieving POJOs.  
						Default support provided for JSON.
				</ul>
			</li>
			<li>New {@link org.apache.juneau.html.SimpleHtmlWriter} class.  
				Can be used for simple HTML DOM construction.
			<li>New {@link org.apache.juneau.utils.ProcBuilder} class for calling external processes.
			<li>New <code><del>ObjectMap.remove(Class,String,Object)</del></code> method.
			<li><js>"class='link'"</js> added to links generated by {@link org.apache.juneau.html.HtmlDocSerializer}.
			<li>New <code><del>EncoderGroup#append(EncoderGroup)</del></code> method.
			<li>New <code>HtmlDocSerializerContext.HTMLDOC_addLinks</code> configuration property.
			<li>Modified the <code>Parser.createContext(ObjectMap,Method,Object)</code> method.  
				Outer context objects can be passed in to create instances of non-static inner classes.
			<li>Fixed bug in {@link org.apache.juneau.html.HtmlStrippedDocSerializer} where exception was thrown when trying to serialize primitive arrays.
			<li>{@link org.apache.juneau.json.JsonParser} now handles parsing JSON boolean/numeric values as strings to bean properties of type boolean or number. 
			<li>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer} and {@link org.apache.juneau.urlencoding.UrlEncodingParser} now 
				represent arrays and collections as key-value pairs where the keys are numbers (e.g. <js>"?0=foo&amp;1=bar"</js>).
			<li>Various internal improvements to {@link org.apache.juneau.utils.IOPipe}.
			<li>New {@link org.apache.juneau.internal.ReflectionUtils#getResource(Class,String)} method.
			<li>{@link org.apache.juneau.internal.StringUtils#parseNumber(String,Class)} now returns zero for empty strings. 
				This affects the way most parsers handle blank values.
		</ul>
		
		<h5 class='topic'>Server</h5>
		<ul class='spaced-list'>
			<li>You can now parse into non-static inner classes of a servlet for parameters/attributes/content.
				Useful if you like to define your marshaller beans inside your servlet.
			<li>Changes to {@link org.apache.juneau.rest.RestServlet}:
				<ul>
					<li>New methods for accessing external INI config files:<br>  
						<code><del>RestServlet.getConfig()</del></code><br>
						<code><del>RestServlet.createConfigFile()</del></code>
					<li>New <js>"$C{...}"</js> variable that resolve to INI config file values.
					<li>New <js>"$UE{...}"</js> variable that  URL-encodes the value inside the variable.
					<li>New convenience methods for retrieving classpath resource files:<br>  
						<del><code>RestServlet.getResource(String)</code></del><br>
						<del><code>RestServlet.getResourceAsString(String)</code></del><br>
						<del><code>RestServlet.getResource(Class,String,String)</code></del>.
							Useful if you want to load predefined POJOs from JSON files in your classpath.
					<li>New <code><del>RestServlet.handleNotFound(int,RestRequest,RestResponse)</del></code> method for customized handling
						of when a resource or method was not found.  
				</ul>
			<li>{@link org.apache.juneau.rest.RestServletDefault}  now automatically processes <js>"/favicon.ico"</js> requests by 
				overriding the new <code><del>RestServlet.handleNotFound(int,RestRequest,RestResponse)</del></code> method.
			<li>New {@link org.apache.juneau.rest.RestRequest} methods: 
				<ul>
					<li><code><del>RestRequest.resolveVars(String)</del></code>
					<li><code>RestRequest.getVarResource(String)</code>
					<li><code><del>RestRequest.getConfig()</del></code>
				</ul>
			<li>New {@link org.apache.juneau.rest.RestResponse} methods: 
				<ul>
					<li>{@link org.apache.juneau.rest.RestResponse#getDirectWriter(String)}.
					<li>{@link org.apache.juneau.rest.RestResponse#getNegotiatedWriter()}.  
						<code>getWriter()</code> now returns an unnegotiated writer.  
						<code>getUnbufferedWriter()</code> has been removed.
				</ul>
			<li>New {@link org.apache.juneau.rest.annotation.RestMethod#encoders() @RestMethod.encoders()} and 
				<code><del>RestMethod.inheritEncoders()</del></code> annotations.  
				Allows encoders to be fine-tuned at the method level.
			<li>New {@link org.apache.juneau.rest.annotation.RestResource#config() @RestResource.config()} annotation for associating external <code><del>ConfigFile</del></code> config files with servlets.
			<li><code><del>ResourceLink</del></code>.
			<li>New <code>org.apache.juneau.rest.matchers</code> package for commonly-used {@link org.apache.juneau.rest.RestMatcher RestMatchers}:
				<ul>
					<li>{@link org.apache.juneau.rest.matchers#MultipartFormDataMatcher}
					<li>{@link org.apache.juneau.rest.matchers#UrlEncodedFormMatcher}
				</ul>
		</ul>
				
		<h5 class='topic'>Microservice</h5>
		<ul class='spaced-list'>
			<li>New juneau-microservice.jar file that encapsulates all 3 juneau jars with code necessary for creating fast and efficent jetty-powered REST microservices.<br>
				Contains the following:
				<ul>
					<li>Jetty 8.0
					<li>Apache HttpClient 4.3.5
					<li>Apache Commons FileUpload 1.3.1
				</ul>
			<li>Microservice now supports Java 6 (previously required Java 7)
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.19"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.19 (Aug 15, 2015)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.19 is a minor update in terms of core functionality.
			But it introduces a <code><del>Microservices</del></code> project for building REST microservices and docker containers.
		</p>

		<h5 class='topic'>Core</h5>
		<ul class='spaced-list'>
			<li>Beans can now be serialized to and parsed from {@link org.apache.juneau.ObjectMap ObjectMaps}.
				See <del>Serializing to ObjectMaps</del> for details.
			<li>New {@link org.apache.juneau.ObjectMap#include(String[])} and {@link org.apache.juneau.ObjectMap#exclude(String[])} methods.
			<li>{@link org.apache.juneau.html.annotation.Html @Html} annotations can now be applied to bean properties.
			<li>New {@link org.apache.juneau.utils.IOPipe} utility class.
			<li>Behavior change on <del><code>StringVarResolver</code></del>.  <jk>null</jk> input now results in blank strings instead of <jk>null</jk>.
		</ul>
		
		<h5 class='topic'>Client</h5>
		<ul class='spaced-list'>
			<li>New {@link org.apache.juneau.rest.client.RestClient#doCallback(String)} method.
		</ul>
		
		<h5 class='topic'>Server</h5>
		<ul class='spaced-list'>
			<li>New {@link org.apache.juneau.rest.RestRequest#getHeaders()} method.
			<li>New <code>RestResponse.getUnbufferedWriter()</code> method.
			<li>Fixed bug that was preventing <code>x-response-headers</code> parameter from working correctly.
			<li>Added {@link org.apache.juneau.annotation.Bean#properties() @Bean.properties} annotations to the various 
				classes in <code>org.apache.juneau.rest.labels</code> so that the order of the bean properties are consistent
				on all JVMs.  On IBM JVMs this is unnecessary because the order of the properties as defined in the class
				are stored in the bytecode.  Other JVMs such as OpenJRE do not implement this feature causing the bean
				properties to be in random order.
			<li>New <code><del>ResourceDescription.ResourceDescription(RestRequest,String,String)</del></code> constructor.
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.1.0.18"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.18 (Aug 5, 2015)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.18 is a minor update affecting the server component only.
		</p>

		<h5 class='topic'>Server</h5>
		<ul class='spaced-list'>
			<li>Fixed bug where localized strings weren't resolving when using chained resource bundles.
			<li>Servlet and method labels and descriptions can now contain embedded string variables.
			<li>New <del><code>RestMethod.input()</code></del> and <code><del>RestMethod.responses()</del></code>
				annotations.
				These replace the various <code>description</code> annotations added 2 days ago with a simpler design.
			<li>New methods on {@link org.apache.juneau.rest.RestServlet}:
				<ul>
					<li><code><del>RestServlet.getMethodDescription(String,RestRequest)</del></code> so that subclasses
						can override the method description in the OPTIONS page.
					<li><del><code>RestServlet.createRequestVarResolver(RestRequest)</code></del> so that subclasses
						can override and augment the variable resolver.
					<li><code><del>RestServlet.resolveChild(Class)</del></code> and <code><del>RestServlet.replaceChild(RestServlet)</del></code>
						classes that allows customized resolution of servlet instances (e.g. if services are defined in OSGi).
				</ul> 
			<li>Reverted the <del><code>MethodDescription</code></del> back to 5.1.0.16 since it was being used by someone.
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.1.0.17"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.17 (Aug 3, 2015)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.17 is a major update.
		</p>

		<h5 class='topic'>Core</h5>
		<ul class='spaced-list'>
			<li>{@link org.apache.juneau.BeanMap#get(Object)} and {@link org.apache.juneau.BeanMap#put(String,Object)} now
				automatically performs filtering if filters are defined on the bean property or bean property class.
				<ul>
					<li>Deleted the following methods which are now unnecessary:
						<ul>
							<li><code>BeanMap.getFiltered(String)</code>
							<li><code>BeanMap.putFiltered(String,Object)</code>
							<li><code>BeanMapEntry.getFiltered(String)</code>
							<li><code>BeanMapEntry.putFiltered(String,Object)</code>
							<li><code>BeanMapEntry.putFiltered(String,Object)</code>
							<li><code>BeanPropertyMeta.getFiltered()</code>
							<li><code>BeanPropertyMeta.setFiltered(Object)</code>
							<li><code>BeanPropertyMeta.getTransformedClassMeta()</code>
						</ul>
					<li>{@link org.apache.juneau.BeanPropertyMeta#getClassMeta()} now returns the filtered type of the property.
				</ul> 
			<li><del><code>StringVarResolver</code></del> now has support for chained resolvers.
			<li><del><code>StringVarResolver</code></del>  now resolves variables inside resolved values.
				i.e. if a resolved variable value itself contains a variable, it now resolves that variable too.
			<li>Fixed bug where inner interface classes being used in <code>RestResource.filters()</code> were being
				interpreted as surrogate classes because they have hidden 1-arg constructors due to being inner classes.
			<li>Fixed bug in {@link org.apache.juneau.internal.MultiSet} where exception was being thrown if last set was empty.
			<li>New {@link org.apache.juneau.utils.ZipFileList} class for providing efficiently zipped directories through the REST interface.
			<li>New <code>RdfProperties.RDF_useXmlNamespaces</code> property.			
			<li>New <code><del>XmlParserContext.XML_preserveRootElement</del></code> property.
			<li>Worked around bug in Sun VM on OS/X where XML parser was throwing an exception when trying to set a reporter.			
		</ul>
		

		<h5 class='topic'>Server</h5>
		<ul class='spaced-list'>
			<li>New {@link org.apache.juneau.rest.response.ZipFileListResponseHandler} class.
			<li>Simplified labels in servlet resource bundles:
				<ul>
					<li><code>"[ClassName].ResourceDescription"</code> is now <code>"[ClassName].label"</code>.
					<li><code>"[ClassName].MethodDescription.[methodName]"</code> is now <code>"[ClassName].[methodName]"</code>.
				</ul>
			<li>Several changes to {@link org.apache.juneau.rest.RestRequest}:
				<ul>
					<li>Added new methods:
						<ul>
							<li><code><del>RestRequest.getQueryParameterMap()</del></code>
							<li><code><del>RestRequest.getQueryParameterNames()</del></code>
							<li><code><del>RestRequest.getPathInfoUndecoded()</del></code>
							<li><code><del>RestRequest.getPathRemainderUndecoded()</del></code>
							<li><code><del>RestRequest.getTrimmedRequestURI()</del></code>
							<li><code><del>RestRequest.getTrimmedRequestURL()</del></code>
							<li><code><del>RestRequest.getServletTitle()</del></code>
							<li><code><del>RestRequest.getServletDescription()</del></code>
							<li>{@link org.apache.juneau.rest.RestRequest#getMethodDescription()}
						</ul>
					<li>Behavior changes to {@link org.apache.juneau.rest.RestRequest#getPathInfo()} to follow Servlet specs.
						Returns <jk>null</jk> instead of blank for no path info.
					<li><code><del>RestRequest.getPathRemainder()</del></code> now automatically decodes the path remainder. 
						Use <code><del>RestRequest.getPathRemainderUndecoded()</del></code> to get the unencoded path remainder.
					<li>Bug fixes in <code><del>RestRequest.getRequestParentURI()</del></code> when servlet is mapped to <js>"/*"</js>.
					<li>Bug fixes in <code><del>RestRequest.getServletURI()</del></code> when servlet is mapped to <js>"/*"</js>.
				</ul>
			<li>New string replacement variables:
				<ul>
					<li><code>$R{contextPath}</code> - Returns value from {@link org.apache.juneau.rest.RestRequest#getContextPath()}
					<li><code>$R{methodDescription}</code> - Returns value from {@link org.apache.juneau.rest.RestRequest#getMethodDescription()}
					<li><code>$R{resourceTitle}</code> - Returns value from <code><del>RestRequest.getServletTitle()</del></code>
					<li><code>$R{resourceDescription}</code> - Returns value from <code><del>RestRequest.getServletDescription()</del></code>
					<li><code>$R{trimmedRequestURI}</code> - Returns value from <code><del>RestRequest.getTrimmedRequestURI()</del></code>
					<li><code>$E{var}</code> - Environment variables.
				</ul>
			<li>Added methods <code><del>RestServlet.getDescription(RestRequest)</del></code> and <del><code>RestServlet.getLabel(RestRequest)</code></del>.
			<li>{@link org.apache.juneau.rest.RestServletDefault} and <code><del>RestServletJenaDefault</del></code> now provide default HTML titles
				and descriptions:
				<p class='bcode'>
	<ja>@Property</ja>(name=<jsf>HTMLDOC_title</jsf>, value=<js>"$R{resourceTitle}"</js>),
	<ja>@Property</ja>(name=<jsf>HTMLDOC_description</jsf>, value=<js>"$R{resourceDescription}"</js>)
				</p>
			<li>Options pages on {@link org.apache.juneau.rest.RestServletDefault} and <code><del>RestServletJenaDefault</del></code> now provide default descriptions and back links:
				and descriptions:
				<p class='bcode'>
	<ja>@Property</ja>(name=<jsf>HTMLDOC_navlinks</jsf>, value=<js>"{back:'$R{servletURI}"</js>),
	<ja>@Property</ja>(name=<jsf>HTMLDOC_description</jsf>, value=<js>"Resource options"</js>)
				</p>
			<li>New {@link org.apache.juneau.rest.RestServletGroupDefault} class.
			<li>Removed <code>RestServletProperties.REST_trimTrailingUriSlashes</code> and <code>RestServletProperties.REST_pathInfoBlankForNull</code>. 
			<li>New annotations for providing labels and descriptions.  Useful if you don't plan on having to support other languages, so you don't 
				want to provide labels in resource bundles.
				<ul>
					<li><del><code>RestResource.label()</code></del>
					<li>{@link org.apache.juneau.rest.annotation.RestResource#description() @RestResource.description()}
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#description() @RestMethod.description()}
					<li><del><code>RestMethod#responses()</code></del>
					<li><del><code>Attr.description()</code></del>
					<li><del><code>Content.description()</code></del>
					<li><del><code>HasParam.description()</code></del>
					<li><del><code>HasQParam.description()</code></del>
					<li><del><code>Header.description()</code></del>
					<li><del><code>Param.description()</code></del>
					<li><del><code>QParam.description()</code></del>
				</ul>
			<li>Support for sorting resources by name in {@link org.apache.juneau.rest.labels.ChildResourceDescriptions}.
		</ul>
		
		<h5 class='topic'>Samples</h5>
		<ul class='spaced-list'>
			<li>Added <code>/tempDir/upload</code> showing how to use <code>ServletFileUpload</code> with multipart form posts.
		</ul>
		
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.16"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.16 (June 28, 2015)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.16 is a moderate update.
		</p>
		
		<h5 class='topic'>Core</h5>
		<ul class='spaced-list'>
			<li>New methods on {@link org.apache.juneau.ClassMeta} that eliminates language-specific code in 
				the general class metadata.
				<ul>
					<li><del><code>ClassMeta.getXmlMeta()</code></del>
					<li><del><code>ClassMeta.getJsonMeta()</code></del>
					<li><del><code>ClassMeta.getHtmlMeta()</code></del>
					<li><del><code>ClassMeta.getUrlEncodingMeta()</code></del>
					<li><del><code>ClassMeta.getRdfMeta()</code></del>
				</ul>
			<li>New {@link org.apache.juneau.dto.jsonschema.JsonType#ANY} enum.
			<li>New {@link org.apache.juneau.html.annotation.Html#asPlainText @Html.asPlainText()} annotation.
			<li>New <code><del>HtmlDocSerializerContext.HTMLDOC_cssImports</del></code> property.
			<li>Significant changes to RDF support.
				<ul>
					<li>New {@link org.apache.juneau.jena.annotation.Rdf @Rdf} and {@link org.apache.juneau.jena.annotation.RdfSchema @RdfSchema}
						annotations.  These replace the use of defining namespaced through the XML annotations, and allows XML and RDF to be
						serialized using different namespaces.
					<li>Support for serializing arrays/collections as RDF bags, RDF lists, and multi-valued properties.   
					<li>Fixed warning message about <js>"tab"</js> setting when using the N3/Turtle serializers.
				</ul>
			<li>New <code><del>SerializerContext.SERIALIZER_sortCollections</del></code> and 
				<code><del>SerializerContext.SERIALIZER_sortMaps</del></code> properties.
			<li>FindBug fixes.
		</ul>

		<h5 class='topic'>Server</h5>
		<ul class='spaced-list'>
			<li>New <code><del>RestRequest.getServletParentURI()</del></code> method.
			<li>New <code>$R{servletParentURI}</code> variable.
			<li>Removed final modifier from {@link org.apache.juneau.rest.labels.ChildResourceDescriptions}.
		</ul>
		
		<h5 class='topic'>Samples</h5>
		<ul class='spaced-list'>
			<li>Added source code links to examples.
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.15"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.15 (May 24, 2015)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.15 is a minor update.
		</p>
		
		<h5 class='topic'>Core</h5>
		<ul class='spaced-list'>
			<li>New properties in <code><del>SerializerContext</del></code>:
				<ol>
					<li><code><del>SerializerContext.SERIALIZER_relativeUriBase</del></code>
					<li><code><del>SerializerContext.SERIALIZER_absolutePathUriBase</del></code>
				</ol>
				These replace the <code>SERIALIZER_uriAuthority</code> and <code>SERIALIZER_uriContext</code> properties.
			</li>
			<li>Improvements in {@link org.apache.juneau.csv.CsvSerializer}.
		</ul>
	
		<h5 class='topic'>Server</h5>
		<ul class='spaced-list'>
			<li>New properties in <code>RestServletProperties</code>:
				<ol>
					<li><code>REST_defaultCharset</code>
					<li><code>REST_servletURI</code>
					<li><code>REST_relativeServletURI</code>
				</ol>
			<li>Improvements involving path calculations when servlets deployed outside of a war file with a context root.
		</ul>
		
		<h5 class='topic'>Client</h5>
		<ul class='spaced-list'>
			<li>New methods in {@link org.apache.juneau.rest.client.RestCall}:
				<ol>
					<li><code><del>RestRequest.getHeader(String,Class)</del></code>
					<li><code><del>RestRequest.getHeader(String,Object,Class)</del></code>
					<li><code><del>RestRequest.getHeader(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getQueryParameter(String,Class)</del></code>
					<li><code><del>RestRequest.getQueryParameter(String,Object,Class)</del></code>
					<li><code><del>RestRequest.getQueryParameter(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getQueryParameter(String,Object,Type,Type...)</del></code>
					<li><code><del>RestRequest.getQueryParameters(String,Class)</del></code>
					<li><code><del>RestRequest.getQueryParameters(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getFormDataParameter(String,Class)</del></code>
					<li><code><del>RestRequest.getFormDataParameter(String,Object,Class)</del></code>
					<li><code><del>RestRequest.getFormDataParameters(String,Class)</del></code>
					<li><code><del>RestRequest.getFormDataParameter(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getFormDataParameters(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getPathParameter(String,Class)</del></code>
					<li><code><del>RestRequest.getPathParameter(String,Type,Type...)</del></code>
					<li><code><del>RestRequest.getBody(Class)</del></code>
					<li><code><del>RestRequest.getBody(Type,Type...)</del></code>
				</ol>
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.1.0.14"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.14 (May 10, 2015)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.14 is a moderate update.
		</p>
		<p>
			The major addition is support for {@link org.apache.juneau.rest.remoteable Remoteable Services}, the ability
				to invoke server-side POJO methods through client-side proxy interfaces.
		</p>
		
		<h5 class='topic'>Core</h5>		
		<ul class='spaced-list'>
			<li>Simplified {@link org.apache.juneau.utils.PojoIntrospector} class.
			<li>New {@link org.apache.juneau.internal.ClassUtils#getMethodSignature(Method)} method.
		</ul>
		
		<h5 class='topic'>Client</h5>		
		<ul class='spaced-list'>
			<li>New methods in {@link org.apache.juneau.rest.client.RestClient} for working with remoteable services:
			<ul>
				<li><code><del>RestClient.setRemoteableServletUri(String)</del></code>
				<li>{@link org.apache.juneau.rest.client.RestClient#getRemoteableProxy(Class)}
			</ul>
		</ul>

		<h5 class='topic'>Server</h5>		
		<ul class='spaced-list'>
			<li>Added a default OPTIONS page to {@link org.apache.juneau.rest.RestServletDefault} and <code><del>RestServletJenaDefault</del></code>.
			<li><code>RestServletProperties.REST_allowMethodParam</code> has been enhanced to allow you to
				explicitly specify which HTTP methods can be used in the <code>&amp;method</code> parameter.
			<li>New methods added to {@link org.apache.juneau.rest.RestRequest}:
			<ul>
				<li><code><del>RestRequest.getParser()</del></code>
				<li><code><del>RestRequest.getReaderParser()</del></code>
			</ul>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.1.0.13"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.13 (Apr 24, 2015)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.13 is a minor update.
		</p>

		<h5 class='topic'>Core</h5>		
		<ul class='spaced-list'>
			<li>{@link org.apache.juneau.ClassMeta#newInstance()} method can now create new instances of arrays.
			<li>Arguments passed to <code><del>Link</del></code> are now serialized using {@link org.apache.juneau.urlencoding.UrlEncodingSerializer}, so arbitrary POJOs can now be passed as arguments.
			<li>New date filters:  <code>org.apache.juneau.transforms.Datefilter.ISO8601DTZP</code> and <code>org.apache.juneau.transforms.Datefilter.SimpleP</code>.
			<li>New <code><del>HtmlDocSerializerContext.HTMLDOC_nowrap</del></code> setting for {@link org.apache.juneau.html.HtmlDocSerializer} class.  
				Adds <js>"* {white-space:nowrap}"</js> to the style header to prevent word wrapping.
			<li>Fixed bug in {@link org.apache.juneau.uon.UonParser} where passing in a blank value on an array or collection type in a form post would cause a <code>ClassCastException</code>.  
				New behavior creates an empty array or <code>Collection</code>.
			<li>Improved implementation of <del><code>UrlEncodingSerializer.serializeUrlPart(Object)</code></del> method.
		</ul>

		<h5 class='topic'>Server</h5>		
		<ul class='spaced-list'>
			<li>{@link org.apache.juneau.rest.RestConverter} API fixed to handle the existence of POJO filters.
				{@link org.apache.juneau.rest.converters.Introspectable}/{@link org.apache.juneau.rest.converters.Queryable}/{@link org.apache.juneau.rest.converters.Traversable} classes can now work with filtered POJOs.  
			<li>{@link org.apache.juneau.rest.annotation.RestResource#messages() @RestResource.messages()} annotation can now be defined on super and subclasses so that NLS messages can be defined in multiple resource bundles.
			<li>Performance improvements in <code>RestServletNls</code> class. 
			<li>Fixed bug where two REST java methods mapped to the same path pattern wasn't triggering an exception when it was supposed to.
		</ul>
		
		<h5 class='topic'>Client</h5>		
		<ul class='spaced-list'>	
			<li>New <code><del>RestCall.setRedirectMaxAttempts(int)</del></code> method to prevent endless redirection loops.
			<li>New <code><del>RestCall#setRetryable(int,long,RetryOn)</del></code> method to automatically retry on failed connection attempts.
			<li>New <code>RestCallInterceptor.onRetry(RestCall,int,HttpRequest,HttpResponse)</code> method for listening in on retry attempts.		
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.12"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.12 (Mar 28, 2015)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.12 is a minor update.
		</p>

		<h5 class='topic'>Core</h5>		
		<ul class='spaced-list'>
			<li>Fixed <code><del>ConfigFile.isEmpty()</del></code> method.
			<li>Changed behavior on {@link org.apache.juneau.uon.UonParser} to not treat <js>'~'</js> characters as escapes
				unless followed by one of the following characters:  <code>( ) , $ = ~</code>.
		</ul>

		<h5 class='topic'>Client</h5>		
		<ul class='spaced-list'>
			<li>New class {@link org.apache.juneau.rest.client.RestCallInterceptor}.  
				Allows responses to be inspected and modified before being processed.  
				Replaces <code>RestClientListener</code> class.
			<li>Minor connection cleanup fixes.
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.11"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.11 (Feb 14, 2015)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.11 is a moderate update.
		</p>

		<h5 class='topic'>Core</h5>		
		<ul class='spaced-list'>
			<li>Additions to {@link org.apache.juneau.html.annotation.Html @Html} bean annotation.
				<ul>
					<li>New {@link org.apache.juneau.html.annotation.Html#noTables() @Html.noTables()} annotation that prevents
						arrays/Collections from being serialized as tables.
					<li>New {@link org.apache.juneau.html.annotation.Html#noTableHeaders() @Html.noTableHeaders()} annotation that prevents
						HTML tables from having header rows.
				</ul>
			</li>
			<li>Several improvements to URL-Encoding support.
				<ul>
					<li>Improved whitespace handling in {@link org.apache.juneau.uon.UonParser}.
					<li>New <code><del>UonParserContext.UON_whitespaceAware</del></code> property for controlling whether whitespace is ignored.
					<li>New <code><del>UrlEncodingContext.URLENC_expandedParams</del></code> property for controlling whether arrays/Collections 
						should be serialized/parsed as multi-part parameters.
					<li>New {@link org.apache.juneau.urlencoding.annotation.UrlEncoding#expandedParams() @UrlEncoding.expandedParams()}
						annotation that specifies that bean properties of type array/Collection be serialized as multi-part parameters (e.g. <code>&amp;key=val1&amp;key=val2</code>).
				</ul>
			</li>
			<li>New <code><del>JsonSerializerContext.JSON_escapeSolidus</del></code> property for controlling whether slash characters should be escaped.
			<li>New {@link org.apache.juneau.internal.TeeOutputStream} and {@link org.apache.juneau.internal.TeeWriter} classes.
			<li>New {@link org.apache.juneau.ClassMeta#isInstance(Object)} method.
			<li>Performance improvements when using the {@link org.apache.juneau.BeanMap#add(String,Object)} method.  
				Array properties are stored in a temporary list cache until {@link org.apache.juneau.BeanMap#getBean()} is called.
			<li>New <code><del>BeanPropertyMeta.add(BeanMap,Object)</del></code> method for adding values to Collection and array properties.
			<li>Config INI files now support keys with name <js>"*"</js>.
		</ul>

		<h5 class='topic'>Server</h5>		
		<ul class='spaced-list'>
			<li>REST method parameters can now be generic types (e.g. <del><ja>@Param</ja>(<js>"foo"</js>) Map&lt;String,Integer&gt; foo</del>).
				This applies to headers, attributes, and parameters.
			<li>New <del><code>@Param.multipart()</code></del>
				and <del><code>@Query.multipart()</code></del> annotations
				for handling multi-part GET and POST parameters.	
			<li>GET parameters are now CASE-SENSITIVE per W3C standards.
				<ul>
					<li>
					<li><code>&amp;Content</code> must now be specified as <code>&amp;content</code>.
					<li><code>&amp;Method</code> must now be specified as <code>&amp;method</code>.
					<li><code>&amp;debug</code> must now be specified as <code>&amp;debug=true</code>.
					<li><code>&amp;plainText</code> must now be specified as <code>&amp;plainText=true</code>.
					<li><code>&amp;notrace</code> must now be specified as <code>&amp;noTrace=true</code>.
				</ul>
			</li>
			<li>Performance improvements around query parameters.
			<li>New methods on {@link org.apache.juneau.rest.RestRequest} for handling multi-part parameters:
				<ul>
					<li><del><code>RestRequest.getParameters(String,Class)</code></del>
					<li><code><del>RestRequest#getQueryParameters(String,Class)</del></code>
				</ul>
			</li>
			<li>Fixed Jetty issue in {@link org.apache.juneau.rest.RestResponse#setHeader(String,String)} where setting 
				the <code>Content-Type</code> through this method was inconsistent with the behavior in WAS/Tomcat.
			<li><code>&amp;noTrace=true</code> now prevents any errors from being logged in log file.
			<li>Workaround for Jetty issue where <code>ServletContext.getContextPath()</code> always ends with <js>"null"</js>.
			<li><code>RestServletProperties.REST_allowMethodParam</code> is now <jk>true</jk> by default on all subclasses 
				of {@link org.apache.juneau.rest.RestServletDefault} and <code><del>RestServletJenaDefault</del></code>.
		</ul>
				
		<h5 class='topic'>Client</h5>		
		<ul class='spaced-list'>
			<li>New method {@link org.apache.juneau.rest.client.RestCall#allowRedirectsOnPosts(boolean)}.
			<li>New method <code>RestCall.peekInputStream()</code> allows you to read response bodies without interrupting execution flow.
			<li>New method {@link org.apache.juneau.rest.client.RestCall#toString()} now useful for debugging purposes.  
				Shows all request/response headers and bodies.
			<li>{@link org.apache.juneau.rest.client.RestCallException} now includes <code>HttpResponse</code> object for easier debugging.
			<li>New method <code>RestClient.addListener(RestClientListener)</code> for registering request/response listeners.
			<li>New <code><del>RestClient.setClassLoader(ClassLoader)</del></code> method.
			<li>TLS support in <code>JazzRestClient</code>.
		</ul>

		<h5 class='topic'>Other changes</h5>	
		<ul class='spaced-list'>
			<li><code>samples.ear</code> and <code>samples.war</code> projects
				have been replaced with an OSGi bundle with activated servlets in <code>juno.samples</code>.
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.10"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.10 (Dec 23, 2014)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.10 is a moderate update.
		</p>

		<h5 class='topic'>Core</h5>		
		<ul class='spaced-list'>
			<li>Major changes to URL-Encoded serializer and parser.
				<ul>
					<li>Logic for serializing and parsing URL-Encoded key-value pairs moved to {@link org.apache.juneau.urlencoding.UrlEncodingSerializer} and {@link org.apache.juneau.urlencoding.UrlEncodingParser} classes.
					<li>Logic for serializing and parsing URL-Encoded values moved to new {@link org.apache.juneau.uon.UonSerializer} and {@link org.apache.juneau.uon.UonParser} classes.
				</ul>
			</li>
			<li>Fix bug where <code>BeanRuntimeExceptions</code> weren't being thrown on subsequent calls to {@link org.apache.juneau.BeanContext#getClassMeta(Class)}.
			<li>Moved logic for <code>BeanContext.getPrimitiveDefault(Class)</code> to new {@link org.apache.juneau.ClassMeta#getPrimitiveDefault()} method for performance reasons.
			<li>Fixed bug in <del><code>BeanContext.addTransforms(Class[])</code></del> that would cause filter order to get messed up.
			<li>{@link org.apache.juneau.ClassMeta#newInstance()} can now create array instances.
			<li>Fixed indentation bugs in {@link org.apache.juneau.html.HtmlSerializer}.
			<li>Fixed issue in {@link org.apache.juneau.html.HtmlSerializer} where newlines were not being converted into line breaks.
			<li>New {@link org.apache.juneau.serializer.WriterSerializer#toString(Object)} method that's identical to the serialize method but throws <code>RuntimeExceptions</code> to make the serializer easier to use for debugging.
		</ul>

		<h5 class='topic'>Server</h5>		
		<ul class='spaced-list'>
			<li>Fixed major issue that prevented parsing URL-Encoded form posts into POJOs.
				Calling <del><code>HttpServlet.getParameter(String)</code></del> was forcing the underlying servlet code to process the HTTP body itself, preventing the <code>UrlEncodingSerializer</code>
				class from being able to parse the content.  Updated code no longer inadvertantly calls this method.
			<li>New <code><del>RestRequest.getQueryParameter(String)</del></code>, <code><del>RestRequest.hasQueryParameter(String)</del></code>, and <code><del>RestRequest.hasAnyQueryParameters(String[])</del></code>
				methods that only look for parameters in the URL query string to prevent loading and parsing of URL-Encoded form posts.
			<li>New <del><code>@QParam</code></del> and <del><code>@HasQParam</code></del> annotations for accessing query parameters from the URL query string.
			<li><code>&amp;plainText</code> parameter can now specify a false value.
			<li>Removed properties parameters from <code><del>RestServlet.onPreCall(RestRequest)</del></code> and <code><del>RestServlet#onPostCall(RestRequest,RestResponse)</del></code> methods
				since the properties are already accessible through <code>RestRequest.getProperties()</code>.
			<li>Added {@link org.apache.juneau.uon.UonSerializer} and {@link org.apache.juneau.uon.UonParser} to serializer and parser lists on 
				{@link org.apache.juneau.rest.RestServletDefault} and <code><del>RestServletJenaDefault</del></code>.
		</ul>
		
		<h5 class='topic'>Client</h5>		
		<ul class='spaced-list'>
			<li>Moved to Apache HttpClient 4.3 to match Jazz 6.0.
			<li>Renamed <code>RestResponseEntity</code> to {@link org.apache.juneau.rest.client.RestRequestEntity}.
			<li>Improved performance on URL-Encoded form posts by serializing directly to output stream instead of serialized to string first.
			<li>New methods on {@link org.apache.juneau.rest.client.RestClient} class that makes it easier to associate serializer and parser attributes with registered serializer and parser:
				<ul>
					<li><code><del>RestClient#setProperty(String,Object)</del></code>			
					<li><code><del>RestClient#setProperties(ObjectMap)</del></code>	
					<li><code><del>RestClient#addNotBeanClasses(Class[])</del></code>		
					<li><del><code>RestClient.addTransforms(Class[])</code></del>		
					<li><code><del>RestClient#addImplClass(Class,Class)</del></code>	
				</ul>
			<li>Renamed <code>RestClient.shutdown()</code> to {@link org.apache.juneau.rest.client.RestClient#close()} to mirror change in Apache API.		
		</ul>

		<h5 class='topic'>Samples</h5>		
		<ul class='spaced-list'>
			<li>New <code>CodeFormatterResource</code> for quickly formatting Java and XML code samples in Javadocs.
			<li>New <code>UrlEncodedFormResource</code> for showing how to work with URL-Encoded form posts.
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.9"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.9 (Dec 1, 2014)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.9 is a major update.
			There weren't very many code changes, but the source has been made a part of Jazz Foundation.
			This required some restructuring of the project.
			The project on Jazz Hub will eventually be discontinued.
			However, the libraries on IBM Community Source will continue to be updated regularly.
		</p>
		<ul class='spaced-list'>
			<li>Project split up into 3 separate bundles:
				<ul>
					<li><code>org.apache.juneau</code> - Core serializers and parsers.
					<li><code>org.apache.juneau.rest</code> - REST server component.
					<li><code>org.apache.juneau.rest.client</code> - REST client component.
				</ul>
			<li>Code changes to facilitate breaking up bundles:
				<ul>
					<li><code>org.apache.juneau.rest.labels.Link</code> class moved to <code><del>Link</del></code>.
					<li>References to <code>org.apache.juneau.rest.RestException</code> in {@link org.apache.juneau.encoders.Encoder} class changed to <code>IOException</code>.
				</ul>
			<li>Changed configuration names for consistency with Jazz Framework.
			<li>New {@link org.apache.juneau.rest.client.RestClient#execute(HttpUriRequest)} method that allows subclasses to handle their own HTTP request execution.
			<li>Changes in <code>JazzRestClient</code> to handle introduction of SSO support in v6.
			<li><code>&amp;plainText</code> debug feature was broken.
			<li>Removed double-buffering in <code>RestRequest</code>.
			<li>Metadata cleanup, Find Bug fixes.
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.1.0.8"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.8 (Oct 25, 2014)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.8 is a moderate update, focused primarily on performance improvements.
		</p>
		<ul class='spaced-list'>
			<li>Improved performance on JSON and URL-Encoding parsers by approximately 50% on large data sets. 
				<ul>
					<li>Rewrote {@link org.apache.juneau.parser.ParserReader} class to handle it's own buffering.
						The change allowed several optimizations to be made when dealing with JSON and URL-Encoding
						text by avoiding char array copies.  
					<li>Added a <code>estimatedSize</code> parameter to the {@link org.apache.juneau.parser.Parser} parse methods to 
						optimize buffering when the input size is known beforehand.
				</ul>
			</li>
			<li>Revamped the {@link org.apache.juneau.BeanContext} API to perform better in multi-threaded environments.
				<ul>
					<li>Introduced a new <code>BeanPropertyStore</code> class that handles creation of {@link org.apache.juneau.BeanContext} objects.
						This allows <code>BeanContext</code> objects to be considered immutable, and therefore cacheable/reusable by the framework.
						While this was technically possible to cache these objects beforehand, it relied on a locking mechanism to prevent bean contexts
							from being modified after being created.  The new mechanism is much more straightforward.
				</ul>
			</li>
			<li>Modifications to the <del>org.apache.juneau.rest.client</del> APIs to make it easier to work with custom Apache HTTP clients.
				<ul>
					<li>Added overridable <code><del>RestClient#createHttpClient()</del></code> to allow customized subclasses to construct customized HTTP clients.
					<li>Removed the <code>DefaultRestClient</code> class since it's now fully redundant with <code>RestClient</code>.
					<li>Added <code>RestClient.shutdown()</code> method for cleaning up the internal HTTP client when you're done using a REST client.
				</ul>
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.1.0.7"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.7 (Oct 5, 2014)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.7 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>Improved error handling.  
			<li>New <code><del>ParserContext.PARSER_debug</del></code> and <code><del>SerializerContext.SERIALIZER_debug</del></code>.
				settings for logging additional information for debugging problems.
			<li>New {@link org.apache.juneau.serializer.Serializer#SERIALIZER_ignoreRecursions} setting for explicitely ignoring recursions when 
				serializing models.  Previously, the <jsf>SERIALIZER_detectRecursions</jsf> setting did this, but now it simply looks for recursions 
				and throws exceptions when they occur.
			<li>Improved handling of <code>StackOverflowErrors</code>.  When <jsf>SERIALIZER_detectRecursions</jsf> is enabled, a useful error message
				is displayed showing the exact chain of objects that resulted in the stack overflow.
			<li>Bug fixes in {@link org.apache.juneau.dto.ResultSetList} for Oracle and SQL Server.
			<li>Serializers and parsers can now access HTTP request attributes, parameters, and headers through <code>SerializerContext.getProperties()</code> and
				<code>ParserContext.getProperties()</code>.		
			<li>Removed media-type and encoding attributes from <code><del>SerializerContext</del></code> and <code><del>ParserContext</del></code>	
				since these are now available through context properties, and are typically not used.
			<li>{@link org.apache.juneau.xml.XmlParser} now accepts <code>application/xml</code>.		
			<li>Improved handling of bean property serialization when multiple matching pojo filters for the bean property class exist.
			<li>Improved concurrency on BeanContext class.
			<li>Fixed bug in {@link org.apache.juneau.rest.converters.Traversable} that was causing it to be executed even if the servlet extra path info was empty.
			<li>Fixed bug in {@link org.apache.juneau.rest.converters.Traversable} where it was not picking up filters and properties defined on REST Java methods. 
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.1.0.6"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.6 (Sept 21, 2014)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.6 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>Simplified API for {@link org.apache.juneau.transform.PojoSwap}.  
				Since it's rarely used, the <code>beanContext</code> parameter was replaced with a <del><code>PojoSwap#getBeanContext()</code></del> method on
				the class.
			<li>New simplified way of defining POJO filters without needing to extend {@link org.apache.juneau.transform.PojoSwap}.
				See {@link org.apache.juneau.transform.SurrogateSwap} for details.
			<li>New {@link org.apache.juneau.html.annotation.Html @Html} annotation.
				Will allow the definition of standard XHTML DTOs in future releases.  
				For now, <del><code>Img</code></del> is an example of defining an XHTML element using Juno DTOs.
			<li>{@link org.apache.juneau.json.JsonParser} now ignores trailing <code>';'</code> characters in input so that it can 
				parse strings of the form <js>"var x = {'foo':'bar'};"</js>.
			<li>New <code>TumblrParserResource</code> in the samples war file showing how to combine the REST client and server APIs into a single
				resource in order to download Tumblr blogs and convert the response into any supported response content type.
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.5"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.5 (Sept 1, 2014)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.5 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>New {@link org.apache.juneau.rest.Redirect} class that simplifies performing redirections in REST methods.
			<li>New pluggable {@link org.apache.juneau.rest.ResponseHandler} class and {@link org.apache.juneau.rest.annotation.RestResource#responseHandlers() @RestResource.responseHandlers()} annotation
				for defining customer response handlers for special kinds of POJOs.
			<li>New method <del><code>UrlEncodingSerializer.serializeUrlPart(Object)</code></del> method.
			<li>New method <code><del>RestRequest.getServletURIBuilder()</del></code> for construcing servlet-based URLs more efficiently.
			<li>New method {@link org.apache.juneau.rest.RestResponse#getNegotiatedOutputStream()} that uses encoders if a match is found, 
				and {@link org.apache.juneau.rest.RestResponse#getOutputStream()} that just return the underlying output stream without any modifications.
			<li>Fixed bug where some properties were not being propagated correctly when using <code><del>CoreObject.setProperties(ObjectMap)</del></code>
				on serializer and parser subclasses.
			<li>Fixed bug in {@link org.apache.juneau.html.HtmlSerializer} where URL keys in Maps were not being serialized as hyperlinks.
			<li>Fixed bug in {@link org.apache.juneau.json.JsonSerializer} where <js>"_class"</js> and <js>"items"</js> attributes were not quoted in strict mode when using SERIALIZER_addClassAttrs feature.	
			<li>Fixed bug where <code>Content-Encoding</code> and<code>Character-Encoding</code> headers were being set when calling {@link org.apache.juneau.rest.RestResponse#getOutputStream()}.
				These should not be set if interacting with the output streams at a low level.
			<li>Eliminated various convenience <code>RestResponse.sendRedirect(...)</code> methods due to the introduction of the {@link org.apache.juneau.rest.Redirect} class.
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.4"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.4 (Aug 25, 2014)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.4 is a minor update.
		</p>
		
		<ul class='spaced-list'>
			<li>New <code><del>RestServlet.getPath()</del></code> method.
			<li>New <code>SerializerContext.getJavaMethod()</code> and <code>ParserContext.getJavaMethod()</code>
					to allow access to REST methods that invoked the serializers or parsers.
				For example, can be used to access additional annotations on REST methods to perform special handing
					during serialization or parsing.
			<li>Better behavior on overriding of filters in <code>BeanContext.addTransforms(Class[])</code>.
				Previously, adding multiple conflicting filters resulted in random behavior.  
				Now filters are overridden when multiple matching filters are applied.
			<li>Allow <code><del>HtmlDocSerializerContext</del></code> properties to be set via <code><del>Serializer.setProperty(String,Object)</del></code>.
				Previously, these could only be defined through override properties (e.g. through REST class and method annotations).
			<li>Fixed memory leak in XML parser.	
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.3"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.3 (Jun 28, 2014)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.3 is a moderate update.
		</p>
		
		<h5 class='topic'>Core API updates</h5>
		<ul class='spaced-list'>
			<li>Ability to detect and use non-public bean classes, getters/setters, and fields using the following new properties:
				<ul>
					<li>{@link org.apache.juneau.BeanContext#BEAN_beanConstructorVisibility} - Control which bean constructors are visible to Juno.
					<li>{@link org.apache.juneau.BeanContext#BEAN_beanClassVisibility} - Control which bean classes are interpreted as beans to Juno.
					<li>{@link org.apache.juneau.BeanContext#BEAN_beanFieldVisibility} - Control which fields are visible to Juno as bean properties.
					<li>{@link org.apache.juneau.BeanContext#BEAN_beanMethodVisibility} - Control which getters/setters are visible to Juno as bean properties.
				</ul>
				Removed <code>BeanContext.<jsf>INCLUDE_BEAN_FIELD_PROPERTIES</jsf></code> and <code>BeanContext.<jsf>INCLUDE_BEAN_METHOD_PROPERTIES</jsf></code> properties, since ignoring fields and methods
				can be accomplished by setting the appropriate properties above to {@link org.apache.juneau.Visibility#NONE NONE}.
				Also, the {@link org.apache.juneau.annotation.BeanProperty @BeanProperty} annotation can now be used on non-public fields/getters/setters to override
				the default behavior defined by the <code>VISIBILITY</code> properties identified above.  This is a convenient way of identifying protected or
				private fields or methods as bean properties.  Previously, you could only identify public fields/getters/setters using this annotation.
			</li>
			<li>New {@link org.apache.juneau.BeanContext#BEAN_useJavaBeanIntrospector} property that lets Juno use the Java bean <code>Introspector</code>
				class to determine bean properties.  In the previous release, the method for determining bean properties was a mixture of Juno-based and Introspector-based.
				Now it's either pure Juno-based or pure Introspector-based.  The result is considerably cleaner code and consistent behavior.
			<li>New {@link org.apache.juneau.annotation.BeanIgnore @BeanIgnore} annotation.  Replaces the previous <code><ja>@BeanProperty</ja>(hidden=<jk>true</jk>)</code> annotation
				for ignoring bean properties.  Can also be used on classes that look like beans so that they're not treated as beans.
			<li>Support for parsing into non-static member classes.  This applies to all parsers.
			<li>New {@link org.apache.juneau.json.annotation.Json#wrapperAttr() @Json.wrapperAttr()}	annotation that automatically wraps beans and objects in a wrapper
				attribute when serializing to or parsing from JSON.
			<li>Changed the default ordering of bean properties to be in parent-to-child class order.
			<li>New {@link org.apache.juneau.transform.BeanFilter#readProperty(Object,String,Object) readProperty()} and {@link org.apache.juneau.transform.BeanFilter#writeProperty(Object,String,Object) writeProperty()}
				methods added to {@link org.apache.juneau.transform.BeanFilter} class to allow individualized serialization and parsing behavior on a class-by-class basis.
			<li>Eliminated previous restriction where bean subtype attributes had to be listed first in JSON objects when using the <code><del>Bean.subTypeProperty()</del></code> annotation.
				The previous behavior was not strictly JSON-compliant since JSON objects are supposed to consist of unordered lists of key/value pairs.
				While targeted for JSON, the restriction is also lifted for all other parsers.  	
			<li>New fluent-style {@link org.apache.juneau.BeanMap#load(String) BeanMap.load()} methods for initializing bean maps.
			<li>{@link org.apache.juneau.html.HtmlDocSerializer} will now embed the data portion of the output in a <code><xt>&lt;div</xt> <xa>id</xa>=<xs>'data'</xs><xt>&gt;</xt></code> element to make it easier to extract the data portion of the page in Javascript in browsers.
		</ul>

		<h5 class='topic'>REST Server API updates</h5>
		<ul class='spaced-list'>
			<li>New {@link org.apache.juneau.rest.RestRequest#getJavaMethod()} method for getting access to the method used to handle a request.
				Useful for accessing the method name or annotations during requests, such as in calls to {@link org.apache.juneau.rest.RestGuard#guard(RestRequest,RestResponse)}.
			<li>Fixed bug when using Jetty where you tried to read text input after a header was written.
			<li>Added new string variables <del><code>$A{...}</code></del> (request attributes) and <del><code>$P{...}</code></del> (request parameters) to <code>RestServlet.createRequestVarResolver(RestRequest)</code>.
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.2"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.2 (Apr 27, 2014)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.2 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>Fixed issue preventing <code>&amp;Accept-Language</code> from being used as a GET parameter.  
			<li>Minor XSS vulnerability fix.
			<li>Empty results on HTML pages now shows <js>"no results"</js> instead of a blank page.
			<li>Fixed issues preventing REST pages from rendering HTML in newer versions of Internet Explorer.
			<li>Changed <code>RestServletProperties.REST_allowMethodParam</code> to be disabled by default.  
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.1"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.1 (Jan 25, 2014)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.1 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>Addressed some behavioral differences between Tomcat and WAS.  
			<ul>
				<li>Query parameter lookup is now always case-insensitive (per WAS behavior).
				<li>Consistent handling of redirect requests (Tomcat and WAS handle relative redirect paths differently).
			</ul>
			<li>Fixed bug involving incorrect resolution of overlapping URL match patterns.
			<li>Overall improvements in HTTP request parameter and header value resolution.  
			<li>Made workspace changes so as not to be dependent on the WAS test environment being loaded.
			<li>Renamed <ja>@Remainder</ja> annotation to {@link org.apache.juneau.rest.annotation.PathRemainder @PathRemainder}.
			<li>Fixed bug involving incorrect calculation of <code>pathInfo</code> on child resources.
		</ul>	
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.1.0.0"></a>
	<h3 class='topic' onclick='toggle(this)'>5.1.0.0 (Jan 18, 2014)</h3>
	<div class='topic'>
		<p>
			Juno 5.1.0.0 is a major update.
		</p>
		<h5 class='topic'>Major changes</h5>
		<ul class='spaced-list'>
			<li>Brand new REST client API that uses Apache HttpClient for HTTP communication.<br>
				The new client API is simply a thin layer on top of <code>HttpClient</code> that performs 
				serialization and parsing using Juno parsers, but leaves all the details of the HTTP connection
				to the Apache code. <br>
				See the <del>org.apache.juneau.rest.client</del> package for details.
			<li>New <code>org.apache.juneau.rest.client.jazz</code> package and <code>org.apache.juneau.rest.client.jazz.JazzRestClient</code> class
				for performing REST operations against Jazz servers.<br>
				Includes improved support for FORM authentication, and better SSL certificate validation.
			<li>Completely redesigned URL-Encoding support.<br>
				See <a class='doclink' href='org/apache/juneau/urlencoding/package-summary.html#TOC'>org.apache.juneau.urlencoding</a> package for details. 
			<li>Changes to Parser API.
			<ul>
				<li>Removal of <code>ExtendedReaderParser</code> abstract class and moved methods into 
					{@link org.apache.juneau.parser.ReaderParser} class.  
				<li>Removal of <code>DataFormat</code> class from API since it was no longer necessary
					due to API change above.
				<li>Removal of <code>ParserStringReader</code> class.<br>
					This was a reader optimized to work with <code>String</code> input.<br>
					However, it could interfere with garbage collection of the original string object.<br>
					Instead, the existing {@link org.apache.juneau.parser.ParserReader} was enhanced to work
					well with <code>String</code> input, and tests show no significant performance differences.
				<li>New <code>org.apache.juneau.parser.Parser.parse(Object,int,ClassMeta)</code> convenience method added.
			</ul>
		</ul>	
		<h5 class='topic'>Other changes</h5>
		<ul class='spaced-list'>
			<li>Various new methods added to {@link org.apache.juneau.internal.StringUtils} and {@link org.apache.juneau.internal.ClassUtils}.
			<li>Improved support on <code><del>BeanContext.getClassMetaFromString(String)</del></code>.<br>
				Now supports resolving <code>"long[]"</code>, and so forth.
			<li>{@link org.apache.juneau.rest.labels.ResourceDescription} name parameter is now automatically URL-encoded in links.
			<li>{@link org.apache.juneau.rest.RestRequest} now correctly handles cases involving URL-encoded characters in the 
				path info portion of URLs (e.g. <code>http://host/contextRoot/foo%2Fbar</code>).
			<li>Removed lazy-initialization that required locking in {@link org.apache.juneau.ClassMeta}.  
			<li>New <code>BeanContext.setDefaultParser(ReaderParser)</code> method added for specifying 
				a default parser to use in a bean context (used when converting beans to <code>Strings</code> using 
				<code><del>BeanContext.convertToType(Object,Class)</del></code>.
				Old behavior simply used the default JSON serializer in these cases.
			<li>More consistent handling of exceptions across all parsers.
			<li>Minor changes to {@link org.apache.juneau.rest.RestRequest} class.
			<ul>
				<li>Changed the order of parameters on <del><code>RestRequest#getParameter(String,Class)</code></del>.
				<li>Added <code>RestRequest.getMapParameter(String,Class,Class,Class)</code> and 
					<code>RestRequest.getCollectionParameter(String,Class,Class)}</code> methods.
			</ul>
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.36"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.36 (Dec 18, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.36 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>Implemented <code>org.apache.juneau.urlencoding.UrlEncodingParser.parseArgs(Reader,int,ClassMeta[])</code>.
			<li><code>name</code> parameter of <code><del>ResourceDescription#ResourceDescription(String,String,String)</del></code>. 
				is now automatically URL-encoded so that the name can contain special characters (e.g. <js>"foo/bar(baz)"</js>).
			<li>Support for URL-matching and path info containing encoded characters (e.g. <js>'/'</js>) now supported.	
			<li>Removed some lazy-initialization of bean information in {@link org.apache.juneau.ClassMeta} that allowed the removal of
				some synchronized blocks.
			<li>Improved support of <code><del>BeanContext.getClassMetaFromString(String)</del></code>.
				Now supports primitive arrays such as <js>"long[]"</js> in addition to the previous support for the equivalent <js>"[J"</js>.
			<li>Various new convenience methods added to {@link org.apache.juneau.internal.StringUtils} and {@link org.apache.juneau.internal.ClassUtils}.
		</ul>	
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.35"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.35 (Nov 26, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.35 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>{@link org.apache.juneau.rest.RestGuard#guard(RestRequest,RestResponse)} now returns a boolean to allow redirects to login pages.
			<li>Fixed bug in RestServlet where occasional false positive "duplicate method with same name and path" errors were occurring.
		</ul>	
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.34"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.34 (Nov 10, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.34 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>
				New support for runtime-replaced variables in REST resource properties:
				<p class='bcode'>
	<ja>@RestResource</ja>(
		messages=<js>"nls/Messages"</js>,
		properties={
			<ja>@Property</ja>(name=<js>"label"</js>,value=<js>"$L{servletTitle}"</js>),  <jc>// Localized variable in Messages.properties</jc>
			<ja>@Property</ja>(name=<js>"javaVendor"</js>,value=<js>"$S{java.vendor}"</js>),  <jc>// System property</jc>
			<ja>@Property</ja>(name=<js>"foo"</js>,value=<js>"bar"</js>),
			<ja>@Property</ja>(name=<js>"bar"</js>,value=<js>"baz"</js>),
			<ja>@Property</ja>(name=<js>"v1"</js>,value=<js>"$R{foo}"</js>),  <jc>// Request variable. value="bar"</jc>
			<ja>@Property</ja>(name=<js>"v2"</js>,value=<js>"$R{$R{foo}}"</js>)  <jc>// Nested request variable. value="baz"</jc>
		}
	)
				</p>
				See <code>RestServlet.createRequestVarResolver(RestRequest)</code> for more information.
			</li>
			<li>
				 Eliminated <ja>@Property.type</ja> annotation which was the old way of specifying NLS variables that got resolved at runtime.
			</li> 
			<li>
				New methods on {@link org.apache.juneau.rest.RestRequest}:
				<ul>
					<li><del><code>RestRequest.getVarResolver()</code></del></li>
					<li><code><del>RestRequest.getServletURI()</del></code></li>
					<li><code><del>RestRequest.getRequestParentURI()</del></code></li>
				</ul>
			</li>
			<li>
				New methods on {@link org.apache.juneau.rest.RestResponse}:
				<ul>
					<li><code>RestResponse.sendRedirect(CharSequence)</code>
				</ul>
			</li>
			<li>
				New methods on {@link org.apache.juneau.rest.RestServlet} that allow easier customization by subclasses:
				<ul>
					<li><code><del>RestServlet.createConfigFactory()</del></code></li>
					<li><code><del>RestServlet.createConverters()</del></code></li>
					<li><code><del>RestServlet.createDefaultRequestHeaders()</del></code></li>
					<li><code><del>RestServlet.createDefaultResponseHeaders()</del></code></li>
					<li><code><del>RestServlet.createEncoders()</del></code></li>
					<li><code><del>RestServlet.createFilters()</del></code></li>
					<li><code><del>RestServlet.createGuards()</del></code></li>
					<li><code><del>RestServlet.createMimetypesFileTypeMap()</del></code></li>
					<li><code><del>RestServlet.createParsers()</del></code></li>
					<li><code><del>RestServlet.createProperties()</del></code></li>
					<li><code><del>RestServlet.createRequestProperties(ObjectMap,RestRequest)</del></code></li>
					<li><code><del>RestServlet.createRequestVarResolver(RestRequest)</del></code></li>
					<li><code><del>RestServlet.createSerializers()</del></code></li>
					<li><code><del>RestServlet.createUrlEncodingParser()</del></code></li>
				</ul>
			</li>
			<li>
				Changed <code>RestServletNls</code> to use <code>ResourceDescription/MethodDescription</code>
					instead of <code>RestResource/RestMethod</code>
			</li>
			<li>
				New property <code>RestServletProperties.REST_htDocsFolder</code>.<br>
				New support for serving up static documents from classpath through REST interface.
			</li>
			<li>
				Exception APIs now use {@link java.text.MessageFormat} (e.g. <js>"{0}"</js>) for message variables instead of <js>"%s"</js>.
			</li>
			<li>
				New {@link org.apache.juneau.annotation.Bean#stopClass @Bean.stopClass} annotation for specifying stop classes for bean properties.
			</li>
			<li>
				New <del><code>BeanFilter.setStopClass(Class)</code></del> which is the program equivalent to the annotation above.
			</li>
			<li>
				New methods on {@link org.apache.juneau.dto.ResultSetList}:
				<ul>
					<li><code>ResultSetList.handleBlob(Blob)</code></li>
					<li><code>ResultSetList.handleClob(Clob)</code></li>
				</ul>
		</ul>	
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.33"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.33 (Oct 20, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.33 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>
				Removed generic parameter from {@link org.apache.juneau.serializer.WriterSerializer} class. 
				<ul>
					<li>
						Many of the examples in the documentation were written as follows, which resulted in "unchecked" compile warnings:<br>
						<code>WriterSerializer s = <jk>new</jk> JsonSerializer();</code><br>
						These compile warnings will now go away.
					</li>
				</ul>
			</li>	
			<li>
				New settings in BeanContext.  These can be applied to all serializers/parsers.
				<ul>
					<li>{@link org.apache.juneau.BeanContext#BEAN_ignoreInvocationExceptionsOnGetters}
					<li>{@link org.apache.juneau.BeanContext#BEAN_ignoreInvocationExceptionsOnSetters}
					<li>{@link org.apache.juneau.BeanContext#BEAN_notBeanPackages_add}
					<li>{@link org.apache.juneau.BeanContext#BEAN_notBeanPackages_remove}
				</ul>
			</li>
			<li>
				Eliminated <code>addNotBeanClassPatterns(String...)</code> methods throughout API since these are now controlled by {@link org.apache.juneau.BeanContext#BEAN_notBeanPackages_add} / {@link org.apache.juneau.BeanContext#BEAN_notBeanPackages_remove} properties.
			</li>
			<li>
				New settings in <code>RestServletProperties</code>.
				<ul>
					<li><code>RestServletProperties.REST_trimTrailingUriSlashes</code><br>
						Also removed <code>RestRequest.getRequestURI(boolean trimTrailingSlashes)</code> method which is now redundant with this property.
					<li><code>RestServletProperties.REST_pathInfoBlankForNull</code><br>
						Also removed <code>RestRequest.getPathInfo(boolean returnBlankForNull)</code> method which is now redundant with this property.
				</ul>
			</li>
			<li>
				New JSON-Schema {@link org.apache.juneau.dto.jsonschema.SchemaMap} class for supporting linked schemas.
			</li>
			<li>
				Serializers will no longer throw an exception when <code>maxDepth</code> setting is reached, and will instead simply ignore content below the specified depth.<br>
				While the old behavior was as-designed, the new behavior is more in-line with expected behavior.
			</li>
			<li>
				Added support for HTTP header <js>"X-Response-Headers"</js> to {@link org.apache.juneau.rest.RestServlet}. <br>
				Allows you to specify one or more headers that should be returned on the response from the servlet.<br>
				For example, to get a page to automatically refresh every 1 second, you can append the following to a URL:  <code>?x-response-headers={Refresh=1}</code>
			</li>
			<li>
				Removed <code>HtmlDocSerializerContext.<jsf>HTML_REFRESH</jsf></code> setting that added a Refresh meta tag to HTML documents, since this can now be controlled through <code>X-Response-Headers</code>.
			</li>
			<li>
				Small improvements to samples.
				<ul>
					<li><code>PhotosResource</code> now includes a default entry.
				</ul>
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.32"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.32 (Oct 5, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.32 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>
				New support for generating and consuming fully-compliant JSON-Schema documents.<br>
				See <a class='doclink' href='org/apache/juneau/dto/jsonschema/package-summary.html#TOC'>org.apache.juneau.dto.jsonschema</a> for information.
			</li>
			<li>
				New methods added to {@link org.apache.juneau.parser.Parser}:
				<ul>
					<li><code>org.apache.juneau.parser.Parser.parseMap(Object,int,Class,Class,Class)</code></li>
					<li><code>org.apache.juneau.parser.Parser.parseCollection(Object,int,Class,Class)</code></li>
				</ul>
			</li>
	 		<li>
				{@link org.apache.juneau.annotation.Bean @Bean} annotation can now be defined on interfaces and inherited by subclasses.
			</li>
			<li>
	 			Support for customizing serialized values for <code>Enums</code> through overriding <code>toString()</code> and <code>fromString()</code> on the enum class.<br>
				Previously used <code>Enum.valueOf()</code> to convert strings back into <code>Enums</code>.<br>
				Used for JSON-Schema support to allow {@link org.apache.juneau.dto.jsonschema.JsonType} enum to be serialized to lowercase per the specification (e.g. <js>"string"</js> instead of <js>"STRING"</js>).
	 		</li>
	 		<li>
				{@link org.apache.juneau.dto.cognos Cognos} DTOs now have fluent-style bean setters.
	 		</li>
	 		<li>
				Support for generic bean objects whose type was erased at compile time.<br> 
				Previous behavior gave you an error message that the type could not be determined.<br>
				New behavior assumes a type of <code>Object</code> when the type is erased.
	 		</li>
	 		<li>
	 			Bug fixes:
	 			<ul>
	 				<li>
						When duplicate fluent-style setters were defined with different parameter types (e.g. <code>setFoo(Foo f)</code>, <code>setFoo(Bar b)</code>), the {@link org.apache.juneau.BeanMap} API would sometime choose the wrong setter as the bean property setter. <br>
						Now validates that the setter being chosen is the one whose return type matches the property getter.
					</li>
					<li>
						Passing in <code>Accept</code> GET parameters with <js>'+'</js> (e.g. <code>&amp;Accept=text/json+simple</code>) wasn't working anymore.<br>
						The <code>Accept</code> parameter is supposed to interpret spaces as <js>'+'</js> to allow you to not have to write <code>&amp;Accept=text/json%2Bsimple</code>.
	 				</li>
	 				<li>
						Parsers would not set bean properties of abstract type {@link java.lang.Number}.<br> 
						Now it detects the numeric type based on input and sets the value accordingly.		
					</li>
	 			</ul>
			</li>
		</ul>	
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.31"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.31 (Aug 9, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.31 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>
				Simplified the {@link org.apache.juneau.serializer.Serializer} and {@link org.apache.juneau.parser.Parser} class hierarchies.<br> 
				This reverses a previous change that added a bunch of interfaces in these APIs (and subsequently required compiling with Java 7 to get around a compiler bug).<br>
				The new class hierarchy is much simpler to understand.
			</li>
			<li>
				Added {@link org.apache.juneau.transforms.XMLGregorianCalendarSwap} to convert these to ISO8601 strings during serialization, and vice versa during parsing.
			</li>
			<li>
				Added a strict mode to {@link org.apache.juneau.json.JsonParser}.
			</li>
			<li>
				Added default {@link org.apache.juneau.json.JsonParser#DEFAULT_STRICT} parser.
			</li>
		</ul>	
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.30"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.30 (Aug 8, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.30 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li> 
				Fixed bug involving beans using <code><del>Bean.subTypes()</del></code> annotation in addition to <code>subTypes</code> property.
			</li>
			<li>
				Modified the JSON parser to handle non-existent JSON values to get around an issue where Cognos was generating invalid JSON.
			</li>
		</ul>
	</div>
		
	<!-- =========================================================================================================== -->
	<a id="5.0.0.29"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.29 (Aug 2, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.29 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>
				Revamped the API for filter support:
				<ul>
					<li>Updated {@link org.apache.juneau.transform.BeanFilter} class to mirror the {@link org.apache.juneau.annotation.Bean @Bean} annotation.</li>
					<li>Introduced support for bean <code><del>Bean.subTypeProperty() subtypes</del></code>. </li>
					<li>Replaced <code><ja>@Bean</ja>(filter=xxx)</code> with new <del><code>@Transform</code></del> annotation.</li>
				</ul>
			</li>
			<li>
				Revamped URL-Encoding support.<br>
				The old URL-Encoding serializer and parser simply used the JSON serializer/parser with a thin URL-encoding top layer.<br>
				The new URL-Encoding serialize and parser was written from scratch and is considerably more consistent in design and output.
			</li>
			<li>	
				Improved number parsing.<br> 
				The new number parser should handle any valid numeric syntax for decimals and floats that Java itself supports.
			</li>
			<li>
				{@link org.apache.juneau.json.JsonSerializer} LAX mode now quotes reserved word attributes.
			</li>
			<li>
				New predefined DateFilters with millisecond precision:
				<ul>
					<li><code>org.apache.juneau.transforms.DateSwap.ISO8601DTP</code></li>
					<li><code>org.apache.juneau.transforms.DateSwap.ISO8601DTZP</code></li>
				</ul>
			</li>
		</ul>		
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.28"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.28 (July 9, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.28 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>
				Fixes an <code>OutOfMemoryError</code> and performance issue caused by incorrect caching of class metadata. 
			</li>
			<li>
				Added <code>WriterSerializer.serialize(Object,Writer)</code> convenience method for serializing directly to a writer.<br> 
				Applies to all serializers.
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.27"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.27 (July 7, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.27 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>
				Fixed some HTML formatting issues in {@link org.apache.juneau.html.HtmlSerializer}.
			</li>
			<li>
    			{@link org.apache.juneau.rest.RestServletDefault} now includes {@link org.apache.juneau.plaintext.PlainTextSerializer} and {@link org.apache.juneau.plaintext.PlainTextParser} for plain-text support.
    		</li>
    		<li>
				Child resources now render on default <code>OPTIONS</code> pages through new method <del><code>ResourceOptions.getChildren()</code></del>.
			</li>
			<li>
				Changes to {@link org.apache.juneau.urlencoding.UrlEncodingSerializer}/{@link org.apache.juneau.urlencoding.UrlEncodingParser} to reduce the need for quoted string values.<br>
				More changes are likely in this area of the code to support multipart form posts.
			</li>
			<li>
				FindBugs fixes.
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.26"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.26 (Jun 5, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.26 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>
				FindBug fixes.
			</li>
			<li>
				Changed the way child REST resources are defined.<br>
				Eliminated the <ja>@RestChild</ja> annotation on getter methods and replaced it with {@link org.apache.juneau.rest.annotation.RestResource#children() @RestResource.children()} defined on the resource class itself.<br>
				Child resource paths are specified through {@link org.apache.juneau.rest.annotation.RestResource#path() @RestResource.path()}.
     		</li>
     		<li>
     			New {@link org.apache.juneau.rest.labels.ChildResourceDescriptions} bean for automatically generating the contents of router resource pages.
     		</li>
     		<li>
				Changed <code><ja>@RestMethod</ja>.pattern()</code> to {@link org.apache.juneau.rest.annotation.RestMethod#path() @RestMethod.path()} for naming consistency.
			</li>
		</ul>
	</div>	
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.25"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.25 (May 11, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.25 is a minor update.
		</p>
		<h5 class='topic'>Core API updates</h5>
		<ul class='spaced-list'>
			<li>
				New {@link org.apache.juneau.dto.ResultSetList} DTO for serializing SQL result sets to JSON/XML/HTML and so forth.
			</li>
			<li>
				New <code>SqlQueryResource</code> class in the sample war for demonstrating the <code>ResultSetList</code> DTO.
			</li>
		</ul>
		<h5 class='topic'>Server API updates</h5>
		<ul class='spaced-list'>
			<li>
				Fixed issue with media type for CSS files being reported as <js>"text/plain"</js> instead of <js>"text/css"</js>.
			</li>
			<li>
				Moved initialization of class properties to before the call to <code>Servlet.init()</code> so that <code>getProperties()</code> can be called during servlet initialization.
			</li>
     		<li>
    			New <code><ja>@Property</ja>.type</code> annotation with support for using system properties as resource properties.
    		</li>
		</ul>		
	</div>	

	<!-- =========================================================================================================== -->
	<a id="5.0.0.24"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.24 (May 9, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.24 is a major update.
		</p>
		<h5 class='topic'>Core API updates</h5>
		<ul class='spaced-list'>
			<li>
				New support for {@link org.apache.juneau.dto.atom ATOM}.
				<ul>
					<li>New <code>AtomFeedResource</code> class added to sample war.
				</ul>
			</li>
			<li>
				New <code><del>XmlFormat.CONTENT</del></code> enum value.<br>
				Allows bean properties to be persisted as XML element text.
			</li>
			<li>
				New <code><del>XmlContentHandler</del></code> class and <code><del>@Xml.contentHandler</del></code> annotation.<br>
				Allows customized serialization and parsing of beans to XML element text.<br>
				Added for support of ATOM text content that must support both plain text and embedded XHTML.
			</li>
			<li>
				New {@link org.apache.juneau.xml.annotation.XmlSchema @XmlSchema} and updated {@link org.apache.juneau.xml.annotation.XmlNs @XmlNs} annotations to better mimic JAXB.
			</li>
			<li>
				Removed <code><ja>@Xml</ja>.valAttr</code> annotation since it's now redundant with <code><ja>@Xml</ja>(format=<jsf>CONTENT</jsf>)</code>.
 			</li>
 			<li>
				Fixed timezone bug in {@link org.apache.juneau.transforms.CalendarSwap}.
			</li>
 			<li>
				Simplified <code>Serializer.serialize(Object,Object,SerializerContext)</code> method.
			</li>
			<li>
				Fixed bug where lists returned by {@link org.apache.juneau.ObjectMap#getObjectList(String)} were not updatable.
			</li>
			<li>
				Eliminated old RDF/XML serializer.
			</li>
		</ul>	
		<h5 class='topic'>Documentation updates</h5>
		<ul>
			<li>New {@link org.apache.juneau.json JSON Support Overview} document.</li>
			<li>New {@link org.apache.juneau.xml XML Support Overview} document.</li>
			<li>New {@link org.apache.juneau.jena RDF Languages Support Overview} document.</li>
			<li>New {@link org.apache.juneau.dto.atom ATOM Support Overview} document.</li>
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.23"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.23 (Apr 14, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.23 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>
				Simplified {@link org.apache.juneau.dto.cognos Cognos} support.
			</li>
			<li>
				Fixed bug where <code><ja>@Xml</ja></code> annotation was not being inherited by inner classes.
			</li>
			<li>
				Javadoc stylesheet improvements.
			</li>
		</ul>		
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.22"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.22 (Apr 12, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.22 is a minor update.
		</p>
		<h5 class='topic'>Core API changes</h5>
		<ul class='spaced-list'>
			<li>
		    	New <code><ja>@Property</ja>.nls()</code> annotation for specifying localized property values.<br>
		    	For example, allows you to set the <jsf>HTMLDOC_title</jsf> and <jsf>HTMLDOC_description</jsf> properties to localized values pulled from a resource bundle.<br>
		    	See the <code>AddressBookResource</code> class for an example.
		    </li>
		</ul>
		<h5 class='topic'>REST Servlet API changes</h5>
		<ul class='spaced-list'>
			<li>Fix a bug where the <code>&amp;Content</code> query parameter was not always parsed correctly.</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.21"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.21 (Apr 9, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.21 is a minor update.
		</p>
		<h5 class='topic'>Core API changes</h5>
		<ul class='spaced-list'>
			<li>
				New <code><del>HtmlDocSerializerContext.HTMLDOC_navlinks</del></code> annotation for addint links to HTML page views.
			</li>
			<li>
				Renamed the properties in <code><del>HtmlDocSerializerContext</del></code> for clarity.
			</li>
		</ul>		
		<h5 class='topic'>Servlet API changes</h5>
		<ul class='spaced-list'>
			<li>
				Added new <code>RestServlet.addDefaultProperties(ObjectMap,RestRequest)</code> method for programatically adding properties to the property map per request.
			</li>
			<li>
				Added the following new properties in the properties map to make them easily available to serializers and parsers (since they don't have access to the HTTP request object).<br>  
				Note that the <code>SerializerContext.SERIALIZER_uriAuthority</code> and <code>SerializerContext.SERIALIZER_uriContext</code> properties were previously available.
				<ul>
					<li><code>RestServletProperties.REST_servletPath</code></li>
					<li><code>RestServletProperties.REST_pathInfo</code></li>
					<li><code>RestServletProperties.REST_method</code></li>
				</ul>
			</li>
			<li>
				Path variables annotated with <del><code>@Attr</code></del> are now automatically URL-decoded.
			</li>
		</ul>		
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.20"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.20 (Apr 7, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.20 is a major update.
		</p>
		<h5 class='topic'>Core API changes</h5>
		<ul class='spaced-list'>
			<li>
				New Jena-based {@link org.apache.juneau.jena.RdfSerializer} for serializing POJOs to RDF/XML, RDF/XML-ABBREV, N-Triple, Turtle, and N3.<br>
				Serializes ANY POJOs to RDF, even simple objects and primitives.
			</li>
			<li>
				New Jena-based {@link org.apache.juneau.jena.RdfParser} for parsing RDF/XML, RDF/XML-ABBREV, N3, Turtle, and N-Triple back into POJOs.
			</li>
			<li>
				<code><del>XmlSerializerContext.XML_autoDetectNamespaces</del></code> default changed to <jk>true</jk>.<br>
				The old default value would cause XML with unmapped namespaces if you didn't manually specify them via the <code><del>XmlSerializerContext.XML_namespaces</del></code> annotation.<br>
				While setting the default to <jk>true</jk> is somewhat slower (since the serializer must crawl the POJO tree to find namespaces), the benefits of having it work out-of-the-box outweighs the performance concerns.<br>
				For developers concerned about performance, they can always change it back to false and specify the namespaces themselves.	
			</li>
		</ul>
		<h5 class='topic'>REST server API changes</h5>
		<ul class='spaced-list'>
			<li>
				Allow inheritance of {@link org.apache.juneau.rest.annotation.RestResource @RestResource} annotation.<br>
				Serializers, parsers, filters, properties , guards, and converters definitions are automatically inherited from parent classes and interfaces.
			</li>
			<li>
				Enhancements to {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod} annotation:
				<ul>
					<li>
						New <code>RestMethod.filters()</code> annotation for defining POJO filters at the method level.
					</li>
					<li>
						New <code><del>RestMethod.serializersInherit()</del></code> and <code><del>RestMethod.parsersInherit()</del></code> annotations for controlling how serializers and parsers (and associated filters and properties) are inherited from the class.<br>
						This replaces the previous <code>addSerializers</code> and <code>addParsers</code> annotations.
				</ul>
			</li>
			<li>
				New <code><del>RestServletJenaDefault</del></code> servlet that includes serialization/parsing support for all Jena-based serializers and parsers.
			</li>
			<li>
				New <code><del>DefaultJenaProvider</del></code> JAX-RS provider that includes serialization/parsing support for all Jena-based serializers and parsers.
			</li>
			<li>
				Eliminated <code>RestServletChild</code> class.<br>  
				It's redundant with the introduction of inheritable annotations.
			</li>
			<li>
				New methods on {@link org.apache.juneau.rest.RestServlet}:
				<ul>
					<li><code>RestServlet.createConfigFactory()</code></li>
					<li><code>RestServlet.createSerializers()</code></li>
					<li><code>RestServlet.createParsers()</code></li>
				</ul>
				These augment the existing <code>getBeanContext()</code> / <code>getSerializers()</code> / <code>getParsers()</code> methods.		
			</li>
		</ul>
		<h5 class='topic'>REST client API changes</h5>
		<ul class='spaced-list'>
			<li>
				New <code>RestCall.setDateHeader(String,Object)</code> method for setting ISO8601 datetime headers.
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.19"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.19 (Apr 1, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.19 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>
				New methods on {@link org.apache.juneau.rest.RestServlet}:
				<ul>
					<li><code><del>RestServlet.onPreCall(RestRequest)</del></code></li>
					<li><code><del>RestServlet.onPostCall(RestRequest,RestResponse)</del></code></li>
				</ul>
			</li>
			<li>
				<jsf>TRIM_NULLS</jsf> setting changed to <code><del>SerializerContext.SERIALIZER_trimNullProperties</del></code>.<br>
				New property default is <jk>true</jk>. 
				Only applies to bean properties, not map or collection entries.
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.18"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.18 (Mar 27, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.18 is a moderate update.
		</p>
		<p>
			The biggest change is the introduction of the {@link org.apache.juneau.jena.RdfSerializer} class that uses Jena to generate RDF/XML, RDF/XML-ABBREV, N-Tuple, N3, and Turtle output.
		</p>
		<p>
			This code should be considered prototype-quality, and subject to change in the future.<br>  
			There are plans of adding an equivalent <code>RdfParser</code> class in the future, so the serializer logic may need to be tweaked to allow POJOs to be reconstituted correctly in the parser.
		</p>
		<p>
			The <code>RdfXmlSerializer</code> class should be considered deprecated for now.<br>  
			However, I'm keeping it around, since it's considerably faster and uses far less memory than the Jena-based serializer since it serializes directly from POJOs to RDF/XML.<br> 
			It may or may not be removed in the future depending on demand.
		</p>
		<h5 class='topic'>Other changes</h5>
		<ul class='spaced-list'>
			<li>
				New {@link org.apache.juneau.jso.JsoParser} class.  
			</li>
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.17"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.17 (Mar 25, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.17 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>
				Charset now passed as a parameter to <code>IOutputStreamSerializer.serialize()</code> and <code>IInputStreamParser.parse()</code>. 
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.16"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.16 (Mar 25, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.16 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>
				New <code><del>@Properties</del></code> REST method parameter annotation that can be used to get the runtime properties map through a parameter instead of through {@link org.apache.juneau.rest.RestResponse}. 
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.15"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.15 (Mar 24, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.15 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>		
				Juno-Wink integration components that have been requested by many for a long time!<br>
				Refer to <del>org.apache.juneau.rest.jaxrs</del> for information.
			</li>
			<li>
				New <code><del>@Produces</del></code> annotation in place of <code>ISerializer.getMediaTypes()</code> for specifying what media types a serializer produces.<br>
				Available when subclassing from {@link org.apache.juneau.serializer.Serializer}.
			</li>
			<li>
				New <code><del>@Consumes</del></code> annotation in place of <code>IParser.getMediaTypes()</code> for specifying what media types a parser consumes.<br>
				Available when subclassing from {@link org.apache.juneau.parser.Parser}.
			</li>
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.14"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.14 (Mar 23, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.14 is a major update.
		</p>
		<p>
			The biggest change is that the <code>RestSerializer</code>, <code>RestParser</code>, <code>RestSerializerGroup</code>, and <code>RestParserGroup</code> classes have been eliminated entirely.<br>  
			Instead, the existing {@link org.apache.juneau.serializer.Serializer}, {@link org.apache.juneau.parser.Parser}, {@link org.apache.juneau.serializer.SerializerGroup}, and {@link org.apache.juneau.parser.ParserGroup} classes of the core API have been augmented to replace them.
		</p>
		<p>
			Adoptions will be required if you have previously used these classes.
		</p>
		<h5 class='topic'>Core API changes</h5>
		<ul class='spaced-list'>
			<li>
				New <code>org.apache.juneau.serializer</code> package.
				<ul>
					<li>Entirely reworked class hierarchy to make it easier to define new serializers.</li>
					<li>New {@link org.apache.juneau.serializer.WriterSerializer} base class for defining character-based serializers.</li>
					<li>New {@link org.apache.juneau.serializer.OutputStreamSerializer} base class for defining byte-based serializers.</li>
					<li>Updated {@link org.apache.juneau.serializer.SerializerGroup} class with full support for RFC2616 <code>Accept-Content</code> headers.</li>
					<li>Improved cloning support on serializers and serializer groups.</li>
				</ul>
         	</li>
         	<li>
         		New <code>org.apache.juneau.parser</code> package.
         		<ul>
         			<li>Entirely reworked class hierarchy to make it easier to define new parsers.</li>
					<li>New {@link org.apache.juneau.parser.ReaderParser} base class for defining character-based parsers.</li>
					<li>New {@link org.apache.juneau.parser.InputStreamParser} base class for defining byte-based parsers.</li>
					<li>Improved cloning support on parsers and parser groups.</li>
         		</ul>
         	</li>
         	<li>
				New <code>org.apache.juneau.transform</code> package.
				<ul>
					<li>Cleaner class structure.</li>
					<li>Improved {@link org.apache.juneau.transform.BeanFilter} class for defining property filters on beans.</li>
					<li>Improved {@link org.apache.juneau.utils.PojoQuery} class for defining filters on objects (previously called <code>ObjectFilter</code>).</li>
         		</ul>
         	</li>
         	<li>
				New <code>org.apache.juneau.encoders</code> package.
				<ul>
					<li>Defines API for {@link org.apache.juneau.encoders.Encoder Encoders} for enabling compression in REST servlets and clients.</li>
					<li>Previously, gzip compression was enabled by default.  This new API allows you to plug in your own compression algorithms.</li>
					<li>New {@link org.apache.juneau.encoders.GzipEncoder} class for enabling gzip compression.</li>
					<li>New {@link org.apache.juneau.encoders.EncoderGroup} class for managing multiple encoders and finding them based on RFC2616 <code>Accept-Encoding</code> header values.</li>
				</ul>
			</li>
			<li>
				New <code>org.apache.juneau.plaintext</code> package.
				<ul>
					<li>New {@link org.apache.juneau.plaintext.PlainTextSerializer} and {@link org.apache.juneau.plaintext.PlainTextParser} classes for serializing/parsing text/plain content.</li>
				</ul>
			</li>
			<li>
				New <code>org.apache.juneau.jso</code> package.
				<ul>
					<li>New {@link org.apache.juneau.jso.JsoSerializer} class for serializing <code>application/x-java-serialized-object</code> content.</li>
				</ul>
			</li>
			<li>
				New <code>org.apache.juneau.soap</code> package.
				<ul>
					<li>New {@link org.apache.juneau.soap.SoapXmlSerializer} class for serializing <code>text/xml+soap</code> content.</li>
				</ul>
			</li>
			<li>
				Improved cloning support on the {@link org.apache.juneau.BeanContext} class.
				<ul>
					<li>Better caching.  Improved caching performance.</li>
				</ul>
			</li>
         	<li>
				<code>JsonMap</code> and <code>JsonList</code> changed to {@link org.apache.juneau.ObjectMap} and {@link org.apache.juneau.ObjectList} to better reflect that they're not limited to just JSON support.
     		</li>
     		<li>
				Renamed <code>PojoSwap</code> to {@link org.apache.juneau.utils.PojoQuery} to not confuse it with the new Filter API.
			</li>
		</ul>
		<h5 class='topic'>REST server API changes</h5>
		<ul class='spaced-list'>
			<li>
				Eliminated <code>org.apache.juneau.rest.serializers</code> and <code>org.apache.juneau.rest.parsers</code> packages.
				<ul>
					<li>All existing REST serializers and parsers merged into the core API.</li>
				</ul>
			</li>
		</ul>
		<h5 class='topic'>REST client API changes</h5>
		<ul class='spaced-list'>
			<li>
				Simplified {@link org.apache.juneau.rest.client.RestClient} API.
				<ul>
					<li>You can now only specify a single serializer or parser per client.  This significantly simplifies the code.</li>
					<li>Support for {@link org.apache.juneau.encoders.Encoder Encoders}.</li>
				</ul>
			</li>
			<li>
				Eliminated <code>RestCmdLine</code> (since it's essentially redundant with CURL).
			</li>
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.13"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.13 (Mar 14, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.13 is a minor update.
		</p>
		<h5 class='topic'>Core API changes</h5>
		<ul class='spaced-list'>
			<li>		
				New support for relative URIs.
				<ul>
					<li>URIs of the form <js>"foo/bar"</js> are interpreted as relative to the context root of the web application.</li>
					<li>URIs of the form <js>"/foo/bar"</js> are interpreted as relative to the HTTP authority (e.g. <js>"http://myhost:9080"</js>).</li>
				</ul>
			</li>
			<li>
				New <code>SerializerContext.SERIALIZER_uriContext</code> and <code>SerializerContext.SERIALIZER_uriAuthority</code> serializer properties for specifying values for relative URIs.
     		</li>
     		<li>
				New {@link org.apache.juneau.annotation.URI @URI} annotation that allows you to specify classes and bean properties as URLs that aren't <code>java.net.URI</code> or <code>java.net.URL</code>.
			</li>
			<li>
				New {@link org.apache.juneau.html.HtmlSerializer#HTML_uriAnchorText} HTML serializer property for tailoring how anchor text is rendered.
			</li>
			<li>
				Renamed <code>BeanProperty#uri</code> annotation to <code>BeanProperty#beanUri</code> to make it clear that this property represents the URI of the bean itself instead of an arbitrary property containing a URI.
     		</li>
     		<li>
				Removed <code>BeanProperty#id</code> annotation.
			</li>
		</ul>
		<h5 class='topic'>REST server API changes</h5>
		<ul class='spaced-list'>
			<li>
				Improvements to {@link org.apache.juneau.rest.RestServlet} to automatically handle relative URIs in POJOs.
				<ul>
        			<li><code>SerializerContext.SERIALIZER_uriContext</code> property set by default to web app context root.</li>
					<li><code>SerializerContext.SERIALIZER_uriAuthority</code> property set by default to the request scheme+hostname+port.</li>
         		</ul>
         	</li>
         	<li>
				Fixed bug involving <code>Accept-Charset</code> header in Chrome that prevented HTML output from rendering correctly in that browser.<br>
				<code>Accept-Charset</code> handling should now be fully W3C compliant.
			</li>
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.12"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.12 (Mar 10, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.12 is a minor update.
		</p>
		<h5 class='topic'>Core API changes</h5>
		<ul class='spaced-list'>
			<li>
				Relaxed method naming conventions when using {@link org.apache.juneau.annotation.BeanProperty @BeanProperty} annotation.<br>
				Methods with zero parameters are interpreted as getters, and methods with one parameter are interpreted as setters.<br>
				Eliminated the <code>BeanProperty.method</code> annotation, since it's now unnecessary.
  			</li>
		</ul>		
		<h5 class='topic'>REST server API changes</h5>
		<ul class='spaced-list'>
			<li>		
				Significantly improved response error messages.<br> 
				Older messages were rather cryptic.   Error conditions should be much easier to debug now.
			</li>
			<li>
				New <code>PlainTextRestSerializer</code> class for serializing <js>"plain/text"</js> requests.<br>
				Useful for debugging purposes.
			</li>
     		<li>
				<code>Readers</code> and <code>InputStreams</code> can now be passed in as <del><code>@Content</code></del> parameters if you need direct access to the HTTP body content without involving the parsers.<br> 
				Equivalent to previously calling {@link org.apache.juneau.rest.RestRequest#getInputStream()} and {@link org.apache.juneau.rest.RestRequest#getReader()}.
     		</li>
     		<li>
				Improved support for the <code>?debug</code> parameter.<br>
				Dumps better information to the log file, such as all header parameters.
			</li>
		</ul>		
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.11"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.11 (Mar 8, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.11 is a moderate update.
		</p>
		<h5 class='topic'>REST server API changes</h5>
		<ul class='spaced-list'>
			<li>	
				New <code>UrlEncodingRestSerializer</code> and <code>UrlEncodingRestParser</code> classes.<br>
				Allows parsing form posts directly to POJOs.
			</li>
			<li>
				Support for <code>Accept</code> and <code>Content-Type</code> <js>"application/x-www-form-urlencoded"</js> added by default on {@link org.apache.juneau.rest.RestServletDefault}.
			</li>
			<li>
				New <code><del>RestServlet.renderError(HttpServletRequest,HttpServletResponse,RestException)</del></code> method to allow customized handling of response errors.
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.10"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.10 (Mar 7, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.10 is a minor update.
		</p>
		<h5 class='topic'>Core API changes</h5>
		<ul class='spaced-list'>
			<li>New {@link org.apache.juneau.ObjectMap#findKeyIgnoreCase(String)} method.
			<li>HtmlSerializer will now create 2-dimensional tables for collections of mixed beans/maps if all object have the same set of property names/keys.</li>
		</ul>
		<h5 class='topic'>REST server API changes</h5>
		<ul class='spaced-list'>
			<li>New <code>RestServletProperties</code> class that defines all the class-level properties that can be set on the servlet.</li>
			<li>Properties can be set through {@link org.apache.juneau.rest.annotation.RestResource#properties() @RestResource.properties} annotation, or new <code><del>RestServlet.setProperty(String,Object)</del></code> method.</li>
			<li>New <js>"?noTrace"</js> URL parameter to prevent stack traces from being logged (for JUnit testing of error conditions).</li>
			<li>New <code>RestServletProperties.REST_useStackTraceHashes</code> property to prevent the same stack trace from being logged multiple times.</li>
			<li>New <code>RestServletProperties.REST_renderResponseStackTraces</code> property for preventing stack traces in responses for security reasons.</li>
			<li>New overridable <code>RestServlet.onError(HttpServletRequest,HttpServletResponse,RestException,boolean)</code> and <code><del>RestServlet.onSuccess(RestRequest,RestResponse,long)</del></code> methods for plugging in your own logging and peformance monitoring.</li>
			<li>Eliminated <code>RestServlet.getInitParams()</code> method, since it's now redundant with {@link org.apache.juneau.rest.RestServlet#getProperties()}.</li>
			<li>Header parameters passed as URL parameters are now case-insensitive.</li>			
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.9"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.9 (Feb 26, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.9 is a moderate update.
		</p>
		<h5 class='topic'>Core API changes</h5>
		<ul class='spaced-list'>
			<li>
				{@link org.apache.juneau.config INI config file support}:
				<ul>
					<li>A convenient API for reading, writing, and manipulating INI files.</li>
					<li>Ability to convert INI files to batch and shell environment variables.</li>
					<li>Command-line interface for updating INI files.</li>
					<li>Support for encoded INI file values.</li>
				</ul>
			</li>
			<li>Support for fluent-style bean setters (setters that return the bean itself).</li>
			<li>Ability to use {@link org.apache.juneau.annotation.Bean @Bean} annotation to override bean identification settings.</li>
			<li>New {@link org.apache.juneau.ObjectMap#cast(Class)} method to convert <code>ObjectMaps</code> directly to beans.</li>
		</ul>
		<h5 class='topic'>REST server API changes</h5>
		<ul class='spaced-list'>
			<li>Build-in default <code>OPTIONS</code> pages.</li>
			<li>New {@link org.apache.juneau.rest.annotation.RestResource#defaultRequestHeaders() @RestResource.defaultRequestHeaders} and {@link org.apache.juneau.rest.annotation.RestResource#defaultResponseHeaders() @RestResource.defaultResponseHeaders} annotations.</li>
			<li>New {@link org.apache.juneau.rest.annotation.RestMethod#serializers() @RestMethod.serializers()} and {@link org.apache.juneau.rest.annotation.RestMethod#parsers() @RestMethod.parsers()} annotations.</li>
			<li>New {@link org.apache.juneau.rest.annotation.RestMethod#properties() @RestMethod.properties()} annotation.</li>
			<li>New {@link org.apache.juneau.rest.annotation.RestMethod#defaultRequestHeaders() @RestMethod.defaultRequestHeaders()} annotation.</li>
			<li>New {@link org.apache.juneau.rest.annotation.RestMethod#matchers() @RestMethod.matchers()} annotation and {@link org.apache.juneau.rest.RestMatcher} class.</li>
			<li><code>Readers</code> and <code>InputStreams</code> can be specified on <del><code>@Content</code></del> annotated parameters.</li>
			<li>New <del><code>@HasParam</code></del> annotation.</li>
			<li>Full RFC2616 support for matching <code>Accept</code> headers to serializers.</li>		
		</ul>
		<h5 class='topic'>Other notes</h5>
		<ul class='spaced-list'>
			<li>Smaller library size (460kB).</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.8"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.8 (Jan 30, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.8 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>
				New {@link org.apache.juneau.config INI file} support. 
				<ul>
					<li>Makes reading, updating, and manipulating INI configuration files a snap. </li>
					<li>Supports automatic conversion of data types in line with the functionality of the rest of the product.</li>
					<li>Comments and layout of INI files are persisted during saves. </li>
				</ul>
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.7"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.7 (Jan 20, 2013)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.7 is a major update.
		</p>
		<h5 class='topic'>Core API updates</h5>
		<ul class='spaced-list'>
			<li>Combined previous 3 libraries into a single library.</li>
			<li>
				New {@link org.apache.juneau.parser.ParserListener} class.<br>
				Adds ability to find and process unknown bean properties during parsing.
			</li>
			<li>
				Enhancements to {@link org.apache.juneau.xml.XmlParser}:
				<ul>
					<li>Coalescing support</li>
					<li>Validations support</li>
					<li>Support for replacing entity references</li>
					<li>Resolver support</li>
					<li>Event allocator support</li>
					<li>Trim-whitespace support</li>
				</ul>
			</li>
			<li>	
				Enhanced XML support:
				<ul>
					<li>
						New {@link org.apache.juneau.xml.annotation.Xml#format() @Xml.format} annotation.<br>
						Controls how POJOs get serialized to XML.<br>
						Also allows you to collapse collections and arrays.
					</li>
					<li>
						New <code>@Xml.namespaces</code> annotation.<br>
						Namespaces can be defined at package, class, method, or field levels.
					</li>
					<li>
						New <code>@Xml.nsUri</code> annotation.<br>
						Shortcut for specifying namespace URIs.
					</li>
					<li>
						New <code>@Xml.valAttr</code> annotation.<br>
					Serializes a bean property value as an attribute.
					</li>
					<li>Ability to override XS and XSI namespaces on XML and RDF/XML serializers.</li>
					<li>Ability to override RDF namespace on RDF/XML serializer.</li>
					<li>New more-efficient namespace resolution.</li>	
				</ul>
			</li>
			<li>
				New configurable property classes for everything are now structured better and easier to locate and identify through the following new classes:
				<ul>
					<li>{@link org.apache.juneau.BeanContext}</li>
					<li><code><del>SerializerContext</del></code></li>
					<li><code><del>ParserContext</del></code></li>
				</ul>		
			</li>
			<li>
				Enhancements to {@link org.apache.juneau.BeanContext}:
				<ul>
					<li>
						Ability to mark bean properties as hidden using <code>@BeanProperty.hidden()</code> so that they don't get serialized.
					</li>
					<li>
						Simplified <code>ClassType</code> {@link org.apache.juneau.ClassMeta} API.<br>
						Combined 4 classes into a single class.
					</li>
					<li>
						New <del><code>@Bean.filter</code></del> and <del><code>@BeanProperty.filter</code></del> annotations.<br>
						Used for defining filters on bean classes and bean properties instead of just globally through <code>BeanContext.addTransforms(Class[])</code>.
					</li>
					<li>
						New {@link org.apache.juneau.PropertyNamer} API / {@link org.apache.juneau.annotation.Bean#propertyNamer() @Bean.propertyNamer} annotation.<br>
						Used for customizing bean property names.
					</li>
					<li>
						New <del><code>@BeanProperty.beanUri</code></del> and <del><code>@BeanProperty.id</code></del> annotations.<br>
						Used for associating beans with URLs and IDs.<br>
						Used by XML serializer to add a url attribute on a bean element.<br>
						Used by RDF/XML serializer to construct <code>rdf:resource</code> attributes.
					</li>
					<li>
						New {@link org.apache.juneau.annotation.BeanProperty#properties() @BeanProperty.properties()} annotation.
						Used for limiting properties on child elements.
					</li>	
				</ul>
			</li>
			<li>
				Automatic support for {@link java.net.URL} and {@link java.net.URI} objects.
				<ul>
					<li>Converted to hrefs in HTML.</li>
					<li>Converted to url attributes in XML.</li>
					<li>Converted to resource:about attributes in RDF/XML.</li>
				</ul>				
			</li>
			<li>
				Improvements to Javadocs.
			</li>
			<li>
				Improved {@link org.apache.juneau.utils.PojoQuery} support.
			</li>
		</ul>
		<h5 class='topic'>REST client updates</h5>
		<ul class='spaced-list'>
			<li>GZIP compression support.</li>
			<li>Bug fixes.</li>
		</ul>
		<h5 class='topic'>REST server updates</h5>
		<ul class='spaced-list'>
 			<li>
				Support for overriding bean context and serializer properties in a REST method call through new <code><del>RestResponse.setProperty(String,Object)</del></code> method.<br>
				For example, allows you to control whitespace options on a per-request basis.
			</li>
			<li>
				Several new annotations on REST servlets:
				<ul>
					<li><code>@RestResource.filters()</code> - Associate post-formatting filters on a resource level.</li>
					<li>{@link org.apache.juneau.rest.annotation.RestResource#guards() @RestResource.guards} - Associate resource-level guards.</li>
					<li>{@link org.apache.juneau.rest.annotation.RestResource#messages() @RestResource.messages} - Associate a resource bundle with a REST servlet.  Comes with several convenience methods for looking up messages for the client locale.</li>
					<li>{@link org.apache.juneau.rest.annotation.RestResource#properties() @RestResource.properties} - Override default bean context, serializer, and parser properties though an annotation.</li>
				</ul> 
			</li>
			<li>
				Several new annotations on REST methods:
				<ul>
					<li><code>@RestMethod.filters()</code> - Associate post-formatting filters on a method level.</li>
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#guards() @RestMethod.guards()} - Associate method-level guards.</li>
				</ul>
			</li>
			<li>				
				New annotations on REST method parameters with automatic conversion:
				<ul>
					<li><del><code>@Attr</code></del> - A parameter or URL variable value as a parsed POJO.</li>
					<li><del><code>@Param</code></del> - A query parameter value as a parsed POJO.</li>
					<li>{@link org.apache.juneau.rest.annotation.PathRemainder @PathRemainder} - The remainder after a URL pattern match as a String.</li>
					<li>{@link org.apache.juneau.rest.annotation.Header @Header} - An HTTP header value as a parsed POJO.</li>
					<li><del><code>@Content</code></del> - The HTTP content as a parsed POJO.</li>
					<li>{@link org.apache.juneau.rest.annotation.Method @Method} - The HTTP method name as a String.</li>
				</ul>
			</li>
			<li>
				HTTP response content POJOs can now simply be returned from methods instead of calling {@link org.apache.juneau.rest.RestResponse#setOutput(Object)}.		
			</li>	
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.6"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.6 (Oct 30, 2012)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.6 is a minor update that fixes a small bug in 5.0.0.5.
		</p>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.5"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.5 (Oct 29, 2012)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.5 is a major update.
		</p>
		<ul class='spaced-list'>
			<li>New <code><ja>@RestChild</ja></code> annotation for identifying child resources.</li>
			<li>
				New <code>traversable</code> and <code>filterable</code> attributes added to {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod} annotation.<br>
				Eliminates the need for <code>PojoResource</code> and <code>FilteredRestResource</code> classes.
			</li>
			<li>Simplified client API.  Easier to use when making multiple connections to the same server.</li>
			<li>Support for pluggable authentication in the client API.</li>
			<li>Support for authenticating against Jazz Team Servers.</li>
			<li>Support for rendering package-level Javadocs in REST resources.</li>
			<li>Support for parsing of header values into specific object types.</li>
			<li>Changed default XML representation to not include JSON-type attributes.  Produces cleaner XML.</li>
			<li>
				New <code>resourceUri</code> attributed added to <ja>@Bean</ja> annotation to associate beans with resource URIs.
				<ul>
					<li>Used for automatically creating hyperlinks in {@link org.apache.juneau.html.HtmlSerializer}.</li>
					<li>Used for automatically creating <xa>uri</xa> attributes in {@link org.apache.juneau.xml.XmlSerializer}.</li>
					<li>Used for automatically creating <xa>rdf:about</xa> attributes in <code>RdfXmlSerializer</code>.</li>
				</ul>
			</li>	
		</ul>
	</div>	

	<!-- =========================================================================================================== -->
	<a id="5.0.0.4"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.4 (Oct 7, 2012)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.4 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>
				New {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod} annoation on {@link org.apache.juneau.rest.RestServlet} methods.<br>
				Allows the usage of URL pattern matching and automatic conversion of URL variables to arguments passed to method handlers.<br>
				See {@link org.apache.juneau.rest.RestServlet} for more information.
			</li>
			<li>
				Enhancements to <code><del>BeanContext.convertToType(Object,Class)</del></code> to be able to convert <code>Strings</code> to classes with 
				<code>fromString(String)</code>/<code>valueOf(String)</code> static methods or <code>T(String)</code> constructors.
			</li>	
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.3"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.3 (Oct 3, 2012)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.3 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>
				Support for parsing into read-only beans (i.e. beans with only getters, property values set through constructor args).<br>
				To support this, the {@link org.apache.juneau.annotation.BeanConstructor @BeanConstructor} annotation has been added.
			</li>
			<li>
				Merged separate settings classes back into their base classes (simplifies the API).
			</li>
			<li>
				{@link org.apache.juneau.serializer.SerializerGroup SerializerGroups} and {@link org.apache.juneau.parser.ParserGroup ParserGroups} now share {@link org.apache.juneau.BeanContext BeanContexts} to reduce memory consumption of class type metadata.	
			</li>	
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.2"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.2 (Sept 28, 2012)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.2 is a minor update.
		</p>
		<ul class='spaced-list'>
			<li>
				Improvements to Javadocs.  Most of the information in the Juno Starters Guide wiki has been moved into the overview and package-level javadocs.<br>
				Since the information is now written in HTML, you can now copy and paste the code examples directly from the Javadocs.<br>
				The code examples are also syntax-highlighted using CSS.
			</li>
			<li> 
				Support for defining default XML namespaces on packages and classes for the XML and RDF serializers.
			</li>
			<li>
				Restructured the packages along content type support (e.g. all JSON support moved to <code>org.apache.juneau.json</code>).
			</li>
			<li>
				Automatic support for parsing maps with <code>Enum</code> keys, and parsing <code>Enum</code> strings.<br>
				This was previously possible using filters, but now it's built-in for all the parsers.
			</li>
			<li> 
				Replaced the <code>ObjectList.toXArray()</code> methods with a new <code>elements(Class&lt;T&gt; type)</code> method that's more efficient and avoids creating an unnecessary array.
			</li>
			<li> 
				Support for parsing into beans with read-only properties.<br>
				New {@link org.apache.juneau.annotation.BeanConstructor @BeanConstructor} annotation allows you to specify bean property values to be passed in through a constructor.
			</li>
			<li> 
				Separated the rest library into separate independent client and server libraries.<br>
				Use one, use both, it's up to you.
			</li>
		</ul>
	</div>

	<!-- =========================================================================================================== -->
	<a id="5.0.0.1"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.1 (Jun 14, 2012)</h3>
	<div class='topic'>
		<p>
			Juno 5.0.0.1 is a moderate update.
		</p>
		<ul class='spaced-list'>
			<li>
				New support for generating XML-Schema documents from POJO models.
			</li>
			<li>
				New support for serializing to RDF/XML.
			</li>
		</ul>
	</div>
	
	<!-- =========================================================================================================== -->
	<a id="5.0.0.0"></a>
	<h3 class='topic' onclick='toggle(this)'>5.0.0.0 (Jun 11, 2012)</h3>
	<div class='topic'>
		<p>
			Version 5.0 marks a major release milestone for the Juno/JJSON library.  
			It is now available for download from iRAM under the name "Juno (previously JJSON)".  
			The Juno Starters Guide has been updated to reflect new functionality in this release.  
		</p>
		<ul class='spaced-list'>
			<li>
				New name.<br>
				Unfortunately, "JJSON" was already trademarked by another similar library.  
				Therefore, it's been renamed "Juno" (after the Roman goddess and wife of Jupiter) which does not appear to have any similar trademark issues (crosses fingers).  
				The name is also a play on the word "Uno", indicating that this is a single simple unifying interface of several kinds of technology.
			</li>
			<li>
				Simplified APIs for working with beans.<br>
				Significant improvements have been made to the parsers to make it easier to convert serialized POJOs back into their original forms.
			</li>
			<li>
				Serializer/Parser classes now directly subclass from {@link org.apache.juneau.BeanContext}.<br>
				In previous releases, if you wanted to change the way beans were handled by the serializers and parsers, you had to construct a separate bean map factory and pass it to the serializer or parser.  
				Now, you can call the bean map factory methods directly on the serializer or parser class.
			</li>
			<li>
				Simplified Filter API for handling non-standard POJOs.<br>
				The API for handling non-standard POJOs has been simplified by introducing the concept of a <del><code>Transform</code></del> class, which is associated with the <code>BeanContext</code> class (and thus the Serializer and Parser classes too) through the <code>BeanContext.addTransforms(Class[])</code> method.<br>
				Two new subclasses of <del><code>Transform</code></del>:
				<ul>
					<li>{@link org.apache.juneau.transform.BeanFilter} - Filter POJO beans.</li>
					<li>{@link org.apache.juneau.transform.PojoSwap} - Filter POJOs that aren't beans.</li>
				</ul>
				This new API replaces the previous separate <code>Cast</code> and <code>BeanFilter</code> APIs which were considerably more complicated and puts them under a common API. 
			</li>
			<li>
				Elimination of <code>_class</code> attributes in parsable output.<br>
				One of the complaints about the previous version of JJSON was that if you wanted to have the resulting JSON or XML be parsable back into beans, you had to enable the <js>"addClassAttrs"</js> property on the bean map factory class so that <js>"_class"</js> attributes could be added to the output.<br>
				This requirement is virtually eliminated in v5.  In many cases, the parsers are able to determine through reflection what the correct target type is based on the top-level class passed in on the parse method. 
			</li>
			<li>
				Performance improvements.<br>
				Several significant performance improvements have been made in this release.
				<ul>
					<li>
						New Reader-based JSON parser.<br>
						Previously, the JSON parser required that the entire JSON text be loaded into memory as a String before being parsed.  
						The new JSON parser is Reader-based which significantly reduces memory consumption.
					</li>
					<li>     
						New StAX-based XML parser.<br>
						The old XML parser was based on DOM.  The new XML parser uses a StAX parser which significantly reduces memory consumption.
					</li>
					<li>
						Caching of reflection data in the <code>BeanMap</code> API.<br>
						The number of reflection calls have been significantly reduced in the <code>BeanMap</code> API code.  
						Reflection is used to determine the class types of property values on beans.  
						This information is now cached and persisted so that the reflection API calls to determine class types are only performed the first time a bean type is encountered.
     				</li>
     				<li>
						Automatic support for GZIP compression/decompression in <code>RestServlets</code>.<br>
						This is completely transparent to the developer.  
						The output writer is negotiated by the framework to automatically handle compression and charset requests without the developer needing to know anything about it.
					</li>
				</ul>
			</li>
			<li>
				Cognos/XML support.
			</li>
			<li>
				JSON-schema support.
			</li>
			<li>
				New {@link org.apache.juneau.utils.PojoIntrospector} class.
			</li>
			<li>
				Significant REST servlet API improvements.
				<ul>
					<li>
						Defining child resources is considerably simpler now.  
						In addition to the standard doX() methods for handling the requests for the current resource, you can also define getX() methods for returning child resources which automatically become available under the child URL specified by the getter name.
					</li>
					<li>
						Initialization of the child resources occurs automatically when the parent resource initialization occurs.
					</li>
					<li>
						Other improvments have been made in the area of automatic negotiation of input and output type streams.  
						For example, automatic support is provided for GZIP (<code>Accept-Encoding: gzip</code>) and charsets (e.g <code>Accept-Charset: SJIS</code>) on both incoming and outgoing data.  
						It's all transparent from a developers perspective.  
						The developer simply working with POJOs, and all details about content types, encoding, charsets, and so forth are handled by the framework.
					</li>
					<li>
						Support for generating complex <code>OPTIONS</code> pages for resources.
					</li>
				</ul>
			</li>
			<li>
				Automatic support for SOAP XML output on <js>"text/soap+xml"</js> requests against <code>RestServlet</code>.
			</li>
			<li>
				Support for XML namespaces. 
			</li>
			<li>
				Support for setting the XML root element name by either passing in a parameter on the serializer, or by specifying it via a <ja>@Bean</ja> annotation.
			</li>
 			<li>
				Support for loading beans directly from Readers and Strings. 
			</li>
			<li>
				Parsing support for POJOs of type <code>Enum</code>.
			</li>
 			<li>
				Significant improved support for various flavors of parameterized types, such as subclasses of parameterized types (e.g. <code>MyBeanList <jk>extends</jk> LinkedList&lt;MyBean&gt;</code>).
 			</li>
 			<li>
				Improved ordering of bean properties (should now be ordered as they are defined in the class).
			</li>
			<li>
				Various default filters provided:
				<ul>
					<li>byte[]&lt;--&gt;Base64 encoded strings</li>
					<li>Date/Calendar&lt;--&gt;ISO8601/RFC822/Long</li>
				</ul>
			</li>
			<li>
				New {@link org.apache.juneau.html.HtmlParser} and {@link org.apache.juneau.urlencoding.UrlEncodingParser} classes.
			</li>
			<li>
				HtmlSerializer now produces XHTML.
			</li>
		</ul>
	</div>

</div>
</body>								
