
<!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>
<h1 class='title'>Apache Juneau {@property juneauVersion} Documentation</h1>

<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>
<p>
	Apache Juneau&trade; is a single cohesive Java ecosystem consisting of the following parts:
</p>
<table class='styled w800'>
	<tr>
		<th>Group</th><th>Component</th><th>Description</th>
	</tr>
	
	<tr class='dark bb'>
		<td rowspan="4" style='text-align:center;font-weight:bold;padding:20px;'>Juneau Core</td>
		<td class='code'><a class='doclink' href='#juneau-marshall'>juneau-marshall</a></td>
		<td>
			A universal toolkit for marshalling POJOs to a wide variety of content types using a common framework with no external library dependencies.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='#juneau-marshall-rdf'>juneau-marshall-rdf</a></td>
		<td>
			Extended marshalling support for RDF languages.				
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='#juneau-dto'>juneau-dto</a></td>
		<td>
			A variety of predefined DTOs for serializing and parsing languages such as HTML5, Swagger and ATOM.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='#juneau-config'>juneau-config</a></td>
		<td>
			A sophisticated configuration file API.
		</td>
	</tr>
	
	<tr class='light bb'>
		<td rowspan="5" style='text-align:center;font-weight:bold;padding:20px;'>Juneau REST</td>
		<td class='code'><a class='doclink' href='#juneau-rest-server'>juneau-rest-server</a></td>
		<td>
			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.0+ container.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='#juneau-rest-server-springboot'>juneau-rest-server-springboot</a></td>
		<td>
			Spring boot integration support.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='#juneau-rest-server-jaxrs'>juneau-rest-server-jaxrs</a></td>
		<td>
			JAX/RS integration support.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='#juneau-rest-client'>juneau-rest-client</a></td>
		<td>
			A universal REST client API for interacting with Juneau or 3rd-party REST interfaces using POJOs and proxy interfaces.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='#juneau-rest-mock'>juneau-rest-mock</a></td>
		<td>
			Mocking APIs for server-less end-to-end testing of REST server and client APIs.
		</td>
	</tr>

	<tr class='dark bb'>
		<td rowspan="4" style='text-align:center;font-weight:bold;padding:20px;'>Examples</td>
		<td class='code'><a class='doclink' href='#juneau-examples-core'>juneau-examples-core</a></td>
		<td>
			Juneau Core API examples.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='#juneau-examples-rest'>juneau-examples-rest</a></td>
		<td>
			Juneau REST API examples.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='#juneau-examples-rest-jetty'>juneau-examples-rest-jetty</a></td>
		<td>
			Juneau REST API examples using Jetty deployment.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='#juneau-examples-rest-springboot'>juneau-examples-rest-springboot</a></td>
		<td>
			Juneau REST API examples using Spring Boot deployment.
		</td>
	</tr>

</table>

<a href='#TOC' id='TOC'></a><h5 class='toc'>Table of Contents</h5>
<ol class='toc'>
	<li><p class='toc2'><a class='doclink' href='#Introduction'>Introduction</a></p>
	<ol>
		<li><p><a class='doclink' href='#Introduction.Features'>Features</a><span class='update'>8.1.0-updated</span></p>
		<li><p><a class='doclink' href='#Introduction.Components'>Components</a></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-marshall'>juneau-marshall</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.Marshalls'>Marshalls</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.HttpPartSerializers'>HTTP Part Serializers</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.HttpPartParsers'>HTTP Part Parsers</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.ConfigurableProperties'></a><span class='update'><b>8.1.3-updated</b></span></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.ConfigurableProperties.Common'>Common Serializer Properties</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.ConfigurableProperties.CommonSerializer'>Common Serializer Properties</a><span class='update'>8.1.0-updated</span></p>
			<li><p><a class='doclink' href='#juneau-marshall.ConfigurableProperties.CommonParser'>Common Parser Properties</a><span class='update'><b>8.1.3-updated</b></span></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.ConfigurableAnnotations'>Configurable Annotations</a><span class='update'>8.1.0-new, <b>8.1.3-updated</b></span></p>
		<li><p><a class='doclink' href='#juneau-marshall.ObjectMap'>ObjectMap and ObjectList</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.Groups'>SerializerGroups and ParserGroups</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.Transforms.PojoSwaps'>PojoSwaps</a><span class='update'>8.1.0-updated</span></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.DefaultPojoSwaps'>Default PojoSwaps</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.AutoPojoSwaps'>Auto-detected POJO swaps</a><span class='update'>8.1.0-new</span></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.PerMediaTypePojoSwaps'>Per-media-type PojoSwaps</a><span class='update'>8.1.0-updated</span></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.OneWayPojoSwaps'>One-way PojoSwaps</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.SwapAnnotation'>@Swap Annotation</a><span class='update'>8.0.0-updated</span></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.TemplatedSwaps'>Templated Swaps</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.SurrogateClasses'>Surrogate Classes</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.BeanAnnotation'>@Bean Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.BeanpAnnotation'>@Beanp Annotation</a><span class='update'>8.1.0-updated, 8.1.2-updated</span></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.BeancAnnotation'>@Beanc Annotation</a><span class='update'>8.1.0-updated, 8.1.2-updated</span></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.BeanIgnoreAnnotation'>@BeanIgnore Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.NamePropertyAnnotation'>@NameProperty Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.ParentPropertyAnnotation'>@ParentProperty Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.PojoBuilders'>POJO Builders</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.BeanFilters'>BeanFilter Class</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.InterfaceFilters'>Interface Filters</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.StopClasses'>Stop Classes</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.Transforms.BypassSerialization'>Bypass Serialization using Readers and InputStreams</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.DynamicallyAppliedAnnotations'>Dynamically Applied Annotations</a><span class='update'><b>8.1.3-new</b></span></p>
		<li><p><a class='doclink' href='#juneau-marshall.BeanDictionaries'>Bean Names and Dictionaries</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.BeanDictionaries.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.Recursion'>Non-Tree Models and Recursion Detection</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.ParsingIntoGenericModels'>Parsing into Generic Models</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.ReadingContinuousStreams'>Reading Continuous Streams</a></p>
		<li><p><a class='doclink' href='#juneau-marshall.URIs'>URIs</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.JsonDetails'>JSON Details</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.JsonDetails.Methodology'>JSON Methodology</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.JsonDetails.Serializers'>JSON Serializers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.JsonDetails.SimplifiedJson'>Simplified JSON</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.JsonDetails.Parsers'>JSON Parsers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.JsonDetails.JsonAnnotation'>@Json Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.JsonDetails.JsonSchema'>JSON-Schema Support</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.XmlDetails'>XML Details</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.XmlDetails.Methodology'>XML Methodology</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.XmlDetails.Serializers'>XML Serializers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.XmlDetails.Parsers'>XML Parsers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.XmlDetails.BeanTypeNameAnnotation'>@Bean(typeName) Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.XmlDetails.XmlChildNameAnnotation'>@Xml(childName) Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.XmlDetails.XmlFormatAnnotation'>@Xml(format) Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.XmlDetails.Namespaces'>Namespaces</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.XmlDetails.XmlSchema'>XML-Schema Support</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.HtmlDetails'>HTML Details</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.HtmlDetails.Methodology'>HTML Methodology</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.HtmlDetails.Serializers'>HTML Serializers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.HtmlDetails.Parsers'>HTML Parsers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.HtmlDetails.HtmlAnnotation'>@Html Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.HtmlDetails.HtmlRenderAnnotation'>@Html(render) Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.HtmlDetails.HtmlDocSerializer'>HtmlDocSerializer</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.HtmlDetails.BasicHtmlDocTemplate'>BasicHtmlDocTemplate</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.HtmlDetails.CustomTemplates'>Custom Templates</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.HtmlDetails.HtmlSchema'>HTML-Schema Support</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.UonDetails'>UON Details</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.UonDetails.Methodology'>UON Methodology</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.UonDetails.Serializers'>UON Serializers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.UonDetails.Parsers'>UON Parsers</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.UrlEncodingDetails'>URL-Encoding Details</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.UrlEncodingDetails.Methodology'>URL-Encoding Methodology</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.UrlEncodingDetails.Serializers'>URL-Encoding Serializers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.UrlEncodingDetails.Parsers'>URL-Encoding Parsers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.UrlEncodingDetails.UrlEncodingAnnotation'>@UrlEncoding Annotation</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.MsgPackDetails'>MessagePack Details</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.MsgPackDetails.Serializers'>MessagePack Serializers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.MsgPackDetails.Parsers'>MessagePack Parsers</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.OpenApiDetails'>OpenAPI Details</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.OpenApiDetails.Methodology'>OpenAPI Methodology</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.OpenApiDetails.Serializers'>OpenAPI Serializers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.OpenApiDetails.Parsers'>OpenAPI Parsers</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.SimpleVariableLanguage'>Simple Variable Language</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall.SimpleVariableLanguage.SvlVariables'>SVL Variables</a><span class='update'>8.0.0-updated, 8.1.0-updated</span></p>
			<li><p><a class='doclink' href='#juneau-marshall.SimpleVariableLanguage.VarResolvers'>VarResolvers and VarResolverSessions</a></p>
			<li><p><a class='doclink' href='#juneau-marshall.SimpleVariableLanguage.DefaultVarResolver'>VarResolver.DEFAULT</a><span class='update'>8.1.0-new</span></p>
			<li><p><a class='doclink' href='#juneau-marshall.SimpleVariableLanguage.OtherNotes'>Other Notes</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-marshall.BestPractices'>Best Practices</a></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-marshall-rdf'>juneau-marshall-rdf</a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-marshall-rdf.RdfDetails'>RDF Details</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-marshall-rdf.RdfDetails.Serializers'>RDF Serializers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall-rdf.RdfDetails.Parsers'>RDF Parsers</a></p>
			<li><p><a class='doclink' href='#juneau-marshall-rdf.RdfDetails.RdfAnnotation'>@Rdf Annotation</a></p>
			<li><p><a class='doclink' href='#juneau-marshall-rdf.RdfDetails.Namespaces'>Namespaces</a></p>
			<li><p><a class='doclink' href='#juneau-marshall-rdf.RdfDetails.UriProperties'>URI Properties</a></p>
			<li><p><a class='doclink' href='#juneau-marshall-rdf.RdfDetails.RootProperty'>Root Property</a></p>
			<li><p><a class='doclink' href='#juneau-marshall-rdf.RdfDetails.TypedLiterals'>Typed Literals</a></p>
		</ol>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-dto'>juneau-dto</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>
		<li><p><a class='doclink' href='#juneau-dto.SwaggerUI'>Swagger UI</a></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-config'>juneau-config</a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-config.Overview'>Overview</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-config.Overview.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.EntryTypes.PrimitiveTypes'>Primitive Types</a></p>
			<li><p><a class='doclink' href='#juneau-config.EntryTypes.POJOs'>POJOs</a></p>
			<li><p><a class='doclink' href='#juneau-config.EntryTypes.Arrays'>Arrays</a></p>
			<li><p><a class='doclink' href='#juneau-config.EntryTypes.Collections'>Collections</a></p>
			<li><p><a class='doclink' href='#juneau-config.EntryTypes.BinaryData'>Binary Data</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-config.Variables'>Variables</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-config.Variables.LogicVariables'>Logic Variables</a></p>
		</ol>
		<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.SettingValues.FileSystemChanges'>File System Changes</a></p>
			<li><p><a class='doclink' href='#juneau-config.SettingValues.CustomEntrySerialization'>Custom Entry Serialization</a></p>
			<li><p><a class='doclink' href='#juneau-config.SettingValues.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.Imports'>Imports</a><span class='update'>8.1.0-updated</span></p>
		<li><p><a class='doclink' href='#juneau-config.ConfigStores'>Config Stores</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-config.ConfigStores.ConfigMemoryStore'>ConfigMemoryStore</a></p>
			<li><p><a class='doclink' href='#juneau-config.ConfigStores.ConfigFileStore'>ConfigFileStore</a></p>
			<li><p><a class='doclink' href='#juneau-config.ConfigStores.CustomConfigStores'>Custom ConfigStores</a></p>
			<li><p><a class='doclink' href='#juneau-config.ConfigStores.ConfigStoreListeners'>ConfigStore Listeners</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>
		<li><p><a class='doclink' href='#juneau-config.SystemDefaultConfig'>System Default Config</a><span class='update'>8.0.0-new, 8.1.0-updated</span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-rest-server'>juneau-rest-server</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><span class='update'>8.1.0-updated</span></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Instantiation'>Instantiation</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.Instantiation.RestServlet'>RestServlet</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRestServlet'>BasicRestServlet</a><span class='update'>8.1.0-updated</span></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRest'>BasicRest</a><span class='update'>8.1.0-new</span></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Instantiation.Children'>Children</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRestServletGroup'>BasicRestServletGroup</a><span class='update'>8.1.0-updated</span></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Instantiation.BasicRestGroup'>BasicRestGroup</a><span class='update'>8.1.0-new</span></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Instantiation.ResourceResolvers'>Resource Resolvers</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Instantiation.LifecycleHooks'>Lifecycle Hooks</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-server.Rest'>@Rest</a><span class='update'>8.1.2-updated</span></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.Rest.AnnotationInheritance'>Annotation Inheritance</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Rest.RestPath'>@Rest(path)</a><span class='update'>8.1.0-new, 8.1.2-updated</span></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.RestMethod.MethodParameters'>Java Method Parameters</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.RestRequest'>RestRequest</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.RestResponse'>RestResponse</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.RequestBody'>RequestBody</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.RequestHeaders'>RequestHeaders</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.RequestAttributes'>RequestAttributes</a><span class='update'>8.1.0-new</span></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.RequestQuery'>RequestQuery</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.RequestFormData'>RequestFormData</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.RestMethodPath'>@RestMethod(path)</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.RequestPathMatch'>RequestPathMatch</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.MethodReturnTypes'>Method Return Types</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.ReaderResource'>ReaderResource</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.StreamResource'>StreamResource</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.RestMethodMatchers'>@RestMethod(matchers)</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.PredefinedResponses'>Predefined Responses</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.PredefinedExceptions'>Predefined Exceptions</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.RestMethod.PredefinedHelperBeans'>Predefined Helper Beans</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-server.restRPC'>restRPC</a><span class='update'>8.0.0-updated</span></p>
		<li><p><a class='doclink' href='#juneau-rest-server.OpenApiSchemaPartParsing'>OpenAPI Schema Part Parsing</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.OpenApiSchemaPartSerializing'>OpenAPI Schema Part Serializing</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations'>HTTP-Part Annotations</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.Body'>@Body</a><span class='update'>8.1.0-updated</span></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.FormData'>@FormData</a><span class='update'>8.1.0-updated</span></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.HasFormData'>@HasFormData</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.Query'>@Query</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.HasQuery'>@HasQuery</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.Header'>@Header</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.Path'>@Path</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.Request'>@Request</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.Response'>@Response</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.ResponseHeader'>@ResponseHeader</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HttpPartAnnotations.ResponseStatus'>@ResponseStatus</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><span class='update'>8.0.0-updated</span></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.ConfigurableProperties'>Configurable Properties</a><span class='update'>8.1.0-updated</span></p>
		<li><p><a class='doclink' href='#juneau-rest-server.ConfigurableAnnotations'>Configurable Annotations</a><span class='update'>8.1.0-new</span></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Transforms'>Transforms</a><span class='update'>8.1.0-updated</span></p>
		<li><p><a class='doclink' href='#juneau-rest-server.URIs'>URIs</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.Guards'>Guards</a></p>
		<li><p><a class='doclink' href='#juneau-rest-server.RoleGuards'>Role guards</a><span class='update'>8.1.0-new</span></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.RestInfoProvider'>RestInfoProvider</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.RestInfoProvider.BasicRestInfoProvider'>BasicRestInfoProvider</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-server.Swagger'>Swagger</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.Swagger.BasicRestServlet'>BasicRestServlet</a><span class='update'>8.1.0-updated</span></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Swagger.BasicSwaggerInfo'>Basic Swagger Info</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Swagger.Tags'>Tags</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Swagger.Operations'>Operations</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Swagger.Parameters'>Parameters</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Swagger.ParameterExamples'>Parameter Examples</a><span class='update'>8.1.0-updated</span></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Swagger.Responses'>Responses</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Swagger.ResponseExamples'>Response Examples</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Swagger.Models'>Models</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.Swagger.Stylesheet'>SwaggerUI.css</a></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-server.ExecutionStatistics'>REST method execution statistics</a><span class='update'><b>8.1.3-new</b></span></p>
		<li><p><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation'>@HtmlDocConfig</a><span class='update'>8.1.0-updated</span></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation.UIvsDI'>User Interfaces (UI) vs. Developer Interfaces (DI)</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation.Widgets'>Widgets</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation.PredefinedWidgets'>Predefined Widgets</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation.UiCustomization'>UI Customization</a></p>
			<li><p><a class='doclink' href='#juneau-rest-server.HtmlDocAnnotation.Stylesheets'>Stylesheets</a><span class='update'>8.1.0-updated</span></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.LoggingAndDebugging'>Logging / Debugging</a><span class='update'>8.1.0-new</span></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.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.OtherNotes'>Other Notes</a></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-rest-server-jaxrs'>juneau-rest-server-jaxrs</a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-rest-server-jaxrs.BaseProvider'>Juneau JAX-RS Provider</a></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-rest-server-springboot'>juneau-rest-server-springboot</a><span class='update'>8.0.0-new</span></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-rest-server-springboot.Overview'>Overview</a><span class='update'>8.0.0-new</span></p>
		<li><p><a class='doclink' href='#juneau-rest-server-springboot.ChildResources'>Child Resources</a><span class='update'>8.1.0-new</span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-rest-client'>juneau-rest-client</a></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-rest-client.RestProxies'>REST Proxies</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-client.RestProxies.Remote'>@Remote</a><span class='update'>8.1.2-updated</span></p>
			<li><p><a class='doclink' href='#juneau-rest-client.RestProxies.RemoteMethod'>@RemoteMethod</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.RestProxies.Body'>@Body</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.RestProxies.FormData'>@FormData</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.RestProxies.Query'>@Query</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.RestProxies.Header'>@Header</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.RestProxies.Path'>@Path</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.RestProxies.Request'>@Request</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.RestProxies.Response'>@Response</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.RestProxies.DualPurposeInterfaces'>Dual-purpose (end-to-end) interfaces</a><span class='update'>8.0.0-new</span></p>
		</ol>
		<li><p><a class='doclink' href='#juneau-rest-client.SSL'>SSL Support</a></p>
		<li><p><a class='doclink' href='#juneau-rest-client.Authentication'>Authentication</a></p>
		<ol>
			<li><p><a class='doclink' href='#juneau-rest-client.Authentication.BASIC'>BASIC Authentication</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.Authentication.FORM'>FORM-based Authentication</a></p>
			<li><p><a class='doclink' href='#juneau-rest-client.Authentication.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.Other'>Other Useful Methods</a></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-rest-mock'>juneau-rest-mock</a><span class='update'>8.1.0-new</span></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-rest-mock.MockRest'>MockRest</a><span class='update'>8.1.0-new</span></p>
		<li><p><a class='doclink' href='#juneau-rest-mock.MockRemote'>MockRemote</a><span class='update'>8.1.0-new, 8.1.2-updated</span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-microservice-core'>juneau-microservice-core</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-microservice-core.Overview'>Microservice Overview</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-core.LifecycleMethods'>Lifecycle Methods</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-core.Args'>Args</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-core.Manifest'>Manifest</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-core.Config'>Config</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-core.SystemProperties'>System properties</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-core.VarResolver'>VarResolver</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-core.ConsoleCommands'>Console Commands</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-core.Logging'>Logging</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-core.Listeners'>Listeners</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-microservice-jetty'>juneau-microservice-jetty</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-microservice-jetty.Overview'>Overview</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-jetty.LifecycleMethods'>Lifecycle Methods</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-jetty.ResourceClasses'>Resource Classes</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-jetty.PredefinedResourceClasses'>Predefined Resource Classes</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-jetty.Config'>Config</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-jetty.JettyXml'>Jetty.xml file</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-jetty.UiCustomization'>UI Customization</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-microservice-jetty.Extending'>Extending JettyMicroservice</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#my-jetty-microservice'>my-jetty-microservice</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
	<ol>
		<li><p><a class='doclink' href='#my-jetty-microservice.Installing'>Installing in Eclipse</a><span class='update'>8.0.0-updated, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#my-jetty-microservice.Running'>Running in Eclipse</a><span class='update'>8.0.0-updated, 8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#my-jetty-microservice.Building'>Building and Running from Command-Line</a><span class='update'>8.0.0-updated, 8.1.2-deprecated</span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#my-springboot-microservice'>my-springboot-microservice</a><span class='update'>8.0.0-new</span></p>
	<ol>
		<li><p><a class='doclink' href='#my-springboot-microservice.Installing'>Installing in Eclipse</a><span class='update'>8.0.0-new</span></p>
		<li><p><a class='doclink' href='#my-springboot-microservice.Running'>Running in Eclipse</a><span class='update'>8.0.0-new</span></p>
		<li><p><a class='doclink' href='#my-springboot-microservice.Building'>Building and Running from Command-Line</a><span class='update'>8.0.0-new</span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-examples-core'>juneau-examples-core</a><span class='update'>8.0.0-updated</span></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-examples-core.Installing'>Installing in Eclipse</a><span class='update'>8.0.0-new</span></p>
		<li><p><a class='doclink' href='#juneau-examples-core.Examples'>Examples</a><span class='update'>8.0.0-new</span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-examples-rest'>juneau-examples-rest</a><span class='update'>8.0.0-updated</span></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-examples-rest.RootResources'>RootResources</a><span class='update'>8.0.0-updated, 8.1.0-updated</span></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.HelloWorldResource'>HelloWorldResource</a><span class='update'>8.0.0-updated</span></p>
		<li><p><a class='doclink' href='#juneau-examples-rest.DtoExamples'>DtoExamples</a><span class='update'>8.0.0-new, 8.1.0-updated</span></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 class='toc2'><a class='doclink' href='#juneau-examples-rest-jetty'>juneau-examples-rest-jetty</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-examples-rest-jetty.Installing'>Installing in Eclipse</a><span class='update'>8.0.0-new,8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-examples-rest-jetty.Running'>Running in Eclipse</a><span class='update'>8.0.0-new,8.1.2-deprecated</span></p>
		<li><p><a class='doclink' href='#juneau-examples-rest-jetty.Building'>Building and Running from Command-Line</a><span class='update'>8.0.0-new,8.1.2-deprecated</span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-examples-rest-springboot'>juneau-examples-rest-springboot</a><span class='update'>8.0.0-new</span></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-examples-rest-springboot.Installing'>Installing in Eclipse</a><span class='update'>8.0.0-new</span></p>
		<li><p><a class='doclink' href='#juneau-examples-rest-springboot.Running'>Running in Eclipse</a><span class='update'>8.0.0-new</span></p>
		<li><p><a class='doclink' href='#juneau-examples-rest-springboot.Building'>Building and Running from Command-Line</a><span class='update'>8.0.0-new</span></p>
		<li><p><a class='doclink' href='#juneau-examples-rest-springboot.DeployingToHeroku'>Deploying to Heroku</a><span class='update'>8.0.0-new</span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#Glossaries'>Glossaries</a><span class='update'><b>8.1.3-new</b></span></p>
	<ol>
		<li><p><a class='doclink' href='#Glossaries.ConfigurablePropertiesGlossary'>Configurable Properties Glossary</a><span class='update'><b>8.1.3-new</b></span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#Security'>Security Best-Practices</a></p>
	<ol>
		<li><p><a class='doclink' href='#Security.juneau-marshall'>juneau-marshall</a></p>
		<li><p><a class='doclink' href='#Security.juneau-svl'>juneau-svl</a></p>
		<li><p><a class='doclink' href='#Security.juneau-rest-server'>juneau-rest-server</a></p>
	</ol>
</ol>


<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#Introduction' id='Introduction'>1 - Introduction</a></h2>
<div class='topic'><!-- START: 1 - Introduction -->
<p>
	Apache Juneau&trade; is a single cohesive Java ecosystem consisting of the following parts:
</p>
<table class='styled w800'>
	<tr>
		<th>Group</th><th>Component</th><th>Description</th>
	</tr>
	
	<tr class='dark bb'>
		<td rowspan="4" style='text-align:center;font-weight:bold;padding:20px;'>Juneau Core</td>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-marshall'>juneau-marshall</a></td>
		<td>
			A universal toolkit for marshalling POJOs to a wide variety of content types using a common framework with no external library dependencies.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-marshall-rdf'>juneau-marshall-rdf</a></td>
		<td>
			Extended marshalling support for RDF languages.				
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-dto'>juneau-dto</a></td>
		<td>
			A variety of predefined DTOs for serializing and parsing languages such as HTML5, Swagger and ATOM.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-config'>juneau-config</a></td>
		<td>
			A sophisticated configuration file API.
		</td>
	</tr>
	
	<tr class='light bb'>
		<td rowspan="5" style='text-align:center;font-weight:bold;padding:20px;'>Juneau REST</td>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-rest-server'>juneau-rest-server</a></td>
		<td>
			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.0+ container.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-rest-server-springboot'>juneau-rest-server-springboot</a></td>
		<td>
			Spring boot integration support.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-rest-server-jaxrs'>juneau-rest-server-jaxrs</a></td>
		<td>
			JAX/RS integration support.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-rest-client'>juneau-rest-client</a></td>
		<td>
			A universal REST client API for interacting with Juneau or 3rd-party REST interfaces using POJOs and proxy interfaces.
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-rest-mock'>juneau-rest-mock</a></td>
		<td>
			Mocking APIs for server-less end-to-end testing of REST server and client APIs.
		</td>
	</tr>

	<tr class='dark bb'>
		<td rowspan="4" style='text-align:center;font-weight:bold;padding:20px;'>Examples</td>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-examples-core'>juneau-examples-core</a></td>
		<td>
			Juneau Core API examples.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-examples-rest'>juneau-examples-rest</a></td>
		<td>
			Juneau REST API examples.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-examples-rest-jetty'>juneau-examples-rest-jetty</a></td>
		<td>
			Juneau REST API examples using Jetty deployment.
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='http://juneau.apache.org/site/apidocs-{@property juneauVersion}/overview-summary.html#juneau-examples-rest-springboot'>juneau-examples-rest-springboot</a></td>
		<td>
			Juneau REST API examples using Spring Boot deployment.
		</td>
	</tr>

</table>
<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 (at a time when the concept was new), 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>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#Introduction.Features' id='Introduction.Features'>1.1 - Features</a><span class='update'>8.1.0-updated</span></h3>
<div class='topic'><!-- START: 1.1 - Introduction.Features -->
<ul class='spaced-list'>
	<li>
		Fast memory-efficient serialization.
	<li>
		Fast, safe, memory-efficient parsing.  Parsers are not susceptible to deserialization attacks.
	<li>
		KISS is our mantra!  No auto-wiring.  No code generation.  No dependency injection.  Just add it to your classpath and use it.  Extremely simple unit testing!
	<li>
		Enjoyable to use
	<li>
		Tiny - ~1MB
	<li>
		Exhaustively tested
	<li>
		Lots of up-to-date documentation and examples
	<li>
		Minimal library dependencies: 
		<ul>
			<li><b>juneau-marshall</b>, <b>juneau-dto</b>, <b>juneau-svl</b>, <b>juneau-config</b> - No external dependencies.  Entirely self-contained.
			<li><b>juneau-marshall-rdf</b> - Optional RDF support.  Requires Apache Jena 2.7.1+.
			<li><b>juneau-rest-server</b> - Any Servlet 3.1.0+ container.
			<li><b>juneau-rest-client</b> - Apache HttpClient 4.5+.
			<li><b>juneau-microservice</b> - Eclipse Jetty.
		</ul>
	<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>
</div><!-- END: 1.1 - Introduction.Features -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#Introduction.Components' id='Introduction.Components'>1.2 - Components</a></h3>
<div class='topic'><!-- START: 1.2 - Introduction.Components -->
<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 <c>"org.apache.juneau"</c>:
</p>
<table class='styled w800'>
	<tr>
		<th>Category</th><th>Maven Artifacts</th><th>Description</th><th>Prereqs</th>
	</tr>
	<tr class='dark bb'>
		<td rowspan="4" 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>OpenAPI
				<li>SOAP/XML
				<li>CSV
				<li>BSON (coming soon)
				<li>YAML (coming soon)
				<li>Protobuf (coming soon)
				<li>Amazon Ion (coming soon)
			</ul>
		</td>
		<td>
			<ul style='margin:0px 10px;'>
				<li>Java 8
			</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 8
				<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 8+</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 8+</li></ul></td>
	</tr>
	<tr class='light bb'>
		<td rowspan="4" 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 8
				<li>Servlet 3.1+
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='#juneau-rest-server-springboot'>juneau-rest-server-springboot</a></td>
		<td>
			Spring Boot integration support
		</td>
		<td>
			<ul style='margin:0px 10px;'>
				<li>Java 8+
				<li>Spring Boot 2.0+
			</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>
			JAX-RS support
		</td>
		<td>
			<ul style='margin:0px 10px;'>
				<li>Java 8+
				<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 8+
				<li>Apache HttpClient 4.5+
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td rowspan="4" style='text-align:center;font-weight:bold;padding:20px;' class='code'>juneau-microservice</td>
		<td class='code'><a class='doclink' href='#juneau-microservice-core'>juneau-microservice-core</a></td>
		<td>
			Microservice API
		</td>
		<td>
			<ul style='margin:0px 10px;'>
				<li>Java 8+
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='#juneau-microservice-jetty'>juneau-microservice-jetty</a></td>
		<td>
			Jetty Microservice API
		</td>
		<td>
			<ul style='margin:0px 10px;'>
				<li>Java 8+
				<li>Eclipse Jetty 9.4+
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='#my-jetty-microservice'>my-jetty-microservice</a></td>
		<td>
			Developer template project for Jetty-based microservices.
		</td>
		<td>
			<ul style='margin:0px 10px;'>
				<li>Java 8+
				<li>Eclipse Jetty 9.4+
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td class='code'><a class='doclink' href='#my-springboot-microservice'>my-springboot-microservice</a></td>
		<td>
			Developer template project for Spring-Boot-based microservices.
		</td>
		<td>
			<ul style='margin:0px 10px;'>
				<li>Java 8+
				<li>Spring Boot 2.0+
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td rowspan="4" 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='light bb'>
		<td class='code'><a class='doclink' href='#juneau-examples-rest-jetty'>juneau-examples-rest-jetty</a></td>
		<td>
			REST code examples deployed using Jetty
		</td>
		<td></td>
	</tr>
	<tr class='light bb'>
		<td class='code'><a class='doclink' href='#juneau-examples-rest-springboot'>juneau-examples-rest-springboot</a></td>
		<td>
			REST code examples deployed using Spring Boot
		</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'><c>juneau-all</c></td>
		<td>
			Combination of the following:
			<ul style='margin:0px 10px;'>
				<li>juneau-marshall
				<li>juneau-dto
				<li>juneau-config
				<li>juneau-rest-server
				<li>juneau-rest-client
			</ul>
		</td>
		<td>
			<ul style='margin:0px 10px;'>
				<li>Java 8+
				<li>Servlet 3.1+
				<li>Apache HttpClient 4.5+
			</ul>
		</td>
	</tr>
</table>

<p>
	The current version of Juneau is <c>{@property juneauVersion}</c>.
	The easiest way to pull in the library is through the following maven dependency:
</p>
<p class='bpcode w800'>
	<xt>&lt;dependency&gt;</xt>
		<xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
		<xt>&lt;artifactId&gt;</xt>juneau-all<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	
<p>
	If you would like to work with the bleeding-edge code, you can access the <c>{@property juneauVersionNext}-SNAPSHOT</c>
	version through the following repository:
</p>
<p class='bpcode w800'>
	<xt>&lt;pluginRepositories&gt;
		&lt;pluginRepository&gt;
			&lt;id&gt;<xv>apache.snapshots</xv>&lt;/id&gt;
			&lt;url&gt;<xv>http://repository.apache.org/snapshots/</xv>&lt;/url&gt;
			&lt;snapshots&gt;
				&lt;enabled&gt;<xv>true</xv>&lt;/enabled&gt;
				&lt;updatePolicy&gt;<xv>always</xv>&lt;/updatePolicy&gt;
			&lt;/snapshots&gt;
		&lt;/pluginRepository&gt;
	&lt;/pluginRepositories&gt;</xt>
</p>	
<p>
	Each of the components are also packaged as stand-alone OSGi modules.
</p>
</div><!-- END: 1.2 - Introduction.Components -->
</div><!-- END: 1 - Introduction -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-marshall' id='juneau-marshall'>2 - juneau-marshall</a></h2>
<div class='topic'><!-- START: 2 - juneau-marshall -->
<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<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>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	

<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-marshall-{@property juneauVersion}.jar 
</p>	

<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.marshall_{@property juneauVersion}.jar 
</p>	

<p>
	The <c>juneau-marshall</c> 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>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Serializers' id='juneau-marshall.Serializers'>2.1 - Serializers</a></h3>
<div class='topic'><!-- START: 2.1 - juneau-marshall.Serializers -->
<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='bpcode w800'>
	<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:
	//	"{name:'John Smith',age:21}"</jc>
	String json = SimpleJsonSerializer.<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='bpcode w800'>
	<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, <c>Maps</c>, <c>Collections</c>, 
	beans, and arrays. 
	Extensible support for other data types such as <c>Calendars</c>, <c>Dates</c>, 
	<c>Iterators</c> is available through the use of POJO swaps (described later).
</p>
<p>
	The class hierarchy for the serializers (excluding specialized subclasses) are:
</p>
<ul class='javatree'>
	<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>
			<li class='jc'>{@link org.apache.juneau.json.JsonSchemaSerializer}
			<li class='jc'>{@link org.apache.juneau.json.SimpleJsonSerializer}
			</ul>
			<li class='jc'>{@link org.apache.juneau.plaintext.PlainTextSerializer}
			<li class='jc'>{@link org.apache.juneau.jena.RdfSerializer}
			<ul>
				<li class='jc'>{@link org.apache.juneau.jena.N3Serializer}
				<li class='jc'>{@link org.apache.juneau.jena.NTripleSerializer}
				<li class='jc'>{@link org.apache.juneau.jena.RdfXmlSerializer}
				<li class='jc'>{@link org.apache.juneau.jena.RdfXmlAbbrevSerializer}
				<li class='jc'>{@link org.apache.juneau.jena.TurtleSerializer}
			</ul>
			<li class='jc'>{@link org.apache.juneau.uon.UonSerializer}
			<ul>
				<li class='jc'>{@link org.apache.juneau.oapi.OpenApiSerializer}
				<li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer}
			</ul>
			<li class='jc'>{@link org.apache.juneau.xml.XmlSerializer}
			<ul>
				<li class='jc'>{@link org.apache.juneau.html.HtmlSerializer}
				<ul>
					<li class='jc'>{@link org.apache.juneau.html.HtmlSchemaSerializer}
					<li class='jc'>{@link org.apache.juneau.html.HtmlStrippedDocSerializer}
					<ul>
						<li class='jc'>{@link org.apache.juneau.html.HtmlDocSerializer}
						<ul>
							<li class='jc'>{@link org.apache.juneau.html.HtmlSchemaDocSerializer}
						</ul>
					</ul>
				</ul>
				<li class='jc'>{@link org.apache.juneau.soap.SoapXmlSerializer}
				<li class='jc'>{@link org.apache.juneau.xml.XmlDocSerializer}
				<li class='jc'>{@link org.apache.juneau.xmlschema.XmlSchemaSerializer}
				<ul>
					<li class='jc'>{@link org.apache.juneau.xmlschema.XmlSchemaDocSerializer}
				</ul>
			</ul>
		</ul>
		<li class='jac'>{@link org.apache.juneau.serializer.OutputStreamSerializer}
		<ul>
			<li class='jc'>{@link org.apache.juneau.jso.JsoSerializer}
			<li class='jc'>{@link org.apache.juneau.msgpack.MsgPackSerializer}
		</ul>
	</ul>
</ul>
</div><!-- END: 2.1 - juneau-marshall.Serializers -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Parsers' id='juneau-marshall.Parsers'>2.2 - Parsers</a></h3>
<div class='topic'><!-- START: 2.2 - juneau-marshall.Parsers -->
<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='bpcode w800'>
	<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='bpcode w800'>
	<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>
<br>
<div 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).
	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.  
</div>

<p>
	The class hierarchy for the parsers (excluding specialized subclasses) are:
</p>
<ul class='javatree'>
	<li class='jac'>{@link org.apache.juneau.parser.Parser}
	<ul>
		<li class='jac'>{@link org.apache.juneau.parser.ReaderParser}
		<ul>
			<li class='jc'>{@link org.apache.juneau.json.JsonParser}
			<li class='jc'>{@link org.apache.juneau.plaintext.PlainTextParser}
			<li class='jc'>{@link org.apache.juneau.jena.RdfParser}
			<ul>
				<li class='jc'>{@link org.apache.juneau.jena.RdfXmlParser}
				<li class='jc'>{@link org.apache.juneau.jena.N3Parser}
				<li class='jc'>{@link org.apache.juneau.jena.NTripleParser}
				<li class='jc'>{@link org.apache.juneau.jena.TurtleParser}
			</ul>
			<li class='jc'>{@link org.apache.juneau.uon.UonParser}
			<ul>
				<li class='jc'>{@link org.apache.juneau.oapi.OpenApiParser}
				<li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingParser}
			</ul>
			<li class='jc'>{@link org.apache.juneau.xml.XmlParser}
			<ul>
				<li class='jc'>{@link org.apache.juneau.html.HtmlParser}
			</ul>
		</ul>
		<li class='jac'>{@link org.apache.juneau.parser.InputStreamParser}
		<ul>
			<li class='jc'>{@link org.apache.juneau.jso.JsoParser}
			<li class='jc'>{@link org.apache.juneau.msgpack.MsgPackParser}
		</ul>
	</ul>
</ul>
</div><!-- END: 2.2 - juneau-marshall.Parsers -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Marshalls' id='juneau-marshall.Marshalls'>2.3 - Marshalls</a></h3>
<div class='topic'><!-- START: 2.3 - juneau-marshall.Marshalls -->
<p>
	{@link org.apache.juneau.marshall.Marshall Marshalls} are simple pairings of a {@link org.apache.juneau.serializer.Serializer}
	and {@link org.apache.juneau.parser.Parser} with convenience methods for serializing and parsing POJOs.
</p>
<ul class='javatree'>
	<li class='jac'>{@link org.apache.juneau.marshall.Marshall}
	<ul>
		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#read(Object,Class) read(Object,Class)}
		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#read(Object,Type,Type...) read(Object,Type,Type...)}
		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#write(Object) write(Object)} 
		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#write(Object,Object) write(Object,Object)}
		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#toString(Object) toString(Object)}
		<li class='jm'>{@link org.apache.juneau.marshall.Marshall#println(Object) println(Object)}
	</ul>
</ul>
<p>
	Marshalls are often cleaner to use on-the-fly since they have simplified names.
</p>
<p>
	The following shows the {@link org.apache.juneau.marshall.Json} marshall in action:
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Using instance.</jc>
	Json json = <jk>new</jk> Json();
	MyPojo myPojo = json.read(string, MyPojo.<jk>class</jk>);
	String string = json.write(myPojo);
</p>
<p class='bpcode w800'>
	<jc>// Using DEFAULT instance.</jc>
	MyPojo myPojo = Json.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
	String string = Json.<jsf>DEFAULT</jsf>.write(myPojo);
</p>
<p>
	Marshalls exist for all supported languages:
</p>
<ul class='javatree'>
	<li class='jac'>{@link org.apache.juneau.marshall.Marshall}
	<ul>
		<li class='jac'>{@link org.apache.juneau.marshall.CharMarshall}
		<ul>
			<li class='jc'>{@link org.apache.juneau.marshall.Html}
			<li class='jc'>{@link org.apache.juneau.marshall.Json}
			<li class='jc'>{@link org.apache.juneau.marshall.PlainText}
			<li class='jc'>{@link org.apache.juneau.marshall.SimpleJson}
			<li class='jc'>{@link org.apache.juneau.marshall.Uon}
			<li class='jc'>{@link org.apache.juneau.marshall.UrlEncoding}
			<li class='jc'>{@link org.apache.juneau.marshall.Xml}
			<li class='jc'>{@link org.apache.juneau.marshall.N3}
			<li class='jc'>{@link org.apache.juneau.marshall.NTriple}
			<li class='jc'>{@link org.apache.juneau.marshall.RdfXml}
			<li class='jc'>{@link org.apache.juneau.marshall.RdfXmlAbbrev}
			<li class='jc'>{@link org.apache.juneau.marshall.Turtle}	
		</ul>
		<li class='jac'>{@link org.apache.juneau.marshall.StreamMarshall}
		<ul>
			<li class='jc'>{@link org.apache.juneau.marshall.Jso}
			<li class='jc'>{@link org.apache.juneau.marshall.MsgPack}
		</ul>
	</ul>
</ul>
</div><!-- END: 2.3 - juneau-marshall.Marshalls -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HttpPartSerializers' id='juneau-marshall.HttpPartSerializers'>2.4 - HTTP Part Serializers</a></h3>
<div class='topic'><!-- START: 2.4 - juneau-marshall.HttpPartSerializers -->
<p>
	There is a separate set of serializers for serializing HTTP parts (query, form-data, headers, path variables, and plain-text request bodies).
	The distinction is that these are designed to serialize directly to strings based on Open-API schema information.
</p>
<p class='bpcode w800'>
	<jc>// Schema information about our part.</jc>
	HttpPartSchema schema = HttpPartSchema
		.<jsm>create</jsm>(<js>"array"</js>)
		.collectionFormat(<js>"pipes"</js>)
		.items(
			HttpPartSchema
				.<jsm>create</jsm>(<js>"array"</js>)
				.collectionFormat(<js>"csv"</js>)
				.items(
					HttpPartSchema.<jsm>create</jsm>(<js>"integer"</js>,<js>"int64"</js>)
				)
		)
		.build();

	<jc>// Our value to serialize</jc>
	Object value = <jk>new long</jk>[][]{{1,2,3},{4,5,6},{7,8,9}};

	<jc>// Produces "1,2,3|4,5,6|7,8,9"</jc>
	String output = OpenApiSerializer.<jsf>DEFAULT</jsf>.serialize(HttpPartType.<jsf>HEADER</jsf>, schema, value);
</p>
<p>
	The class hierarchy for the part serializers are:
</p>

<ul class='javatree'>
	<li class='jic'>{@link org.apache.juneau.httppart.HttpPartSerializer}
	<ul>
		<li class='jc'>{@link org.apache.juneau.httppart.SimplePartSerializer} - Serializes directly to strings.
		<li class='jc'>{@link org.apache.juneau.uon.UonSerializer} - Serializes to UON notation.
		<ul>
			<li class='jc'>{@link org.apache.juneau.oapi.OpenApiSerializer} - Serializes using Open-API schema rules.
		</ul>
	</ul>
</ul>
</div><!-- END: 2.4 - juneau-marshall.HttpPartSerializers -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HttpPartParsers' id='juneau-marshall.HttpPartParsers'>2.5 - HTTP Part Parsers</a></h3>
<div class='topic'><!-- START: 2.5 - juneau-marshall.HttpPartParsers -->
<p>
	There is a separate set of parsers for parsing HTTP parts (query, form-data, headers, path variables, and plain-text request bodies).
	The distinction is that these are designed to parse directly from strings based on Open-API schema information.
</p>
<p class='bpcode w800'>
	<jc>// Schema information about our part.</jc>
	HttpPartSchema schema = HttpPartSchema
		.<jsm>create</jsm>(<js>"array"</js>)
		.collectionFormat(<js>"pipes"</js>)
		.items(
			HttpPartSchema
				.<jsm>create</jsm>(<js>"array"</js>)
				.collectionFormat(<js>"csv"</js>)
				.items(
					HttpPartSchema.<jsm>create</jsm>(<js>"integer"</js>,<js>"int64"</js>)
				)
		)
		.build();

	<jc>// Our input to parse.</jc>
	String input = <js>"1,2,3|4,5,6|7,8,9"</js>;

	<jc>// Produces "[[1,2,3],[4,5,6],[7,8,9]]</jc>
	<jk>long</jk>[][] value = OpenApiParser.<jsf>DEFAULT</jsf>.parse(HttpPartType.<jsf>HEADER</jsf>, schema, input, <jk>long</jk>[][].<jk>class</jk>);
</p>
<p>
	The class hierarchy for the part serializers are:
</p>

<ul class='javatree'>
	<li class='jic'>{@link org.apache.juneau.httppart.HttpPartParser}
	<ul>
		<li class='jc'>{@link org.apache.juneau.httppart.SimplePartParser} - Parses directly from strings.
		<li class='jc'>{@link org.apache.juneau.uon.UonParser} - Parses from UON notation.
		<ul>
			<li class='jc'>{@link org.apache.juneau.oapi.OpenApiParser} - Parses using Open-API schema rules.
		</ul>
	</ul>
</ul>
</div><!-- END: 2.5 - juneau-marshall.HttpPartParsers -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableProperties' id='juneau-marshall.ConfigurableProperties'>2.6 - </a><span class='update'><b>8.1.3-updated</b></span></h3>
<div class='topic'><!-- START: 2.6 - juneau-marshall.ConfigurableProperties -->
<p>
	Serializers and parsers have a wide variety of configurable properties.  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.
	For example, the following code shows how to configure a JSON serializer:
</p>
<p class='bpcode w800'>
	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.
	The following produces the same serializer.
</p>
<p class='bpcode w800'>
	WriterSerializer s = JsonSerializer
		.<jsm>create</jsm>()
		.set(<jsf>JSON_simpleMode</jsf>, <jk>true</jk>)
		.set(<jsf>WSERIALIZER_useWhitespace</jsf>, <jk>true</jk>)
		.set(<jsf>WSERIALIZER_quoteChar</jsf>, <js>"'"</js>)
		.build();
</p>
<p>
	However, each of the serializers and parsers already contain reusable instances with common configurations.
	For example, JSON has the following predefined reusable serializers and parsers:
</p>
<ul class='javatree'>
	<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_READABLE DEFAULT_READABLE}
		</ul>
	</li>
	<li class='jc'>{@link org.apache.juneau.json.SimpleJsonSerializer}
		<ul>
			<li class='jf'>{@link org.apache.juneau.json.SimpleJsonSerializer#DEFAULT DEFAULT}
			<li class='jf'>{@link org.apache.juneau.json.SimpleJsonSerializer#DEFAULT_READABLE DEFAULT_READABLE}
		</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='bpcode w800'>
	<jc>// Serialize a POJO to LAX JSON.</jc>
	String json = SimpleJsonSerializer.<jsf>DEFAULT</jsf>.serialize(myPojo);
</p>
<p>
	For performance reasons, serializers and parsers are immutable.
	However, they can be 'copied' and modified using the <c>builder()</c> method.
</p>
<p class='bpcode w800'>
	<jc>// Clone and customize an existing serializer.</jc>
	WriterSerializer s = SimpleJsonSerializer.<jsf>DEFAULT</jsf>
		.builder()  <jc>// Create a new builder with copied settings.</jc>
		.quoteChar(<js>'"'</js>)  <jc>// Use a different quote character.</jc>
		.build();
</p>
<p>
	Configurable properties can be set globally using either system properties or environment variables.
	<br>For example, the <jsf>WSERIALIZER_useWhitespace</jsf> variable resolves to the string <js>"WriterSerializer.useWhitespace.b"</js>.
	This setting can be enabled by setting the system property <js>"WriterSerializer.useWhitespace"</js> or environment
	variables <js>"WriterSerializer_useWhitespace"</js> or <js>"WRITERSERIALIZER_USEWHITESPACE"</js> to <js>"true"</js>.
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableProperties.Common' id='juneau-marshall.ConfigurableProperties.Common'>2.6.1 - Common Serializer Properties</a></h4>
<div class='topic'><!-- START: 2.6.1 - juneau-marshall.ConfigurableProperties.Common -->
<p>
	All serializers and parsers extend from the {@link org.apache.juneau.BeanContext} class.
	Therefore, the following properties are common to all serializers and parsers:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.BeanContext}
	<ul>
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanClassVisibility BEAN_beanClassVisibility}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanConstructorVisibility BEAN_beanConstructorVisibility}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanDictionary BEAN_beanDictionary}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanFieldVisibility BEAN_beanFieldVisibility}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanFilters BEAN_beanFilters}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanMapPutReturnsOldValue BEAN_beanMapPutReturnsOldValue}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanMethodVisibility BEAN_beanMethodVisibility}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beansRequireDefaultConstructor BEAN_beansRequireDefaultConstructor}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beansRequireSerializable BEAN_beansRequireSerializable}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beansRequireSettersForGetters BEAN_beansRequireSettersForGetters}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beansRequireSomeProperties BEAN_beansRequireSomeProperties}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanTypePropertyName BEAN_beanTypePropertyName}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_bpi BEAN_bpi}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_bpx BEAN_bpx}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_debug BEAN_debug}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_examples BEAN_examples}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_fluentSetters BEAN_fluentSetters}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_ignoreInvocationExceptionsOnGetters BEAN_ignoreInvocationExceptionsOnGetters}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_ignoreInvocationExceptionsOnSetters BEAN_ignoreInvocationExceptionsOnSetters}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_ignorePropertiesWithoutSetters BEAN_ignorePropertiesWithoutSetters}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_ignoreUnknownBeanProperties BEAN_ignoreUnknownBeanProperties}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_ignoreUnknownNullBeanProperties BEAN_ignoreUnknownNullBeanProperties}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_implClasses BEAN_implClasses}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_locale BEAN_locale}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_mediaType BEAN_mediaType}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_notBeanClasses BEAN_notBeanClasses}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_notBeanPackages BEAN_notBeanPackages}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_pojoSwaps BEAN_pojoSwaps}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_propertyNamer BEAN_propertyNamer}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_sortProperties BEAN_sortProperties}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_timeZone BEAN_timeZone}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_useEnumNames BEAN_useEnumNames}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_useInterfaceProxies BEAN_useInterfaceProxies}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_useJavaBeanIntrospector BEAN_useJavaBeanIntrospector}
	</ul>
</ul>
</div><!-- END: 2.6.1 - juneau-marshall.ConfigurableProperties.Common -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableProperties.CommonSerializer' id='juneau-marshall.ConfigurableProperties.CommonSerializer'>2.6.2 - Common Serializer Properties</a><span class='update'>8.1.0-updated</span></h4>
<div class='topic'><!-- START: 2.6.2 - juneau-marshall.ConfigurableProperties.CommonSerializer -->
<p>
	In addition to the common properties above, the following properties are common to all serializers:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.BeanTraverseContext}
	<ul>
		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions BEANTRAVERSE_detectRecursions}
		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_ignoreRecursions BEANTRAVERSE_ignoreRecursions}
		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_initialDepth BEANTRAVERSE_initialDepth}
		<li class='jf'>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_maxDepth BEANTRAVERSE_maxDepth}
		<li class='jc'>{@link org.apache.juneau.serializer.Serializer}
		<ul>
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes SERIALIZER_addBeanTypes}
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType SERIALIZER_addRootType}
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_listener SERIALIZER_listener}
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortCollections SERIALIZER_sortCollections}
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortMaps SERIALIZER_sortMaps}
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyCollections SERIALIZER_trimEmptyCollections}
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyMaps SERIALIZER_trimEmptyMaps}
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimNullProperties SERIALIZER_trimNullProperties}
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimStrings SERIALIZER_trimStrings}
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext SERIALIZER_uriContext}
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity SERIALIZER_uriRelativity}
			<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution SERIALIZER_uriResolution}
			<li class='jc'>{@link org.apache.juneau.serializer.WriterSerializer}
			<ul>
				<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_fileCharset WSERIALIZER_fileCharset}
				<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_maxIndent WSERIALIZER_maxIndent}
				<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_quoteChar WSERIALIZER_quoteChar}
				<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_streamCharset WSERIALIZER_streamCharset}
				<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_useWhitespace WSERIALIZER_useWhitespace}
			</ul>
			<li class='jc'>{@link org.apache.juneau.serializer.OutputStreamSerializer}
			<ul>
				<li class='jf'>{@link org.apache.juneau.serializer.OutputStreamSerializer#OSSERIALIZER_binaryFormat OSSERIALIZER_binaryFormat}
			</ul>
		</ul>
	</ul>
</ul>
</div><!-- END: 2.6.2 - juneau-marshall.ConfigurableProperties.CommonSerializer -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableProperties.CommonParser' id='juneau-marshall.ConfigurableProperties.CommonParser'>2.6.3 - Common Parser Properties</a><span class='update'><b>8.1.3-updated</b></span></h4>
<div class='topic'><!-- START: 2.6.3 - juneau-marshall.ConfigurableProperties.CommonParser -->
<p>
	In addition to the common properties above, the following properties are common to all parsers:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.parser.Parser}
	<ul>
		<li class='jf'>{@link org.apache.juneau.parser.Parser#PARSER_autoCloseStreams PARSER_autoCloseStreams}
		<li class='jf'>{@link org.apache.juneau.parser.Parser#PARSER_debugOutputLines PARSER_debugOutputLines}
		<li class='jf'>{@link org.apache.juneau.parser.Parser#PARSER_listener PARSER_listener}
		<li class='jf'>{@link org.apache.juneau.parser.Parser#PARSER_strict PARSER_strict}
		<li class='jf'>{@link org.apache.juneau.parser.Parser#PARSER_trimStrings PARSER_trimStrings}
		<li class='jf'>{@link org.apache.juneau.parser.Parser#PARSER_unbuffered PARSER_unbuffered}
		<li class='jc'>{@link org.apache.juneau.parser.ReaderParser}
		<ul>
			<li class='jf'>{@link org.apache.juneau.parser.ReaderParser#RPARSER_fileCharset RPARSER_fileCharset}
			<li class='jf'>{@link org.apache.juneau.parser.ReaderParser#RPARSER_streamCharset RPARSER_streamCharset}
		</ul>
		<li class='jc'>{@link org.apache.juneau.parser.InputStreamParser}
		<ul>
			<li class='jf'>{@link org.apache.juneau.parser.InputStreamParser#ISPARSER_binaryFormat ISPARSER_binaryFormat}
		</ul>
	</ul>
</ul>
</div><!-- END: 2.6.3 - juneau-marshall.ConfigurableProperties.CommonParser -->
</div><!-- END: 2.6 - juneau-marshall.ConfigurableProperties -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.ConfigurableAnnotations' id='juneau-marshall.ConfigurableAnnotations'>2.7 - Configurable Annotations</a><span class='update'>8.1.0-new, <b>8.1.3-updated</b></span></h3>
<div class='topic'><!-- START: 2.7 - juneau-marshall.ConfigurableAnnotations -->
<p>
	All configurable properties described in the previous section have annotation equivalents that can be applied on
	classes or methods.
</p>
<p>
	In the section on the REST server API, we describe how to configure serializers and parsers using <ja>@Property</ja>
	annotations such as shown below:
</p>
<p class='bpcode w800'>
	<jc>// Configuring serializers/parsers using @Property annotations.</jc>
	<ja>@Rest</ja>(
		path=<js>"/atom"</js>,
		title=<js>"Sample ATOM feed resource"</js>,
		properties={
			<ja>@Property</ja>(name=<jsf>WSERIALIZER_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>),
			<ja>@Property</ja>(name=<jsf>BEAN_examples</jsf>, value=<js>"{'org.apache.juneau.dto.atom.Feed': $F{AtomFeedResource_example.json}}"</js>)
		}
		...
	)
	<jk>public class</jk> AtomFeedResource <jk>extends</jk> BasicRestServletJena {
		...
	}
</p>
<p>
	However, an even easier way to configure serializers and parsers are to used provided specialized <ja>@XConfig</ja>
	annotations like those shown below:
</p>
<p class='bpcode w800'>
	<jc>// Same as above but using specialized annotations.</jc>
	<ja>@Rest</ja>(
		path=<js>"/atom"</js>,
		title=<js>"Sample ATOM feed resource"</js>
		...
	)
	<ja>@SerializerConfig</ja>(quoteChar=<js>"'"</js>)
	<ja>@RdfConfig</ja>(rdfxml_tab=<js>"5"</js>, addRootProperty=<js>"true"</js>)
	<ja>@BeanConfig</ja>(examples=<js>"Feed: $F{AtomFeedResource_example.json}"</js>)
	<jk>public class</jk> AtomFeedResource <jk>extends</jk> BasicRestServletJena {
		...
	}
</p>
<p>
	Config annotations are provided for all serializers and parsers:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.annotation.BeanConfig BeanConfig}
	<li class='ja'>{@link org.apache.juneau.csv.annotation.CsvConfig CsvConfig}
	<li class='ja'>{@link org.apache.juneau.html.annotation.HtmlConfig HtmlConfig}
	<li class='ja'>{@link org.apache.juneau.html.annotation.HtmlDocConfig HtmlDocConfig}
	<li class='ja'>{@link org.apache.juneau.jso.annotation.JsoConfig JsoConfig}
	<li class='ja'>{@link org.apache.juneau.json.annotation.JsonConfig JsonConfig}
	<li class='ja'>{@link org.apache.juneau.jsonschema.annotation.JsonSchemaConfig JsonSchemaConfig}
	<li class='ja'>{@link org.apache.juneau.msgpack.annotation.MsgPackConfig MsgPackConfig}
	<li class='ja'>{@link org.apache.juneau.oapi.annotation.OpenApiConfig OpenApiConfig}
	<li class='ja'>{@link org.apache.juneau.parser.annotation.ParserConfig ParserConfig}
	<li class='ja'>{@link org.apache.juneau.plaintext.annotation.PlainTextConfig PlainTextConfig}
	<li class='ja'>{@link org.apache.juneau.jena.annotation.RdfConfig RdfConfig}
	<li class='ja'>{@link org.apache.juneau.serializer.annotation.SerializerConfig SerializerConfig}
	<li class='ja'>{@link org.apache.juneau.soap.annotation.SoapXmlConfig SoapXmlConfig}
	<li class='ja'>{@link org.apache.juneau.uon.annotation.UonConfig UonConfig}
	<li class='ja'>{@link org.apache.juneau.urlencoding.annotation.UrlEncodingConfig UrlEncodingConfig}
	<li class='ja'>{@link org.apache.juneau.xml.annotation.XmlConfig XmlConfig}
</ul>
<p>
	Config annotations defined on classes and methods can be applied to serializers and parsers using the following methods:	
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.BeanContextBuilder}
	<ul>
		<li class='jm'>{@link org.apache.juneau.BeanContextBuilder#applyAnnotations(Class...) applyAnnotations(Class...)} - Apply annotations from class and all parent classes.
		<li class='jm'>{@link org.apache.juneau.BeanContextBuilder#applyAnnotations(Method...) applyAnnotations(Method...)} - Apply annotations from method and parent methods.
	</ul>
</ul>
<p>
	The following example shows how annotations defined on a dummy class can be applied to a serializer:
</p>
<p class='bpcode w800'>
	<ja>@SerializerConfig</ja>(quoteChar=<js>"'"</js>)
	<ja>@BeanConfig</ja>(bpi=<js>"AddressBean: street,city,state"</js>)
	<jk>public static class</jk> DummyClass {}
	
	WriterSerializer ws = JsonSerializer.<jsm>create</jsm>().applyAnnotations(DummyClass.<jk>class</jk>).build();
	String json = ws.toString(addressBean);
</p>
</div><!-- END: 2.7 - juneau-marshall.ConfigurableAnnotations -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.ObjectMap' id='juneau-marshall.ObjectMap'>2.8 - ObjectMap and ObjectList</a></h3>
<div class='topic'><!-- START: 2.8 - juneau-marshall.ObjectMap -->
<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='javatree'>
	<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. 
	
	(In theory, any valid XML can also be parsed into an unstructured model, although this has not been 
	officially 'tested')
</p>
<p class='bpcode w800'>
	<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 <c>ObjectMap</c> and <c>ObjectList</c> classes have many convenience features:
</p>
<p class='bpcode w800'>	
	<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>

<div 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>.
</div>
</div><!-- END: 2.8 - juneau-marshall.ObjectMap -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Groups' id='juneau-marshall.Groups'>2.9 - SerializerGroups and ParserGroups</a></h3>
<div class='topic'><!-- START: 2.9 - juneau-marshall.Groups -->
<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 <c>Accept</c> 
	and <c>Content-Type</c> values...
</p>
<p class='bpcode w800'>
	<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(TemporalCalendarSwap.IsoLocalDateTime.<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.IsoLocalDateTime.<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 <c>SerializerGroup</c> and <c>ParserGroup</c> 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><!-- END: 2.9 - juneau-marshall.Groups -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.ContextsBuildersSessionsPropertyStores' id='juneau-marshall.ContextsBuildersSessionsPropertyStores'>2.10 - Contexts, Builders, Sessions, and PropertyStores</a></h3>
<div class='topic'><!-- START: 2.10 - juneau-marshall.ContextsBuildersSessionsPropertyStores -->
<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.
		<ul>
			<li>Heavy to construct and designed to be cached and reused.
			<li>Created by <l>ContextBuilder</l> classes.
			<li>Examples:  <c>BeanContext</c>, <c>JsonSerializer</c>
		</ul>
	<li>
		<l>Session</l> - A non-thread-safe single-use object with configuration combined from context and 
		runtime args such as locale/timezone.
		<ul>
			<li>Lightweight objects that take a minimum amount of time to instantiate and are not typically reused.
			<li>Created by <c>Context</c> objects.
			<li>Examples:  <c>BeanSession</c>, <c>JsonSerializerSession</c>
		</ul>
	<li>
		<l>PropertyStore</l> - A thread-safe read-only set of configuration properties.
		<ul>
			<li>Heavier to create than <c>Sessions</c> but lighter than <c>Contexts</c>.
			<li>Each <c>Context</c> contains one <c>PropertyStore</c> that defines all the configuration about that object.
			<li>Created by <l>PropertyStoreBuilder</l> classes.
		</ul>
</ul>	
<p>
	For example, the class hierarchy for <c>JsonSerializer</c> is:
</p>
<ul class='javatree'>
	<li class='jc'><c>Object</c>
	<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 <c>PropertyStore</c>
	such as <jsf>WSERIALIZER_useWhitespace</jsf> or <jsf>JSON_simpleMode</jsf>.
</p>
<p>
	The class hierarchy for <c>JsonSerializerBuilder</c> is:
</p>
<ul class='javatree'>
	<li class='jc'><c>Object</c>
	<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='jac'>{@link org.apache.juneau.serializer.WriterSerializerBuilder}
					<ul>
						<li class='jc'>{@link org.apache.juneau.json.JsonSerializerBuilder}
					</ul>
				</ul>
			</ul>
		</ul>
	</ul>
</ul>
<p>
	The class hierarchy for <c>JsonSerializerSession</c> is:
</p>
<ul class='javatree'>
	<li class='jc'><c>Object</c>
	<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='bpcode w800'>
	<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 
	<c>PropertyStore</c> objects.
</p>
<p>
	In the example above, the property store being built looks like the following:
</p>
<p class='bpcode w800'>
	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><!-- END: 2.10 - juneau-marshall.ContextsBuildersSessionsPropertyStores -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms' id='juneau-marshall.Transforms'>2.11 - Transforms</a></h3>
<div class='topic'><!-- START: 2.11 - juneau-marshall.Transforms -->
<p>
	By default, the Juneau framework can serialize and parse a wide variety of POJOs out-of-the-box.  
	However, two special classes are provided tailor how certain Java objects are handled by the framework.
	These classes are:
</p>
<ul class='javatree'>
	<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 class='javatree'>
	<li class='jc'>{@link org.apache.juneau.BeanContext}
	<ul>
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_beanFilters BEAN_beanFilters}
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_pojoSwaps BEAN_pojoSwaps}
	</ul>
</ul>
<p>
	Annotations are also provided for specifying transforms directly on classes and methods (all described in later sections):
</p>
<ul class='javatree'>
	<li class='ja'>
		{@link org.apache.juneau.annotation.Swap} 
		- Used to tailor how non-bean POJOs get interpreted by the framework.
	<li class='ja'>
		{@link org.apache.juneau.annotation.Bean} 
		- Used to tailor how beans get interpreted by the framework.
	<li class='ja'>
		{@link org.apache.juneau.annotation.Beanc} 
		- Maps constructor arguments to property names on beans with read-only properties.
	<li class='ja'>
		{@link org.apache.juneau.annotation.Beanp} 
		- Used to tailor how bean properties get interpreted by the framework.
	<li class='ja'>
		{@link org.apache.juneau.annotation.BeanIgnore} 
		- Ignore classes, fields, and methods from being interpreted as bean or bean components.
	<li class='ja'>
		{@link org.apache.juneau.annotation.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} 
		- Identifies a setter as a method for adding a parent reference to a child object.
	<li class='ja'>
		{@link org.apache.juneau.annotation.URI} 
		- Used to identify a class or bean property as a URI.
</ul>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PojoSwaps' id='juneau-marshall.Transforms.PojoSwaps'>2.11.1 - PojoSwaps</a><span class='update'>8.1.0-updated</span></h4>
<div class='topic'><!-- START: 2.11.1 - juneau-marshall.Transforms.PojoSwaps -->
<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 <c>File</c>, <c>Reader</c>, 
	<c>Iterable</c>, 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 <c>PojoSwap</c> that will swap in a bean of a particular type
	with a map containing customized key-value pairs:
</p>
<p class='bpcode w800'>
	<jc>// Sample swap for converting a bean to a specialized map of key-value pairs.</jc>
	<jk>public class</jk> MyBeanSwap <jk>extends</jk> PojoSwap&lt;MyBean,ObjectMap&gt; {
		
		<jc>// Converts a bean to a generic map.</jc>
		<ja>@Override</ja> <jc>/* PojoSwap */</jc>
		<jk>public</jk> ObjectMap swap(BeanSession session, MyBean o) {
			<jk>return new</jk> ObjectMap().append(<js>"foo"</js>, o.getBar());
		}
		
		<jc>// Converts the generic map back into a bean.</jc>
		<ja>@Override</ja> <jc>/* PojoSwap */</jc>
		<jk>public</jk> MyBean unswap(BeanSession session, ObjectMap o, ClassMeta hint) <jk>throws</jk> Exception {
			MyBean b = <jk>new</jk> MyBean();
			b.setBar(o.getString(<js>"foo"</js>));
			<jk>return</jk> b;
		}
	}
</p>
<p>
	The swap can then be associated with serializers and parsers like so:
</p>
<p class='bpcode w800'>
	<jc>// Create a new JSON serializer with our swap.</jc>
	WriterSerializer s = JsonSerializer.<jsm>create</jsm>().simple().pojoSwaps(MyBeanSwap.<jk>class</jk>).build();
	String json = s.serialize(<jk>new</jk> MyBean());
	
	<jc>// Create a JSON parser with our swap.</jc>
	ReaderParser p = JsonParser.<jsm>create</jsm>().pojoSwaps(MyBeanSwap.<jk>class</jk>).build();
	MyBean bean = p.parse(json, MyBean.<jk>class</jk>);
</p>
<p>
	Another example of a <c>PojoSwap</c> is one that converts <c><jk>byte</jk>[]</c> arrays to
	BASE64-encoded strings:
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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>
</div><!-- END: 2.11.1 - juneau-marshall.Transforms.PojoSwaps -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.DefaultPojoSwaps' id='juneau-marshall.Transforms.DefaultPojoSwaps'>2.11.2 - Default PojoSwaps</a></h4>
<div class='topic'><!-- START: 2.11.2 - juneau-marshall.Transforms.DefaultPojoSwaps -->
<p>
	By default, all serializers and parsers have built in <c>PojoSwaps</c> defined for the following common data types:
</p>
<ul class='javatree'>
	<li class='jc'>{@link java.util.Enumeration}
	<li class='jc'>{@link java.util.Iterator}
	<li class='jc'>{@link java.util.Locale}
	<li class='jc'>{@link java.util.Class}
	<li class='jc'>{@link java.util.Calendar} - ISO offset date-time.
	<li class='jc'>{@link java.util.Date} - Local date-time
	<li class='jc'>{@link java.time.Instant} - ISO instant.
	<li class='jc'>{@link java.time.ZonedDateTime} - ISO offset date-time.
	<li class='jc'>{@link java.time.LocalDate} - ISO local date.
	<li class='jc'>{@link java.time.LocalDateTime} - ISO local date-time.
	<li class='jc'>{@link java.time.LocalTime} - ISO local time.
	<li class='jc'>{@link java.time.OffsetDateTime} - ISO offset date-time.
	<li class='jc'>{@link java.time.OffsetTime} - ISO offset time.
	<li class='jc'>{@link java.time.Year} - ISO year.
	<li class='jc'>{@link java.time.YearMonth} - ISO year-month.
	<li class='jc'>{@link java.time.Temporal} - ISO instant.
	<li class='jc'>{@link java.util.TimeZone}
	<li class='jc'>{@link javax.xml.datatype.XMLGregorianCalendar}
	<li class='jc'>{@link java.time.ZoneId}
</ul>
<p>
	Various other swaps are provided in the <c>org.apache.juneau.transforms</c> package:
</p>
<ul class='javatree'>
	<li class='jp'><jk>org.apache.juneau.transforms</jk>
		<ul>
			<li class='jac'>{@link org.apache.juneau.transforms.ByteArraySwap}
			<ul>
				<li class='jc'>{@link org.apache.juneau.transforms.ByteArraySwap.Base64}
				<li class='jc'>{@link org.apache.juneau.transforms.ByteArraySwap.Hex}
				<li class='jc'>{@link org.apache.juneau.transforms.ByteArraySwap.SpacedHex}
			</ul>
			<li class='jac'>{@link org.apache.juneau.transforms.InputStreamSwap}
			<ul>
				<li class='jc'>{@link org.apache.juneau.transforms.InputStreamSwap.Base64}
				<li class='jc'>{@link org.apache.juneau.transforms.InputStreamSwap.Hex}
				<li class='jc'>{@link org.apache.juneau.transforms.InputStreamSwap.SpacedHex}
			</ul>
			<li class='jc'>{@link org.apache.juneau.transforms.ReaderSwap}
			<li class='jac'>{@link org.apache.juneau.transforms.TemporalCalendarSwap}
			<ul>
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.BasicIsoDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoInstant}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoLocalDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoLocalDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoLocalTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoOffsetDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoOffsetDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoOffsetTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoOrdinalDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoWeekDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.IsoZonedDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap.Rfc1123DateTime}
			</ul>
			<li class='jac'>{@link org.apache.juneau.transforms.TemporalDateSwap}
			<ul>
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.BasicIsoDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoInstant}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoLocalDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoLocalDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoLocalTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoOffsetDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoOffsetDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoOffsetTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoOrdinalDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoWeekDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.IsoZonedDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap.Rfc1123DateTime}
			</ul>
			<li class='jac'>{@link org.apache.juneau.transforms.TemporalSwap}
			<ul>
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.BasicIsoDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoInstant}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoLocalDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoLocalDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoLocalTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoOffsetDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoOffsetDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoOffsetTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoOrdinalDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoWeekDate}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoYear}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoYearMonth}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.IsoZonedDateTime}
				<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap.Rfc1123DateTime}
			</ul>
		</ul>
	</li>
</ul>
</div><!-- END: 2.11.2 - juneau-marshall.Transforms.DefaultPojoSwaps -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.AutoPojoSwaps' id='juneau-marshall.Transforms.AutoPojoSwaps'>2.11.3 - Auto-detected POJO swaps</a><span class='update'>8.1.0-new</span></h4>
<div class='topic'><!-- START: 2.11.3 - juneau-marshall.Transforms.AutoPojoSwaps -->
<p>
	Various methods can be defined on a class directly to affect how it gets serialized.
	This can often be simpler than using <c>PojoSwaps</c>.
</p>
<p>
	Objects serialized as <c>Strings</c> can be parsed back into their original objects by 
	implementing one of the following methods on the class:
</p>		
<ul class='spaced-list'>
	<li>
		<c><jk>public static</jk> T fromString(String)</c> method.
		<br>Any of the following method names also work: 
		<ul>
			<li><c>valueOf(String)</c>
			<li><c>parse(String)</c>
			<li><c>parseString(String)</c>
			<li><c>forName(String)</c>
			<li><c>forString(String)</c>
		</ul>
	<li>
		<c><jk>public</jk> T(String)</c> 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><c>fromString(String)</c> - {@link java.util.UUID}
	<li><c>valueOf(String)</c> - {@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><c>parse(String)</c> - {@link java.text.DateFormat}, {@link java.text.MessageFormat}, 
		{@link java.text.NumberFormat}, {@link java.util.Date}, {@link java.util.logging.Level}
	<li><c>parseString(String)</c> - {@link javax.xml.bind.DatatypeConverter}
	<li><c>forName(String)</c> - {@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 <c>toString()</c> method.
</p>
<p>
	Serializing to other intermediate objects can be accomplished by defining a swap method directly on the 
	class:
</p>			
<ul>
	<li><c><jk>public</jk> X swap()</c> method, where <c>X</c> is any serializable object.
	<li><c><jk>public</jk> X swap(BeanSession)</c> method, where <c>X</c> is any serializable object.
	<li><c><jk>public static</jk> MyPojo unswap(X)</c> method, where <c>X</c> is any serializable object.
	<li><c><jk>public static</jk> MyPojo swap(X,BeanSession)</c> method, where <c>X</c> is any serializable object.
</ul>
<p>
	Serializing to and from Maps can be accomplished by defining any of the following methods:
</p>			
<ul>
	<li><c><jk>public</jk> Map toMap()</c> method.  Can be any type of map with string keys and object vals. 
	<li><c><jk>public</jk> ObjectMap toMap()</c> method. 
	<li><c><jk>public</jk> Map toMap(BeanSession)</c> method.  Can be any type of map with string keys and object vals. 
	<li><c><jk>public</jk> ObjectMap toMap(BeanSession)</c> method.
	<li><c><jk>public static</jk> MyPojo fromMap(Map)</c> method.  Can be any type of map with string keys and object vals. 
	<li><c><jk>public static</jk> MyPojo fromMap(ObjectMap)</c> method.
	<li><c><jk>public static</jk> MyPojo fromMap(Map,BeanSession)</c> method.  Can be any type of map with string keys and object vals. 
	<li><c><jk>public static</jk> MyPojo fromMap(ObjectMap,BeanSession)</c> method.
</ul>
<p>
	The <c>BeanSession</c> parameter allows you access to various information about the current 
	serialization session.
	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='bpcode w800'>
	<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><c><jk>public static</jk> T unswap(BeanSession, X)</c> method where <c>X</c> is the 
		swap class type.
	<li><c><jk>public</jk> T(X)</c> constructor where <c>X</c> 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='bpcode w800'>
	<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>(dictionary=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><!-- END: 2.11.3 - juneau-marshall.Transforms.AutoPojoSwaps -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PerMediaTypePojoSwaps' id='juneau-marshall.Transforms.PerMediaTypePojoSwaps'>2.11.4 - Per-media-type PojoSwaps</a><span class='update'>8.1.0-updated</span></h4>
<div class='topic'><!-- START: 2.11.4 - juneau-marshall.Transforms.PerMediaTypePojoSwaps -->
<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.
	It's also possible to define multiple swaps against the same POJO as long as they're differentiated 
	by media type.
	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='bpcode w800'>
	<jk>public class</jk> PojoSwapTest {

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

		<jk>public static class</jk> MyJsonSwap <jk>extends</jk> StringSwap&lt;MyPojo&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> StringSwap&lt;MyPojo&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> StringSwap&lt;MyPojo&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>
<p>
	When multiple swaps match the same media type, a best-match algorithm is applied to find the correct
	swap to use.
</p>
<p>
	In later sections we describe how annotations can be used to shorten this syntax:
</p>
<p class='bpcode w800'>
	<ja>@Swaps</ja>({MyJsonSwap.<jk>class</jk>,MyXmlSwap.<jk>class</jk>,MyOtherSwap.<jk>class</jk>})
	<jk>public static class</jk> MyPojo {}

	<ja>@Swap</ja>(mediaTypes=<js>"&#42;/json"</js>)
	<jk>public static class</jk> MyJsonSwap <jk>extends</jk> PojoSwap&lt;MyPojo,String&gt; {...}

	<ja>@Swap</ja>(mediaTypes=<js>"&#42;/xml"</js>)
	<jk>public static class</jk> MyXmlSwap <jk>extends</jk> PojoSwap&lt;MyPojo,String&gt; {...}

	<ja>@Swap</ja>(mediaTypes=<js>"&#42;/*"</js>)
	<jk>public static class</jk> MyOtherSwap <jk>extends</jk> PojoSwap&lt;MyPojo,String&gt; {...}
</p>
</div><!-- END: 2.11.4 - juneau-marshall.Transforms.PerMediaTypePojoSwaps -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.OneWayPojoSwaps' id='juneau-marshall.Transforms.OneWayPojoSwaps'>2.11.5 - One-way PojoSwaps</a></h4>
<div class='topic'><!-- START: 2.11.5 - juneau-marshall.Transforms.OneWayPojoSwaps -->
<p>
	In the previous sections, we defined two-way swaps, meaning swaps where the original objects could be 
	reconstructing during parsing. 
	However, there are certain kinds of POJOs that we may want to support for serializing, but that are not 
	possible to reconstruct during parsing.  
	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.  
	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.  
	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='bpcode w800'>
	<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.  
	Note that trying to parse the original object will cause a {@link org.apache.juneau.parser.ParseException} 
	to be thrown.
</p>
<p class='bpcode w800'>
	<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><!-- END: 2.11.5 - juneau-marshall.Transforms.OneWayPojoSwaps -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.SwapAnnotation' id='juneau-marshall.Transforms.SwapAnnotation'>2.11.6 - @Swap Annotation</a><span class='update'>8.0.0-updated</span></h4>
<div class='topic'><!-- START: 2.11.6 - juneau-marshall.Transforms.SwapAnnotation -->
<p>
	{@link org.apache.juneau.annotation.Swap @Swap} can be used to associate a swap class using an 
	annotation.
	This is often cleaner than using the builder <c>pojoSwaps()</c> method since you can keep
	your swap class near your POJO class. 
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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>
	<c>Readers</c> 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='bpcode w800'>
	<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='bpcode w800'>
	<jk>public class</jk> MyBean {
		<jk>private</jk> MyPojo <jf>myPojo</jf>;
	
		<jc>// Swap applied to bean property.	
		<ja>@Beanp</ja>(swap=MyPojoSwap.<jk>class</jk>)
		<jk>public</jk> MyPojo getMyPojo() {
			<jk>return</jk> <jf>myPojo</jf>;
		}
	}
</p>
<p>
	When applied to bean properties, the swap annotation need only be applied to either the getter, setter, or field.
</p>
<p>
	The swap annotation can also be applied to the private field of a bean property, like so:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyBean {

		<ja>@Beanp</ja>(swap=MyPojoSwap.<jk>class</jk>)
		<jk>private</jk> MyPojo <jf>myPojo</jf>;
	
		<jk>public</jk> MyPojo getMyPojo() {
			<jk>return</jk> <jf>myPojo</jf>;
		}
		
		<jk>public</jk> MyBean setMyPojo(MyPojo myPojo) {
			<jk>this</jk>.<jf>myPojo</jf> = myPojo;
			<jk>return this</jk>;
		}
	}
</p>
</div><!-- END: 2.11.6 - juneau-marshall.Transforms.SwapAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.TemplatedSwaps' id='juneau-marshall.Transforms.TemplatedSwaps'>2.11.7 - Templated Swaps</a></h4>
<div class='topic'><!-- START: 2.11.7 - juneau-marshall.Transforms.TemplatedSwaps -->
<p>
	The {@link org.apache.juneau.annotation.Swap#template() @Swap(template)} annotation allows you to associate
	arbitrary contextual strings with swaps.
	The primary purpose is for providing template names, such as for Apache FreeMarker, therefore
	the name 'template'.
	However, the usage of the string is open-ended.
</p>
<p>
	For example, you could pair a template string like so:
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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><!-- END: 2.11.7 - juneau-marshall.Transforms.TemplatedSwaps -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.SurrogateClasses' id='juneau-marshall.Transforms.SurrogateClasses'>2.11.8 - Surrogate Classes</a></h4>
<div class='topic'><!-- START: 2.11.8 - juneau-marshall.Transforms.SurrogateClasses -->
<p>
<p>
	Surrogate classes are very similar in concept to <c>PojoSwaps</c> 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='bpcode w800'>
	<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 <c>PojoSwap</c>.
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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 <c>PojoSwap</c>:
</p>
<p class='bpcode w800'>
	<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>

<ul class='seealso'>
	<li class='jic'>{@link org.apache.juneau.transform.Surrogate}
</ul>
</div><!-- END: 2.11.8 - juneau-marshall.Transforms.SurrogateClasses -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanAnnotation' id='juneau-marshall.Transforms.BeanAnnotation'>2.11.9 - @Bean Annotation</a></h4>
<div class='topic'><!-- START: 2.11.9 - juneau-marshall.Transforms.BeanAnnotation -->
<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='bpcode w800'>
	<jc>// Address class with only street/city/state properties (in that order).</jc>
	<jc>// All other properties are ignored.</jc>
	<ja>@Bean</ja>(bpi=<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#bpx() @Bean(bpx)}
	annotation.
</p>
<p class='bpcode w800'>
	<jc>// Address class with only street/city/state properties (in that order).</jc>
	<jc>// All other properties are ignored.</jc>
	<ja>@Bean</ja>(bpx=<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='bpcode w800'>
	<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.
	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 class='bpcode w800'>
	<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.
	When specified, only the list of properties defined on the interface class will be used during 
	serialization.
	Additional properties on subclasses will be ignored.
</p>
<p class='bpcode w800'>
	<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 = SimpleJsonSerializer.<jsf>DEFAULT</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.
	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).
	It's identical in purpose to the stop class specified by {@link java.beans.Introspector#getBeanInfo(Class, Class)}.
	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 <c>C3</c> will include property 
	<c>p3</c>, but not <c>p1</c> or <c>p2</c>.
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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><!-- END: 2.11.9 - juneau-marshall.Transforms.BeanAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanpAnnotation' id='juneau-marshall.Transforms.BeanpAnnotation'>2.11.10 - @Beanp Annotation</a><span class='update'>8.1.0-updated, 8.1.2-updated</span></h4>
<div class='topic'><!-- START: 2.11.10 - juneau-marshall.Transforms.BeanpAnnotation -->
<p>
	The {@link org.apache.juneau.annotation.Beanp @Beanp} annotation is used to tailor how 
	individual bean properties are interpreted by the framework.
</p>
<p>
	The {@link org.apache.juneau.annotation.Beanp#name() @Beanp(name)} annotation
	is used to override the name of the bean property.
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyBean {
		<ja>@Beanp</ja>(name=<js>"Bar"</js>)
		<jk>public</jk> String getFoo() {...}
	}
</p>
<p>
	The {@link org.apache.juneau.annotation.Name @Name} annotation is a shortcut for specifying a bean property name:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyBean {
		<ja>@Name</ja>(<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='bpcode w800'>
	<jk>public class</jk> MyBean {
		<ja>@Beanp</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.
	This is similar in concept to the Jackson <ja>@JsonGetterAll</ja> and <ja>@JsonSetterAll</ja> 
	annotations, but generalized for all supported marshall languages.
	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='bpcode w800'>
	<jc>// Option #1 - A simple public Map field.</jc>
	<jc>// The field name can be anything.</jc>
	<jk>public class</jk> BeanWithDynaField {

		<ja>@Beanp</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>@Beanp</ja>(name=<js>"*"</js>)
		<jk>public</jk> Map&lt;String,Object&gt; getMyExtraStuff() {
			...
		}

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

		<ja>@Beanp</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>@Beanp</ja>(name=<js>"*"</js>, swap=TemporalCalendarSwap.IsoOffsetDateTime.<jk>class</jk>)
		<jk>public</jk> Map&lt;String,Calendar&gt; getMyExtraStuff() {
			...
		}
	}
</p>
<div 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.
</div>
<p>
	The {@link org.apache.juneau.annotation.Beanp#value() @Beanp(value)} annotation
	is a synonym for {@link org.apache.juneau.annotation.Beanp#name() @Beanp(name)}.
	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='bpcode w800'>
	<ja>@Beanp</ja>(name=<js>"foo"</js>)

	<ja>@Beanp</ja>(<js>"foo"</js>)
</p>
<p>
	The {@link org.apache.juneau.annotation.Beanp#type() @Beanp(type)} annotation
	is used to identify a specialized class type for a generalized property.
	Normally the type is inferred through reflection of the field type or getter return type.
	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.
	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='bpcode w800'>
	<jk>public class</jk> MyBean {

		<jc>// Identify concrete type as a HashMap.</jc>
		<ja>@Beanp</ja>(type=HashMap.<jk>class</jk>)
		<jk>public</jk> Map <jf>p1</jf>;
	}
</p>
<p>
	The {@link org.apache.juneau.annotation.BeanProperty#params() @Beanp(params)} annotation
	is for bean properties of type map or collection.
	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='bpcode w800'>
	<jk>public class</jk> MyBean {

		<jc>// This is a HashMap&lt;String,Integer&gt;.</jc>
		<ja>@Beanp</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.Beanp#properties() @Beanp(properties)} 
	annotation is used to limit which child properties are rendered by the serializers.
	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='bpcode w800'>
	<jk>public class</jk> MyClass {

		<jc>// Only render 'f1' when serializing this bean property.</jc>
		<ja>@Beanp</ja>(bpi={<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.Beanp#format() @Beanp(format)} 
	annotation specifies a String format for converting a bean property value to a formatted string.
</p>
<p class='bpcode w800'>
	<jc>// Serialize a float as a string with 2 decimal places.</jc>
	<ja>@Beanp</ja>(format=<js>"$%.2f"</js>)
	<jk>public float</jk> <jf>price</jf>;
</p>
</div><!-- END: 2.11.10 - juneau-marshall.Transforms.BeanpAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeancAnnotation' id='juneau-marshall.Transforms.BeancAnnotation'>2.11.11 - @Beanc Annotation</a><span class='update'>8.1.0-updated, 8.1.2-updated</span></h4>
<div class='topic'><!-- START: 2.11.11 - juneau-marshall.Transforms.BeancAnnotation -->
<p>
	The {@link org.apache.juneau.annotation.Beanc @Beanc} annotation is used to 
	map constructor arguments to property names on bean with read-only properties.
	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='bpcode w800'>
	<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>@Beanc</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='bpcode w800'>
	<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>
<p>
	The {@link org.apache.juneau.annotation.Name @Name} annotation can also be used instead of <c><ja>@Beanc</ja>(properties)</c>:
</p>
<p class='bpcode w800'>
	<ja>@Beanc</ja>
	<jk>public</jk> Person(<ja>@Name</ja>(<js>"name"</js>) String name, <ja>@Name</ja>(<js>"age"</js>) <jk>int</jk> age) {
		<jk>this</jk>.<jf>name</jf> = name;
		<jk>this</jk>.<jf>age</jf> = age;
	}
</p>
<p>
	If neither <c><ja>@Beanc</ja>(properties)</c> or <ja>@Name</ja> is used to identify the bean property names, 
	we will try to use the parameter names if they are available in the bytecode.
</p>
</div><!-- END: 2.11.11 - juneau-marshall.Transforms.BeancAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanIgnoreAnnotation' id='juneau-marshall.Transforms.BeanIgnoreAnnotation'>2.11.12 - @BeanIgnore Annotation</a></h4>
<div class='topic'><!-- START: 2.11.12 - juneau-marshall.Transforms.BeanIgnoreAnnotation -->
<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='bpcode w800'>
	<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='bpcode w800'>
	<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><!-- END: 2.11.12 - juneau-marshall.Transforms.BeanIgnoreAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.NamePropertyAnnotation' id='juneau-marshall.Transforms.NamePropertyAnnotation'>2.11.13 - @NameProperty Annotation</a></h4>
<div class='topic'><!-- START: 2.11.13 - juneau-marshall.Transforms.NamePropertyAnnotation -->
<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='bpcode w800'>
	<jc>// JSON</jc> 
	{
		<jok>id1</jok>: {<jok>name</jok>: <jov>'John Smith'</jov>, <jok>sex</jok>: <jov>'M'</jov>},
		<jok>id2</jok>: {<jok>name</jok>: <jov>'Jane Doe'</jov>, <jok>sex</jok>: <jov>'F'</jov>}
	}
</p>
<p class='bpcode w800'>
	<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><!-- END: 2.11.13 - juneau-marshall.Transforms.NamePropertyAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.ParentPropertyAnnotation' id='juneau-marshall.Transforms.ParentPropertyAnnotation'>2.11.14 - @ParentProperty Annotation</a></h4>
<div class='topic'><!-- START: 2.11.14 - juneau-marshall.Transforms.ParentPropertyAnnotation -->
<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='bpcode w800'>
	<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><!-- END: 2.11.14 - juneau-marshall.Transforms.ParentPropertyAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.PojoBuilders' id='juneau-marshall.Transforms.PojoBuilders'>2.11.15 - POJO Builders</a></h4>
<div class='topic'><!-- START: 2.11.15 - juneau-marshall.Transforms.PojoBuilders -->
<p>
	Juneau parsers can use builders to instantiate POJOs.
	This is useful in cases where you want to create beans with read-only properties.
	Note that while it's possible to do this using the {@link org.apache.juneau.annotation.Beanc @Beanc}
	annotation, using builders can often be cleaner.
</p>
<p>
	A typical builder usage is shown below:
</p>
<p class='bpcode w800'>
	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='bpcode w800'>
	<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>@Beanp</ja>
			<jk>public</jk> MyBeanBuilder foo(String foo) {
				<jk>this</jk>.<jf>foo</jf> = foo;
				<jk>return this</jk>;
			}
			
			<ja>@Beanp</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.
	Builders MUST be beans with one or more writable properties.
	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 <c>create()</c> method on the POJO class that returns a builder instance.
		<p class='bcode w800'>
	<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 w800'>
	<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 w800'>
	<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 <c>build()</c> method on the builder class.
		<p class='bcode w800'>
	<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 w800'>
	<jk>public</jk> MyPojo(MyBuilder b) {...}
		</p>
</ul>
<ul class='seealso'>
	<li class='ja'>{@link org.apache.juneau.annotation.Builder}
	<li class='jic'>{@link org.apache.juneau.transform.Builder}
</ul>
</div><!-- END: 2.11.15 - juneau-marshall.Transforms.PojoBuilders -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BeanFilters' id='juneau-marshall.Transforms.BeanFilters'>2.11.16 - BeanFilter Class</a></h4>
<div class='topic'><!-- START: 2.11.16 - juneau-marshall.Transforms.BeanFilters -->
<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.Beanp @Beanp} annotations on your bean classes.
	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='bpcode w800'>
	<ja>@Bean</ja>(bpi=<js>"street,city,state"</js>)
	<jk>public class</jk> Address { ... }
</p>
<p>
	The programmatic equivalent would be:
</p>				
<p class='bpcode w800'>
	<jk>public class</jk> AddressFilter <jk>extends</jk> BeanFilterBuilder&lt;Address&gt; {
		
		<jc>// Must provide a no-arg constructor!</jc>
		<jk>public</jk> AddressFilter() {
			bpi(<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 class='javatree'>
	<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='bpcode w800'>			
	<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.
	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.
	Any class that's not a subclass of {@link org.apache.juneau.transform.BeanFilterBuilder} get interpreted 
	as bean interface classes.
	These cause bean implementations of those interfaces to only expose the properties defined on the 
	interface.
</p>
<p class='bpcode w800'>
	<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><!-- END: 2.11.16 - juneau-marshall.Transforms.BeanFilters -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.InterfaceFilters' id='juneau-marshall.Transforms.InterfaceFilters'>2.11.17 - Interface Filters</a></h4>
<div class='topic'><!-- START: 2.11.17 - juneau-marshall.Transforms.InterfaceFilters -->
<p>
	Occasionally, you may want to limit bean properties to only those defined on a parent class or interface.  
	This is accomplished through interface filters.
</p>
<p>
	Interface filters are defined through the following:
</p>
<ul class='javatree'>
	<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='bpcode w800'>
	<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. 
	To do so, we can define the following bean filter:
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	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-<c>BeanFilter</c> classes passed in as meaning interface classes. 
	So in the previous example, the <c>BeanFilter</c> class could have been avoided altogether by just 
	passing in <c>MyInterface.<jk>class</jk></c> to the serializer, like so:
</p>
<p class='bpcode w800'>
	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='bpcode w800'>
	<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='bpcode w800'>
	<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.
	Child beans will only serialize properties defined on the parent class.
<p class='bpcode w800'>
	<ja>@Bean</ja>(interfaceClass=MyAbstractClass.<jk>class</jk>)
	<jk>public abstract class</jk> MyAbstractClass {
		<jk>public</jk> String getFoo() {...};
	}
</p>
</div><!-- END: 2.11.17 - juneau-marshall.Transforms.InterfaceFilters -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.StopClasses' id='juneau-marshall.Transforms.StopClasses'>2.11.18 - Stop Classes</a></h4>
<div class='topic'><!-- START: 2.11.18 - juneau-marshall.Transforms.StopClasses -->
<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 class='javatree'>
	<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)}.
	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 <c>C3</c> will include property <c>p3</c>,
	but not <c>p1</c> or <c>p2</c>.
</p>
<p class='bpcode w800'>
	<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><!-- END: 2.11.18 - juneau-marshall.Transforms.StopClasses -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Transforms.BypassSerialization' id='juneau-marshall.Transforms.BypassSerialization'>2.11.19 - Bypass Serialization using Readers and InputStreams</a></h4>
<div class='topic'><!-- START: 2.11.19 - juneau-marshall.Transforms.BypassSerialization -->
<p>
	Juneau serializers treat instances of <c>Readers</c> and <c>InputStreams</c> special by 
	simply serializing their contents directly to the output stream or writer.
	This allows you to embed fully customized serializer output.
</p>
<p class='bpcode w800'>
	<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 = SimpleJsonSerializer.<jsf>DEFAULT</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.
	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='bpcode w800'>
	<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>	
<div 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.
</div>
</div><!-- END: 2.11.19 - juneau-marshall.Transforms.BypassSerialization -->
</div><!-- END: 2.11 - juneau-marshall.Transforms -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.DynamicallyAppliedAnnotations' id='juneau-marshall.DynamicallyAppliedAnnotations'>2.12 - Dynamically Applied Annotations</a><span class='update'><b>8.1.3-new</b></span></h3>
<div class='topic'><!-- START: 2.12 - juneau-marshall.DynamicallyAppliedAnnotations -->
<p>
	In the section {@doc juneau-marshall.Transforms}, you were introduced to annotations that can be applied to bean
	classes, methods, fields, and constructors such as {@link org.apache.juneau.annotation.Bean @Bean}:
</p>
<p class='bpcode w800'>
	<jc>// Address class with only street/city/state properties (in that order).</jc>
	<jc>// All other properties are ignored.</jc>
	<ja>@Bean</ja>(bpi=<js>"street,city,state"</js>)
	<jk>public class</jk> Address { ... }
</p>
<p>
	An alternate way of applying these annotations is using the <ja>@XConfig</ja> annotations introduced in section
	{@doc juneau-marshall.ConfigurableAnnotations}.  
</p>
<p class='bpcode w800'>
	<jc>// Unannotated class.</jc>
	<jk>public class</jk> Address { ... }

	<ja>@BeanConfig</ja>(
		applyBean={
			<ja>@Bean</ja>(on=<js>"Address"</js>, bpi=<js>"AddressBean: street,city,state"</js>)
		}
	}
	<jk>public static class</jk> DummyClass {}

	WriterSerializer ws = JsonSerializer.<jsm>create</jsm>().applyAnnotations(DummyClass.<jk>class</jk>).build();
	String json = ws.toString(addressBean);
</p>
<p>
	The advantage to this approach is it allows you to use Juneau annotations on classes/methods/fields/constructors
	where you might not have access to the source code, or when you only want to selectively apply the annotation 
	under certain scenarios instead of globally.
</p>
<p>
	For example, the following shows the <ja>@Bean</ja> annotation being selectively applied on a single REST method 
	(described later in {@doc juneau-rest-server}): 
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja> 
	<ja>@BeanConfig</ja>(
		applyBean={
			<ja>@Bean</ja>(on=<js>"Address"</js>, bpi=<js>"AddressBean: street,city,state"</js>)
		}
	}
	<jk>public</jk> List&lt;Address&gt; getAddresses() {}
</p>
<p>
	Any Juneau annotation that has an <c>on()</c> method can be applied dynamically this way.
	These include:
</p>
<ul>
	<li class='ja'>{@link org.apache.juneau.annotation.Bean}
	<li class='ja'>{@link org.apache.juneau.annotation.Beanc}
	<li class='ja'>{@link org.apache.juneau.annotation.BeanIgnore}
	<li class='ja'>{@link org.apache.juneau.annotation.Beanp}
	<li class='ja'>{@link org.apache.juneau.annotation.Example}
	<li class='ja'>{@link org.apache.juneau.annotation.NameProperty}
	<li class='ja'>{@link org.apache.juneau.annotation.ParentProperty}
	<li class='ja'>{@link org.apache.juneau.annotation.Swap}
	<li class='ja'>{@link org.apache.juneau.annotation.URI}
	<li class='ja'>{@link org.apache.juneau.csv.annotation.Csv}
	<li class='ja'>{@link org.apache.juneau.html.annotation.Html}
	<li class='ja'>{@link org.apache.juneau.jso.annotation.Jso}
	<li class='ja'>{@link org.apache.juneau.json.annotation.Json}
	<li class='ja'>{@link org.apache.juneau.jsonschema.annotation.Schema}
	<li class='ja'>{@link org.apache.juneau.msgpack.annotation.MsgPack}
	<li class='ja'>{@link org.apache.juneau.oapi.annotation.OpenApi}
	<li class='ja'>{@link org.apache.juneau.plaintext.annotation.PlainText}
	<li class='ja'>{@link org.apache.juneau.soap.annotation.SoapXml}
	<li class='ja'>{@link org.apache.juneau.uon.annotation.Uon}
	<li class='ja'>{@link org.apache.juneau.urlencoding.annotation.UrlEncoding}
	<li class='ja'>{@link org.apache.juneau.xml.annotation.Xml}
	<li class='ja'>{@link org.apache.juneau.jena.annotation.Rdf}
</ul>
<p>
	The valid pattern matches are:
</p>
<ul class='spaced-list'>
	<li>Classes:
		<ul>
			<li>Fully qualified: 
				<ul>
					<li><js>"com.foo.MyClass"</js>
				</ul>
			<li>Fully qualified inner class: 
				<ul>
					<li><js>"com.foo.MyClass$Inner1$Inner2"</js>
				</ul>
			<li>Simple: 
				<ul>
					<li><js>"MyClass"</js>
				</ul>
			<li>Simple inner: 
				<ul>
					<li><js>"MyClass$Inner1$Inner2"</js>
					<li><js>"Inner1$Inner2"</js>
					<li><js>"Inner2"</js>
				</ul>
		</ul>
	<li>Methods:
		<ul>
			<li>Fully qualified with args: 
				<ul>
					<li><js>"com.foo.MyClass.myMethod(String,int)"</js> 
					<li><js>"com.foo.MyClass.myMethod(java.lang.String,int)"</js> 
					<li><js>"com.foo.MyClass.myMethod()"</js>
				</ul>
			<li>Fully qualified: 
				<ul>
					<li><js>"com.foo.MyClass.myMethod"</js>
				</ul>
			<li>Simple with args: 
				<ul>
					<li><js>"MyClass.myMethod(String,int)"</js>
					<li><js>"MyClass.myMethod(java.lang.String,int)"</js>
					<li><js>"MyClass.myMethod()"</js>
				</ul>
			<li>Simple: 
				<ul>
					<li><js>"MyClass.myMethod"</js>
				</ul>
			<li>Simple inner class: 
				<ul>
					<li><js>"MyClass$Inner1$Inner2.myMethod"</js>
					<li><js>"Inner1$Inner2.myMethod"</js>
					<li><js>"Inner2.myMethod"</js>
				</ul>
		</ul>
	<li>Fields:
		<ul>
			<li>Fully qualified: 
				<ul>
					<li><js>"com.foo.MyClass.myField"</js>
				</ul>
			<li>Simple: 
				<ul>
					<li><js>"MyClass.myField"</js>
				</ul>
			<li>Simple inner class: 
				<ul>
					<li><js>"MyClass$Inner1$Inner2.myField"</js>
					<li><js>"Inner1$Inner2.myField"</js>
					<li><js>"Inner2.myField"</js>
				</ul>
		</ul>
	<li>Constructors:
		<ul>
			<li>Fully qualified with args: 
				<ul>
					<li><js>"com.foo.MyClass(String,int)"</js>
					<li><js>"com.foo.MyClass(java.lang.String,int)"</js>
					<li><js>"com.foo.MyClass()"</js>
				</ul>
			<li>Simple with args: 
				<ul>
					<li><js>"MyClass(String,int)"</js>
					<li><js>"MyClass(java.lang.String,int)"</js>
					<li><js>"MyClass()"</js>
				</ul>
			<li>Simple inner class: 
				<ul>
					<li><js>"MyClass$Inner1$Inner2()"</js>
					<li><js>"Inner1$Inner2()"</js>
					<li><js>"Inner2()"</js>
				</ul>
		</ul>
	<li>A comma-delimited list of anything on this list.
</ul>
</div><!-- END: 2.12 - juneau-marshall.DynamicallyAppliedAnnotations -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.BeanDictionaries' id='juneau-marshall.BeanDictionaries'>2.13 - Bean Names and Dictionaries</a></h3>
<div class='topic'><!-- START: 2.13 - juneau-marshall.BeanDictionaries -->
<p>
	While parsing into beans, Juneau attempts to determine the class types of bean properties through 
	reflection on the bean property getter or setter.
	Often this is insufficient if the property type is an interface or abstract class that cannot be 
	instantiated.
	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.
	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 <c>Object</c>, then the serializer will add 
	<js>"_type"</js> attributes so that the class can be determined during parsing.
</p>
<p class='bpcode w800'>
 	<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>@Beanp</ja>(dictionary={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='bpcode w800'>
 	{
		x: [
			{_type:<js>'bar'</js>},
			{_type:<js>'baz'</js>}
		]
	}	 
</p>
<p>
	Type names can be represented slightly differently in different languages.
	For example, the dictionary name is used as element names when serialized to XML.
	This allows the <c>typeName</c> 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='bpcode w800'>
	<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 class='javatree'>
	<li class='ja'>{@link org.apache.juneau.annotation.Beanp#dictionary() Beanp(dictionary)} 
		- On individual bean properties through the annotation.
	<li class='ja'>{@link org.apache.juneau.annotation.Bean#dictionary() Bean(dictionary)} 
		- 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#dictionary(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='bpcode w800'>
	<jc>// Create a parser and tell it which classes to try to resolve.</jc>
	ReaderParser p = JsonParser
		.<jsm>create</jsm>()
		.dictionary(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>()
		.dictionary(HtmlBeanDictionary.<jk>class</jk>)
		.build();
</p>
<p>
	The <js>"_type"</js> property name can be overridden through the following:
</p>
<ul class='javatree'>
	<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='bpcode w800'>
	<ja>@Bean</ja>(typePropertyName=<js>"mytype"</js>, dictionary={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 = SimpleJsonSerializer.<jsf>DEFAULT</jsf>.serialize(x);
</p>
<div class='info'>
	Type names do not need to be universally unique.  
	However, they must be unique within a dictionary.
</div>
<div class='info'>
	The following reserved words cannot be used as type names:  
	<c>object, array, number, boolean, null</c>.
</div>
<div 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_addBeanTypes} 
	configuration property.
</div>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.BeanDictionaries.BeanSubTypes' id='juneau-marshall.BeanDictionaries.BeanSubTypes'>2.13.1 - Bean Subtypes</a></h4>
<div class='topic'><!-- START: 2.13.1 - juneau-marshall.BeanDictionaries.BeanSubTypes -->
<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='bpcode w800'>
	<jc>// Abstract superclass</jc>
	<ja>@Bean</ja>(
		dictionary={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='bpcode w800'>
	JsonSerializer s = SimpleJsonSerializer.<jsf>DEFAULT</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='bpcode w800'>
	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><!-- END: 2.13.1 - juneau-marshall.BeanDictionaries.BeanSubTypes -->
</div><!-- END: 2.13 - juneau-marshall.BeanDictionaries -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.VirtualBeans' id='juneau-marshall.VirtualBeans'>2.14 - Virtual Beans</a></h3>
<div class='topic'><!-- START: 2.14 - juneau-marshall.VirtualBeans -->
<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='bpcode w800'>
	<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 {@doc PojoCategories parsable} values, even other virtual beans.
</p>
<p>
	Under-the-covers, a virtual bean is simply a proxy interface on top of an existing <c>BeanMap</c>
	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 <c>BeanContext</c> class:
</p>
<p class='bpcode w800'>
	Address address = BeanContext.<jsf>DEFAULT</jsf>.createSession().newBean(Address.<jk>class</jk>);
</p>
</div><!-- END: 2.14 - juneau-marshall.VirtualBeans -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.Recursion' id='juneau-marshall.Recursion'>2.15 - Non-Tree Models and Recursion Detection</a></h3>
<div class='topic'><!-- START: 2.15 - juneau-marshall.Recursion -->
<p>
	The Juneau Serializer API is designed to be used against POJO tree structures. 
	It expects that there not be loops in the POJO model (e.g. children with references to parents, etc...).
	If you try to serialize models with loops, you will usually cause a <c>StackOverflowError</c> to 
	be thrown (if {@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_maxDepth} is not reached 
	first).
</p>
<p>
	If you still want to use the Juneau serializers on such models, Juneau provides the 
	{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions} setting.
	It tells the serializer to look for instances of an object in the current branch of the tree and skip 
	serialization when a duplicate is encountered.
</p>
<p>
	For example, let's make a POJO model out of the following classes:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> A {
		<jk>public</jk> B b;
	}
	
	<jk>public class</jk> B {
		<jk>public</jk> C c;
	}
	
	<jk>public class</jk> C {
		<jk>public</jk> A a;
	}
</p>
<p>
	Now we create a model with a loop and serialize the results.
</p>
<p class='bpcode w800'>
	<jc>// Clone an existing serializer and set property for detecting recursions.</jc>
	JsonSerializer s = SimpleJsonSerializer.<jsf>DEFAULT_READABLE</jsf>.builder().detectRecursions(<jk>true</jk>).build();

	<jc>// Create a recursive loop.</jc>
	A a = <jk>new</jk> A();
	a.<jf>b</jf> = <jk>new</jk> B();
	a.<jf>b</jf>.<jf>c</jf> = <jk>new</jk> C();
	a.<jf>b</jf>.<jf>c</jf>.<jf>a</jf> = a;
	
	<jc>// Serialize to JSON.</jc>
	String json = s.serialize(a);
</p>
<p>
	What we end up with is the following, which does not serialize the contents of the <c>c</c> field:
</p>
<p class='bpcode w800'>
	{
		<jok>b</jok>: {
			<jok>c</jok>: {
			}
		}
	}
</p>
<p>
	Without recursion detection enabled, this would cause a stack-overflow error.
</p>
<p>
	Recursion detection introduces a performance penalty of around 20%.
	For this reason the setting is disabled by default.
</p>
</div><!-- END: 2.15 - juneau-marshall.Recursion -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.ParsingIntoGenericModels' id='juneau-marshall.ParsingIntoGenericModels'>2.16 - Parsing into Generic Models</a></h3>
<div class='topic'><!-- START: 2.16 - juneau-marshall.ParsingIntoGenericModels -->
<p>
	The Juneau parsers are not limited to parsing back into the original bean classes.
	If the bean classes are not available on the parsing side, the parser can also be used to 
	parse into a generic model consisting of <c>Maps</c>, <c>Collections</c>, and primitive
	objects.
</p>
<p>
	You can parse into any <c>Map</c> type (e.g. <c>HashMap</c>, <c>TreeMap</c>), but
	using {@link org.apache.juneau.ObjectMap} is recommended since it has many convenience methods
	for converting values to various types.
	The same is true when parsing collections.  You can use any Collection (e.g. <c>HashSet</c>, 
	<c>LinkedList</c>) or array (e.g. <c>Object[]</c>, <c>String[]</c>, 
	<c>String[][]</c>), but using {@link org.apache.juneau.ObjectList} is recommended.
</p>
<p>
	When the map or list type is not specified, or is the abstract <c>Map</c>, <c>Collection</c>, 
	or <c>List</c> types, the parser will use <c>ObjectMap</c> and <c>ObjectList</c> by 
	default.
</p>
<p>
	For example, given the following JSON:
</p>
<p class='bpcode w800'>
	{
		id: <jk>1</jk>, 
		name: <js>'John Smith'</js>, 
		uri: <js>'http://sample/addressBook/person/1'</js>, 
		addressBookUri: <js>'http://sample/addressBook'</js>, 
		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
		addresses: [
			{
				uri: <js>'http://sample/addressBook/address/1'</js>, 
				personUri: <js>'http://sample/addressBook/person/1'</js>, 
				id: <jk>1</jk>, 
				street: <js>'100 Main Street'</js>, 
				city: <js>'Anywhereville'</js>, 
				state: <js>'NY'</js>, 
				zip: <jk>12345</jk>, 
				isCurrent: <jk>true</jk>
			}
		]
	}
</p>
<p>
	We can parse this into a generic <c>ObjectMap</c>:
</p>
<p class='bpcode w800'>	
	<jc>// Parse JSON into a generic POJO model.</jc>
	ObjectMap m = JsonParser.<jsf>DEFAULT</jsf>.parse(json, ObjectMap.<jk>class</jk>);

	<jc>// Convert it back to JSON.</jc>
	String json = SimpleJsonSerializer.<jsf>DEFAULT_READABLE</jsf>.serialize(m);
</p>
<p>
	What we end up with is the exact same output.
	Even the numbers and booleans are preserved because they are parsed into <c>Number</c> and 
	<c>Boolean</c> objects when parsing into generic models.
</p>
<p class='bpcode w800'>
	{
		id: <jk>1</jk>, 
		name: <js>'John Smith'</js>, 
		uri: <js>'http://sample/addressBook/person/1'</js>, 
		addressBookUri: <js>'http://sample/addressBook'</js>, 
		birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
		addresses: [
			{
				uri: <js>'http://sample/addressBook/address/1'</js>, 
				personUri: <js>'http://sample/addressBook/person/1'</js>, 
				id: <jk>1</jk>, 
				street: <js>'100 Main Street'</js>, 
				city: <js>'Anywhereville'</js>, 
				state: <js>'NY'</js>, 
				zip: <jk>12345</jk>, 
				isCurrent: <jk>true</jk>
			}
		]
	}
</p>
<p>
	Once parsed into a generic model, various convenience methods are provided on the <c>ObjectMap</c>
		and <c>ObjectList</c> classes to retrieve values:
</p>
<p class='bpcode w800'>
	<jc>// Parse JSON into a generic POJO model.</jc>
	ObjectMap m = JsonParser.<jsf>DEFAULT</jsf>.parse(json, ObjectMap.<jk>class</jk>);

	<jc>// Get some simple values.</jc>
	String name = m.getString(<js>"name"</js>);
	<jk>int</jk> id = m.getInt(<js>"id"</js>);

	<jc>// Get a value convertable from a String.</jc>
	URI uri = m.get(URI.<jk>class</jk>, <js>"uri"</js>);

	<jc>// Get a value using a swap.</jc>
	TemporalCalendarSwap swap = <jk>new</jk> TemporalCalendarSwap.IsoInstant();
	Calendar birthDate = m.get(swap, <js>"birthDate"</js>);

	<jc>// Get the addresses.</jc>
	ObjectList addresses = m.getObjectList(<js>"addresses"</js>);

	<jc>// Get the first address and convert it to a bean.</jc>
	Address address = addresses.get(Address.<jk>class</jk>, 0);
</p>

<p>
	As a general rule, parsing into beans is often more efficient than parsing into generic models.
	And working with beans is often less error prone than working with generic models.
</p>
</div><!-- END: 2.16 - juneau-marshall.ParsingIntoGenericModels -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.ReadingContinuousStreams' id='juneau-marshall.ReadingContinuousStreams'>2.17 - Reading Continuous Streams</a></h3>
<div class='topic'><!-- START: 2.17 - juneau-marshall.ReadingContinuousStreams -->
<p>
	The following parsers can be configured to read continuous streams of objects from the same input stream:
</p>
<ul class='javatree'>
	<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 continuous streams by using the {@link org.apache.juneau.parser.Parser#PARSER_unbuffered PARSER_unbuffered}
	setting.
	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='bpcode w800'>
	<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. <c>"123" + "456" = "123456"</c>).
</p>
<p>
	For obvious reasons, do not use the following properties when reading continuous streams:
</p>
<ul class='javatree'>
	<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><!-- END: 2.17 - juneau-marshall.ReadingContinuousStreams -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.URIs' id='juneau-marshall.URIs'>2.18 - URIs</a></h3>
<div class='topic'><!-- START: 2.18 - juneau-marshall.URIs -->
<p>
	Juneau serializers have sophisticated support for transforming relative URIs to absolute form.
</p>
<p>
	The classes and settings that control the behavior are:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.UriResolver} 
	<li class='jc'>{@link org.apache.juneau.UriContext}
	<li class='jc'>{@link org.apache.juneau.UriRelativity}
	<li class='jc'>{@link org.apache.juneau.UriResolution}
	<li class='jac'>{@link org.apache.juneau.serializer.Serializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext}
		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity}
		<li class='jf'>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution}
	</ul> 
</ul>
<p>
	The following example shows a bean containing URIs of various forms and how they end up serialized. 
</p>
<p class='bpcode w800'>
	<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>);;
	}	
	
	<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='javatree'>
	<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.
	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.
	For example:
</p>
<p class='bpcode w800'>
	<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><!-- END: 2.18 - juneau-marshall.URIs -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.JacksonComparison' id='juneau-marshall.JacksonComparison'>2.19 - Comparison with Jackson</a></h3>
<div class='topic'><!-- START: 2.19 - juneau-marshall.JacksonComparison -->
<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 w800'>
	<tr><th>Jackson</th><th>Juneau</th></tr>
	<tr>
		<td>
			<ja>@JsonGetter</ja>
			<br><ja>@JsonSetter</ja>
		</td>
		<td>
			{@link org.apache.juneau.annotation.Beanp @Beanp}
		</td>
	</tr>
	<tr>
		<td>
			<ja>@JsonAnyGetter</ja>
			<br><ja>@JsonAnySetter</ja>
		</td>
		<td>
			{@link org.apache.juneau.annotation.Beanp#name() @Beanp(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><c><ja>@JsonIgnoreProperties</ja>({...})</c></td>
		<td>
			{@link org.apache.juneau.annotation.Bean#bpx @Bean(bpx="...")}
		</td>
	</tr>
	<tr>
		<td><c><ja>@JsonAutoDetect</ja>(fieldVisibility=...)</c></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.Beanc @Beanc}
		</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(bpi="...")}
			<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 <c>Reader</c> swapped values.
		</td>
	</tr>
</table>
</div><!-- END: 2.19 - juneau-marshall.JacksonComparison -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.PojoCategories' id='juneau-marshall.PojoCategories'>2.20 - POJO Categories</a></h3>
<div class='topic'><!-- START: 2.20 - juneau-marshall.PojoCategories -->
<p>
	The following chart shows POJOs categorized into groups and whether they can be serialized or parsed:
</p>
<h5 class='figure'>General POJO serialization/parsing support</h5>
<table class='styled w800' style='border-collapse:collapse'>
	<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, Java arrays, Java Optionals</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, Optional, and array values are group [1, 2, 3ac, 4a, 6a] objects.	
		</td>
		<td>
			<ul class='normal'>
				<li><c>HashSet&lt;String,Integer&gt;</c>
				<li><c>TreeMap&lt;Integer,Bean&gt;</c>
				<li><c>List&lt;<jk>int</jk>[][]&gt;</c>
				<li><c>Bean[]</c>
				<li><c>Optional&lt;Bean&gt;</c>
			</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><c>HashSet&lt;Bean,Integer&gt;</c>
				<li><c>TreeMap&lt;Integer,Reader&gt;</c>
				<li><c>Optional&lt;Reader&gt;</c>
			</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.TemporalDateSwap.IsoLocalDateTime} 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><c>java.util.Date</c>
				<li><c>java.util.GregorianCalendar</c>
			</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><c>java.util.Iterator</c>
			</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><c><jk>public</jk> X swap(BeanSession);</c> where <c>X</c> is in groups 
					[1, 2a, 3ac].
				<li><c><jk>public</jk> String toString();</c> where the string is any meaningful data.
			</ul>
			And a method that converts it back into the original object:
			<ul>
				<li><c><jk>public static</jk> T fromString(String);</c>		
				<li><c><jk>public static</jk> T valueOf(String);</c>		
				<li><c><jk>public static</jk> T parse(String);</c>		
				<li><c><jk>public static</jk> T parseString(String);</c>		
				<li><c><jk>public static</jk> T forName(String);</c>		
				<li><c><jk>public static</jk> T forString(String);</c>		
				<li><c><jk>public</jk> T(X);</c> where <c>X</c> is in groups [1, 2a, 3ac].
				<li><c><jk>public static</jk> T unswap(BeanSession,X);</c> where <c>X</c> is in 
					groups [1, 2a, 3ac].		
			</ul>
		</td>
		<td>
			<ul class='normal'>
				<li><c>java.lang.Class</c>
				<li><c>java.sql.Time</c>
				<li><c>java.sql.Timestamp</c>
				<li><c>java.text.MessageFormat</c>
				<li><c>java.text.NumberFormat</c>
				<li><c>java.util.Date</c>
				<li><c>java.util.UUID</c>
				<li><c>java.util.logging.Level</c>
				<li><c>javax.xml.bind.DatatypeConverter</c>
			</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><c><jk>public</jk> X swap(BeanSession);</c> where <c>X</c> is in groups 
					[1, 2, 3].
				<li><c><jk>public</jk> String toString();</c> 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>
<div 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. 
</div>

<h5 class='topic' id='PojosConveribleToStrings'>POJOs convertible to/from Strings</h5>
<p>
	A separate category exists for POJOs that can be converted to and from Strings.
	These are used in places such as: 
</p>
<ul class='spaced-list'>
	<li>Serializing of POJOs to Strings in the REST client API when no serializers are registered.
	<li>Parsing of POJOs from Strings in the REST server API for <js>"text/plain"</js> requests where
	<js>"text/plain"</js> is not already mapped to an existing serializer.
</ul>

<p>
	As a general rule, all POJOs are converted to Strings using the <c>toString()</c> method.
	However, there is one exception:
</p>
<ul class='spaced-list'>
	<li>{@link java.util.TimeZone} - Uses {@link java.util.TimeZone#getID()}
</ul>

<p>
	POJOs are convertible from Strings using any of the following (matched in the specified order):
</p>
<ul class='spaced-list'>
	<li>Any any of the following public static non-deprecated methods:
	<ul>
		<li><c>create(String)</c>
		<li><c>fromString(String)</c>
		<li><c>fromValue(String)</c>
		<li><c>valueOf(String)</c>
		<li><c>parse(String)</c>
		<li><c>parseString(String)</c>
		<li><c>forName(String)</c>
		<li><c>forString(String)</c>
	</ul>
	<li>Has a public constructor that takes in a <c>String</c>.
</ul>
<p>
	Exceptions exist for the following classes:
</p>
<ul class='spaced-list'>
	<li>{@link java.util.TimeZone} - Uses {@link java.util.TimeZone#getTimeZone(String)}
	<li>{@link java.util.Locale} - Uses {@link java.util.Locale#forLanguageTag(String)} after replacing <js>'_'</js> with <js>'-'</js>.
	<li>{@link java.lang.Boolean} - Blank and <js>"null"</js> are interpreted as null values.
	<li>Primitives (except for <c><jk>void</jk>.<jk>class</jk></c>) - Uses the primitive wrapper classes for instantiating from Strings.
</ul>

<h5 class='topic' id='PojosConveribleToOtherTypes'>POJOs convertible to/from other types</h5>
<p>
	POJOs are also converted to various other types in places such as the Open-API serializers and parsers. 
	In this section, the type being converted to will be referred to as <c>X</c>.
</p>
<p>
	POJOs are considered convertible from X if it has any of the following (matched in the specified order):
</p>
<ul class='spaced-list'>
	<li>Any any of the following public static non-deprecated methods:
	<ul>
		<li><c>create(X)</c>
		<li><c>from*(X)</c>
	</ul>
	<li>Has a public constructor that takes in an <c>X</c>.
	<li>The X class has a public non-static no-arg non-deprecated method called <c>to*()</c>.
</ul>
<p>
	POJOs are considered convertible from X if any of the reverse of above are true.
</p>
</div><!-- END: 2.20 - juneau-marshall.PojoCategories -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails' id='juneau-marshall.JsonDetails'>2.21 - JSON Details</a></h3>
<div class='topic'><!-- START: 2.21 - juneau-marshall.JsonDetails -->
<p>
	Juneau supports converting arbitrary POJOs to and from JSON using ultra-efficient serializers and parsers.
	The JSON serializer converts POJOs directly to JSON without the need for intermediate DOM objects using a 
	highly-efficient state machine.
	Likewise, the JSON parser creates POJOs directly from JSON without the need for intermediate DOM objects. 
</p>
<p>
	The following example shows JSON for a typical bean:
</p>
<h5 class='figure'>Sample Beans</h5>
<p class='bpcode w800'>
	<jk>public class</jk> Person {
		
		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>name</jf>;
		<ja>@Swap</ja>(TemporalCalendarSwap.IsoInstant.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
		<jk>public</jk> List&lt;Address&gt; <jf>addresses</jf>; 
	
		<jc>// Getters/setters omitted</jc>
	}
	
	<jk>public class</jk> Address {

		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>;
		<jk>public</jk> StateEnum <jf>state</jf>;
		<jk>public int</jk> <jf>zip</jf>;
		<jk>public boolean</jk> <jf>isCurrent</jf>;

		<jc>// Getters/setters omitted</jc>
	}	
</p>
<h5 class='figure'>Sample Code</h5>
<p class='bpcode w800'>
	Person p = <jk>new</jk> Person()
		.name(<js>"John Smith"</js>)
		.birthDate(<js>"1946-08-12T00:00:00Z"</js>)
		.addresses(
			<jk>new</jk> Address() 
				.street(<js>"100 Main Street"</js>)
				.city(<js>"Anywhereville"</js>)
				.state(<jsf>NY</jsf>)
				.zip(12345)
				.isCurrent(<jk>true</jk>);
		);
</p>
<h5 class='figure'>Normal JSON</h5>
<p class='bpcode w800'>
   {
      <js>"name"</js>: <js>"John Smith"</js>, 
      <js>"birthDate"</js>: <js>"1946-08-12T00:00:00Z"</js>, 
      <js>"addresses"</js>: [
         {
            <js>"street"</js>: <js>"100 Main Street"</js>, 
            <js>"city"</js>: <js>"Anywhereville"</js>, 
            <js>"state"</js>: <js>"NY"</js>, 
            <js>"zip"</js>: 12345, 
            <js>"isCurrent"</js>: <jk>true</jk>
         }
      ]
   } 
 		</p>
<h5 class='figure'>Simplified JSON</h5>
<p class='bpcode w800'>
   {
      name: <js>'John Smith'</js>, 
      birthDate: <js>'1946-08-12T00:00:00Z'</js>, 
      addresses: [
         {
            street: <js>'100 Main Street'</js>, 
            city: <js>'Anywhereville'</js>, 
            state: <js>'NY'</js>, 
            zip: 12345, 
            isCurrent: <jk>true</jk>
         }
      ]
   } 
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.Methodology' id='juneau-marshall.JsonDetails.Methodology'>2.21.1 - JSON Methodology</a></h4>
<div class='topic'><!-- START: 2.21.1 - juneau-marshall.JsonDetails.Methodology -->
<p>
	The JSON data type produced depends on the Java object type being serialized.
</p>
<ul class='spaced-list'>
	<li>
		Primitives and primitive objects are converted to JSON primitives.
	<li>
		Beans and Maps are converted to JSON objects.
	<li>
		Collections and arrays are converted to JSON arrays.
	<li>
		Anything else is converted to JSON strings.
</ul>

<h5 class='figure'>Data type conversions:</h5>
<table class='styled w800'>
	<tr>
		<th>POJO type</th>
		<th>JSON type</th>
		<th>Example</th>
		<th>Serialized form</th>
	</tr>
	<tr>
		<td>String</td>
		<td>String</td>
		<td><c>serialize(<js>"foobar"</js>);</c></td>
		<td><c><js>'foobar'</js></c>
	</tr>
	<tr>
		<td>Number</td>
		<td>Number</td>
		<td><c>serialize(123);</c></td>
		<td><c>123</c>
	</tr>
	<tr>
		<td>Boolean</td>
		<td>Boolean</td>
		<td><c>serialize(<jk>true</jk>);</c></td>
		<td><c><jk>true</jk></c>
	</tr>
	<tr>
		<td>Null</td>
		<td>Null</td>
		<td><c>serialize(<jk>null</jk>);</c></td>
		<td><c><jk>null</jk></c>
	</tr>
	<tr>
		<td>Beans with properties of any type on this list</td>
		<td>Object</td>
		<td><c>serialize(<jk>new</jk> MyBean());</c></td>
		<td><c>{p1:<js>'val1'</js>,p2:<jk>true</jk>}</c>
	</tr>
	<tr>
		<td>Maps with values of any type on this list</td>
		<td>Object</td>
		<td><c>serialize(<jk>new</jk> TreeMap());</c></td>
		<td><c>{key1:<js>'val1'</js>,key2:<jk>true</jk>}</c>
	</tr>
	<tr>
		<td>Collections and arrays of any type on this list</td>
		<td>Array</td>
		<td><c>serialize(<jk>new</jk> Object[]{1,<js>"foo"</js>,<jk>true</jk>});</c></td>
		<td><c>[1,<js>'foo'</js>,<jk>true</jk>]</c>
	</tr>
</table>
<p>
	In addition, swaps can be used to convert non-serializable POJOs into serializable forms, such as converting 
	<c>Calendar</c> object to ISO8601 strings, or <c><jk>byte</jk>[]</c> arrays to Base-64 
	encoded strings.
</p>
</div><!-- END: 2.21.1 - juneau-marshall.JsonDetails.Methodology -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.Serializers' id='juneau-marshall.JsonDetails.Serializers'>2.21.2 - JSON Serializers</a></h4>
<div class='topic'><!-- START: 2.21.2 - juneau-marshall.JsonDetails.Serializers -->
<p>
	The {@link org.apache.juneau.json.JsonSerializer} class is used to serialize POJOs into JSON.
</p>	
<p>
	The JSON serializer provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonSerializer Common Serializer Properties}
	<li class='jc'>{@link org.apache.juneau.json.JsonSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.json.JsonSerializer#JSON_addBeanTypes JSON_addBeanTypes}
		<li class='jf'>{@link org.apache.juneau.json.JsonSerializer#JSON_escapeSolidus JSON_escapeSolidus}
		<li class='jf'>{@link org.apache.juneau.json.JsonSerializer#JSON_simpleMode JSON_simpleMode}
	</ul>
</ul>
<p>
	The following pre-configured serializers are provided for convenience:
</p>
<ul class='javatree'>
	<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_READABLE DEFAULT_READABLE}
	</ul>
	<li class='jc'>{@link org.apache.juneau.json.SimpleJsonSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.json.SimpleJsonSerializer#DEFAULT DEFAULT}
		<li class='jf'>{@link org.apache.juneau.json.SimpleJsonSerializer#DEFAULT_READABLE DEFAULT_READABLE}
	</ul>
</ul>
</div><!-- END: 2.21.2 - juneau-marshall.JsonDetails.Serializers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.SimplifiedJson' id='juneau-marshall.JsonDetails.SimplifiedJson'>2.21.3 - Simplified JSON</a></h4>
<div class='topic'><!-- START: 2.21.3 - juneau-marshall.JsonDetails.SimplifiedJson -->
<p>
	The {@link org.apache.juneau.json.SimpleJsonSerializer} class can be used to serialized POJOs into Simplified JSON notation.
</p>
<p>
	Simplified JSON is identical to JSON except for the following:
</p>
<ul class='spaced-list'>
	<li>JSON attributes are only quoted when necessary.
	<li>Uses single-quotes for quoting.
</ul>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Some free-form JSON.</jc>
	ObjectMap m = <jk>new</jk> ObjectMap()
		.append(<js>"foo"</js>, <js>"x1"</js>)
		.append(<js>"_bar"</js>, <js>"x2"</js>)
		.append(<js>" baz "</js>, <js>"x3"</js>)
	 	.append(<js>"123"</js>, <js>"x4"</js>)
	 	.append(<js>"return"</js>, <js>"x5"</js>);
	 	.append(<js>""</js>, <js>"x6"</js>);
</p>
<p class='bpcode w800'>
	<joc>// Serialized to standard JSON</joc>
	{
		<jok>"foo"</jok>: <jov>"x1"</jov>,
	 	<jok>"_bar"</jok>: <jov>"x2"</jov>,
	 	<jok>" baz "</jok>: <jov>"x3"</jov>,
	 	<jok>"123"</jok>: <jov>"x4"</jov>,
	 	<jok>"return"</jok>: <jov>"x5"</jov>,
	 	<jok>""</jok>: <jov>"x6"</jov>
	}
</p>	 		
<p class='bpcode w800'>
	<joc>// Serialized to simplified JSON</joc>
	{
		<jok>foo</jok>: <jov>'x1'</jov>,
	 	<jok>_bar</jok>: <jov>'x2'</jov>,
	 	<jok>' baz '</jok>: <jov>'x3'</jov>,  <joc>// Quoted due to embedded spaces.</joc>
	 	<jok>'123'</jok>: <jov>'x4'</jov>,    <joc>// Quoted to prevent confusion with number.</joc>
	 	<jok>'return'</jok>: <jov>'x5'</jov>, <joc>// Quoted because it's a keyword.</joc>
	 	<jok>''</jok>: <jov>'x6'</jov>        <joc>// Quoted because it's an empty string.</joc>
	}
</p>
<p>
	The advantage to simplified JSON is you can represent it in a Java String in minimal form with minimal escaping.
	This is particularly useful in cases such as unit testing where you can easily validate POJOs by simplifying them to Simplified JSON and do a simple string comparison.
</p>
<p class='bpcode w800'>
	WriterSerializer ws = SimpleJsonSerializer.<jsf>DEFAULT</jsf>;
	<jsm>assertEquals</jsm>(<js>"{foo:'bar',baz:123}"</js>, ws.toString(myPojo));
</p>			

<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.json.JsonSerializer#JSON_simpleMode}
</ul>
</div><!-- END: 2.21.3 - juneau-marshall.JsonDetails.SimplifiedJson -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.Parsers' id='juneau-marshall.JsonDetails.Parsers'>2.21.4 - JSON Parsers</a></h4>
<div class='topic'><!-- START: 2.21.4 - juneau-marshall.JsonDetails.Parsers -->
<p>
	The {@link org.apache.juneau.json.JsonParser} class is used to parse JSON into POJOs.
</p>	
<p>
	The JSON parser provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonParser Common Parser Properties}
	<li class='jc'>{@link org.apache.juneau.json.JsonParser}
	<ul>
		<li class='jf'>{@link org.apache.juneau.json.JsonParser#JSON_validateEnd JSON_validateEnd}
	</ul>
</ul>
<p>
	The following pre-configured parsers are provided for convenience:
</p>
<ul class='javatree'>
	<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>
</ul>
<p>
	The JSON parser supports ALL valid JSON, including:
</p>
<ul class='spaced-list'>
	<li>
		Javascript comments.
	<li>
		Single or double quoted values.
	<li>
		Quoted (strict) or unquoted (non-strict) attributes.
	<li>
		JSON fragments (such as string, numeric, or boolean primitive values).
	<li>
		Concatenated strings. 
</ul>
</div><!-- END: 2.21.4 - juneau-marshall.JsonDetails.Parsers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.JsonAnnotation' id='juneau-marshall.JsonDetails.JsonAnnotation'>2.21.5 - @Json Annotation</a></h4>
<div class='topic'><!-- START: 2.21.5 - juneau-marshall.JsonDetails.JsonAnnotation -->
<p>
	The {@link org.apache.juneau.json.annotation.Json @Json} annotation
	is used to override the behavior of {@link org.apache.juneau.json.JsonSerializer} on individual bean classes or properties.
</p>
<p>
	The annotation can be applied to beans as well as other objects serialized to other types (e.g. strings).
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.json.annotation.Json}
	<ul>
		<li class='jf'>{@link org.apache.juneau.json.annotation.Json#wrapperAttr() wrapperAttr}
	</ul>
</ul>		
<p>
	The {@link org.apache.juneau.json.annotation.Json#wrapperAttr() @Json(wrapperAttr)} annotation
	can be used to wrap beans inside a JSON object with a specified attribute name.
</p>		
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Json</ja>(wrapperAttr=<js>"personBean"</js>)
	<jk>public class</jk> Person {
		<jk>public</jk> String <jf>name</jf> = <js>"John Smith"</js>;
	}
</p>
<p>
	The following shows the JSON representation with and without the annotation present:
</p>
<table class='styled w800'>
	<tr>
		<th>Without annotation</th>
		<th>With annotation</th>
	</tr>
	<tr>
		<td class='code'>
	{
		<jok>name</jok>: <jov>'John Smith'</jov>
	}
		</td>
		<td class='code'>
	{
		<jok>personBean</jok>: {
			<jok>name</jok>: <jov>'John Smith'</jov>
		}
	}
		</td>
	</tr>
</table>
</div><!-- END: 2.21.5 - juneau-marshall.JsonDetails.JsonAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.JsonDetails.JsonSchema' id='juneau-marshall.JsonDetails.JsonSchema'>2.21.6 - JSON-Schema Support</a></h4>
<div class='topic'><!-- START: 2.21.6 - juneau-marshall.JsonDetails.JsonSchema -->
<p>
	Juneau provides the {@link org.apache.juneau.json.JsonSchemaSerializer} class for generating JSON-Schema 
	documents that describe the output generated by the {@link org.apache.juneau.json.JsonSerializer} class.
	This class shares the same properties as <c>JsonSerializer</c>.
	For convenience the {@link org.apache.juneau.json.JsonSerializer#getSchemaSerializer()} method has been 
	added for creating instances of schema serializers from the regular serializer instance.
</p>
<h5 class='figure'>Sample Beans</h5>
<p class='bpcode w800'>
	<jk>public class</jk> Person {
		
		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>name</jf>;
		<jk>public</jk> Calendar <jf>birthDate</jf>;
		<jk>public</jk> List&lt;Address&gt; <jf>addresses</jf>; 
	
		<jc>// Getters/setters omitted</jc>
	}
	
	<jk>public class</jk> Address {

		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>;
		<jk>public</jk> StateEnum <jf>state</jf>;
		<jk>public int</jk> <jf>zip</jf>;
		<jk>public boolean</jk> <jf>isCurrent</jf>;

		<jc>// Getters/setters omitted</jc>
	}	
</p>
<p>
	The code for creating our POJO model and generating JSON-Schema is shown below:
</p>
<p class='bpcode w800'>
	<jc>// Get the one of the default schema serializers.</jc>
	JsonSchemaSerializer s = JsonSchemaSerializer.<jsf>DEFAULT_SIMPLE_READABLE</jsf>;
	
	<jc>// Get the JSON Schema for the POJO.</jc>
	String jsonSchema = s.serialize(<jk>new</jk> Person());

	<jc>// This also works.</jc>
	jsonSchema = s.serialize(Person.<jk>class</jk>);
</p>

<h5 class='figure'>JSON Schema</h5>
<p class='bpcode w800'>
	{
		<jok>type: <jov>'object'</jov>, 
		<jok>description</jok>: <jov>'org.apache.juneau.sample.Person'</jov>, 
		<jok>properties</jok>: {
			<jok>name</jok>: {
				<jok>type</jok>: <jov>'string'</jov>, 
				<jok>description</jok>: <jov>'java.lang.String'</jov>
			}, 
			<jok>birthDate</jok>: {
				<jok>type</jok>: <jov>'string'</jov>, 
				<jok>description</jok>: <jov>'java.util.Calendar'</jov>
			}, 
			<jok>addresses</jok>: {
				<jok>type</jok>: <jov>'array'</jov>, 
				<jok>description</jok>: <jov>'java.util.LinkedList&lt;org.apache.juneau.sample.Address&gt;'</jov>, 
				<jok>items</jok>: {
					<jok>type</jok>: <jov>'object'</jov>, 
					<jok>description</jok>: <jov>'org.apache.juneau.sample.Address'</jov>, 
					<jok>properties</jok>: {
						<jok>street</jok>: {
							<jok>type</jok>: <jov>'string'</jov>, 
							<jok>description</jok>: <jov>'java.lang.String'</jov>
						}, 
						<jok>city</jok>: {
							<jok>type</jok>: <jov>'string'</jov>, 
							<jok>description</jok>: <jov>'java.lang.String'</jov>
						}, 
						<jok>state</jok>: {
							<jok>type</jok>: <jov>'string'</jov>, 
							<jok>description</jok>: <jov>'java.lang.String'</jov>
						}, 
						<jok>zip</jok>: {
							<jok>type</jok>: <jov>'number'</jov>, 
							<jok>description</jok>: <jov>'int'</jov>
						}, 
						<jok>isCurrent</jok>: {
							<jok>type</jok>: <jov>'boolean'</jov>, 
							<jok>description</jok>: <jov>'boolean'</jov>
						}
					}
				}
			}
		}
	}
</p>
</div><!-- END: 2.21.6 - juneau-marshall.JsonDetails.JsonSchema -->
</div><!-- END: 2.21 - juneau-marshall.JsonDetails -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails' id='juneau-marshall.XmlDetails'>2.22 - XML Details</a></h3>
<div class='topic'><!-- START: 2.22 - juneau-marshall.XmlDetails -->
<p>
	Juneau supports converting arbitrary POJOs to and from XML using ultra-efficient serializers and parsers.
	The XML serializer converts POJOs directly to XML without the need for intermediate DOM objects.
	Likewise, the XML parser uses a STaX parser and creates POJOs directly without intermediate DOM objects. 
</p>
<p>
	Unlike frameworks such as JAXB, Juneau does not require POJO classes to be annotated to produce and consume 
	XML.
	However, several XML annotations are provided for handling namespaces and fine-tuning the format of the XML produced.
</p>
<p>
	The following example shows XML for a typical bean:
</p>
<h5 class='figure'>Sample Beans</h5>
<p class='bpcode w800'>
	<ja>@Bean</ja>(typeName=<js>"person"</js>)
	<jk>public class</jk> Person {
		
		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>name</jf>;
		<ja>@Swap</ja>(TemporalCalendarSwap.IsoInstant.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
		<jk>public</jk> List&lt;Address&gt; <jf>addresses</jf>; 
	
		<jc>// Getters/setters omitted</jc>
	}
	
	<ja>@Bean</ja>(typeName=<js>"address"</js>)
	<jk>public class</jk> Address {

		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>;
		<jk>public</jk> StateEnum <jf>state</jf>;
		<jk>public int</jk> <jf>zip</jf>;
		<jk>public boolean</jk> <jf>isCurrent</jf>;

		<jc>// Getters/setters omitted</jc>
	}	
</p>
<h5 class='figure'>Sample Code</h5>
<p class='bpcode w800'>
	Person p = <jk>new</jk> Person()
		.name(<js>"John Smith"</js>)
		.birthDate(<js>"1946-08-12T00:00:00Z"</js>)
		.addresses(
			<jk>new</jk> Address() 
				.street(<js>"100 Main Street"</js>)
				.city(<js>"Anywhereville"</js>)
				.state(<jsf>NY</jsf>)
				.zip(12345)
				.isCurrent(<jk>true</jk>);
		);
</p>
<h5 class='figure'>Normal XML:</h5>
<p class='bpcode w800'>
	<xt>&lt;person&gt;</xt>
		<xt>&lt;name&gt;</xt>John Smith<xt>&lt;/name&gt;</xt>
		<xt>&lt;birthDate&gt;</xt>1946-08-12T04:00:00Z<xt>&lt;/birthDate&gt;</xt>
		<xt>&lt;addresses&gt;</xt>
			<xt>&lt;address&gt;</xt>
				<xt>&lt;street&gt;</xt>100 Main Street<xt>&lt;/street&gt;</xt>
				<xt>&lt;city&gt;</xt>Anywhereville<xt>&lt;/city&gt;</xt>
				<xt>&lt;state&gt;</xt>NY<xt>&lt;/state&gt;</xt>
				<xt>&lt;zip&gt;</xt>12345<xt>&lt;/zip&gt;</xt>
				<xt>&lt;isCurrent&gt;</xt>true<xt>&lt;/isCurrent&gt;</xt>
			<xt>&lt;/address&gt;</xt>
		<xt>&lt;/addresses&gt;</xt>
	<xt>&lt;/person&gt;</xt>
</p>
<p>
	Juneau produces JSON-equivalent XML, meaning any valid JSON document can be losslessly converted into an XML 
	equivalent.
	In fact, all of the Juneau serializers and parsers are built upon this JSON-equivalence.
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Methodology' id='juneau-marshall.XmlDetails.Methodology'>2.22.1 - XML Methodology</a></h4>
<div class='topic'><!-- START: 2.22.1 - juneau-marshall.XmlDetails.Methodology -->
<p>
	The following examples show how different data types are represented in XML.
	They mirror how the data structures are represented in JSON.
</p>

<h5 class='topic'>Simple types</h5>
<p>
	The representation of loose (not a direct bean property value) simple types are shown below:
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>XML</th>
	</tr>
	<tr>
		<td>string</td>
		<td class='code'><js>'foo'</js></td>
		<td class='code'><xt>&lt;string&gt;</xt>foo<xt>&lt;/string&gt;</xt></td>
	</tr>
	<tr>
		<td>boolean</td>
		<td class='code'><jk>true</jk></td>
		<td class='code'><xt>&lt;boolean&gt;</xt>true<xt>&lt;/boolean&gt;</xt></td>
	</tr>
	<tr>
		<td>integer</td>
		<td class='code'>123</td>
		<td class='code'><xt>&lt;number&gt;</xt>123<xt>&lt;/number&gt;</xt></td>
	</tr>
	<tr>
		<td>float</td>
		<td class='code'>1.23</td>
		<td class='code'><xt>&lt;number&gt;</xt>1.23<xt>&lt;/number&gt;</xt></td>
	</tr>
	<tr>
		<td>null</td>
		<td class='code'><jk>null</jk></td>
		<td class='code'><xt>&lt;null/&gt;</xt></td>
	</tr>
</table>

<h5 class='topic'>Maps</h5>
<p>
	Loose maps and beans use the element <xt>&lt;object&gt;</xt> for encapsulation.
</p>
<p>
	<xa>_type</xa> attributes are added to bean properties or map entries if the type cannot be inferred 
	through reflection (e.g. an <c>Object</c> or superclass/interface value type).
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>XML</th>
	</tr>
	<tr>
		<td class='code'>
	Map&lt;String,String&gt;
		</td>
		<td class='code'>
	{
		k1: <js>'v1'</js>
		k2: <jk>null</jk>
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;k1&gt;<xv>v1</xv>&lt;/k1&gt;
		&lt;k2 <xa>_type</xa>=<xs>'null'</xs>/&gt;
	&lt;/object&gt;
	</xt></td>
	</tr>
	<tr>
		<td class='code'>
	Map&lt;String,Number&gt;
		</td>
		<td class='code'>
	{
		k1: 123,
		k2: 1.23,
		k3: <jk>null</jk>
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;k1&gt;<xv>123</xv>&lt;/k1&gt;
		&lt;k2&gt;<xv>1.23</xv>&lt;/k2&gt;
		&lt;k3 <xa>_type</xa>=<xs>'null'</xs>/&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	Map&lt;String,Object&gt;
		</td>
		<td class='code'>
	{
		k1: <js>'v1'</js>
		k2: 123,
		k3: 1.23,
		k4: <jk>true</jk>,
		k5: <jk>null</jk>
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;k1&gt;<xv>v1</xv>&lt;/k1&gt;
		&lt;k2 <xa>_type</xa>=<xs>'number'</xs>&gt;<xv>123</xv>&lt;/k2&gt;
		&lt;k3 <xa>_type</xa>=<xs>'number'</xs>&gt;<xv>1.23</xv>&lt;/k3&gt;
		&lt;k4 <xa>_type</xa>=<xs>'boolean'</xs>&gt;<xv>true</xv>&lt;/k4&gt;
		&lt;k5 <xa>_type</xa>=<xs>'null'</xs>/&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
</table>

<h5 class='topic'>Arrays</h5>
<p>
	Loose collections and arrays use the element <xt>&lt;array&gt;</xt> for encapsulation.
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>XML</th>
	</tr>
	<tr>
		<td class='code'>
	String[]
		</td>
		<td class='code'>
	[
		<js>'foo'</js>
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;array&gt;
		&lt;string&gt;<xv>foo</xv>&lt;/string&gt;
		&lt;null/&gt;
	&lt;/array&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	Number[]
		</td>
		<td class='code'>
	[
		123,
		1.23,
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;array&gt;
		&lt;number&gt;<xv>123</xv>&lt;/number&gt;
		&lt;number&gt;<xv>1.23</xv>&lt;/number&gt;
		&lt;null/&gt;
	&lt;/array&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	Object[]
		</td>
		<td class='code'>
	[
		<js>'foo'</js>,
		123,
		1.23,
		<jk>true</jk>,
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;array&gt;
		&lt;string&gt;<xv>foo</xv>&lt;/string&gt;
		&lt;number&gt;<xv>123</xv>&lt;/number&gt;
		&lt;number&gt;<xv>1.23</xv>&lt;/number&gt;
		&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;
		&lt;null/&gt;
	&lt;/array&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	String[][]
		</td>
		<td class='code'>
	[
		[<js>'foo'</js>, <jk>null</jk>],
		<jk>null</jk>,
	]
		</td>
		<td class='code'><xt>
	&lt;array&gt;
		&lt;array&gt;
			&lt;string&gt;<xv>foo</xv>&lt;/string&gt;
			&lt;null/&gt;
		&lt;/array&gt;
		&lt;null/&gt;
	&lt;/array&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<jk>int</jk>[]
		</td>
		<td class='code'>
	[
		123
	]
		</td>
		<td class='code'><xt>
	&lt;array&gt;
		&lt;number&gt;<xv>123</xv>&lt;/number&gt;
	&lt;/array&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<jk>boolean</jk>[]
		</td>
		<td class='code'>
	[
		<jk>true</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;array&gt;
		&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;
	&lt;/array&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	List&lt;String&gt;
		</td>
		<td class='code'>
	[
		<js>'foo'</js>
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;array&gt;
		&lt;string&gt;<xv>foo</xv>&lt;/string&gt;
		&lt;null/&gt;
	&lt;/array&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	List&lt;Number&gt;
		</td>
		<td class='code'>
	[
		123,
		1.23,
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;array&gt;
		&lt;number&gt;<xv>123</xv>&lt;/number&gt;
		&lt;number&gt;<xv>1.23</xv>&lt;/number&gt;
		&lt;null/&gt;
	&lt;/array&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	List&lt;Object&gt;
		</td>
		<td class='code'>
	[
		<js>'foo'</js>,
		123,
		1.23,
		<jk>true</jk>,
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;array&gt;
		&lt;string&gt;<xv>foo</xv>&lt;/string&gt;
		&lt;number&gt;<xv>123</xv>&lt;/number&gt;
		&lt;number&gt;<xv>1.23</xv>&lt;/number&gt;
		&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;
		&lt;null/&gt;
	&lt;/array&gt;
		</xt></td>
	</tr>
</table>

<h5 class='topic'>Beans</h5>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>XML</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<jk>public</jk> String a;
		<jk>public</jk> <jk>int</jk> b;
		<jk>public</jk> Object c;  <jc>// String value</jc>
		<jk>public</jk> Object d;  <jc>// Integer value</jc>  	
		<jk>public</jk> MyBean2 e;  
		<jk>public</jk> String[] f;  
	 	<jk>public</jk> <jk>int</jk>[] g;  	
	}
	<jk>class</jk> MyBean2 {
		String h;  
	}
		</td>
		<td class='code'>
	{
		<jok>a</jok>: <jov>'foo'</jov>,
		<jok>b</jok>: <jov>123</jov>,
		<jok>c</jok>: <jov>'bar'</jov>,
		<jok>d</jok>: <jov>456</jov>,
		<jok>e</jok>: {
			<jok>h</jok>: <jov>'baz'</jov>
		}
		<jok>f</jok>: [<jov>'qux'</jov>]
		<jok>g</jok>: [<jov>789</jov>]
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;<xv>foo</xv>&lt;/a&gt;
		&lt;b&gt;<xv>123</xv>&lt;/b&gt;
		&lt;c&gt;<xv>bar</xv>&lt;/c&gt;
		&lt;d <xa>_type</xa>=<xs>'number'</xs>&gt;<xv>456</xv>&lt;/d&gt;
		&lt;e&gt;
			&lt;h&gt;<xv>baz</xv>&lt;/h&gt;
		&lt;/e&gt;
		&lt;f&gt;
			&lt;string&gt;<xv>qux</xv>&lt;/string&gt;
		&lt;/f&gt;
		&lt;g&gt;
			&lt;number&gt;<xv>789</xv>&lt;/number&gt;
		&lt;/g&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
</table>

<h5 class='topic'>Beans with Map properties</h5>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>XML</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<jk>public</jk> Map&lt;String,String&gt; a;
		<jk>public</jk> Map&lt;String,Number&gt; b;
		<jk>public</jk> Map&lt;String,Object&gt; c; 
	}
		</td>
		<td class='code'>
	{
		<jok>a</jok>: {
			<jok>k1</jok>: <jov>'foo'</jov>
		},
		<jok>b</jok>: {
			<jok>k2</jok>: <jov>123</jov>
		},
		<jok>c</jok>: {
			<jok>k3</jok>: <jov>'bar'</jov>,
			<jok>k4</jok>: <jov>456</jov>,
			<jok>k5</jok>: <jov>true</jov>,
			<jok>k6</jok>: <jov>null</jov>
		}
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;k1&gt;<xv>foo</xv>&lt;/k1&gt;
		&lt;/a&gt;
		&lt;b&gt;
			&lt;k2&gt;<xv>123</xv>&lt;/k2&gt;
		&lt;/b&gt;
		&lt;c&gt;
			&lt;k3&gt;<xv>bar</xv>&lt;/k3&gt;
			&lt;k4 <xa>_type</xa>=<xs>'number'</xs>&gt;<xv>456</xv>&lt;/k4&gt;
			&lt;k5 <xa>_type</xa>=<xs>'boolean'</xs>&gt;<xv>true</xv>&lt;/k5&gt;
			&lt;k6 <xa>_type</xa>=<xs>'null'</xs>/&gt;
		&lt;/c&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
</table>
</div><!-- END: 2.22.1 - juneau-marshall.XmlDetails.Methodology -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Serializers' id='juneau-marshall.XmlDetails.Serializers'>2.22.2 - XML Serializers</a></h4>
<div class='topic'><!-- START: 2.22.2 - juneau-marshall.XmlDetails.Serializers -->
<p>
	The {@link org.apache.juneau.xml.XmlSerializer} class is used to serialize POJOs into XML.
</p>	
<p>
	The {@link org.apache.juneau.xml.XmlDocSerializer} class is the same, but serializes a <xt>&lt;?xml?&gt;</xt> header 
	at the top of the file.
</p>
<p>
	The XML serializers provide the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonSerializer Common Serializer Properties}
	<li class='jc'>{@link org.apache.juneau.xml.XmlSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#XML_addBeanTypes XML_addBeanTypes}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#XML_addNamespaceUrisToRoot XML_addNamespaceUrisToRoot}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#XML_autoDetectNamespaces XML_autoDetectNamespaces}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#XML_defaultNamespace XML_defaultNamespace}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#XML_enableNamespaces XML_enableNamespaces}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#XML_namespaces XML_namespaces}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#XML_xsNamespace XML_xsNamespace}
	</ul>
</ul>
<p>
	The following pre-configured serializers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.xml.XmlSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#DEFAULT DEFAULT}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#DEFAULT_JUNEAU_NAMESPACE DEFAULT_JUNEAU_NAMESPACE}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#DEFAULT_NS DEFAULT_NS}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#DEFAULT_NS_SQ DEFAULT_NS_SQ}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#DEFAULT_NS_SQ_READABLE DEFAULT_NS_SQ_READABLE}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#DEFAULT_SQ DEFAULT_SQ}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#DEFAULT_SQ_READABLE DEFAULT_SQ_READABLE}
		<li class='jf'>{@link org.apache.juneau.xml.XmlSerializer#DEFAULT_XS_NAMESPACE DEFAULT_XS_NAMESPACE}				
	</ul>
</ul>
</div><!-- END: 2.22.2 - juneau-marshall.XmlDetails.Serializers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Parsers' id='juneau-marshall.XmlDetails.Parsers'>2.22.3 - XML Parsers</a></h4>
<div class='topic'><!-- START: 2.22.3 - juneau-marshall.XmlDetails.Parsers -->
<p>
	The {@link org.apache.juneau.xml.XmlParser} class is used to parse XML into POJOs.
</p>	
<p>
	The XML parser provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonParser Common Parser Properties}
	<li class='jc'>{@link org.apache.juneau.xml.XmlParser}
	<ul>
		<li class='jf'>{@link org.apache.juneau.xml.XmlParser#XML_eventAllocator XML_eventAllocator}
		<li class='jf'>{@link org.apache.juneau.xml.XmlParser#XML_preserveRootElement XML_preserveRootElement}
		<li class='jf'>{@link org.apache.juneau.xml.XmlParser#XML_reporter XML_reporter}
		<li class='jf'>{@link org.apache.juneau.xml.XmlParser#XML_resolver XML_resolver}
		<li class='jf'>{@link org.apache.juneau.xml.XmlParser#XML_validating XML_validating}				
	</ul>
</ul>
<p>
	The following pre-configured parsers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.xml.XmlParser}
	<ul>
		<li class='jf'>{@link org.apache.juneau.xml.XmlParser#DEFAULT DEFAULT}
	</ul>
</ul>
</div><!-- END: 2.22.3 - juneau-marshall.XmlDetails.Parsers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.BeanTypeNameAnnotation' id='juneau-marshall.XmlDetails.BeanTypeNameAnnotation'>2.22.4 - @Bean(typeName) Annotation</a></h4>
<div class='topic'><!-- START: 2.22.4 - juneau-marshall.XmlDetails.BeanTypeNameAnnotation -->
<p>
	The {@link org.apache.juneau.annotation.Bean#typeName() @Bean(typeName)} annotation can be used to 
	override the Juneau default name on bean elements. 
	Types names serve two distinct purposes:
</p>
<ol>
	<li>To override the element name.
	<li>To serve as a class identifier so that the bean class can be inferred during parsing if it
		cannot automatically be inferred through reflection.
</ol>

<h5 class='figure'>Example</h5>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>Without annotation</th>
		<th>With annotation</th>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)
	<jk>class</jk> MyBean {
		<jk>public</jk> String a;
		<jk>public int</jk> b;
	}	
		</td>
		<td class='code'>
	{
		a: <js>'foo'</js>,
		b: 123
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;<xv>foo</xv>&lt;/id&gt;
		&lt;b&gt;<xv>123</xv>&lt;/name&gt;
	&lt;/object&gt;
					</xt></td>
					<td class='code'><xt>
	&lt;X&gt;
		&lt;a&gt;<xv>foo</xv>&lt;/id&gt;
		&lt;b&gt;<xv>123</xv>&lt;/name&gt;
	&lt;/X&gt;
		</xt></td>
	</tr>
</table>
<p>
	On bean properties, a <xa>_type</xa> attribute will be added if a type name is present and the bean 
	class cannot be inferred through reflection.
</p>
<p>
	In the following example, a type attribute is used on property 'b' but not property 'a' since
	'b' is of type <c>Object</c> and therefore the bean class cannot be inferred.
</p>

<h5 class='figure'>Example</h5>
<table class='styled w800'>
	<tr>
		<th>Java</th>
		<th>Without annotation</th>
		<th>With annotation</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<jk>public</jk> BeanX a = <jk>new</jk> BeanX();
		<jk>public</jk> Object b = <jk>new</jk> BeanX();
	}
	
	<ja>@Bean</ja>(typeName=<js>"X"</js>)
	<jk>class</jk> BeanX {
		<jk>public</jk> String fx = <js>"foo"</js>;
	}
		
		</td>
		<td class='code'><xt>
&lt;object&gt;
	&lt;a&gt;
		&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
	&lt;/a&gt;
	&lt;b&gt;
		&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
	&lt;/b&gt;
&lt;/object&gt;
		</xt></td>
		<td class='code'><xt>
&lt;object&gt;
	&lt;a&gt;
		&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
	&lt;/a&gt;
	&lt;b <xa>_type</xa>=<xs>'X'</xs>&gt;
		&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
	&lt;/b&gt;
&lt;/object&gt;
		</xt></td>
	</tr>
</table>
<div class='info'>
	<c>string</c>, <c>number</c>, <c>boolean</c>, <c>object</c>, 
	<c>array</c>, and <c>null</c> are reserved keywords that cannot be used as type names.
</div>
<p>
	Beans with type names are often used in conjunction with the 
	{@link org.apache.juneau.annotation.Bean#dictionary() @Bean(dictionary)} and 
	{@link org.apache.juneau.annotation.Beanp#dictionary() @Beanp(dictionary)} 
	annotations so that the beans can be resolved at parse time.  
	These annotations are not necessary during serialization, but are needed during parsing in order to 
	resolve the bean types.
</p>
<p>
	The following examples show how type names are used under various circumstances.  
</p>
<p>
	Pay special attention to when <xa>_type</xa> attributes are and are not used.
</p>

<h5 class='figure'>Examples</h5>
<table class='styled w800'>
	<tr>
		<th>Java</th>
		<th>XML</th>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(dictionary={BeanX.<jk>class</jk>})
	<jk>class</jk> BeanWithArrayPropertiesWithTypeNames {
		<jk>public</jk> BeanX[] b1 = <jk>new</jk> BeanX[]{ 
			<jk>new</jk> BeanX() 
		};
		<jk>public</jk> Object[] b2 = <jk>new</jk> BeanX[]{ 
			<jk>new</jk> BeanX() 
		};
		<jk>public</jk> Object[] b3 = <jk>new</jk> Object[]{ 
			<jk>new</jk> BeanX() 
		};
	}
		</td>				
		<td class='code'><xt>
	&lt;object&gt;
		&lt;b1&gt;
			&lt;X&gt;
				&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
			&lt;/X&gt;
		&lt;/b1&gt;
		&lt;b2&gt;
			&lt;X&gt;
				&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
			&lt;/X&gt;
		&lt;/b2&gt;
		&lt;b3&gt;
			&lt;X&gt;
				&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
			&lt;/X&gt;
		&lt;/b3&gt;
	&lt;/object&gt;
		</xt></td>				
	</tr>				
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(dictionary={BeanX.<jk>class</jk>})
	<jk>class</jk> BeanWith2dArrayPropertiesWithTypeNames {
		<jk>public</jk> BeanX[][] b1 = <jk>new</jk> BeanX[][]{{
			<jk>new</jk> BeanX()
		}};
		<jk>public</jk> Object[][] b2 = <jk>new</jk> BeanX[][]{{
			<jk>new</jk> BeanX()
		}};
		<jk>public</jk> Object[][] b3 = <jk>new</jk> Object[][]{{
			<jk>new</jk> BeanX()
		}};
	}
		</td>				
		<td class='code'><xt>
	&lt;object&gt;
		&lt;b1&gt;
			&lt;array&gt;
				&lt;X&gt;
					&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
				&lt;/X&gt;
			&lt;/array&gt;
		&lt;/b1&gt;
		&lt;b2&gt;
			&lt;array&gt;
				&lt;X&gt;
					&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
				&lt;/X&gt;
			&lt;/array&gt;
		&lt;/b2&gt;
		&lt;b3&gt;
			&lt;array&gt;
				&lt;X&gt;
					&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
				&lt;/X&gt;
			&lt;/array&gt;
		&lt;/b3&gt;
	&lt;/object&gt;
		</xt></td>				
	</tr>		
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(dictionary={BeanX.<jk>class</jk>})
	<jk>class</jk> BeanWithMapPropertiesWithTypeNames {
		<jk>public</jk> Map&lt;String,BeanX&gt; b1 = <jk>new</jk> HashMap&lt;&gt;() {{ 
			put(<js>"k1"</js>, <jk>new</jk> BeanX()); 
		}};
		<jk>public</jk> Map&lt;String,Object&gt; b2 = <jk>new</jk> HashMap&lt;&gt;() {{
			put(<js>"k2"</js>, <jk>new</jk> BeanX());
		}}
	}
		</td>				
		<td class='code'><xt>
	&lt;object&gt;
		&lt;b1&gt;
			&lt;k1&gt;
				&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
			&lt;/k1&gt;
		&lt;/b1&gt;
		&lt;b2&gt;
			&lt;k2 <xa>_type</xa>=<xs>'X'</xs>&gt;
				&lt;fx&gt;<xv>foo</xv>&lt;/fx&gt;
			&lt;/k2&gt;
		&lt;/b2&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
</table>
<p>
	Bean type names are also used for resolution when abstract fields are used.
	The following examples show how they are used in a variety of circumstances.
</p>
<table class='styled w800'>
	<tr>
		<th>Java</th>
		<th>XML</th>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(dictionary={A.<jk>class</jk>})
	<jk>class</jk> BeanWithAbstractFields {
		<jk>public</jk> A a = <jk>new</jk> A();
		<jk>public</jk> IA ia = <jk>new</jk> A();
		<jk>public</jk> AA aa = <jk>new</jk> A();
		<jk>public</jk> Object o = <jk>new</jk> A();
	}
	
	<jk>interface</jk> IA {}
	
	<jk>abstract class</jk> AA <jk>implements</jk> IA {}

	<ja>@Bean</ja>(typeName=<js>"A"</js>)
	<jk>class</jk> A <jk>extends</jk> AA {
		<jk>public</jk> String fa = <js>"foo"</js>;
	}
		</td>				
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
		&lt;/a&gt;
		&lt;ia <xa>_type</xa>=<xs>'A'</xs>&gt;
			&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
		&lt;/ia&gt;
		&lt;aa <xa>_type</xa>=<xs>'A'</xs>&gt;
			&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
		&lt;/aa&gt;
		&lt;o <xa>_type</xa>=<xs>'A'</xs>&gt;
			&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
		&lt;/o&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(dictionary={A.<jk>class</jk>})
	<jk>class</jk> BeanWithAbstractArrayFields {
		<jk>public</jk> A[] a = <jk>new</jk> A[]{<jk>new</jk> A()};
		<jk>public</jk> IA[] ia1 = <jk>new</jk> A[]{<jk>new</jk> A()};
		<jk>public</jk> IA[] ia2 = <jk>new</jk> IA[]{<jk>new</jk> A()};
		<jk>public</jk> AA[] aa1 = <jk>new</jk> A[]{<jk>new</jk> A()};
		<jk>public</jk> AA[] aa2 = <jk>new</jk> AA[]{<jk>new</jk> A()};
		<jk>public</jk> Object[] o1 = <jk>new</jk> A[]{<jk>new</jk> A()};
		<jk>public</jk> Object[] o2 = <jk>new</jk> Object[]{<jk>new</jk> A()};
	}
		</td>				
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;A&gt;
				&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
			&lt;/A&gt;
		&lt;/a&gt;
		&lt;ia1&gt;
			&lt;A&gt;
				&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
			&lt;/A&gt;
		&lt;/ia1&gt;
		&lt;ia2&gt;
			&lt;A&gt;
				&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
			&lt;/A&gt;
		&lt;/ia2&gt;
		&lt;aa1&gt;
			&lt;A&gt;
				&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
			&lt;/A&gt;
		&lt;/aa1&gt;
		&lt;aa2&gt;
			&lt;A&gt;
				&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
			&lt;/A&gt;
		&lt;/aa2&gt;
		&lt;o1&gt;
			&lt;A&gt;
				&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
			&lt;/A&gt;
		&lt;/o1&gt;
		&lt;o2&gt;
			&lt;A&gt;
				&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
			&lt;/A&gt;
		&lt;/o2&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(dictionary={A.<jk>class</jk>})
	<jk>class</jk> BeanWithAbstractMapFields {
		<jk>public</jk> Map&lt;String,A&gt; a = <jk>new</jk> HashMap&lt;&gt;() {{
			put(<js>"k1"</js>, <jk>new</jk> A());
		}};
		<jk>public</jk> Map&lt;String,AA&gt; b = <jk>new</jk> HashMap&lt;&gt;() {{
			put(<js>"k2"</js>, <jk>new</jk> A());
		}};
		<jk>public</jk> Map&lt;String,Object&gt; c = <jk>new</jk> HashMap&lt;&gt;() {{
			put(<js>"k3"</js>, <jk>new</jk> A());
		}};
	}
		</td>				
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;k1&gt;
				&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
			&lt;/k1&gt;
		&lt;/a&gt;
		&lt;b&gt;
			&lt;k2 <xa>_type</xa>=<xs>'A'</xs>&gt;
				&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
			&lt;/k2&gt;
		&lt;/b&gt;
		&lt;c&gt;
			&lt;k3 <xa>_type</xa>=<xs>'A'</xs>&gt;
				&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
			&lt;/k3&gt;
		&lt;/c&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(dictionary={A.<jk>class</jk>})
	<jk>class</jk> BeanWithAbstractMapArrayFields {
		<jk>public</jk> Map&lt;String,A[]&gt; a = <jk>new</jk> LinkedHashMap&lt;&gt;() {{
			put(<js>"a1"</js>, <jk>new</jk> A[]{<jk>new</jk> A()});
		}};
		<jk>public</jk> Map&lt;String,IA[]&gt; ia = <jk>new</jk> LinkedHashMap&lt;&gt;() {{
			put(<js>"ia1"</js>, <jk>new</jk> A[]{<jk>new</jk> A()});
			put(<js>"ia2"</js>, <jk>new</jk> IA[]{<jk>new</jk> A()});
		}};
		<jk>public</jk> Map&lt;String,AA[]&gt; aa = <jk>new</jk> LinkedHashMap&lt;&gt;() {{
			put(<js>"aa1"</js>, <jk>new</jk> A[]{<jk>new</jk> A()});
			put(<js>"aa2"</js>, <jk>new</jk> AA[]{<jk>new</jk> A()});
		}};
		<jk>public</jk> Map&lt;String,Object[]&gt; o = <jk>new</jk>LinkedHashMap&lt;&gt;() {{
			put(<js>"o1"</js>, <jk>new</jk> A[]{<jk>new</jk> A()});
			put(<js>"o2"</js>, <jk>new</jk> AA[]{<jk>new</jk> A()});
		}};
	}
		</td>				
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;a1&gt;
				&lt;A&gt;
					&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
				&lt;/A&gt;
			&lt;/a1&gt;
		&lt;/a&gt;
		&lt;ia&gt;
			&lt;ia1&gt;
				&lt;A&gt;
					&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
				&lt;/A&gt;
			&lt;/ia1&gt;
			&lt;ia2&gt;
				&lt;A&gt;
					&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
				&lt;/A&gt;
			&lt;/ia2&gt;
		&lt;/ia&gt;
		&lt;aa&gt;
			&lt;aa1&gt;
				&lt;A&gt;
					&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
				&lt;/A&gt;
			&lt;/aa1&gt;
			&lt;aa2&gt;
				&lt;A&gt;
					&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
				&lt;/A&gt;
			&lt;/aa2&gt;
		&lt;/aa&gt;
		&lt;o&gt;
			&lt;o1&gt;
				&lt;A&gt;
					&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
				&lt;/A&gt;
			&lt;/o1&gt;
			&lt;o2&gt;
				&lt;A&gt;
					&lt;fa&gt;<xv>foo</xv>&lt;/fa&gt;
				&lt;/A&gt;
			&lt;/o2&gt;
		&lt;/o&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
</table>
<p>
	On a side note, characters that cannot be represented in XML 1.0 are encoded using a simple encoding.
	Note in the examples below, some characters such as <js>'\n'</js>, <js>'\t</js>', and <js>'\r'</js>
	can be represented as XML entities when used in text but not in element names.  Other characters such as
	<js>'\b'</js> and <js>'\f'</js> cannot be encoded in XML 1.0 at all without inventing our own notation.
	Whitespace characters in element names are encoded as well as whitespace end characters in text.
</p>
<table class='styled w800'>
	<tr>
		<th>Java</th>
		<th>XML</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> BeanWithSpecialCharacters {
		<jk>public</jk> String a = <js>"  \b\f\n\t\r  "</js>;
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;<xv>_x0020_ _x0008__x000C_&amp;#x000a;&amp;#x0009;&amp;#x000d; _x0020_</xv>&lt;/a&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"  \b\f\n\t\r  "</js>)
	<jk>class</jk> BeanWithNamesWithSpecialCharacters {
		<ja>@Beanp</ja>(name=<js>"  \b\f\n\t\r  "</js>)
		<jk>public</jk> String a = <js>"  \b\f\n\t\r  "</js>;
	}
		</td>
		<td class='code'><xt>
	&lt;_x0020__x0020__x0008__x000C__x000A__x0009__x000D__x0020__x0020_&gt;
		&lt;_x0020__x0020__x0008__x000C__x000A__x0009__x000D__x0020__x0020_&gt;
			<xv>_x0020_ _x0008__x000C_&amp;#x000a;&amp;#x0009;&amp;#x000d; _x0020_</xv>
		&lt;/_x0020__x0020__x0008__x000C__x000A__x0009__x000D__x0020__x0020_&gt;
	&lt;/_x0020__x0020__x0008__x000C__x000A__x0009__x000D__x0020__x0020_&gt;
		</xt></td>
	</tr>
</table>
<p>
	While it's true that these characters CAN be represented in XML 1.1, it's impossible to parse XML 1.1 
	text in Java without the XML containing an XML declaration.
	Unfortunately, this, and the uselessness of the 
	{@link javax.xml.stream.XMLInputFactory#IS_REPLACING_ENTITY_REFERENCES} setting in Java
	forced us to make some hard design decisions that may not be the most elegant.
</p>
</div><!-- END: 2.22.4 - juneau-marshall.XmlDetails.BeanTypeNameAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.XmlChildNameAnnotation' id='juneau-marshall.XmlDetails.XmlChildNameAnnotation'>2.22.5 - @Xml(childName) Annotation</a></h4>
<div class='topic'><!-- START: 2.22.5 - juneau-marshall.XmlDetails.XmlChildNameAnnotation -->
<p>
	The {@link org.apache.juneau.xml.annotation.Xml#childName() @Xml(childName)} annotation can be used to 
	specify the name of XML child elements for bean properties of type collection or array.
</p>

<h5 class='figure'>Example</h5>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>Without annotation</th>
		<th>With annotation</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(childName=<js>"X"</js>)
		<jk>public</jk> String[] a;
		<ja>@Xml</ja>(childName=<js>"Y"</js>)
		<jk>public</jk> int[] b;
	}
		</td>
		<td class='code'>
	{
		a: [<js>'foo'</js>,<js>'bar'</js>],
		b: [123,456]
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;string&gt;<xv>foo</xv>&lt;/string&gt;
			&lt;string&gt;<xv>bar</xv>&lt;/string&gt;
		&lt;/a&gt;
		&lt;b&gt;
			&lt;number&gt;<xv>123</xv>&lt;/number&gt;
			&lt;number&gt;<xv>456</xv>&lt;/number&gt;
		&lt;/b&gt;
	&lt;/object&gt;
		</xt></td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;X&gt;<xv>foo</xv>&lt;/X&gt;
			&lt;X&gt;<xv>bar</xv>&lt;/X&gt;
		&lt;/a&gt;
		&lt;b&gt;
			&lt;Y&gt;<xv>123</xv>&lt;/Y&gt;
			&lt;Y&gt;<xv>456</xv>&lt;/Y&gt;
		&lt;/b&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(childName=<js>"child"</js>)
		<jk>public</jk> int[] a;
	}
		</td>
		<td class='code'>
	{
		a: [123,456]
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;string&gt;<xv>foo</xv>&lt;/string&gt;
			&lt;string&gt;<xv>bar</xv>&lt;/string&gt;
		&lt;/a&gt;
	&lt;/object&gt;
		</xt></td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;child&gt;<xv>foo</xv>&lt;/child&gt;
			&lt;child&gt;<xv>bar</xv>&lt;/child&gt;
		&lt;/a&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
</table>
</div><!-- END: 2.22.5 - juneau-marshall.XmlDetails.XmlChildNameAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.XmlFormatAnnotation' id='juneau-marshall.XmlDetails.XmlFormatAnnotation'>2.22.6 - @Xml(format) Annotation</a></h4>
<div class='topic'><!-- START: 2.22.6 - juneau-marshall.XmlDetails.XmlFormatAnnotation -->
<p>
	The {@link org.apache.juneau.xml.annotation.Xml#format() @Xml(format)} annotation can be used to tweak 
	the XML format of a POJO.
	The value is set to an enum value of type {@link org.apache.juneau.xml.annotation.XmlFormat}.
	This annotation can be applied to both classes and bean properties.
</p>
<p>
	The {@link org.apache.juneau.xml.annotation.XmlFormat#ATTR} format can be applied to bean properties to 
	serialize them as XML attributes instead of elements.
	Note that this only supports properties of simple types (e.g. strings, numbers, booleans).
</p>

<h5 class='figure'>Example</h5>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>Without annotation</th>
		<th>With annotation</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>ATTR</jsf>)
		<jk>public</jk> String a;
	}
		</td>
		<td class='code'>
	{
		a: <js>'foo'</js>
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;<xv>foo</xv>&lt;/a&gt;
	&lt;/object&gt;
		</xt></td>
		<td class='code'><xt>
	&lt;object <xa>a</xa>=<xs>'foo'</xs>/&gt;
		</xt></td>
	</tr>
</table>
<p>
	The {@link org.apache.juneau.xml.annotation.XmlFormat#ATTRS} format can be applied to bean classes to 
	force all bean properties to be serialized as XML attributes instead of child elements.
</p>

<h5 class='figure'>Example</h5>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>Without annotation</th>
		<th>With annotation</th>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Xml</ja>(format=XmlFormat.<jsf>ATTRS</jsf>)
	<jk>class</jk> MyBean {
		<jk>public</jk> String a;
		<jk>public int</jk> b;
	}
		</td>
		<td class='code'>
	{
		a: <js>'foo'</js>,
		b: 123
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;<xv>foo</xv>&lt;/a&gt;
		&lt;b&gt;<xv>123</xv>&lt;/b&gt;
	&lt;/object&gt;
		</xt></td>
		<td class='code'><xt>
	&lt;object <xa>a</xa>=<xs>'foo'</xs> <xa>b</xa>=<xs>'123'</xs>/&gt;
		</xt></td>
	</tr>
</table>
<p>
	The {@link org.apache.juneau.xml.annotation.XmlFormat#ELEMENT} format can be applied to bean properties 
	to override the {@link org.apache.juneau.xml.annotation.XmlFormat#ATTRS} format applied on the bean 
	class.
</p>

<h5 class='figure'>Example</h5>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>Without annotation</th>
		<th>With annotation</th>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Xml</ja>(format=XmlFormat.<jsf>ATTRS</jsf>)
	<jk>class</jk> MyBean {
		<jk>public</jk> String a;
		<ja>@Xml</ja>(format=XmlFormat.<jsf>ELEMENT</jsf>)
		<jk>public int</jk> b;
	}
		</td>
		<td class='code'>
	{
		a: <js>'foo'</js>,
		b: 123
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;<xv>foo</xv>&lt;/a&gt;
		&lt;b&gt;<xv>123</xv>&lt;/b&gt;
	&lt;/object&gt;
		</xt></td>
		<td class='code'><xt>
	&lt;object <xa>a</xa>=<xs>'foo'</xs></xs>&gt;
		&lt;b&gt;<xv>123</xv>&lt;/b&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
</table>
<p>
	The {@link org.apache.juneau.xml.annotation.XmlFormat#ATTRS} format can be applied to a single bean 
	property of type <c>Map&lt;String,Object&gt;</c> to denote arbitrary XML attribute values on the 
	element.
	These can be mixed with other {@link org.apache.juneau.xml.annotation.XmlFormat#ATTR} annotated 
	properties, but there must not be an overlap in bean property names and map keys. 
</p>

<h5 class='figure'>Example</h5>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>Without annotation</th>
		<th>With annotation</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>ATTRS</jsf>)
		<jk>public</jk> Map&lt;String,Object&gt; a;
		<ja>@Xml</ja>(format=XmlFormat.<jsf>ATTR</jsf>)
		<jk>public int</jk> b;
	}
		</td>
		<td class='code'>
	{
		<jok>a</jok>: {
			<jok>k1</jok>: <jov>'foo'</jov>, 
			<jok>k2</jok>: <jov>123</jov>, 
		},
		<jok>b</jok>: <jov>456</jov>
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;k1&gt;<xv>foo</xv>&lt;/k1&gt;
			&lt;k2 <xa>_type</xa>=<xs>'number'</xs>&gt;<xv>123</xv>&lt;/k2&gt;
		&lt;/a&gt;
		&lt;b&gt;<xv>456</xv>&lt;/b&gt;
	&lt;/object&gt;
		</xt></td>
		<td class='code'><xt>
	&lt;object <xa>k1</xa>=<xs>'foo'</xs> <xa>k2</xa>=<xs>'123'</xs> <xa>b</xa>=<xs>'456'</xs>/&gt;
		</xt></td>
	</tr>
</table>
<p>
	The {@link org.apache.juneau.xml.annotation.XmlFormat#COLLAPSED} format can be applied to bean properties
	of type array/Collection.
	This causes the child objects to be serialized directly inside the bean element.
	This format must be used in conjunction with {@link org.apache.juneau.xml.annotation.Xml#childName() @Xml(childName)}
	to differentiate which collection the values came from if you plan on parsing the output back into beans.
	Note that child names must not conflict with other property names.
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>Without annotation</th>
		<th>With annotation</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(childName=<js>"A"</js>,format=XmlFormat.<jsf>COLLAPSED</jsf>)
		<jk>public</jk> String[] a;
		<ja>@Xml</ja>(childName=<js>"B"</js>,format=XmlFormat.<jsf>COLLAPSED</jsf>)
		<jk>public int</jk>[] b;
	}
		</td>
		<td class='code'>
	{
		a: [<js>'foo'</js>,<js>'bar'</js>],
		b: [123,456]
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;string&gt;<xv>foo</xv>&lt;/string&gt;
			&lt;string&gt;<xv>bar</xv>&lt;/string&gt;
		&lt;/a&gt;
		&lt;b&gt;
			&lt;number&gt;<xv>123</xv>&lt;/number&gt;
			&lt;number&gt;<xv>456</xv>&lt;/number&gt;
		&lt;/b&gt;
	&lt;/object&gt;
		</xt></td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;A&gt;<xv>foo</xv>&lt;/A&gt;
		&lt;A&gt;<xv>bar</xv>&lt;/A&gt;
		&lt;B&gt;<xv>123</xv>&lt;/B&gt;
		&lt;B&gt;<xv>456</xv>&lt;/B&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
</table>
<p>
	The {@link org.apache.juneau.xml.annotation.XmlFormat#ELEMENTS} format can be applied to a single bean 
	property of either a simple type or array/Collection.
	It allows free-form child elements to be formed.
	All other properties on the bean MUST be serialized as attributes.
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>With annotation</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>ATTR</jsf>)
		<jk>public</jk> String a;
		<ja>@Xml</ja>(format=XmlFormat.<jsf>ELEMENTS</jsf>)
		<jk>public</jk> String b;
	}
		</td>
		<td class='code'>
	{
		a: <js>'foo'</js>,
		b: <js>'bar'</js>
	}
		</td>
		<td class='code'><xt>
	&lt;object <xa>a</xa>=<xs>'foo'</xs>&gt;
		&lt;string&gt;<xv>bar</xv>&lt;/string&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>ATTR</jsf>)
		<jk>public</jk> String a;
		<ja>@Xml</ja>(format=XmlFormat.<jsf>ELEMENTS</jsf>)
		<jk>public</jk> Object[] b;
	}
		</td>
		<td class='code'>
	{
		a: <js>'foo'</js>,
		b: [
			<js>'bar'</js>, 
			<js>'baz'</js>, 
			123, 
			<jk>true</jk>,
			<jk>null</jk>
		]
	}
		</td>
		<td class='code'><xt>
	&lt;object <xa>a</xa>=<xs>'foo'</xs>&gt;
		&lt;string&gt;<xv>bar</xv>&lt;/string&gt;
		&lt;string&gt;<xv>baz</xv>&lt;/string&gt;
		&lt;number&gt;<xv>123</xv>&lt;/number&gt;
		&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;
		&lt;null/&gt;
	&lt;/object&gt;
		</xt></td>
	</tr>
</table>
<p>
	The {@link org.apache.juneau.xml.annotation.XmlFormat#MIXED} format is similar to 
	{@link org.apache.juneau.xml.annotation.XmlFormat#ELEMENTS} except elements names on primitive types 
	(string/number/boolean/null) are stripped from the output.
	This format particularly useful when combined with bean dictionaries to produce mixed content.  
	The bean dictionary isn't used during serialization, but it is needed during parsing to resolve bean 
	types.
</p>
<p>
	The {@link org.apache.juneau.xml.annotation.XmlFormat#MIXED_PWS} format identical to 
	{@link org.apache.juneau.xml.annotation.XmlFormat#MIXED} except whitespace characters are preserved in 
	the output.  
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>Without annotations</th>
		<th>With annotations</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>MIXED</jsf>)
		<ja>@Beanp</ja>(dictionary={MyBeanX.<jk>class</jk>, MyBeanY.<jk>class</jk>})	
		<jk>public</jk> Object[] a;
	}
	
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBeanX {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>ATTR</jsf>)
		<jk>public</jk> String b;
	}
	
	<ja>@Bean</ja>(typeName=<js>"Y"</js>)	
	<jk>class</jk> MyBeanY {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>ATTR</jsf>)
		<jk>public</jk> String c;
	}
		</td>
		<td class='code'>
	{
		a: [
			<js>'foo'</js>,
			{ _type:<js>'X'</js>, b:<js>'bar'</js> }
			<js>'baz'</js>,
			{ _type:<js>'Y'</js>, b:<js>'qux'</js> },
			<js>'quux'</js>
		]
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;
			&lt;string&gt;<xv>foo</xv>&lt;/string&gt;
			&lt;object&gt;
				&lt;b&gt;<xv>bar</xv>&lt;/b&gt;
			&lt;/object&gt;
			&lt;string&gt;<xv>baz</xv>&lt;/string&gt;
			&lt;object&gt;
				&lt;b&gt;<xv>qux</xv>&lt;/b&gt;
			&lt;/object&gt;
			&lt;string&gt;<xv>quux</xv>&lt;/string&gt;
		&lt;/a&gt;
	&lt;/object&gt;
		</xt></td>
		<td class='code'><xt>
	&lt;object&gt;<xv>foo</xv>&lt;X <xa>b</xa>=<xs>'bar'</xs>/&gt;<xv>baz</xv>&lt;Y <xa>c</xa>=<xs>'qux'</xs>/&gt;<xv>quux</xv>&lt;/object&gt;
		</xt></td>
	</tr>
</table>
<p>
	Whitespace (tabs and newlines) are not added to MIXED child nodes in readable-output mode. 
	This helps ensures strings in the serialized output can be losslessly parsed back into their original 
	forms when they contain whitespace characters.
	If the {@link javax.xml.stream.XMLInputFactory#IS_REPLACING_ENTITY_REFERENCES} setting was not useless 
	in Java, we could support lossless readable XML for MIXED content.  
	But as of Java 8, it still does not work. 
</p>
<p>
	XML suffers from other deficiencies as well that affect MIXED content.  
	For example, <xt>&lt;X&gt;&lt;/X&gt;</xt> and <xt>&lt;X/&gt;</xt> are equivalent in XML and 
	indistinguishable by the Java XML parsers.  
	This makes it impossible to differentiate between an empty element and an element containing an empty 
	string.  
	This causes empty strings to get lost in translation. 
	To alleviate this, we use the constructs <js>"_xE000_"</js> to represent an empty string, and 
	<js>"_x0020_"</js> to represent leading and trailing spaces.
</p>
<p>
	The examples below show how whitespace is handled under various circumstances:
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>XML</th>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>TEXT</jsf>)
		<jk>public</jk> String a = <jk>null</jk>;
	}
		</td>
		<td class='code'><xt>
	&lt;X/&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>TEXT</jsf>)
		<jk>public</jk> String a = <js>""</js>;
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>_xE000_</xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>TEXT</jsf>)
		<jk>public</jk> String a = <js>" "</js>;
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>_x0020_</xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>TEXT</jsf>)
		<jk>public</jk> String a = <js>"  "</js>;
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>_x0020__x0020_</xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>TEXT</jsf>)
		<jk>public</jk> String a = <js>"  foobar  "</js>;
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>_x0020_ foobar _x0020_</xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>TEXT_PWS</jsf>)
		<jk>public</jk> String a = <jk>null</jk>;
	}
		</td>
		<td class='code'><xt>
	&lt;X/&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>TEXT_PWS</jsf>)
		<jk>public</jk> String a = <js>""</js>;
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>_xE000_</xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>TEXT_PWS</jsf>)
		<jk>public</jk> String a = <js>" "</js>;
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv> </xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>TEXT_PWS</jsf>)
		<jk>public</jk> String a = <js>"  "</js>;
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>  </xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>TEXT_PWS</jsf>)
		<jk>public</jk> String a = <js>"  foobar  "</js>;
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>  foobar  </xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>MIXED</jsf>)
		<jk>public</jk> String[] a = <jk>null</jk>;
	}
		</td>
		<td class='code'><xt>
	&lt;X/&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>MIXED</jsf>)
		<jk>public</jk> String a[] = <jk>new</jk> String[]{<js>""</js>};
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>_xE000_</xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>MIXED</jsf>)
		<jk>public</jk> String a[] = <jk>new</jk> String[]{<js>" "</js>};
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>_x0020_</xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>MIXED</jsf>)
		<jk>public</jk> String a[] = <jk>new</jk> String[]{<js>"  "</js>};
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>_x0020__x0020_</xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>MIXED</jsf>)
		<jk>public</jk> String a[] = <jk>new</jk> String[]{
			<js>"  foobar  "</js>
		};
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>_x0020_ foobar _x0020_</xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>MIXED_PWS</jsf>)
		<jk>public</jk> String[] a = <jk>null</jk>;
	}
		</td>
		<td class='code'><xt>
	&lt;X/&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>MIXED_PWS</jsf>)
		<jk>public</jk> String a[] = <jk>new</jk> String[]{<js>""</js>};
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>_xE000_</xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>MIXED_PWS</jsf>)
		<jk>public</jk> String a[] = <jk>new</jk> String[]{<js>" "</js>};
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv> </xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>MIXED_PWS</jsf>)
		<jk>public</jk> String a[] = <jk>new</jk> String[]{<js>"  "</js>};
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>  </xv>&lt;/X&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<ja>@Bean</ja>(typeName=<js>"X"</js>)	
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>MIXED_PWS</jsf>)
		<jk>public</jk> String a[] = <jk>new</jk> String[]{
			<js>"  foobar  "</js>
		};
	}
		</td>
		<td class='code'><xt>
	&lt;X&gt;<xv>  foobar  </xv>&lt;/X&gt;
		</xt></td>
	</tr>
</table>

<p>
	It should be noted that when using <jsf>MIXED</jsf>, you are not guaranteed to parse back the exact 
	same content since side-by-side strings in the content will end up concatenated when parsed.
</p>
<p>
	The {@link org.apache.juneau.xml.annotation.XmlFormat#TEXT} format is similar to 
	{@link org.apache.juneau.xml.annotation.XmlFormat#MIXED} except it's meant for solitary objects that 
	get serialized as simple child text nodes.
	Any object that can be serialize to a <c>String</c> can be used.
	The {@link org.apache.juneau.xml.annotation.XmlFormat#TEXT_PWS} is the same except whitespace is 
	preserved in the output.
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>Without annotations</th>
		<th>With annotations</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>TEXT</jsf>)
		<jk>public</jk> String a;
	}
		</td>
		<td class='code'>
	{
		a: <js>'foo'</js>
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;
		&lt;a&gt;<xv>foo</xv>&lt;/a&gt;
	&lt;/object&gt;
		</xt></td>
		<td class='code'><xt>
	&lt;object&gt;<xv>foo</xv>&lt;/object&gt;
		</xt></td>
	</tr>
</table>
<p>
	The {@link org.apache.juneau.xml.annotation.XmlFormat#XMLTEXT} format is similar to 
	{@link org.apache.juneau.xml.annotation.XmlFormat#TEXT} except it's meant for strings containing XML 
	that should be serialized as-is to the document.
	Any object that can be serialize to a <c>String</c> can be used.
	During parsing, the element content gets parsed with the rest of the document and then re-serialized to 
	XML before being set as the property value.  
	This process may not be perfect (e.g. double quotes may be replaced by single quotes, etc...).
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>With TEXT annotation</th>
		<th>With XMLTEXT annotation</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<ja>@Xml</ja>(format=XmlFormat.<jsf>XMLTEXT</jsf>)
		<jk>public</jk> String a;
	}
		</td>
		<td class='code'>
	{
		a: <js>'Some &lt;b&gt;XML&lt;/b&gt; text'</js>
	}
		</td>
		<td class='code'><xt>
	&lt;object&gt;<xv>Some &amp;lt;b&amp;gt;XML&amp;lt;/b&amp;gt; text</xv>&lt;/object&gt;
		</xt></td>
		<td class='code'><xt>
	&lt;object&gt;<xv>Some <xt>&lt;b&gt;</xt>XML<xt>&lt;/b&gt;</xt> text</xv>&lt;/object&gt;
		</xt></td>
	</tr>
</table>
</div><!-- END: 2.22.6 - juneau-marshall.XmlDetails.XmlFormatAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.Namespaces' id='juneau-marshall.XmlDetails.Namespaces'>2.22.7 - Namespaces</a></h4>
<div class='topic'><!-- START: 2.22.7 - juneau-marshall.XmlDetails.Namespaces -->
<p>
	Let's go back to the example of our original <c>Person</c> bean class, but add some namespace annotations:
</p>
<h5 class='figure'>Sample Beans</h5>
<p class='bpcode w800'>
	<ja>@Xml</ja>(prefix=<js>"per"</js>)
	<ja>@Bean</ja>(typeName=<js>"person"</js>)
	<jk>public class</jk> Person {
		
		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>name</jf>;
		<ja>@Swap</ja>(TemporalCalendarSwap.IsoInstant.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
		<jk>public</jk> List&lt;Address&gt; <jf>addresses</jf>; 
	
		<jc>// Getters/setters omitted</jc>
	}
	
	<ja>@Xml</ja>(prefix=<js>"addr"</js>)
	<ja>@Bean</ja>(typeName=<js>"address"</js>)
	<jk>public class</jk> Address {

		<jc>// Bean properties</jc>
		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <jk>public</jk> String <jf>street</jf>, <jf>city</jf>;
		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <jk>public</jk> StateEnum <jf>state</jf>;
		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <jk>public int</jk> <jf>zip</jf>;
		<jk>public boolean</jk> <jf>isCurrent</jf>;

		<jc>// Getters/setters omitted</jc>
	}	
</p>
<p>
	The namespace URLs can either be defined as part of the {@link org.apache.juneau.xml.annotation.Xml @Xml}
	annotation, or can be defined at the package level with the {@link org.apache.juneau.xml.annotation.XmlSchema @XmlSchema}
	annotation.
	Below shows it defined at the package level:
</p>
<h5 class='figure'>package-info.java</h5>
<p class='bpcode w800'>
	<ja>@XmlSchema</ja>(
		prefix=<js>"ab"</js>,  <jc>// Default namespace</jc>
		xmlNs={
			<ja>@XmlNs</ja>(prefix=<js>"ab"</js>, namespaceURI=<js>"http://www.apache.org/addressBook/"</js>),
			<ja>@XmlNs</ja>(prefix=<js>"per"</js>, namespaceURI=<js>"http://www.apache.org/person/"</js>),
			<ja>@XmlNs</ja>(prefix=<js>"addr"</js>, namespaceURI=<js>"http://www.apache.org/address/"</js>),
			<ja>@XmlNs</ja>(prefix=<js>"mail"</js>, namespaceURI=<js>"http://www.apache.org/mail/"</js>)
		}
	)
	<jk>package</jk> org.apache.juneau.examples.addressbook;
</p>		
<h5 class='figure'>Sample Code</h5>
<p class='bpcode w800'>
	Person p = <jk>new</jk> Person()
		.name(<js>"John Smith"</js>)
		.birthDate(<js>"1946-08-12T00:00:00Z"</js>)
		.addresses(
			<jk>new</jk> Address() 
				.street(<js>"100 Main Street"</js>)
				.city(<js>"Anywhereville"</js>)
				.state(<jsf>NY</jsf>)
				.zip(12345)
				.isCurrent(<jk>true</jk>);
		);

	<jc>// Create a new serializer with readable output, this time with namespaces enabled.</jc>
	<jc>// Note that this is identical to XmlSerializer.DEFAULT_NS_SQ_READABLE.</jc>
	XmlSerializer s = XmlSerializer.<jsm>create</jsm>().ns().ws().sq().build();
	
	String xml = s.serialize(p);
</p>
<p>
	Now when we run this code, we'll see namespaces added to our output:
</p>
<p class='bpcode w800'>
	<xt>&lt;per:person&gt;</xt>
		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
		<xt>&lt;per:birthDate&gt;</xt>1946-08-12T04:00:00Z<xt>&lt;/per:birthDate&gt;</xt>
		<xt>&lt;per:addresses&gt;</xt>
			<xt>&lt;addr:address&gt;</xt>
				<xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
				<xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
				<xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
				<xt>&lt;mail:zip&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
				<xt>&lt;addr:isCurrent&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
			<xt>&lt;/addr:address&gt;</xt>
		<xt>&lt;/per:addresses&gt;</xt>
	<xt>&lt;/per:person&gt;</xt>
</p>
<p>
	Enabling the {@link org.apache.juneau.xml.XmlSerializer#XML_addNamespaceUrisToRoot} setting results
	in the namespace URLs being added to the root node:
</p>
<p class='bpcode w800'>
	<xt>&lt;per:person</xt>
			<xa>xmlns</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs> 
			<xa>xmlns:per</xa>=<xs>'http://www.apache.org/person/'</xs>
			<xa>xmlns:addr</xa>=<xs>'http://www.apache.org/address/'</xs>
			<xa>xmlns:mail</xa>=<xs>'http://www.apache.org/mail/'</xs>
		<xt>&gt;</xt>
		<xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
		<xt>&lt;per:birthDate&gt;</xt>1946-08-12T04:00:00Z<xt>&lt;/per:birthDate&gt;</xt>
		<xt>&lt;per:addresses&gt;</xt>
			<xt>&lt;addr:address&gt;</xt>
				<xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
				<xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
				<xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
				<xt>&lt;mail:zip&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
				<xt>&lt;addr:isCurrent&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
			<xt>&lt;/addr:address&gt;</xt>
		<xt>&lt;/per:addresses&gt;</xt>
	<xt>&lt;/per:person&gt;</xt>
</p>
<p>
	We can simplify the output by setting the default namespace on the serializer so that all the elements do 
	not need to be prefixed:
<p class='bpcode w800'>
	<jc>// Create a new serializer with readable output, this time with namespaces enabled.</jc>
	XmlSerializer s = XmlSerializer.<jsm>create</jsm>().ws().sq().ns()
		.defaultNamespaceUri(<js>"http://www.apache.org/person/"</js>)
		.build();
</p>
<p>
	This produces the following equivalent where the elements don't need prefixes since they're already in the 
	default document namespace:
</p>
<p class='bpcode w800'>
	<xt>&lt;person</xt>
			<xa>xmlns:juneau</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs> 
			<xa>xmlns</xa>=<xs>'http://www.apache.org/person/'</xs>
			<xa>xmlns:addr</xa>=<xs>'http://www.apache.org/address/'</xs>
			<xa>xmlns:mail</xa>=<xs>'http://www.apache.org/mail/'</xs>
		<xt>&gt;</xt>
		<xt>&lt;name&gt;</xt>John Smith<xt>&lt;/name&gt;</xt>
		<xt>&lt;birthDate&gt;</xt>1946-08-12T04:00:00Z<xt>&lt;/birthDate&gt;</xt>
		<xt>&lt;addresses&gt;</xt>
			<xt>&lt;addr:address&gt;</xt>
				<xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
				<xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
				<xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
				<xt>&lt;mail:zip&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
				<xt>&lt;addr:isCurrent&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
			<xt>&lt;/addr:address&gt;</xt>
		<xt>&lt;/addresses&gt;</xt>
	<xt>&lt;/person&gt;</xt>
</p>
<p>
	One important property on the XML serializer class is 
	{@link org.apache.juneau.xml.XmlSerializer#XML_autoDetectNamespaces XML_autoDetectNamespaces}.
	This property tells the serializer to make a first-pass over the data structure to look for namespaces 
	defined on classes and bean properties.
	In high-performance environments, you may want to consider disabling auto-detection and providing your 
	own explicit list of namespaces to the serializer to avoid this scanning step.
</p>
<p>
	The following code will produce the same output as before, but will perform slightly better since it 
	avoids this pre-scan step.
</p>
<p class='bpcode w800'>
	<jc>// Create a new serializer with readable output, this time with namespaces enabled.</jc>
	XmlSerializer s = XmlSerializer.<jsm>create</jsm>()
		.ws()
		.sq()
		.autoDetectNamespaces(<jk>false</jk>)
		.namespaces(<js>"{per:'http://www.apache.org/person/'}"</js>)
		.build();
</p>
</div><!-- END: 2.22.7 - juneau-marshall.XmlDetails.Namespaces -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.XmlDetails.XmlSchema' id='juneau-marshall.XmlDetails.XmlSchema'>2.22.8 - XML-Schema Support</a></h4>
<div class='topic'><!-- START: 2.22.8 - juneau-marshall.XmlDetails.XmlSchema -->
<p>
	Juneau provides the {@link org.apache.juneau.xmlschema.XmlSchemaSerializer} class for generating XML-Schema 
	documents that describe the output generated by the {@link org.apache.juneau.xml.XmlSerializer} class.
	This class shares the same properties as <c>XmlSerializer</c>.
	Since the XML output differs based on settings on the XML serializer class, the XML-Schema serializer
	class must have the same property values as the XML serializer class it's describes.
	To help facilitate creating an XML Schema serializer with the same properties as the corresponding 
	XML serializer, the {@link org.apache.juneau.xml.XmlSerializer#getSchemaSerializer()} method 
	has been added.
</p>
<p>
	XML-Schema requires a separate file for each namespace.
	Unfortunately, does not mesh well with the Juneau serializer architecture which serializes to single writers.
	To get around this limitation, the schema serializer will produce a single output, but with multiple
	schema documents separated by the null character (<js>'\u0000'</js>) to make it simple to split apart.
</p>
<p>
	Lets start with an example where everything is in the same namespace.
	We'll use the classes from before, but remove the references to namespaces.
	Since we have not defined a default namespace, everything is defined under the default Juneau namespace.
</p>
<h5 class='figure'>Sample Beans</h5>
<p class='bpcode w800'>
	<ja>@Bean</ja>(typeName=<js>"person"</js>)
	<jk>public class</jk> Person {
		
		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>name</jf>;
		<ja>@Swap</ja>(TemporalCalendarSwap.IsoInstant.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
		<jk>public</jk> List&lt;Address&gt; <jf>addresses</jf>; 
	
		<jc>// Getters/setters omitted</jc>
	}
	
	<ja>@Bean</ja>(typeName=<js>"address"</js>)
	<jk>public class</jk> Address {

		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>;
		<jk>public</jk> StateEnum <jf>state</jf>;
		<jk>public int</jk> <jf>zip</jf>;
		<jk>public boolean</jk> <jf>isCurrent</jf>;

		<jc>// Getters/setters omitted</jc>
	}	
</p>
<p>
	The code for creating our POJO model and generating XML Schema is shown below:
</p>
<p class='bpcode w800'>
	<jc>// Create a new serializer with readable output.</jc>
	XmlSerializer s = XmlSerializer.<jsm>create</jsm>()
		.ws()
		.ns()
		.sq()
		.addNamespaceUrisToRoot(<jk>true</jk>)
		.build();

	<jc>// Create the equivalent schema serializer.</jc>
	XmlSchemaSerializer ss = s.getSchemaSerializer();

	
	<jc>// Get the XML Schema corresponding to the XML generated above.</jc>
	String xmlSchema = ss.serialize(<jk>new</jk> Person());
</p>
<h5 class='figure'>XML-Schema results</h5>
<p class='bpcode w800'>
	<xt>&lt;schema</xt> 
			<xa>xmlns</xa>=<xs>'http://www.w3.org/2001/XMLSchema'</xs> 
			<xa>targetNamespace</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs> 
			<xa>elementFormDefault</xa>=<xs>'qualified'</xs> 
			<xa>xmlns:juneau</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs><xt>&gt;</xt>
		<xt>&lt;element</xt> <xa>name</xa>=<xs>'person'</xs> <xa>_type</xa>=<xs>'juneau:org.apache.juneau.examples.addressbook.Person'</xs><xt>/&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'org.apache.juneau.examples.addressbook.Person'</xs><xt>&gt;</xt>
			<xt>&lt;sequence&gt;</xt>
				<xt>&lt;element</xt> <xa>name</xa>=<xs>'name'</xs> <xa>_type</xa>=<xs>'string'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
				<xt>&lt;element</xt> <xa>name</xa>=<xs>'birthDate'</xs> <xa>_type</xa>=<xs>'juneau:java.util.Calendar'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
				<xt>&lt;element</xt> <xa>name</xa>=<xs>'addresses'</xs> <xa>_type</xa>=<xs>'juneau:java.util.LinkedList_x003C_org.apache.juneau.examples.addressbook.Address_x003E_'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
			<xt>&lt;/sequence&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.util.Calendar'</xs><xt>&gt;</xt>
			<xt>&lt;sequence&gt;</xt>
				<xt>&lt;any</xt> <xa>processContents</xa>=<xs>'skip'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
			<xt>&lt;/sequence&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.util.LinkedList_x003C_org.apache.juneau.examples.addressbook.Address_x003E_'</xs><xt>&gt;</xt>
			<xt>&lt;sequence&gt;</xt>
				<xt>&lt;choice</xt> <xa>minOccurs</xa>=<xs>'0'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs><xt>&gt;</xt>
					<xt>&lt;element</xt> <xa>name</xa>=<xs>'address'</xs> <xa>_type</xa>=<xs>'juneau:org.apache.juneau.examples.addressbook.Address'</xs><xt>/&gt;</xt>
					<xt>&lt;element</xt> <xa>name</xa>=<xs>'null'</xs> <xa>_type</xa>=<xs>'string'</xs><xt>/&gt;</xt>
				<xt>&lt;/choice&gt;</xt>
			<xt>&lt;/sequence&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'org.apache.juneau.examples.addressbook.Address'</xs><xt>&gt;</xt>
			<xt>&lt;sequence&gt;</xt>
				<xt>&lt;element</xt> <xa>name</xa>=<xs>'street'</xs> <xa>_type</xa>=<xs>'string'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
				<xt>&lt;element</xt> <xa>name</xa>=<xs>'city'</xs> <xa>_type</xa>=<xs>'string'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
				<xt>&lt;element</xt> <xa>name</xa>=<xs>'state'</xs> <xa>_type</xa>=<xs>'string'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
				<xt>&lt;element</xt> <xa>name</xa>=<xs>'zip'</xs> <xa>_type</xa>=<xs>'integer'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
				<xt>&lt;element</xt> <xa>name</xa>=<xs>'isCurrent'</xs> <xa>_type</xa>=<xs>'boolean'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
			<xt>&lt;/sequence&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
	<xt>&lt;/schema&gt;</xt>
</p>
<p>
	Now if we add in some namespaces, we'll see how multiple namespaces are handled.
</p>
<h5 class='figure'>Sample Beans with multiple namespaces</h5>
<p class='bpcode w800'>
	<ja>@Xml</ja>(prefix=<js>"per"</js>)
	<ja>@Bean</ja>(typeName=<js>"person"</js>)
	<jk>public class</jk> Person {
		
		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>name</jf>;
		<ja>@Swap</ja>(TemporalCalendarSwap.IsoInstant.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
		<jk>public</jk> List&lt;Address&gt; <jf>addresses</jf>; 
	
		<jc>// Getters/setters omitted</jc>
	}
	
	<ja>@Xml</ja>(prefix=<js>"addr"</js>)
	<ja>@Bean</ja>(typeName=<js>"address"</js>)
	<jk>public class</jk> Address {

		<jc>// Bean properties</jc>
		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <jk>public</jk> String <jf>street</jf>, <jf>city</jf>;
		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <jk>public</jk> StateEnum <jf>state</jf>;
		<ja>@Xml</ja>(prefix=<js>"mail"</js>) <jk>public int</jk> <jf>zip</jf>;
		<jk>public boolean</jk> <jf>isCurrent</jf>;

		<jc>// Getters/setters omitted</jc>
	}	
</p>
<p>
	The schema consists of 4 documents separated by a <js>'\u0000'</js> character.
</p>
<h5 class='figure'>XML-Schema results</h5>
<p class='bpcode w800'>
	<xt>&lt;schema</xt> 
			<xa>xmlns</xa>=<xs>'http://www.w3.org/2001/XMLSchema'</xs> 
			<xa>targetNamespace</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs> 
			<xa>elementFormDefault</xa>=<xs>'qualified'</xs> 
			<xa>xmlns:juneau</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs> 
			<xa>xmlns:per</xa>=<xs>'http://www.apache.org/person/'</xs> 
			<xa>xmlns:addr</xa>=<xs>'http://www.apache.org/address/'</xs> 
			<xa>xmlns:mail</xa>=<xs>'http://www.apache.org/mail/'</xs><xt>&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/person/'</xs> <xa>schemaLocation</xa>=<xs>'per.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/address/'</xs> <xa>schemaLocation</xa>=<xs>'addr.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/mail/'</xs> <xa>schemaLocation</xa>=<xs>'mail.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'int'</xs><xt>&gt;</xt>
			<xt>&lt;simpleContent&gt;</xt>
				<xt>&lt;extension</xt> <xa>base</xa>=<xs>'integer'</xs><xt>/&gt;</xt>
			<xt>&lt;/simpleContent&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.lang.String'</xs><xt>&gt;</xt>
			<xt>&lt;simpleContent&gt;</xt>
				<xt>&lt;extension</xt> <xa>base</xa>=<xs>'string'</xs><xt>/&gt;</xt>
			<xt>&lt;/simpleContent&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.net.URI'</xs><xt>&gt;</xt>
			<xt>&lt;simpleContent&gt;</xt>
				<xt>&lt;extension</xt> <xa>base</xa>=<xs>'string'</xs><xt>/&gt;</xt>
			<xt>&lt;/simpleContent&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.util.Calendar'</xs><xt>&gt;</xt>
			<xt>&lt;sequence&gt;</xt>
				<xt>&lt;any</xt> <xa>processContents</xa>=<xs>'skip'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs> <xa>minOccurs</xa>=<xs>'0'</xs><xt>/&gt;</xt>
			<xt>&lt;/sequence&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'java.util.LinkedList_x003C_org.apache.juneau.examples.addressbook.Address_x003E_'</xs><xt>&gt;</xt>
			<xt>&lt;sequence&gt;</xt>
				<xt>&lt;choice</xt> <xa>minOccurs</xa>=<xs>'0'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs><xt>&gt;</xt>
					<xt>&lt;element</xt> <xa>name</xa>=<xs>'address'</xs> <xa>_type</xa>=<xs>'addr:org.apache.juneau.examples.addressbook.Address'</xs><xt>/&gt;</xt>
					<xt>&lt;element</xt> <xa>name</xa>=<xs>'null'</xs> <xa>_type</xa>=<xs>'string'</xs><xt>/&gt;</xt>
				<xt>&lt;/choice&gt;</xt>
			<xt>&lt;/sequence&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'boolean'</xs><xt>&gt;</xt>
			<xt>&lt;simpleContent&gt;</xt>
				<xt>&lt;extension</xt> <xa>base</xa>=<xs>'boolean'</xs><xt>/&gt;</xt>
			<xt>&lt;/simpleContent&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
	<xt>&lt;/schema&gt;</xt>
	[\u0000]
	<xt>&lt;schema</xt> 
			<xa>xmlns</xa>=<xs>'http://www.w3.org/2001/XMLSchema'</xs> 
			<xa>targetNamespace</xa>=<xs>'http://www.apache.org/person/'</xs> 
			<xa>elementFormDefault</xa>=<xs>'qualified'</xs> 
			<xa>attributeFormDefault</xa>=<xs>'qualified'</xs> 
			<xa>xmlns:juneau</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs> 
			<xa>xmlns:per</xa>=<xs>'http://www.apache.org/person/'</xs> 
			<xa>xmlns:addr</xa>=<xs>'http://www.apache.org/address/'</xs> 
			<xa>xmlns:mail</xa>=<xs>'http://www.apache.org/mail/'</xs><xt>&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs> <xa>schemaLocation</xa>=<xs>'juneau.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/address/'</xs> <xa>schemaLocation</xa>=<xs>'addr.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/mail/'</xs> <xa>schemaLocation</xa>=<xs>'mail.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;element</xt> <xa>name</xa>=<xs>'person'</xs> <xa>_type</xa>=<xs>'per:org.apache.juneau.examples.addressbook.Person'</xs><xt>/&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'org.apache.juneau.examples.addressbook.Person'</xs><xt>&gt;</xt>
			<xt>&lt;sequence&gt;</xt>
				<xt>&lt;any</xt> <xa>minOccurs</xa>=<xs>'0'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs><xt>/&gt;</xt>
			<xt>&lt;/sequence&gt;</xt>
			<xt>&lt;attribute</xt> <xa>name</xa>=<xs>'uri'</xs> <xa>_type</xa>=<xs>'string'</xs><xt>/&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
		<xt>&lt;element</xt> <xa>name</xa>=<xs>'name'</xs> <xa>_type</xa>=<xs>'juneau:java.lang.String'</xs><xt>/&gt;</xt>
		<xt>&lt;element</xt> <xa>name</xa>=<xs>'birthDate'</xs> <xa>_type</xa>=<xs>'juneau:java.util.Calendar'</xs><xt>/&gt;</xt>
		<xt>&lt;element</xt> <xa>name</xa>=<xs>'addresses'</xs> <xa>_type</xa>=<xs>'juneau:java.util.LinkedList_x003C_org.apache.juneau.examples.addressbook.Address_x003E_'</xs><xt>/&gt;</xt>
	<xt>&lt;/schema&gt;</xt>
	[\u0000]
	<xt>&lt;schema</xt> 
			<xa>xmlns</xa>=<xs>'http://www.w3.org/2001/XMLSchema'</xs> 
			<xa>targetNamespace</xa>=<xs>'http://www.apache.org/address/'</xs> 
			<xa>elementFormDefault</xa>=<xs>'qualified'</xs> 
			<xa>attributeFormDefault</xa>=<xs>'qualified'</xs> 
			<xa>xmlns:juneau</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs> 
			<xa>xmlns:per</xa>=<xs>'http://www.apache.org/person/'</xs> 
			<xa>xmlns:addr</xa>=<xs>'http://www.apache.org/address/'</xs> 
			<xa>xmlns:mail</xa>=<xs>'http://www.apache.org/mail/'</xs><xt>&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs> <xa>schemaLocation</xa>=<xs>'juneau.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/person/'</xs> <xa>schemaLocation</xa>=<xs>'per.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/mail/'</xs> <xa>schemaLocation</xa>=<xs>'mail.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;complexType</xt> <xa>name</xa>=<xs>'org.apache.juneau.examples.addressbook.Address'</xs><xt>&gt;</xt>
			<xt>&lt;sequence&gt;</xt>
				<xt>&lt;any</xt> <xa>minOccurs</xa>=<xs>'0'</xs> <xa>maxOccurs</xa>=<xs>'unbounded'</xs><xt>/&gt;</xt>
			<xt>&lt;/sequence&gt;</xt>
		<xt>&lt;/complexType&gt;</xt>
		<xt>&lt;element</xt> <xa>name</xa>=<xs>'isCurrent'</xs> <xa>_type</xa>=<xs>'juneau:boolean'</xs><xt>/&gt;</xt>
	<xt>&lt;/schema&gt;</xt>
	[\u0000]
	<xt>&lt;schema</xt> 
			<xa>xmlns</xa>=<xs>'http://www.w3.org/2001/XMLSchema'</xs> 
			<xa>targetNamespace</xa>=<xs>'http://www.apache.org/mail/'</xs> 
			<xa>elementFormDefault</xa>=<xs>'qualified'</xs> 
			<xa>attributeFormDefault</xa>=<xs>'qualified'</xs> 
			<xa>xmlns:juneau</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs> 
			<xa>xmlns:per</xa>=<xs>'http://www.apache.org/person/'</xs> 
			<xa>xmlns:addr</xa>=<xs>'http://www.apache.org/address/'</xs> 
			<xa>xmlns:mail</xa>=<xs>'http://www.apache.org/mail/'</xs><xt>&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/2013/Juneau'</xs> <xa>schemaLocation</xa>=<xs>'juneau.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/person/'</xs> <xa>schemaLocation</xa>=<xs>'per.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;import</xt> <xa>namespace</xa>=<xs>'http://www.apache.org/address/'</xs> <xa>schemaLocation</xa>=<xs>'addr.xsd'</xs><xt>/&gt;</xt>
		<xt>&lt;element</xt> <xa>name</xa>=<xs>'street'</xs> <xa>_type</xa>=<xs>'juneau:java.lang.String'</xs><xt>/&gt;</xt>
		<xt>&lt;element</xt> <xa>name</xa>=<xs>'city'</xs> <xa>_type</xa>=<xs>'juneau:java.lang.String'</xs><xt>/&gt;</xt>
		<xt>&lt;element</xt> <xa>name</xa>=<xs>'state'</xs> <xa>_type</xa>=<xs>'juneau:java.lang.String'</xs><xt>/&gt;</xt>
		<xt>&lt;element</xt> <xa>name</xa>=<xs>'zip'</xs> <xa>_type</xa>=<xs>'juneau:int'</xs><xt>/&gt;</xt>
	<xt>&lt;/schema&gt;</xt>	
</p>
<p>
	For convenience, the {@link org.apache.juneau.xmlschema.XmlSchemaSerializer
	#getValidator(SerializerSession,Object)} method is provided to create a 
	{@link javax.xml.validation.Validator} using the input from the serialize method.
</p>
</div><!-- END: 2.22.8 - juneau-marshall.XmlDetails.XmlSchema -->
</div><!-- END: 2.22 - juneau-marshall.XmlDetails -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails' id='juneau-marshall.HtmlDetails'>2.23 - HTML Details</a></h3>
<div class='topic'><!-- START: 2.23 - juneau-marshall.HtmlDetails -->
<p>
	Juneau supports converting arbitrary POJOs to and from HTML.
	Built on top of the existing XML parser, it also uses a STaX parser and creates POJOs directly without intermediate DOM objects.
</p>
<p>
	The primary use case for HTML serialization is rendering POJOs in easy-to-read format in REST interfaces.
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.Methodology' id='juneau-marshall.HtmlDetails.Methodology'>2.23.1 - HTML Methodology</a></h4>
<div class='topic'><!-- START: 2.23.1 - juneau-marshall.HtmlDetails.Methodology -->
<p>
	The following examples show how different data types are represented in HTML.
	They mirror how the data structures are represented in JSON.
</p>

<h5 class='topic'>Simple types</h5>
<p>
	The representation for simple types mirror those produced by the XML serializer.
	Tags are added to help differentiate data types when they cannot be inferred through reflection.
	These tags are ignored by browsers and treated as plain text.
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>HTML</th>
	</tr>
	<tr>
		<td>string</td>
		<td class='code'><js>'foo'</js></td>
		<td class='code'><xt>&lt;string&gt;</xt>foo<xt>&lt;/string&gt;</xt></td>
	</tr>
	<tr>
		<td>boolean</td>
		<td class='code'><jk>true</jk></td>
		<td class='code'><xt>&lt;boolean&gt;</xt>true<xt>&lt;/boolean&gt;</xt></td>
	</tr>
	<tr>
		<td>integer</td>
		<td class='code'>123</td>
		<td class='code'><xt>&lt;number&gt;</xt>123<xt>&lt;/number&gt;</xt></td>
	</tr>
	<tr>
		<td>float</td>
		<td class='code'>1.23</td>
		<td class='code'><xt>&lt;number&gt;</xt>1.23<xt>&lt;/number&gt;</xt></td>
	</tr>
	<tr>
		<td>null</td>
		<td class='code'><jk>null</jk></td>
		<td class='code'><xt>&lt;null/&gt;</xt></td>
	</tr>
</table>

<h5 class='topic'>Maps</h5>
<p>
	Maps and beans are represented as tables.
</p>
<p>
	The <xa>_type</xa> attribute is added to differentiate between objects (maps/beans) and arrays 
	(arrays/collections).
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>HTML</th>
	</tr>
	<tr>
		<td class='code'>
	Map&lt;String,String&gt;
		</td>
		<td class='code'>
	{
		k1: <js>'v1'</js>
		k2: <jk>null</jk>
	}
		</td>
		<td class='code'><xt>
	&lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>k1</xv>&lt;/td&gt;
			&lt;td&gt;<xv>v1</xv>&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>k2</xv>&lt;/td&gt;
			&lt;td&gt;&lt;null/&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;
	</xt></td>
	</tr>
	<tr>
		<td class='code'>
	Map&lt;String,Number&gt;
		</td>
		<td class='code'>
	{
		k1: 123,
		k2: 1.23,
		k3: <jk>null</jk>
	}
		</td>
		<td class='code'><xt>
	&lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>k1</xv>&lt;/td&gt;
			&lt;td&gt;<xv>123</xv>&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>k2</xv>&lt;/td&gt;
			&lt;td&gt;<xv>1.23</xv>&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>k3</xv>&lt;/td&gt;
			&lt;td&gt;&lt;null/&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	Map&lt;String,Object&gt;
		</td>
		<td class='code'>
	{
		k1: <js>'v1'</js>
		k2: 123,
		k3: 1.23,
		k4: <jk>true</jk>,
		k5: <jk>null</jk>
	}
		</td>
		<td class='code'><xt>
	&lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>k1</xv>&lt;/td&gt;
			&lt;td&gt;<xv>v1</xv>&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>k2</xv>&lt;/td&gt;
			&lt;td&gt;&lt;number&gt;<xv>123</xv>&lt;/number&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>k3</xv>&lt;/td&gt;
			&lt;td&gt;&lt;number&gt;<xv>1.23</xv>&lt;/number&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>k4</xv>&lt;/td&gt;
			&lt;td&gt;&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>k5</xv>&lt;/td&gt;
			&lt;td&gt;&lt;null/&gt;&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;
		</xt></td>
	</tr>
</table>

<h5 class='topic'>Arrays</h5>
<p>
	Collections and arrays are represented as ordered lists.
</p>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>HTML</th>
	</tr>
	<tr>
		<td class='code'>
	String[]
		</td>
		<td class='code'>
	[
		<js>'foo'</js>
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;ul&gt;
		&lt;li&gt;<xv>foo</xv>&lt;/li&gt;
		&lt;li&gt;&lt;null/&gt;&lt;/li&gt;
	&lt;/ul&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	Number[]
		</td>
		<td class='code'>
	[
		123,
		1.23,
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;ul&gt;
		&lt;li&gt;<xv>123</xv>&lt;/li&gt;
		&lt;li&gt;<xv>1.23</xv>&lt;/li&gt;
		&lt;li&gt;&lt;null/&gt;&lt;/li&gt;
	&lt;/ul&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	Object[]
		</td>
		<td class='code'>
	[
		<js>'foo'</js>,
		123,
		1.23,
		<jk>true</jk>,
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;ul&gt;
		&lt;li&gt;<xv>foo</xv>&lt;/li&gt;
		&lt;li&gt;&lt;number&gt;<xv>123</xv>&lt;/number&gt;&lt;/li&gt;
		&lt;li&gt;&lt;number&gt;<xv>1.23</xv>&lt;/number&gt;&lt;/li&gt;
		&lt;li&gt;&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;&lt;/li&gt;
		&lt;li&gt;&lt;null/&gt;&lt;/li&gt;
	&lt;/ul&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	String[][]
		</td>
		<td class='code'>
	[
		[<js>'foo'</js>, <jk>null</jk>],
		<jk>null</jk>,
	]
		</td>
		<td class='code'><xt>
	&lt;ul&gt;
		&lt;li&gt;
			&lt;ul&gt;
				&lt;li&gt;<xv>foo</xv>&lt;/li&gt;
				&lt;li&gt;&lt;null/&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;&lt;null/&gt;&lt;/li&gt;
	&lt;/ul&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<jk>int</jk>[]
		</td>
		<td class='code'>
	[
		123
	]
		</td>
		<td class='code'><xt>
	&lt;ul&gt;
		&lt;li&gt;<xv>123</xv>&lt;/li&gt;
	&lt;/ul&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	<jk>boolean</jk>[]
		</td>
		<td class='code'>
	[
		<jk>true</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;ul&gt;
		&lt;li&gt;<xv>true</xv>&lt;/li&gt;
	&lt;/ul&gt;
		</xt></td>
	</tr>
</table>

<h5 class='topic'>Collections</h5>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>HTML</th>
	</tr>
	<tr>
		<td class='code'>
	List&lt;String&gt;
		</td>
		<td class='code'>
	[
		<js>'foo'</js>
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;ul&gt;
		&lt;li&gt;<xv>foo</xv>&lt;/li&gt;
		&lt;li&gt;&lt;null/&gt;&lt;/li&gt;
	&lt;/ul&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	List&lt;Number&gt;
		</td>
		<td class='code'>
	[
		123,
		1.23,
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;ul&gt;
		&lt;li&gt;<xv>123</xv>&lt;/li&gt;
		&lt;li&gt;<xv>1.23</xv>&lt;/li&gt;
		&lt;li&gt;&lt;null/&gt;&lt;/li&gt;
	&lt;/ul&gt;
		</xt></td>
	</tr>
	<tr>
		<td class='code'>
	List&lt;Object&gt;
		</td>
		<td class='code'>
	[
		<js>'foo'</js>,
		123,
		1.23,
		<jk>true</jk>,
		<jk>null</jk>
	]
		</td>
		<td class='code'><xt>
	&lt;ul&gt;
		&lt;li&gt;<xv>foo</xv>&lt;/li&gt;
		&lt;li&gt;&lt;number&gt;<xv>123</xv>&lt;/number&gt;&lt;/li&gt;
		&lt;li&gt;&lt;number&gt;<xv>1.23</xv>&lt;/number&gt;&lt;/li&gt;
		&lt;li&gt;&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;&lt;/li&gt;
		&lt;li&gt;&lt;null/&gt;&lt;/li&gt;
	&lt;/ul&gt;
		</xt></td>
	</tr>
</table>

<h5 class='topic'>Beans</h5>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>HTML</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<jk>public</jk> String a;
		<jk>public</jk> <jk>int</jk> b;
		<jk>public</jk> Object c;  <jc>// String value</jc>
		<jk>public</jk> Object d;  <jc>// Integer value</jc>  	
		<jk>public</jk> MyBean2 e;  
		<jk>public</jk> String[] f;  
	 	<jk>public</jk> <jk>int</jk>[] g;  	
	}
	<jk>class</jk> MyBean2 {
		String h;  
	}
		</td>
		<td class='code'>
	{
		<jok>a</jok>: <jov>'foo'</jov>,
		<jok>b</jok>: <jov>123</jov>,
		<jok>c</jok>: <jov>'bar'</jov>,
		<jok>d</jok>: <jov>456</jov>,
		<jok>e</jok>: {
			<jok>h</jok>: <jov>'baz'</jov>
		}
		<jok>f</jok>: [<jov>'qux'</jov>]
		<jok>g</jok>: [<jov>789</jov>]
	}
		</td>
		<td class='code'><xt>
	&lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>a</xv>&lt;/td&gt;
			&lt;td&gt;<xv>foo</xv>&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>b</xv>&lt;/td&gt;
			&lt;td&gt;<xv>123</xv>&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>c</xv>&lt;/td&gt;
			&lt;td&gt;<xv>bar</xv>&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>d</xv>&lt;/td&gt;
			&lt;td&gt;&lt;number&gt;<xv>456</xv>&lt;/number&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>e</xv>&lt;/td&gt;
			&lt;td&gt;
				&lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
					&lt;tr&gt;
						&lt;td&gt;<xv>h</xv>&lt;/td&gt;
						&lt;td&gt;<xv>qux</xv>&lt;/td&gt;
					&lt;/tr&gt;
				&lt;/table&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>f</xv>&lt;/td&gt;
			&lt;td&gt;
				&lt;ul&gt;
					&lt;li&gt;<xv>baz</xv>&lt;/li&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>g</xv>&lt;/td&gt;
			&lt;td&gt;
				&lt;ul&gt;
					&lt;li&gt;<xv>789</xv>&lt;/li&gt;
				&lt;/ul&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;
		</xt></td>
	</tr>
</table>

<h5 class='topic'>Beans with Map properties</h5>
<table class='styled w800'>
	<tr>
		<th>Data type</th>
		<th>JSON example</th>
		<th>HTML</th>
	</tr>
	<tr>
		<td class='code'>
	<jk>class</jk> MyBean {
		<jk>public</jk> Map&lt;String,String&gt; a;
		<jk>public</jk> Map&lt;String,Number&gt; b;
		<jk>public</jk> Map&lt;String,Object&gt; c; 
	}
		</td>
		<td class='code'>
	{
		<jok>a</jok>: {
			<jok>k1</jok>: <jov>'foo'</jov>
		},
		<jok>b</jok>: {
			<jok>k2</jok>: <jov>123</jov>
		},
		<jok>c</jok>: {
			<jok>k3</jok>: <jov>'bar'</jov>,
			<jok>k4</jok>: <jov>456</jov>,
			<jok>k5</jok>: <jov>true</jov>,
			<jok>k6</jok>: <jov>null</jov>
		}
	}
		</td>
		<td class='code'><xt>
	&lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>a</xv>&lt;/td&gt;
			&lt;td&gt;
				&lt;table _type='object'&gt;
					&lt;tr&gt;
						&lt;td&gt;<xv>k1</xv>&lt;/td&gt;
						&lt;td&gt;<xv>foo</xv>&lt;/td&gt;
					&lt;/tr&gt;
				&lt;/table&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>b</xv>&lt;/td&gt;
			&lt;td&gt;
				&lt;table _type='object'&gt;
					&lt;tr&gt;
						&lt;td&gt;<xv>k2</xv>&lt;/td&gt;
						&lt;td&gt;<xv>123</xv>&lt;/td&gt;
					&lt;/tr&gt;
				&lt;/table&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td&gt;<xv>c</xv>&lt;/td&gt;
			&lt;td&gt;
				&lt;table <xa>_type</xa>=<xs>'object'</xs>&gt;
					&lt;tr&gt;
						&lt;td&gt;<xv>k3</xv>&lt;/td&gt;
						&lt;td&gt;<xv>bar</xv>&lt;/td&gt;
					&lt;/tr&gt;
					&lt;tr&gt;
						&lt;td&gt;<xv>k4</xv>&lt;/td&gt;
						&lt;td&gt;&lt;number&gt;<xv>456</xv>&lt;/number&gt;&lt;/td&gt;
					&lt;/tr&gt;
					&lt;tr&gt;
						&lt;td&gt;<xv>k5</xv>&lt;/td&gt;
						&lt;td&gt;&lt;boolean&gt;<xv>true</xv>&lt;/boolean&gt;&lt;/td&gt;
					&lt;/tr&gt;
					&lt;tr&gt;
						&lt;td&gt;<xv>k6</xv>&lt;/td&gt;
						&lt;td&gt;&lt;null/&gt;&lt;/td&gt;
					&lt;/tr&gt;
				&lt;/table&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/table&gt;
		</xt></td>
	</tr>
</table>
</div><!-- END: 2.23.1 - juneau-marshall.HtmlDetails.Methodology -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.Serializers' id='juneau-marshall.HtmlDetails.Serializers'>2.23.2 - HTML Serializers</a></h4>
<div class='topic'><!-- START: 2.23.2 - juneau-marshall.HtmlDetails.Serializers -->
<p>
	The {@link org.apache.juneau.html.HtmlSerializer} class is used to serialize POJOs into HTML.
</p>	
<p>
	The {@link org.apache.juneau.html.HtmlDocSerializer} class is the same, but wraps the serialized POJO
	inside a document template consisting of header, nav, aside, and footer sections.
</p>
<p>
	The HTML serializers provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonSerializer Common Serializer Properties}
	<li class='jc'>{@link org.apache.juneau.html.HtmlSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.html.HtmlSerializer#HTML_addBeanTypes HTML_addBeanTypes}
		<li class='jf'>{@link org.apache.juneau.html.HtmlSerializer#HTML_addKeyValueTableHeaders HTML_addKeyValueTableHeaders}
		<li class='jf'>{@link org.apache.juneau.html.HtmlSerializer#HTML_detectLabelParameters HTML_detectLabelParameters}
		<li class='jf'>{@link org.apache.juneau.html.HtmlSerializer#HTML_detectLinksInStrings HTML_detectLinksInStrings}
		<li class='jf'>{@link org.apache.juneau.html.HtmlSerializer#HTML_labelParameter HTML_labelParameter}
		<li class='jf'>{@link org.apache.juneau.html.HtmlSerializer#HTML_uriAnchorText HTML_uriAnchorText}
	</ul>
	<li class='jc'>{@link org.apache.juneau.html.HtmlDocSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_aside HTMLDOC_aside}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_footer HTMLDOC_footer}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_head HTMLDOC_head}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_header HTMLDOC_header}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_nav HTMLDOC_nav}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_navlinks HTMLDOC_navlinks}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_noResultsMessage HTMLDOC_noResultsMessage}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_nowrap HTMLDOC_nowrap}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_script HTMLDOC_script}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_style HTMLDOC_style}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_stylesheet HTMLDOC_stylesheet}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_template HTMLDOC_template}				
	</ul>
</ul>
<p>
	The following pre-configured serializers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.html.HtmlSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.html.HtmlSerializer#DEFAULT }
		<li class='jf'>{@link org.apache.juneau.html.HtmlSerializer#DEFAULT_SQ }
		<li class='jf'>{@link org.apache.juneau.html.HtmlSerializer#DEFAULT_SQ_READABLE }
	</ul>
	<li class='jc'>{@link org.apache.juneau.html.HtmlDocSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#DEFAULT }
	</ul>
</ul>
</div><!-- END: 2.23.2 - juneau-marshall.HtmlDetails.Serializers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.Parsers' id='juneau-marshall.HtmlDetails.Parsers'>2.23.3 - HTML Parsers</a></h4>
<div class='topic'><!-- START: 2.23.3 - juneau-marshall.HtmlDetails.Parsers -->
<p>
	The {@link org.apache.juneau.html.HtmlParser} class is used to parse HTML into POJOs.
	They can also parse the contents produced by {@link org.apache.juneau.html.HtmlDocSerializer}.
</p>	
<p>
	The HTML parser provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonParser Common Parser}
</ul>
<p>
	The following pre-configured parsers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.html.HtmlParser}
	<ul>
		<li class='jf'>{@link org.apache.juneau.html.HtmlParser#DEFAULT DEFAULT}
	</ul>
</ul>
</div><!-- END: 2.23.3 - juneau-marshall.HtmlDetails.Parsers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlAnnotation' id='juneau-marshall.HtmlDetails.HtmlAnnotation'>2.23.4 - @Html Annotation</a></h4>
<div class='topic'><!-- START: 2.23.4 - juneau-marshall.HtmlDetails.HtmlAnnotation -->
<p>
	The {@link org.apache.juneau.html.annotation.Html @Html} annotation can be used to customize how POJOs are serialized to HTML on a per-class/field/method basis.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.html.annotation.Html}
	<ul>
		<li class='jf'>{@link org.apache.juneau.html.annotation.Html#anchorText() anchorText}
		<li class='jf'>{@link org.apache.juneau.html.annotation.Html#format() format}
		<li class='jf'>{@link org.apache.juneau.html.annotation.Html#link() link}
		<li class='jf'>{@link org.apache.juneau.html.annotation.Html#noTableHeaders() noTableHeaders}
		<li class='jf'>{@link org.apache.juneau.html.annotation.Html#noTables() noTables}
		<li class='jf'>{@link org.apache.juneau.html.annotation.Html#render() render}
	</ul>
</ul>		
<p>
	The {@link org.apache.juneau.html.annotation.Html#link @Html(link)} annotation adds a hyperlink to a bean property when rendered as HTML.
</p>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jk>public class</jk> FileSpace {
		<jc>// Add a hyperlink to this bean property.</jc>
		<ja>@Html</ja>(link&#61;<js>"servlet:/drive/{drive}"</js>)
		public String getDrive() {...}
	}			
</p>
<p>
	The {@link org.apache.juneau.html.annotation.Html#anchorText @Html(anchorText)} annotation is used to specify the anchor text of a hyperlink.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Produces &lt;a href&#61;'...'&gt;CLICK ME!&lt;/a&gt; when serialized to HTML.</jc>
	<jk>public class</jk> FileSpace {
		<jc>// Add a hyperlink to this bean property.</jc>
		<ja>@Html</ja>(link=<js>"servlet:/drive/{drive}"</js>, anchorText=<js>"CLICK ME!"</js>)
		public String getDrive() {...}
	}			
</p>
<p>
	The {@link org.apache.juneau.html.annotation.Html#format @Html(format)} annotation is used to specify what format to use for HTML elements.
	For example, the HTML beans defined in the {@link org.apache.juneau.dto.html5} package use <c>format=<jsf>XML</jsf></c> so that
	the beans get serialized as standard XML:
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Parent class of all HTML DTO beans.</jc>
	<ja>@Html</ja>(format=<jsf>XML</jsf>)	
	<jk>public abstract class</jk> HtmlElement {...}
</p>
<p>
	The {@link org.apache.juneau.html.annotation.Html#noTableHeaders @Html(noTableHeaders)} annotation is used to prevent beans from being serialized with table headers.
</p>
<p>
	The {@link org.apache.juneau.html.annotation.Html#noTables @Html(noTables)} annotation is used to force beans to be serialized as trees instead of tables
</p>
</div><!-- END: 2.23.4 - juneau-marshall.HtmlDetails.HtmlAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlRenderAnnotation' id='juneau-marshall.HtmlDetails.HtmlRenderAnnotation'>2.23.5 - @Html(render) Annotation</a></h4>
<div class='topic'><!-- START: 2.23.5 - juneau-marshall.HtmlDetails.HtmlRenderAnnotation -->
<p>
	The {@link org.apache.juneau.html.annotation.Html#render @Html(render)} annotation allows for custom rendering of bean property values when serialized as HTML. 
	Using this class, you can alter the CSS style and HTML content of the bean property.
</p>
<p>
	The following example shows two render classes that customize the appearance of the <c>pctFull</c> and
	<c>status</c> columns in the code below:
</p>
<p class='bpcode w800'>
	<jk>import static</jk> org.apache.juneau.dto.html5.HtmlBuilder.*;	
			
	<jc>// Our bean class</jc>
	<jk>public class</jk> FileSpace {

		<jk>private final</jk> String <jf>drive</jf>;
		<jk>private final long</jk> <jf>total</jf>, <jf>available</jf>;

		<jk>public</jk> FileSpace(String drive, <jk>long</jk> total, <jk>long</jk> available) {
			<jk>this</jk>.<jf>drive</jf> = drive;
			<jk>this</jk>.<jf>total</jf> = total;
			<jk>this</jk>.<jf>available</jf> = available;
		}

		<ja>@Html</ja>(link=<js>"drive/{drive}"</js>)
		<jk>public</jk> String getDrive() {
			<jk>return</jk> <jf>drive</jf>;
		}

		<jk>public long</jk> getTotal() {
			<jk>return</jk> <jf>total</jf>;
		}

		<jk>public long</jk> getAvailable() {
			<jk>return</jk> <jf>available</jf>;
		}

		<ja>@Html</ja>(render=FileSpacePctRender.<jk>class</jk>)
		<jk>public float</jk> getPctFull() {
			<jk>return</jk> ((100 * <jf>available</jf>) / <jf>total</jf>);
		}

		<ja>@Html</ja>(render=FileSpaceStatusRender.<jk>class</jk>)
		<jk>public</jk> FileSpaceStatus getStatus() {
			<jk>float</jk> pf = getPctFull();
			<jk>if</jk> (pf &lt; 80)
				<jk>return</jk> FileSpaceStatus.<jsf>OK</jsf>;
			<jk>if</jk> (pf &lt; 90)
				<jk>return</jk> FileSpaceStatus.<jsf>WARNING</jsf>;
			<jk>return</jk> FileSpaceStatus.<jsf>SEVERE</jsf>;
		}
	}
</p>
<p class='bpcode w800'>
	<jc>// Possible values for the getStatus() method</jc>
	<jk>public enum</jk> FileSpaceStatus {
		<jsf>OK</jsf>, <jsf>WARNING</jsf>, <jsf>SEVERE</jsf>;
	}
</p>
<p class='bpcode w800'>
	<jc>// Custom render for getPctFull() method</jc>
	<jk>public class</jk> FileSpacePctRender <jk>extends</jk> HtmlRender&lt;Float&gt; {

		<ja>@Override</ja>
		<jk>public</jk> String getStyle(SerializerSession session, Float value) {
			<jk>if</jk> (value &lt; 80)
				<jk>return</jk> <js>"background-color:lightgreen;text-align:center"</js>;
			<jk>if</jk> (value &lt; 90)
				<jk>return</jk> <js>"background-color:yellow;text-align:center"</js>;
			<jk>return</jk> <js>"background-color:red;text-align:center;border:;animation:color_change 0.5s infinite alternate"</js>;
		}

		<ja>@Override</ja>
		<jk>public</jk> Object getContent(SerializerSession session, Float value) {
			<jk>if</jk> (value >= 90)
				<jk>return</jk> <jsm>div</jsm>(
					String.<jsm>format</jsm>(<js>"%.0f%%"</js>, value),
					<jsm>style</jsm>(<js>"@keyframes color_change { from { background-color: red; } to { background-color: yellow; }"</js>)
				);
			<jk>return</jk> String.<jsm>format</jsm>(<js>"%.0f%%"</js>, value);
		}
	}
</p>
<p class='bpcode w800'>
	<jc>// Custom render for getStatus() method</jc>
	<jk>public class</jk> FileSpaceStatusRender <jk>extends</jk> HtmlRender&lt;FileSpaceStatus&gt; {

		<ja>@Override</ja>
		<jk>public</jk> String getStyle(SerializerSession session, FileSpaceStatus value) {
			<jk>return</jk> <js>"text-align:center"</js>;
		}

		<ja>@Override</ja>
		<jk>public</jk> Object getContent(SerializerSession session, FileSpaceStatus value) {
			<jk>switch</jk> (value) {
				<jk>case</jk> <jsf>OK</jsf>:  <jk>return</jk> <jsm>img</jsm>().src(URI.<jsm>create</jsm>(<js>"servlet:/htdocs/ok.png"</js>));
				<jk>case</jk> <jsf>WARNING</jsf>:  <jk>return</jk> <jsm>img</jsm>().src(URI.<jsm>create</jsm>(<js>"servlet:/htdocs/warning.png"</js>));
				<jk>default</jk>: <jk>return</jk> <jsm>img</jsm>().src(URI.<jsm>create</jsm>(<js>"servlet:/htdocs/severe.png"</js>));
			}
		}
	}
</p>
</div><!-- END: 2.23.5 - juneau-marshall.HtmlDetails.HtmlRenderAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlDocSerializer' id='juneau-marshall.HtmlDetails.HtmlDocSerializer'>2.23.6 - HtmlDocSerializer</a></h4>
<div class='topic'><!-- START: 2.23.6 - juneau-marshall.HtmlDetails.HtmlDocSerializer -->
<p>
	{@link org.apache.juneau.html.HtmlDocSerializer} is an extension of {@link org.apache.juneau.html.HtmlSerializer}
	that wraps serialized POJOs in a complete HTML document. 
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.html.HtmlDocSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_aside HTMLDOC_aside}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_footer HTMLDOC_footer}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_head HTMLDOC_head}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_header HTMLDOC_header}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_nav HTMLDOC_nav}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_navlinks HTMLDOC_navlinks}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_noResultsMessage HTMLDOC_noResultsMessage}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_nowrap HTMLDOC_nowrap}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_script HTMLDOC_script}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_style HTMLDOC_style}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_stylesheet HTMLDOC_stylesheet}
		<li class='jf'>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_template HTMLDOC_template}
	</ul>
</ul>
<p>
	This class is used extensively in the creation of POJO-based user interfaces in the REST API.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jd>/** 
	 * Sample REST resource that prints out a simple "Hello world!" message.
	 */</jd>
	<ja>@Rest</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> BasicRestServlet {...}
</p>
<p>
	The {@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_template HTMLDOC_template} setting defines
	a template for the HTML page being generated.
	The default template is described next.
</p>
</div><!-- END: 2.23.6 - juneau-marshall.HtmlDetails.HtmlDocSerializer -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.BasicHtmlDocTemplate' id='juneau-marshall.HtmlDetails.BasicHtmlDocTemplate'>2.23.7 - BasicHtmlDocTemplate</a></h4>
<div class='topic'><!-- START: 2.23.7 - juneau-marshall.HtmlDetails.BasicHtmlDocTemplate -->
<p>
	The {@link org.apache.juneau.html.BasicHtmlDocTemplate} class defines a default template for HTML documents
	created by {@link org.apache.juneau.html.HtmlDocSerializer}.
</p>
<p>
	The HTML document created by this template consists of the following structure:
</p>
<p class='bpcode w800'>
	<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>
</div><!-- END: 2.23.7 - juneau-marshall.HtmlDetails.BasicHtmlDocTemplate -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.CustomTemplates' id='juneau-marshall.HtmlDetails.CustomTemplates'>2.23.8 - Custom Templates</a></h4>
<div class='topic'><!-- START: 2.23.8 - juneau-marshall.HtmlDetails.CustomTemplates -->
<p>
	Custom page templates can be created by implementing the {@link org.apache.juneau.html.HtmlDocTemplate}
	interface and associating it with your {@link org.apache.juneau.html.HtmlDocSerializer} using the {@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_template HTMLDOC_template}
	setting.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.html.HtmlDocTemplate}
	<ul>
		<li class='jm'>{@link org.apache.juneau.html.HtmlDocTemplate#writeTo(HtmlDocSerializerSession,HtmlWriter,Object) writeTo(HtmlDocSerializerSession,HtmlWriter,Object)}
	</ul>
</ul>
<p>
	The interface implementation is open-ended allowing you to define the contents of the page any way you wish.
</p>
</div><!-- END: 2.23.8 - juneau-marshall.HtmlDetails.CustomTemplates -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.HtmlDetails.HtmlSchema' id='juneau-marshall.HtmlDetails.HtmlSchema'>2.23.9 - HTML-Schema Support</a></h4>
<div class='topic'><!-- START: 2.23.9 - juneau-marshall.HtmlDetails.HtmlSchema -->
<p>
	The {@link org.apache.juneau.html.HtmlSchemaSerializer} class is the HTML-equivalent to the
	{@link org.apache.juneau.json.JsonSchemaSerializer} class.
	It's used to generate HTML versions of JSON-Schema documents that describe the output generated by the 
	{@link org.apache.juneau.json.JsonSerializer} class.
</p>
<h5 class='figure'>Sample Beans</h5>
<p class='bpcode w800'>
	<jk>public class</jk> Person {
		
		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>name</jf>;
		<jk>public</jk> Calendar <jf>birthDate</jf>;
		<jk>public</jk> List&lt;Address&gt; <jf>addresses</jf>; 
	
		<jc>// Getters/setters omitted</jc>
	}
	
	<jk>public class</jk> Address {

		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>;
		<jk>public</jk> StateEnum <jf>state</jf>;
		<jk>public int</jk> <jf>zip</jf>;
		<jk>public boolean</jk> <jf>isCurrent</jf>;

		<jc>// Getters/setters omitted</jc>
	}	
</p>
<p>
	The code for creating our POJO model and generating HTML-Schema is shown below:
</p>
<p class='bpcode w800'>
	<jc>// Get the one of the default schema serializers.</jc>
	HtmlSchemaSerializer s = HtmlSchemaSerializer.<jsf>DEFAULT_SIMPLE_READABLE</jsf>;
	
	<jc>// Get the HTML Schema for the POJO.</jc>
	String htmlSchema = s.serialize(<jk>new</jk> Person());

	<jc>// This also works.</jc>
	htmlSchema = s.serialize(Person.<jk>class</jk>);
</p>
<p>
	The result is the HTML table shown below:
</p>
<table class='bordered unstyled w800'>
	<tr>
		<td>type</td>
		<td>object</td>
	</tr>
	<tr>
		<td>properties</td>
		<td>
			<table>
				<tr>
					<td>name</td>
					<td>
						<table>
							<tr>
								<td>type</td>
								<td>string</td>
							</tr>
						</table>
					</td>
				</tr>
				<tr>
					<td>birthDate</td>
					<td>
						<table>
							<tr>
								<td>type</td>
								<td>string</td>
							</tr>
						</table>
					</td>
				</tr>
				<tr>
					<td>addresses</td>
					<td>
						<table>
							<tr>
								<td>type</td>
								<td>array</td>
							</tr>
							<tr>
								<td>items</td>
								<td>
									<table>
										<tr>
											<td>type</td>
											<td>object</td>
										</tr>
										<tr>
											<td>properties</td>
											<td>
												<table>
													<tr>
														<td>street</td>
														<td>
															<table>
																<tr>
																	<td>type</td>
																	<td>string</td>
																</tr>
															</table>
														</td>
													</tr>
													<tr>
														<td>city</td>
														<td>
															<table>
																<tr>
																	<td>type</td>
																	<td>string</td>
																</tr>
															</table>
														</td>
													</tr>
													<tr>
														<td>state</td>
														<td>
															<table>
																<tr>
																	<td>type</td>
																	<td>string</td>
																</tr>
																<tr>
																	<td>enum</td>
																	<td>
																		<ul>
																			<li>AL</li>
																			<li>PA</li>
																			<li>NC</li>
																		</ul>
																	</td>
																</tr>
															</table>
														</td>
													</tr>
													<tr>
														<td>zip</td>
														<td>
															<table>
																<tr>
																	<td>type</td>
																	<td>integer</td>
																</tr>
																<tr>
																	<td>format</td>
																	<td>int32</td>
																</tr>
															</table>
														</td>
													</tr>
													<tr>
														<td>isCurrent</td>
														<td>
															<table>
																<tr>
																	<td>type</td>
																	<td>boolean</td>
																</tr>
															</table>
														</td>
													</tr>
												</table>
											</td>
										</tr>
									</table>
								</td>
							</tr>
						</table>
					</td>
				</tr>
			</table>
		</td>
	</tr>
</table>
</div><!-- END: 2.23.9 - juneau-marshall.HtmlDetails.HtmlSchema -->
</div><!-- END: 2.23 - juneau-marshall.HtmlDetails -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails' id='juneau-marshall.UonDetails'>2.24 - UON Details</a></h3>
<div class='topic'><!-- START: 2.24 - juneau-marshall.UonDetails -->
<p>
	Juneau supports converting arbitrary POJOs to and from UON strings using ultra-efficient serializers 
	and parsers.
	The serializer converts POJOs directly to UON strings without the need for intermediate DOM objects 
	using a highly-efficient state machine.
	Likewise, the parser creates POJOs directly from UON strings without the need for intermediate DOM 
	objects. 
</p>
<p>
	Juneau uses UON (URL-Encoded Object Notation) for representing POJOs.  
	The UON specification can be found <a href='doc-files/rfc_uon.txt'>here</a>.
</p>
<p>
	The following example shows JSON for a typical bean:
</p>
<h5 class='figure'>Sample Beans</h5>
<p class='bpcode w800'>
	<jk>public class</jk> Person {
		
		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>name</jf>;
		<ja>@Swap</ja>(TemporalCalendarSwap.IsoInstant.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
		<jk>public</jk> List&lt;Address&gt; <jf>addresses</jf>; 
	
		<jc>// Getters/setters omitted</jc>
	}
	
	<jk>public class</jk> Address {

		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>;
		<jk>public</jk> StateEnum <jf>state</jf>;
		<jk>public int</jk> <jf>zip</jf>;
		<jk>public boolean</jk> <jf>isCurrent</jf>;

		<jc>// Getters/setters omitted</jc>
	}	
</p>
<h5 class='figure'>Sample Code</h5>
<p class='bpcode w800'>
	Person p = <jk>new</jk> Person()
		.name(<js>"John Smith"</js>)
		.birthDate(<js>"1946-08-12T00:00:00Z"</js>)
		.addresses(
			<jk>new</jk> Address() 
				.street(<js>"100 Main Street"</js>)
				.city(<js>"Anywhereville"</js>)
				.state(<jsf>NY</jsf>)
				.zip(12345)
				.isCurrent(<jk>true</jk>);
		);
</p>
<h5 class='figure'>UON</h5>
<p class='bpcode w800'>
   (
		<ua>name</ua>=<us>'John+Smith'</us>,
		<ua>birthDate</ua>=<us>'1946-08-12T00:00:00Z'</us>,
		<ua>addresses</ua>=@(
			(
				<ua>street</ua>=<us>'100 Main Street'</us>,
				<ua>city</ua>=<us>Anywhereville</us>,
				<ua>state</ua>=<us>NY</us>,
				<ua>zip</ua>=<un>12345</un>,
				<ua>isCurrent</ua>=<uk>true</uk>
			)
		)
   ) 
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails.Methodology' id='juneau-marshall.UonDetails.Methodology'>2.24.1 - UON Methodology</a></h4>
<div class='topic'><!-- START: 2.24.1 - juneau-marshall.UonDetails.Methodology -->
<h5 class='figure'>General methodology:</h5>
<table class='styled w800' style='border-collapse:collapse'>
	<tr><th>Java type</th><th>JSON equivalent</th><th>UON</th></tr>
	<tr>
		<td>Maps/beans</td>
		<td>OBJECT</td>
		<td class='code'>
	<ua>a1</ua>=(<ua>b1</ua>=<us>x1</us>,<ua>b2</ua>=<us>x2</us>)
	<ua>a1</ua>=(<ua>b1</ua>=(<ua>c1</ua>=<us>x1</us>,<ua>c2</ua>=<us>x2</us>))
		</td>
	</tr>
	<tr>
		<td>Collections/arrays</td>
		<td>ARRAY</td>
		<td class='code'>
	<ua>a1</ua>=@(<us>x1</us>,<us>x2</us>)
	<ua>a1</ua>=@(@(<us>x1</us>,<us>x2</us>),@(<us>x3</us>,<us>x4</us>))
	<ua>a1</ua>=@((<ua>b1</ua>=<us>x1</us>,<ua>b2</ua>=<us>x2</us>),(<ua>c1</ua>=<us>x1</us>,<ua>c2</ua>=<us>x2</us>))
		</td>
	</tr>
	<tr>
		<td>Booleans</td>
		<td>BOOLEAN</td>
		<td class='code'>
	<ua>a1</ua>=<uk>true</uk>&amp;<ua>a2</ua>=<uk>false</uk>
		</td>
	</tr>
	<tr>
		<td>int/float/double/...</td>
		<td>NUMBER</td>
		<td class='code'>
	<ua>a1</ua>=<un>123</un>&amp;<ua>a2</ua>=<un>1.23e1</un>
		</td>
	</tr>
	<tr>
		<td>null</td>
		<td>NULL</td>
		<td class='code'>
	<ua>a1</ua>=<uk>null</uk>
		</td>
	</tr>
	<tr>
		<td>String</td>
		<td>STRING</td>
		<td class='code'>
	<ua>a1</ua>=<us>foobar</us>
	<ua>a1</ua>=<us>'true'</us>
	<ua>a1</ua>=<us>'null'</us>
	<ua>a1</ua>=<us>'123'</us>
	<ua>a1</ua>=<us>' string with whitespace '</us>
	<ua>a1</ua>=<us>'string with ~'escaped~' quotes'</us>
		</td>
	</tr>
</table>
<p>
	Refer to the <a href='doc-files/rfc_uon.txt'>UON specification</a> for a complete set of syntax rules.		
</p>
</div><!-- END: 2.24.1 - juneau-marshall.UonDetails.Methodology -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails.Serializers' id='juneau-marshall.UonDetails.Serializers'>2.24.2 - UON Serializers</a></h4>
<div class='topic'><!-- START: 2.24.2 - juneau-marshall.UonDetails.Serializers -->
<p>
	The {@link org.apache.juneau.uon.UonSerializer} class is used to serialize POJOs into UON.
</p>	
<p>
	The UON serializers provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonSerializer Common Serializer Properties}
	<li class='jc'>{@link org.apache.juneau.uon.UonSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.uon.UonSerializer#UON_addBeanTypes UON_addBeanTypes}
		<li class='jf'>{@link org.apache.juneau.uon.UonSerializer#UON_encoding UON_encoding}
		<li class='jf'>{@link org.apache.juneau.uon.UonSerializer#UON_paramFormat UON_paramFormat}					
	</ul>
</ul>
<p>
	The following pre-configured serializers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.uon.UonSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.uon.UonSerializer#DEFAULT DEFAULT}
		<li class='jf'>{@link org.apache.juneau.uon.UonSerializer#DEFAULT_ENCODING DEFAULT_ENCODING}
		<li class='jf'>{@link org.apache.juneau.uon.UonSerializer#DEFAULT_READABLE DEFAULT_READABLE}
	</ul>
</ul>
</div><!-- END: 2.24.2 - juneau-marshall.UonDetails.Serializers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.UonDetails.Parsers' id='juneau-marshall.UonDetails.Parsers'>2.24.3 - UON Parsers</a></h4>
<div class='topic'><!-- START: 2.24.3 - juneau-marshall.UonDetails.Parsers -->
<p>
	The {@link org.apache.juneau.uon.UonParser} class is used to parse UON into POJOs.
</p>	
<p>
	The UON parser provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonParser Common Parser Properties}
	<li class='jc'>{@link org.apache.juneau.uon.UonParser}
	<ul>
		<li class='jf'>{@link org.apache.juneau.uon.UonParser#UON_decoding UON_decoding}
		<li class='jf'>{@link org.apache.juneau.uon.UonParser#UON_validateEnd UON_validateEnd}
	</ul>
</ul>
<p>
	The following pre-configured parsers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.uon.UonParser}
	<ul>
		<li class='jf'>{@link org.apache.juneau.uon.UonParser#DEFAULT DEFAULT}
		<li class='jf'>{@link org.apache.juneau.uon.UonParser#DEFAULT_DECODING DEFAULT_DECODING}			
	</ul>
</ul>
</div><!-- END: 2.24.3 - juneau-marshall.UonDetails.Parsers -->
</div><!-- END: 2.24 - juneau-marshall.UonDetails -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.UrlEncodingDetails' id='juneau-marshall.UrlEncodingDetails'>2.25 - URL-Encoding Details</a></h3>
<div class='topic'><!-- START: 2.25 - juneau-marshall.UrlEncodingDetails -->
<p>
	Juneau supports converting arbitrary POJOs to and from URL-encoded strings using ultra-efficient serializers 
	and parsers.
	The serializer converts POJOs directly to URL-encoded strings without the need for intermediate DOM objects 
	using a highly-efficient state machine.
	Likewise, the parser creates POJOs directly from URL-encoded strings without the need for intermediate DOM 
	objects. 
</p>
<p>
	Juneau uses UON (URL-Encoded Object Notation) for representing POJOs as URL-Encoded values in key-value pairs.  
	The UON specification can be found <a href='doc-files/rfc_uon.txt'>here</a>.
</p>
<p>
	The following example shows JSON for a typical bean:
</p>
<h5 class='figure'>Sample Beans</h5>
<p class='bpcode w800'>
	<jk>public class</jk> Person {
		
		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>name</jf>;
		<ja>@Swap</ja>(TemporalCalendarSwap.IsoInstant.<jk>class</jk>) <jk>public</jk> Calendar <jf>birthDate</jf>;
		<jk>public</jk> List&lt;Address&gt; <jf>addresses</jf>; 
	
		<jc>// Getters/setters omitted</jc>
	}
	
	<jk>public class</jk> Address {

		<jc>// Bean properties</jc>
		<jk>public</jk> String <jf>street</jf>, <jf>city</jf>;
		<jk>public</jk> StateEnum <jf>state</jf>;
		<jk>public int</jk> <jf>zip</jf>;
		<jk>public boolean</jk> <jf>isCurrent</jf>;

		<jc>// Getters/setters omitted</jc>
	}	
</p>
<h5 class='figure'>Sample Code</h5>
<p class='bpcode w800'>
	Person p = <jk>new</jk> Person()
		.name(<js>"John Smith"</js>)
		.birthDate(<js>"1946-08-12T00:00:00Z"</js>)
		.addresses(
			<jk>new</jk> Address() 
				.street(<js>"100 Main Street"</js>)
				.city(<js>"Anywhereville"</js>)
				.state(<jsf>NY</jsf>)
				.zip(12345)
				.isCurrent(<jk>true</jk>);
		);
</p>
<h5 class='figure'>URL-Encoding</h5>
<p class='bpcode w800'>
	<ua>name</ua>=<us>'John+Smith'</us>
	&amp;<ua>birthDate</ua>=<us>'1946-08-12T00:00:00Z'</us>
	&amp;<ua>addresses</ua>=@(
		(
			<ua>street</ua>=<us>'100 Main Street'</us>,
			<ua>city</ua>=<us>Anywhereville</us>,
			<ua>state</ua>=<us>NY</us>,
			<ua>zip</ua>=<un>12345</un>,
			<ua>isCurrent</ua>=<uk>true</uk>
		)
	)
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.UrlEncodingDetails.Methodology' id='juneau-marshall.UrlEncodingDetails.Methodology'>2.25.1 - URL-Encoding Methodology</a></h4>
<div class='topic'><!-- START: 2.25.1 - juneau-marshall.UrlEncodingDetails.Methodology -->
<h5 class='figure'>General methodology:</h5>
<table class='styled w800' style='border-collapse:collapse'>
	<tr><th>Java type</th><th>JSON equivalent</th><th>UON</th></tr>
	<tr>
		<td>Maps/beans</td>
		<td>OBJECT</td>
		<td class='code'>
	<ua>a1</ua>=(<ua>b1</ua>=<us>x1</us>,<ua>b2</ua>=<us>x2</us>)
	<ua>a1</ua>=(<ua>b1</ua>=(<ua>c1</ua>=<us>x1</us>,<ua>c2</ua>=<us>x2</us>))
		</td>
	</tr>
	<tr>
		<td>Collections/arrays</td>
		<td>ARRAY</td>
		<td class='code'>
	<ua>a1</ua>=@(<us>x1</us>,<us>x2</us>)
	<ua>a1</ua>=@(@(<us>x1</us>,<us>x2</us>),@(<us>x3</us>,<us>x4</us>))
	<ua>a1</ua>=@((<ua>b1</ua>=<us>x1</us>,<ua>b2</ua>=<us>x2</us>),(<ua>c1</ua>=<us>x1</us>,<ua>c2</ua>=<us>x2</us>))
		</td>
	</tr>
	<tr>
		<td>Booleans</td>
		<td>BOOLEAN</td>
		<td class='code'>
	<ua>a1</ua>=<uk>true</uk>&amp;<ua>a2</ua>=<uk>false</uk>
		</td>
	</tr>
	<tr>
		<td>int/float/double/...</td>
		<td>NUMBER</td>
		<td class='code'>
	<ua>a1</ua>=<un>123</un>&amp;<ua>a2</ua>=<un>1.23e1</un>
		</td>
	</tr>
	<tr>
		<td>null</td>
		<td>NULL</td>
		<td class='code'>
	<ua>a1</ua>=<uk>null</uk>
		</td>
	</tr>
	<tr>
		<td>String</td>
		<td>STRING</td>
		<td class='code'>
	<ua>a1</ua>=<us>foobar</us>
	<ua>a1</ua>=<us>'true'</us>
	<ua>a1</ua>=<us>'null'</us>
	<ua>a1</ua>=<us>'123'</us>
	<ua>a1</ua>=<us>' string with whitespace '</us>
	<ua>a1</ua>=<us>'string with ~'escaped~' quotes'</us>
		</td>
	</tr>
</table>
<p>
	Refer to the <a href='doc-files/rfc_uon.txt'>UON specification</a> for a complete set of syntax rules.		
</p>
</div><!-- END: 2.25.1 - juneau-marshall.UrlEncodingDetails.Methodology -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.UrlEncodingDetails.Serializers' id='juneau-marshall.UrlEncodingDetails.Serializers'>2.25.2 - URL-Encoding Serializers</a></h4>
<div class='topic'><!-- START: 2.25.2 - juneau-marshall.UrlEncodingDetails.Serializers -->
<p>
	The {@link org.apache.juneau.urlencoding.UrlEncodingSerializer} class is used to serialize POJOs into URL-Encoding.
</p>	
<p>
	The URL-Encoding serializers provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonSerializer Common Serializer Properties}
	<li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer#URLENC_expandedParams URLENC_expandedParams}
	</ul>
</ul>
<p>
	The following pre-configured serializers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer#DEFAULT DEFAULT}
		<li class='jf'>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer#DEFAULT_EXPANDED DEFAULT_EXPANDED}
		<li class='jf'>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer#DEFAULT_PLAINTEXT DEFAULT_PLAINTEXT}
		<li class='jf'>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer#DEFAULT_READABLE DEFAULT_READABLE}		
		
	</ul>
</ul>
</div><!-- END: 2.25.2 - juneau-marshall.UrlEncodingDetails.Serializers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.UrlEncodingDetails.Parsers' id='juneau-marshall.UrlEncodingDetails.Parsers'>2.25.3 - URL-Encoding Parsers</a></h4>
<div class='topic'><!-- START: 2.25.3 - juneau-marshall.UrlEncodingDetails.Parsers -->
<p>
	The {@link org.apache.juneau.urlencoding.UrlEncodingParser} class is used to parse URL-Encoding into POJOs.
</p>	
<p>
	The URL-Encoding parser provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonParser Common Parser Properties}
	<li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingParser}
	<ul>
		<li class='jf'>{@link org.apache.juneau.urlencoding.UrlEncodingParser#URLENC_expandedParams URLENC_expandedParams}
	</ul>
</ul>
<p>
	The following pre-configured parsers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingParser}
	<ul>
		<li class='jf'>{@link org.apache.juneau.urlencoding.UrlEncodingParser#DEFAULT DEFAULT}
	</ul>
</ul>
</div><!-- END: 2.25.3 - juneau-marshall.UrlEncodingDetails.Parsers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.UrlEncodingDetails.UrlEncodingAnnotation' id='juneau-marshall.UrlEncodingDetails.UrlEncodingAnnotation'>2.25.4 - @UrlEncoding Annotation</a></h4>
<div class='topic'><!-- START: 2.25.4 - juneau-marshall.UrlEncodingDetails.UrlEncodingAnnotation -->
<p>
	The {@link org.apache.juneau.urlencoding.annotation.UrlEncoding @UrlEncoding} annotation
	is used to override the behavior of {@link org.apache.juneau.urlencoding.UrlEncodingSerializer} on individual bean classes or properties.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.urlencoding.annotation.UrlEncoding}
	<ul>
		<li class='jf'>{@link org.apache.juneau.urlencoding.annotation.UrlEncoding#expandedParams() expandedParams}
	</ul>
</ul>		
<p>
	The {@link org.apache.juneau.urlencoding.annotation.UrlEncoding#expandedParams() expandedParams} setting is
	used to force bean properties of type array or Collection to be expanded into multiple key/value pairings.
	It's identical in behavior to using the {@link org.apache.juneau.urlencoding.UrlEncodingSerializer#URLENC_expandedParams}
	and {@link org.apache.juneau.urlencoding.UrlEncodingParser#URLENC_expandedParams} properties, but applies to only individual bean properties.
</p>
</div><!-- END: 2.25.4 - juneau-marshall.UrlEncodingDetails.UrlEncodingAnnotation -->
</div><!-- END: 2.25 - juneau-marshall.UrlEncodingDetails -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.MsgPackDetails' id='juneau-marshall.MsgPackDetails'>2.26 - MessagePack Details</a></h3>
<div class='topic'><!-- START: 2.26 - juneau-marshall.MsgPackDetails -->
<p>
	Juneau supports converting arbitrary POJOs to and from MessagePack using ultra-efficient serializers 
	and parsers.
</p>
<p>
	MessagePack is a compact binary form of JSON.
	The serialization support for MessagePack mirrors that of JSON.
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.MsgPackDetails.Serializers' id='juneau-marshall.MsgPackDetails.Serializers'>2.26.1 - MessagePack Serializers</a></h4>
<div class='topic'><!-- START: 2.26.1 - juneau-marshall.MsgPackDetails.Serializers -->
<p>
	The {@link org.apache.juneau.msgpack.MsgPackSerializer} class is used to serialize POJOs into MessagePack.
</p>	
<p>
	The MessagePack serializer provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonSerializer Common Serializer Properties}
	<li class='jc'>{@link org.apache.juneau.msgpack.MsgPackSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.msgpack.MsgPackSerializer#MSGPACK_addBeanTypes MSGPACK_addBeanTypes}
	</ul>
</ul>
<p>
	The following pre-configured serializers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.msgpack.MsgPackSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.msgpack.MsgPackSerializer#DEFAULT DEFAULT}
		
	</ul>
</ul>
</div><!-- END: 2.26.1 - juneau-marshall.MsgPackDetails.Serializers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.MsgPackDetails.Parsers' id='juneau-marshall.MsgPackDetails.Parsers'>2.26.2 - MessagePack Parsers</a></h4>
<div class='topic'><!-- START: 2.26.2 - juneau-marshall.MsgPackDetails.Parsers -->
<p>
	The {@link org.apache.juneau.msgpack.MsgPackParser} class is used to parse MessagePack into POJOs.
</p>	
<p>
	The MessagePack parser provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonParser Common Parser Properties}
</ul>
<p>
	The following pre-configured parsers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.msgpack.MsgPackParser}
	<ul>
		<li class='jf'>{@link org.apache.juneau.msgpack.MsgPackParser#DEFAULT DEFAULT}
	</ul>
</ul>
</div><!-- END: 2.26.2 - juneau-marshall.MsgPackDetails.Parsers -->
</div><!-- END: 2.26 - juneau-marshall.MsgPackDetails -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.OpenApiDetails' id='juneau-marshall.OpenApiDetails'>2.27 - OpenAPI Details</a></h3>
<div class='topic'><!-- START: 2.27 - juneau-marshall.OpenApiDetails -->
<p>
	Juneau supports converting arbitrary POJOs to and from strings using OpenAPI-based schema rules. 
</p>
<p>
	The relevant classes for using OpenAPI-based serialization are:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.oapi.OpenApiSerializer} - Converts POJOs to strings.
	<li class='jc'>{@link org.apache.juneau.oapi.OpenApiParser} - Converts strings to POJOs.
	<li class='jc'>{@link org.apache.juneau.httppart.HttpPartSchema} - Defines the schema for your POJO.
</ul>
<p>
	The {@link org.apache.juneau.httppart.HttpPartSchema} class is used to define the formatting and 
	validations for a POJO.
	It's used in conjunction with the serializer and parser to produce and consume HTTP parts based on 
	OpenAPI rules.
</p>
<p>
	Later in the rest-server and rest-client sections, we also describe how the following annotations
	can be applied to method parameters and class types to define the schema for various HTTP parts:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Header}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Query}
	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Path}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Response}
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseHeader}
</ul>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.OpenApiDetails.Methodology' id='juneau-marshall.OpenApiDetails.Methodology'>2.27.1 - OpenAPI Methodology</a></h4>
<div class='topic'><!-- START: 2.27.1 - juneau-marshall.OpenApiDetails.Methodology -->
<p>
	Unlike the other Juneau serializers and parsers that convert input and output directly to-and-from POJOs,
	the OpenAPI serializers and parsers use intermediate objects based on the <c>type</c> and <c>format</c>
	of the schema.
</p>
<p>
	The following table shows the "natural" intermediate type of the object based on the <c>type/format</c>:
</p>
<table class='styled w800'>
	<tr><th>Type</th><th>Format</th><th>Intermediate Java Type</th></tr>
	<tr class='dark bb'>
		<td rowspan='4'><c>string</c> or empty</td>
		<td><c>byte<br>binary<br>binary-spaced</c></td>
		<td><c><jk>byte</jk>[]</c></td>
	</tr>
	<tr class='dark bb'>
		<td><c>date<br>date-time</c></td>
		<td>{@link java.util.Calendar}</td>
	</tr>
	<tr class='dark bb'>
		<td><c>uon</c></td>
		<td>No intermediate type.<br>(serialized directly to/from POJO)</td>
	</tr>
	<tr class='dark bb'>
		<td>empty</td>
		<td>{@link java.lang.String}</td>
	</tr>
	<tr class='light bb'>
		<td rowspan='1'><c>boolean</c></td>
		<td>empty</td>
		<td>{@link java.lang.Boolean}</td>
	</tr>
	<tr class='dark bb'>
		<td rowspan='2'><c>integer</c></td>
		<td><c>int32</c></td>
		<td>{@link java.lang.Integer}</td>
	</tr>
	<tr class='dark bb'>
		<td><c>int64</c></td>
		<td>{@link java.lang.Long}</td>
	</tr>
	<tr class='light bb'>
		<td rowspan='2'><c>number</c></td>
		<td><c>float</c></td>
		<td>{@link java.lang.Float}</td>
	</tr>
	<tr class='light bb'>
		<td><c>double</c></td>
		<td>{@link java.lang.Double}</td>
	</tr>
	<tr class='dark bb'>
		<td rowspan='2'><c>array</c></td>
		<td>empty</td>
		<td>Arrays of intermediate types on this list.</td>
	</tr>
	<tr class='dark bb'>
		<td><c>uon</c></td>
		<td>No intermediate type.<br>(serialized directly to/from POJO)</td>
	</tr>
	<tr class='light bb'>
		<td rowspan='2'><c>object</c></td>
		<td>empty</td>
		<td><c>Map&lt;String,Object&gt;</c></td>
	</tr>
	<tr class='light bb'>
		<td><c>uon</c></td>
		<td>No intermediate type.<br>(serialized directly to/from POJO)</td>
	</tr>
</table>
<p>
	The valid POJO types for serializing/parsing are based on the intermediate types above.
	As a general rule, any POJOs that are the intermediate type or transformable to or from
	the intermediate type are valid POJO types.
</p>
<p>
	For example, the following POJO type can be transformed to and from a byte array.
</p>
<p class='bpcode w800'>
	<jc>// Sample POJO class convertable to and from a byte[].</jc>
	<jk>public class</jk> MyPojo {
		
		<jc>// Constructor used by parser.</jc>
		<jk>public</jk> MyPojo(<jk>byte</jk>[] fromBytes) {...}
	
		<jc>// toX method used by serializer.</jc>
		<jk>public byte</jk>[] toBytes() {...}
	}
</p>
<p>
	This example shows how that POJO can be converted to a BASE64-encoded string.
</p>
<p class='bpcode w800'>
	<jc>// Construct a POJO.</jc>
	MyPojo myPojo = ...;
	
	<jc>// Define a schema.</jc>
	HttpPartSchema schema = HttpPartSchema.<jsm>create</jsm>().type(<js>"string"</js>).format(<js>"byte"</js>).build();

	<jc>// Convert POJO to BASE64-encoded string.</jc>
	HttpPartSerializer s = OpenApiSerializer.<jsf>DEFAULT</jsf>;
	String httpPart = s.serialize(schema, myPojo);
	
	<jc>// Convert BASE64-encoded string back into a POJO.</jc>
	HttpPartParser p = OpenApiParser.<jsf>DEFAULT</jsf>;
	myPojo = p.parse(schema, httpPart, MyPojo.<jk>class</jk>);
</p>
<p>
	In addition to defining format, the schema also allows for validations of the serialized form.
</p>
<p class='bpcode w800'>
	<jc>// Construct a POJO.</jc>
	MyPojo myPojo = ...;
	
	<jc>// Define a schema.</jc>
	<jc>// Serialized string must be no smaller than 100 characters.</jc>
	HttpPartSchema schema = HttpPartSchema.<jsm>create</jsm>().type(<js>"string"</js>).format(<js>"byte"</js>).minLength(100).build();

	<jc>// Convert POJO to BASE64-encoded string.</jc>
	HttpPartSerializer s = OpenApiSerializer.<jsf>DEFAULT</jsf>;
	String httpPart;
	<jk>try</jk> {
		httpPart = s.serialize(schema, myPojo);
	} <jk>catch</jk> (SchemaValidationException e) {
		<jc>// Oops, output too small.</jc>
	}
	
	<jc>// Convert BASE64-encoded string back into a POJO.</jc>
	HttpPartParser p = OpenApiParser.<jsf>DEFAULT</jsf>;
	<jk>try</jk> {
		myPojo = p.parse(schema, httpPart, MyPojo.<jk>class</jk>);
	} <jk>catch</jk> (SchemaValidationException e) {
		<jc>// Oops, input too small.</jc>
	}
</p>
<p>
	It looks simple, but the implementation is highly sophisticated being able to serialize and parse and validate using complex schemas.
</p>
<p>
	The next sections go more into depth on serializing and parsing various POJO types.
</p>
</div><!-- END: 2.27.1 - juneau-marshall.OpenApiDetails.Methodology -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.OpenApiDetails.Serializers' id='juneau-marshall.OpenApiDetails.Serializers'>2.27.2 - OpenAPI Serializers</a></h4>
<div class='topic'><!-- START: 2.27.2 - juneau-marshall.OpenApiDetails.Serializers -->
<p>
	The {@link org.apache.juneau.oapi.OpenApiSerializer} class is used to convert POJOs to HTTP parts.
</p>
<p>
	Later we'll describe how to use HTTP-Part annotations to define OpenAPI schemas for serialization and parsing
	of HTTP parts.  
	The following example is a preview showing an HTTP body defined as pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>):
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
	<jk>public void</jk> post2dLongArray(
		<ja>@Body</ja>(
			schema=<ja>@Schema</ja>(
				items=<ja>@Items</ja>(
					collectionFormat=<js>"pipes"</js>,
					items=<ja>@SubItems</ja>(
						collectionFormat=<js>"csv"</js>,
						type=<js>"integer"</js>, 
						format=<js>"int64"</js>,
						minimum=<js>"0"</js>,
						maximum=<js>"100"</js>
						minLength=1,
						maxLength=10
					)
				)
				minLength=1,
				maxLength=10
			)
		)
		Long[][] body
	) {...}
</p>
<p>
	Under-the-covers, this gets converted to the following schema object:
</p>
<p class='bpcode w800'>
	<jk>import static</jk> org.apache.juneau.httppart.HttpPartSchema.*;

	HttpPartSchema schema = <jsm>create</jsm>()
		.items(
			<jsm>create</jsm>()
				.collectionFormat(<js>"pipes"</js>)
				.items(
					<jsm>create</jsm>()
						.collectionFormat(<js>"csv"</js>)
						.type(<js>"integer"</js>) 
						.format(<js>"int64"</js>)
						.minimum(<js>"0"</js>)
						.maximum(<js>"100"</js>)
						.minLength(1)
						.maxLength=(10)
				)
		)
		.build();
</p>
<p>
	The following code shows how the schema above can be used to create our pipe+csv list of numbers:
</p>
<p class='bpcode w800'>
	<jc>// Our POJO being serialized.</jc>
	Long[][] input = ....
	
	<jc>// The serializer to use.</jc>
	HttpPartSerializer s = OpenApiSerializer.<jsf>DEFAULT</jsf>;
	
	<jc>// Convert POJO to a string.</jc>
	<jk>try</jk> {
		String httpPart = s.serialize(schema, input);
	} <jk>catch</jk> (SchemaValidationException e) {
		<jc>// Oops, one of the restrictions were not met.</jc>
	}
</p>
<p>
	As a general rule, any POJO convertible to the intermediate type for the <c>type/format</c> of the schema can
	be serialized using the OpenAPI serializer.
	Here are the rules of POJO types allowed for various type/format combinations:
</p>
<table class='styled w800'>
	<tr><th>Type</th><th>Format</th><th>Valid parameter types</th></tr>
	<tr class='dark bb'>
		<td rowspan='4'><c>string</c> or empty</td>
		<td><c>byte<br>binary<br>binary-spaced</c></td>
		<td>
			<ul>
				<li><c><jk>byte</jk>[]</c> (default)
				<li>{@link java.io.InputStream}
				<li>{@link java.io.Reader} - Read into String and then converted using {@link java.lang.String#getBytes()}.
				<li>{@link java.lang.Object} - Converted to String and then converted using {@link java.lang.String#getBytes()}.
				<li>Any POJO transformable to a <c><jk>byte</jk>[]</c> via the following methods:
					<ul>
						<li><c><jk>public byte</jk>[] toBytes() {...}</c>
						<li><c><jk>public byte</jk>[]</jk> toFoo() {...}</c> (any method name starting with "to")
					</ul>
				<li>Any POJO transformable to a <c><jk>byte</jk>[]</c> via a {@link org.apache.juneau.transform.PojoSwap}.
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td><c>date<br>date-time</c></td>
		<td>
			<ul>
				<li>{@link java.util.Calendar} (default)
				<li>{@link java.util.Date}
				<li>Any POJO transformable to a {@link java.util.Calendar} via the following methods:
					<ul>
						<li><c><jk>public</jk> Calendar toCalendar() {...}</c>
						<li><c><jk>public</jk> Calendar toFoo() {...}</c> (any method name starting with "to")
					</ul>
				<li>Any POJO transformable to a {@link java.util.Calendar} via a {@link org.apache.juneau.transform.PojoSwap}.
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td><c>uon</c></td>
		<td>
			<ul>
				<li>Any {@doc PojoCategories Serializable POJO} type.
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td>empty</td>
		<td>
			<ul>
				<li>{@link java.lang.String} (default)
				<li>Any POJO transformable to a {@link java.lang.String} via the following methods:
					<ul>
						<li><c><jk>public</jk> String toString() {...}</c>
					</ul>
				<li>Any POJO transformable to a {@link java.lang.String} via a {@link org.apache.juneau.transform.PojoSwap}.
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td rowspan='1'><c>boolean</c></td>
		<td>empty</td>
		<td>
			<ul>
				<li>{@link java.lang.Boolean} (default)
				<li><jk>boolean</jk>
				<li>{@link java.lang.String} - Converted to a {@link java.lang.Boolean}.
				<li>Any POJO transformable to a {@link java.lang.Boolean} via the following methods:
					<ul>
						<li><c><jk>public</jk> Boolean toBoolean() {...}</c>
						<li><c><jk>public</jk> Boolean toFoo() {...}</c> (any method name starting with "to")
					</ul>
				<li>Any POJO transformable to a {@link java.lang.Boolean} via a {@link org.apache.juneau.transform.PojoSwap}.
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td rowspan='2'><c>integer</c></td>
		<td><c>int32</c></td>
		<td>
			<ul>
				<li>{@link java.lang.Integer} (default)
				<li><jk>int</jk>
				<li>{@link java.lang.String} - Converted to an {@link java.lang.String}.
				<li>Any POJO transformable to an {@link java.lang.Integer} via the following methods:
					<ul>
						<li><c><jk>public</jk> Integer toInteger() {...}</c>
						<li><c><jk>public</jk> Integer toFoo() {...}</c> (any method name starting with "to")
					</ul>
				<li>Any POJO transformable to an {@link java.lang.Integer} via a {@link org.apache.juneau.transform.PojoSwap}.
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td><c>int64</c></td>
		<td>
			<ul>
				<li>{@link java.lang.Long} (default)
				<li><jk>long</jk>
				<li>{@link java.lang.String} - Converted to a {@link java.lang.Long}.
				<li>Any POJO transformable to a {@link java.lang.Long} via the following methods:
					<ul>
						<li><c><jk>public</jk> Long toLong() {...}</c>
						<li><c><jk>public</jk> Long toFoo() {...}</c> (any method name starting with "to")
					</ul>
				<li>Any POJO transformable to a {@link java.lang.Long} via a {@link org.apache.juneau.transform.PojoSwap}.
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td rowspan='2'><c>number</c></td>
		<td><c>float</c></td>
		<td>
			<ul>
				<li>{@link java.lang.Float} (default)
				<li><jk>float</jk>
				<li>{@link java.lang.String} - Converted to a {@link java.lang.Float}.
				<li>Any POJO transformable to a {@link java.lang.Float} via the following methods:
					<ul>
						<li><c><jk>public</jk> Float toFloat() {...}</c>
						<li><c><jk>public</jk> Float toFoo() {...}</c> (any method name starting with "to")
					</ul>
				<li>Any POJO transformable to a {@link java.lang.Float} via a {@link org.apache.juneau.transform.PojoSwap}.
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td><c>double</c></td>
		<td>
			<ul>
				<li>{@link java.lang.Double} (default)
				<li><jk>double</jk>
				<li>{@link java.lang.String} - Converted to a {@link java.lang.Double}.
				<li>Any POJO transformable to a {@link java.lang.Double} via the following methods:
					<ul>
						<li><c><jk>public</jk> Double toDouble() {...}</c>
						<li><c><jk>public</jk> Double toFoo() {...}</c> (any method name starting with "to")
					</ul>
				<li>Any POJO transformable to a {@link java.lang.Double} via a {@link org.apache.juneau.transform.PojoSwap}.
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td rowspan='2'><c>array</c></td>
		<td>empty</td>
		<td>
			<ul>
				<li>Arrays or Collections of any defaults on this list.
				<li>Any POJO transformable to arrays of the default types (e.g. <c>Integer[]</c>, <c>Boolean[][]</c>, etc...).
					<br>For example:
					<ul>
						<li><c><jk>public</jk> Boolean[][] toFoo() {...}</c> (any method name starting with "to")
					</ul>
				<li>Any POJO transformable to arrays of the default types via a {@link org.apache.juneau.transform.PojoSwap}
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td><c>uon</c></td>
		<td>
			<ul>
				<li>Any {@doc PojoCategories Serializable POJO} type.
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td rowspan='2'><c>object</c></td>
		<td>empty</td>
		<td>
			<ul>
				<li><c>Map&lt;String,Object&gt;</c> (default)
				<li>Beans with properties of anything on this list.
				<li>Any POJO transformable to a map via a {@link org.apache.juneau.transform.PojoSwap}
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td><c>uon</c></td>
		<td>
			<ul>
				<li>Any {@doc PojoCategories Serializable POJO} type.
			</ul>
		</td>
	</tr>
</table>
<p>
	For arrays, an example of "Any POJO transformable to arrays of the default types" is:
</p>
<p class='bpcode w800'>
	<jc>// Sample POJO class convertable to a Long[][].</jc>
	<jk>public class</jk> MyPojo {
		
		<jc>// toX method used by serializer.</jc>
		<jk>public</jk> Long[][] to2dLongs() {...}
	}
</p>
<p>
	In the example above, our POJO class can be used to create our pipe-delimited list of comma-delimited numbers: 
</p>
<p class='bpcode w800'>
	<jc>// Our POJO being serialized.</jc>
	MyPojo input = ....
	
	<jc>// The serializer to use.</jc>
	HttpPartSerializer s = OpenApiSerializer.<jsf>DEFAULT</jsf>;
	
	<jc>// Convert POJO to a string.</jc>
	<jk>try</jk> {
		String httpPart = s.serialize(schema, input);
	} <jk>catch</jk> (SchemaValidationException e) {
		<jc>// Oops, one of the restrictions were not met.</jc>
	}
</p>
<p>
	The <c>object</c> type is not officially part of the OpenAPI standard.  
	However, Juneau supports serializing Maps and beans to HTTP parts using UON notation.
</p>
<p>
	The following shows an example of a bean with several properties of various types.
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyBean {
		<jk>private static byte</jk>[] <jsf>FOOB</jsf> = <js>"foo"</js>.getBytes();

		<jk>public</jk> String <jf>f1</jf> = <js>"foo"</js>;
		<jk>public byte</jk>[] <jf>f2</jf> = <jsf>FOOB</jsf>;
		<jk>public byte</jk>[] <jf>f3</jf> = <jsf>FOOB</jsf>;
		<jk>public byte</jk>[] <jf>f4</jf> = <jsf>FOOB</jsf>;
		<jk>public</jk> Calendar <jf>f5</jf> = <jsm>parseIsoCalendar</jsm>(<js>"2012-12-21T12:34:56Z"</js>);
		<jk>public</jk> String <jf>f6</jf> = <js>"foo"</js>;
		<jk>public int</jk> <jf>f7</jf> = 1;
		<jk>public</jk> Long <jf>f8</jf> = 2l;
		<jk>public float</jk> <jf>f9</jf> = 1.0;
		<jk>public</jk> Double <jf>f10</jf> = 1.0;
		<jk>public</jk> Boolean <jf>f11</jf> = <jk>true</jk>;
		<jk>public</jk> Object <jf>fExtra</jf> = "1";
	}
</p>
<p>
	We define the following schema:
</p>
<p class='bpcode w800'>
	<jk>import static</jk> org.apache.juneau.httppart.HttpPartSchema.*;
	
	HttpPartSchema ps = <jsm>schema</jsm>(<js>"object"</js>)
		.property(<js>"f1"</js>, <jsm>schema</jsm>(<js>"string"</js>))
		.property(<js>"f2"</js>, <jsm>schema</jsm>(<js>"string"</js>, <js>"byte"</js>))
		.property(<js>"f3"</js>, <jsm>schema</jsm>(<js>"string"</js>, <js>"binary"</js>))
		.property(<js>"f4"</js>, <jsm>schema</jsm>(<js>"string"</js>, <js>"binary-spaced"</js>))
		.property(<js>"f5"</js>, <jsm>schema</jsm>(<js>"string"</js>, <js>"date-time"</js>))
		.property(<js>"f6"</js>, <jsm>schema</jsm>(<js>"string"</js>, "<js>uon"</js>))
		.property(<js>"f7"</js>, <jsm>schema</jsm>(<js>"integer"</js>))
		.property(<js>"f8"</js>, <jsm>schema</jsm>(<js>"integer"</js>, <js>"int64"</js>))
		.property(<js>"f9"</js>, <jsm>schema</jsm>(<js>"number"</js>))
		.property(<js>"f10"</js>, <jsm>schema</jsm>(<js>"number"</js>, <js>"double"</js>))
		.property(<js>"f11"</js>, <jsm>schema</jsm>(<js>"boolean"</js>))
		.additionalProperties(<jsm>schema</jsm>(<js>"integer"</js>))
		.build();
</p>
<p>
	Then we serialize our bean:
</p>
<p class='bpcode w800'>
	HttpPartSerializer s = OpenApiSerializer.<jsf>DEFAULT</jsf>;
	String httpPart = s.serialize(schema, <jk>new</jk> MyBean());
</p>
<p>
	The results of this serialization is shown below:
</p>
<p class='bpcode w800'>
	(
		f1=foo,
		f2=Zm9v,
		f3=666F6F,
		f4='66 6F 6F',
		f5=2012-12-21T12:34:56Z,
		f6=foo,
		f7=1,
		f8=2,
		f9=1.0,
		f10=1.0,
		f11=true,
		fExtra=1
	)
</p>
<p>
	The following is an example of a bean with various array property types:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyBean {
		<jk>private static byte</jk>[] <jsf>FOOB</jsf> = <js>"foo"</js>.getBytes();
	
		<jk>public</jk> String[] <jf>f1</jf> = <jk>new</jk> String[]{<js>"a,b"</js>,<jk>null</jk>}, 
		<jk>public byte</jk>[][] <jf>f2</jf> = <jk>new byte</jk>[][]{<jsf>FOOB</jsf>,<jk>null</jk>}, 
		<jk>public byte</jk>[][] <jf>f3</jf> = <jk>new byte</jk>[][]{<jsf>FOOB</jsf>,<jk>null</jk>},
		<jk>public byte</jk>[][] <jf>f4</jf> = <jk>new byte</jk>[][]{<jsf>FOOB</jsf>,<jk>null</jk>},
		<jk>public</jk> Calendar[] <jf>f5</jf> = <jk>new</jk> Calendar[]{<jsm>parseIsoCalendar</jsm>(<js>"2012-12-21T12:34:56Z"</js>),<jk>null</jk>},
		<jk>public</jk> String[] <jf>f6</jf> = <jk>new</jk> String[]{<js>"a"</js>,<js>"b"</js>,<jk>null</jk>},
		<jk>public int</jk>[] <jf>f7</jf> = <jk>new int</jk>[]{1,2,<jk>null</jk>}, 
		<jk>public</jk> Integer[] <jf>f8</jf> = <jk>new</jk> Integer[]{3,4,<jk>null</jk>}, 
		<jk>public float</jk>[] <jf>f9</jf> = <jk>new float</jk>[]{1f,2f,<jk>null</jk>}, 
		<jk>public</jk> Float[] <jf>f10</jf> = <jk>new</jk> Float[]{3f,4f,<jk>null</jk>}, 
		<jk>public</jk> Boolean[] <jf>f11</jf> = <jk>new</jk> Boolean[]{<jk>true</jk>,<jk>false</jk>,<jk>null</jk>}, 
		<jk>public</jk> Object[] <jf>fExtra</jf> = <jk>new</jk> Object[]{1,<js>"2"</js>,<jk>null</jk>};
	}
</p>
<p>
	For this bean, we define the following schema:
</p>
<p class='bpcode w800'>
	HttpPartSchema ps = <jsm>schema</jsm>("object")
		.property(<js>"f1"</js>, <jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"string"</js>)))
		.property(<js>"f2"</js>, <jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"string"</js>, <js>"byte"</js>)))
		.property(<js>"f3"</js>, <jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"string"</js>, <js>"binary"</js>)))
		.property(<js>"f4"</js>, <jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"string"</js>, <js>"binary-spaced"</js>)))
		.property(<js>"f5"</js>, <jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"string"</js>, <js>"date-time"</js>)))
		.property(<js>"f6"</js>, <jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"string"</js>, <js>"uon"</js>)))
		.property(<js>"f7"</js>, <jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"integer"</js>)))
		.property(<js>"f8"</js>, <jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"integer"</js>, <js>"int64"</js>)))
		.property(<js>"f9"</js>, <jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"number"</js>)))
		.property(<js>"f10"</js>, <jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"number"</js>, <js>"double"</js>)))
		.property(<js>"f11"</js>, <jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"boolean"</js>)))
		.additionalProperties(<jsm>schema</jsm>(<js>"array"</js>).items(<jsm>schema</jsm>(<js>"integer"</js>)))
		.build();
</p>
<p>
	Serializing this bean produces the following output:
</p>
<p class='bpcode w800'>
	(
		f1=@('a,b',null),
		f2=@(Zm9v,null),
		f4=@(2012-12-21T12:34:56Z,null),
		f5=@(666F6F,null),
		f6=@('66 6F 6F',null),
		f7=@(a,b,null),
		f8=@(1,2,null),
		f9=@(3,4,null),
		f10=@(1.0,2.0,null),
		f11=@(3.0,4.0,null),
		f12=@(true,false,null),
		fExtra=@(1,2,null)
	)
</p>
<ul class='notes'>
	<li>
		Array properties can also use CSV/SSV/PIPES for array notation.
		<br>Various notations can be mixed throughout.
	<li>
		Schemas and POJOs can be defined arbitrarily deep.
	<li>
		Schemas are optional.
		They can be skipped or partially defined.
	<li>
		We make our best attempt to convert the input to the matching type.  
		However, you will get <c>SerializeExceptions</c> if you attempt an impossible conversion.
		(e.g. trying to serialize the string "foo" as a boolean). 
</ul>
</div><!-- END: 2.27.2 - juneau-marshall.OpenApiDetails.Serializers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.OpenApiDetails.Parsers' id='juneau-marshall.OpenApiDetails.Parsers'>2.27.3 - OpenAPI Parsers</a></h4>
<div class='topic'><!-- START: 2.27.3 - juneau-marshall.OpenApiDetails.Parsers -->
<p>
	The {@link org.apache.juneau.oapi.OpenApiParser} class is used to convert HTTP parts back into POJOs.
</p>
<p>
	The following is the previous example of a schema that defines the format of a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>):
</p>
<p class='bpcode w800'>
	<jk>import static</jk> org.apache.juneau.httppart.HttpPartSchema.*;

	HttpPartSchema schema = <jsm>create</jsm>()
		.items(
			<jsm>create</jsm>()
				.collectionFormat(<js>"pipes"</js>)
				.items(
					<jsm>create</jsm>()
						.collectionFormat(<js>"csv"</js>)
						.type(<js>"integer"</js>) 
						.format(<js>"int64"</js>)
						.minimum(<js>"0"</js>)
						.maximum(<js>"100"</js>)
						.minLength(1)
						.maxLength=(10)
				)
		)
		.build();
</p>
<p>
	The following code shows how the schema above can be used to parse our input into a POJO:
</p>
<p class='bpcode w800'>
	<jc>// Our input being parsed.</jc>
	String input = <js>"1,2,3|4,5,6|7,8,9"</js>
	
	<jc>// The parser to use.</jc>
	HttpPartParser p = OpenApiParser.<jsf>DEFAULT</jsf>;
	
	<jc>// Convert string to a POJO.</jc>
	<jk>try</jk> {
		Long[][] pojo = p.parse(schema, input, Long[][].<jk>class</jk>);
	} <jk>catch</jk> (SchemaValidationException e) {
		<jc>// Oops, one of the restrictions were not met.</jc>
	}
</p>
<p>
	As a general rule, any POJO convertible from the intermediate type for the <c>type/format</c> of the schema can
	be parsed using the OpenAPI parser.
	Here are the rules of POJO types allowed for various type/format combinations:
</p>
<table class='styled w800'>
	<tr><th>Type</th><th>Format</th><th>Valid parameter types</th></tr>
	<tr class='dark bb'>
		<td rowspan='4'><c>string</c> or empty</td>
		<td><c>byte<br>binary<br>binary-spaced</c></td>
		<td>
			<ul>
				<li><c><jk>byte</jk>[]</c> (default)
				<li>{@link java.io.InputStream} - Returns a {@link java.io.ByteArrayInputStream}.
				<li>{@link java.io.Reader} - Returns a {@link java.io.InputStreamReader} wrapped around a {@link java.io.ByteArrayInputStream}.
				<li>{@link java.lang.String} - Constructed using {@link java.lang.String#String(byte[])}.
				<li>{@link java.lang.Object} - Returns the default <c><jk>byte</jk>[]</c>.
				<li>Any POJO transformable from a <c><jk>byte</jk>[]</c> (via constructors or static create methods).
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td><c>date<br>date-time</c></td>
		<td>
			<ul>
				<li>{@link java.util.Calendar} (default)
				<li>{@link java.util.Date}
				<li>{@link java.util.GregorianCalendar}
				<li>{@link java.lang.String} - Converted using {@link java.util.Calendar#toString()}.
				<li>{@link java.lang.Object} - Returns the default {@link java.util.Calendar}.
				<li>Any POJO transformable from a {@link java.util.Calendar} (via constructors or static create methods).
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td><c>uon</c></td>
		<td>
			<ul>
				<li>Any {@doc PojoCategories Parsable POJO} type.
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td>empty</td>
		<td>
			<ul>
				<li>{@link java.lang.String} (default)
				<li>{@link java.lang.Object} - Returns the default {@link java.lang.String}.
				<li>Any POJO transformable from a {@link java.lang.String} (via constructors, static create methods, or swaps).
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td rowspan='1'><c>boolean</c></td>
		<td>empty</td>
		<td>
			<ul>
				<li>{@link java.lang.Boolean} (default)
				<li><jk>boolean</jk>
				<li>{@link java.lang.String}
				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Boolean}.
				<li>Any POJO transformable from a {@link java.lang.Boolean} (via constructors, static create methods, or swaps).
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td rowspan='2'><c>integer</c></td>
		<td><c>int32</c></td>
		<td>
			<ul>
				<li>{@link java.lang.Integer} (default)
				<li>Any subclass of {@link java.lang.Number} 
				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
				<li>{@link java.lang.String}
				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Integer}.
				<li>Any POJO transformable from an {@link java.lang.Integer} (via constructors, static create methods, or swaps).
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td><c>int64</c></td>
		<td>
			<ul>
				<li>{@link java.lang.Long} (default)
				<li>Any subclass of {@link java.lang.Number} 
				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
				<li>{@link java.lang.String}
				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Long}.
				<li>Any POJO transformable from an {@link java.lang.Long} (via constructors, static create methods, or swaps).
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td rowspan='2'><c>number</c></td>
		<td><c>float</c></td>
		<td>
			<ul>
				<li>{@link java.lang.Float} (default)
				<li>Any subclass of {@link java.lang.Number} 
				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
				<li>{@link java.lang.String}
				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Float}.
				<li>Any POJO transformable from an {@link java.lang.Float} (via constructors, static create methods, or swaps).
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td><c>double</c></td>
		<td>
			<ul>
				<li>{@link java.lang.Double} (default)
				<li>Any subclass of {@link java.lang.Number} 
				<li>Any primitive number:  (e.g <jk>int</jk>, <jk>float</jk>...)
				<li>{@link java.lang.String}
				<li>{@link java.lang.Object} - Returns the default {@link java.lang.Double}.
				<li>Any POJO transformable from an {@link java.lang.Double} (via constructors, static create methods, or swaps).
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td rowspan='2'><c>array</c></td>
		<td>empty</td>
		<td>
			<ul>
				<li>Arrays or Collections of anything on this list.
				<li>Any POJO transformable from arrays of the default types (e.g. <c>Integer[]</c>, <c>Boolean[][]</c>, etc...).
			</ul>
		</td>
	</tr>
	<tr class='dark bb'>
		<td><c>uon</c></td>
		<td>
			<ul>
				<li>Any {@doc PojoCategories Parsable POJO} type.
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td rowspan='2'><c>object</c></td>
		<td>empty</td>
		<td>
			<ul>
				<li><c>Map&lt;String,Object&gt;</c> (default)
				<li>Beans with properties of anything on this list.
				<li>Maps with string keys.
			</ul>
		</td>
	</tr>
	<tr class='light bb'>
		<td><c>uon</c></td>
		<td>
			<ul>
				<li>Any {@doc PojoCategories Parsable POJO} type.
			</ul>
		</td>
	</tr>
</table>
<p>
	Additionally, any of the type above can also be wrapped as {@link java.util.Optional Optionals}.
</p>

<p>
	For arrays, an example of "Any POJO transformable from arrays of the default types" is:
</p>
<p class='bpcode w800'>
	<jc>// Sample POJO class convertable from a Long[][].</jc>
	<jk>public class</jk> MyPojo {
		
		<jc>// Constructor used by parser.</jc>
		<jk>public</jk> MyPojo(Long[][] from2dLongs) {...}
	}
</p>
<p>
	In the example above, our POJO class can be constructed from our pipe-delimited list of comma-delimited numbers: 
</p>
<p class='bpcode w800'>
	<jc>// Our input being parsed.</jc>
	String input = <js>"1,2,3|4,5,6|7,8,9"</js>
	
	<jc>// The parser to use.</jc>
	HttpPartParser p = OpenApiParser.<jsf>DEFAULT</jsf>;
	
	<jc>// Convert string to a POJO.</jc>
	<jk>try</jk> {
		MyPojo pojo = p.parse(schema, input, MyPojo.<jk>class</jk>);
	} <jk>catch</jk> (SchemaValidationException e) {
		<jc>// Oops, one of the restrictions were not met.</jc>
	}
</p>
<p>
	Just like serialization, the <c>object</c> type is not officially part of the OpenAPI standard, but
	Juneau supports parsing HTTP parts in UON notation to Maps and beans.
</p>
<p>
	The following shows an example of a bean with several properties of various types.
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyBean {
		<jk>public</jk> String <jf>f1</jf>;
		<jk>public byte</jk>[] <jf>f2</jf>;
		<jk>public byte</jk>[] <jf>f3</jf>;
		<jk>public byte</jk>[] <jf>f4</jf>;
		<jk>public</jk> Calendar <jf>f5</jf>;
		<jk>public</jk> String <jf>f6</jf>;
		<jk>public int</jk> <jf>f7</jf>;
		<jk>public</jk> Long <jf>f8</jf>;
		<jk>public float</jk> <jf>f9</jf>;
		<jk>public</jk> Double <jf>f10</jf>;
		<jk>public</jk> Boolean <jf>f11</jf>;
		<jk>public</jk> Object <jf>fExtra</jf>;
	}
</p>
<p>
	We define the following schema again:
</p>
<p class='bpcode w800'>
	<jk>import static</jk> org.apache.juneau.httppart.HttpPartSchema.*;
	
	HttpPartSchema ps = <jsm>schema</jsm>(<js>"object"</js>)
		.property(<js>"f1"</js>, <jsm>schema</jsm>(<js>"string"</js>))
		.property(<js>"f2"</js>, <jsm>schema</jsm>(<js>"string"</js>, <js>"byte"</js>))
		.property(<js>"f3"</js>, <jsm>schema</jsm>(<js>"string"</js>, <js>"binary"</js>))
		.property(<js>"f4"</js>, <jsm>schema</jsm>(<js>"string"</js>, <js>"binary-spaced"</js>))
		.property(<js>"f5"</js>, <jsm>schema</jsm>(<js>"string"</js>, <js>"date-time"</js>))
		.property(<js>"f6"</js>, <jsm>schema</jsm>(<js>"string"</js>, "<js>uon"</js>))
		.property(<js>"f7"</js>, <jsm>schema</jsm>(<js>"integer"</js>))
		.property(<js>"f8"</js>, <jsm>schema</jsm>(<js>"integer"</js>, <js>"int64"</js>))
		.property(<js>"f9"</js>, <jsm>schema</jsm>(<js>"number"</js>))
		.property(<js>"f10"</js>, <jsm>schema</jsm>(<js>"number"</js>, <js>"double"</js>))
		.property(<js>"f11"</js>, <jsm>schema</jsm>(<js>"boolean"</js>))
		.additionalProperties(<jsm>schema</jsm>(<js>"integer"</js>))
		.build();
</p>
<p>
	Then we parse our input into our POJO:
</p>
<p class='bpcode w800'>
	String input = 
		<js>"(f1=foo,f2=Zm9v,f3=666F6F,f4='66 6F 6F',f5=2012-12-21T12:34:56Z,f6=foo,"</js>
		+ <js>"f7=1,f8=2,f9=1.0,f10=1.0,f11=true,fExtra=1)"</js>;
	
	HttpPartParser p = OpenApiParser.<jsf>DEFAULT</jsf>;
	MyBean b = p.parse(schema, input, MyBean.<jk>class</jk>);
</p>
<p>
	Note that serializing into generic <c>Object</c> properties would have produced similar results:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyBean {
		<jk>public</jk> Object <jf>f1</jf>;
		<jk>public</jk> Object <jf>f2</jf>;
		<jk>public</jk> Object <jf>f3</jf>;
		<jk>public</jk> Object <jf>f4</jf>;
		<jk>public</jk> Object <jf>f5</jf>;
		<jk>public</jk> Object <jf>f6</jf>;
		<jk>public</jk> Object <jf>f7</jf>;
		<jk>public</jk> Object <jf>f8</jf>;
		<jk>public</jk> Object <jf>f9</jf>;
		<jk>public</jk> Object <jf>f10</jf>;
		<jk>public</jk> Object <jf>f11</jf>;
		<jk>public</jk> Object <jf>fExtra</jf>;
	}
</p>
<p>
	We can also parse into Maps as well:
</p>
<p class='bpcode w800'>
	String input = 
		<js>"(f1=foo,f2=Zm9v,f3=666F6F,f4='66 6F 6F',f5=2012-12-21T12:34:56Z,f6=foo,"</js>
		+ <js>"f7=1,f8=2,f9=1.0,f10=1.0,f11=true,fExtra=1)"</js>;
	
	HttpPartParser p = OpenApiParser.<jsf>DEFAULT</jsf>;
	ObjectMap m = p.parse(schema, input, ObjectMap.<jk>class</jk>);
</p>
<ul class='notes'>
	<li>
		Array properties can also use CSV/SSV/PIPES for array notation.
		<br>Various notations can be mixed throughout.
	<li>
		Schemas and POJOs can be defined arbitrarily deep.
	<li>
		Schemas are optional.
		They can be skipped or partially defined.
	<li>
		We make our best attempt to convert the output to the matching type.  
		However, you will get <c>ParseExceptions</c> if you attempt an impossible conversion.
		(e.g. trying to parse the string "foo" into a boolean). 
</ul>
</div><!-- END: 2.27.3 - juneau-marshall.OpenApiDetails.Parsers -->
</div><!-- END: 2.27 - juneau-marshall.OpenApiDetails -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.SimpleVariableLanguage' id='juneau-marshall.SimpleVariableLanguage'>2.28 - Simple Variable Language</a></h3>
<div class='topic'><!-- START: 2.28 - juneau-marshall.SimpleVariableLanguage -->
<p>
	The <l>org.apache.juneau.svl</l> packages defines an API for a language called <l>Simple Variable Language</l>.
	In a nutshell, Simple Variable Language (or SVL) is text that contains variables of the form <js>"$varName{varKey}"</js>.
	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.
	The {@link org.apache.juneau.svl.VarResolver#DEFAULT} resolver is a reusable instance of this class 
	configured with the following basic variables:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.svl.vars.SystemPropertiesVar} - <c>$S{key[,default]}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.EnvVariablesVar} - <c>$E{key[,default]}</c>
</ul>
<p>
	The following logic variables are also provided:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.svl.vars.IfVar} - <c>$IF{arg,then[,else]}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.SwitchVar} - <c>$SW{arg,pattern1:then1[,pattern2:then2...]}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.CoalesceVar} - <c>$CO{arg1[,arg2...]}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.PatternMatchVar} - <c>$PM{arg,pattern}</c> 
	<li class='jc'>{@link org.apache.juneau.svl.vars.PatternReplaceVar} - <c>$PR{arg,pattern,replace}</c> 
	<li class='jc'>{@link org.apache.juneau.svl.vars.PatternExtractVar} - <c>$PE{arg,pattern,groupIndex}</c> 
	<li class='jc'>{@link org.apache.juneau.svl.vars.NotEmptyVar} - <c>$NE{arg}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.UpperCaseVar} - <c>$UC{arg}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.LowerCaseVar} - <c>$LC{arg}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.LenVar} - <c>$LN{arg[,delimiter]}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.SubstringVar} - <c>$ST{arg,start[,end]}</c>
</ul>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.SimpleVariableLanguage.SvlVariables' id='juneau-marshall.SimpleVariableLanguage.SvlVariables'>2.28.1 - SVL Variables</a><span class='update'>8.0.0-updated, 8.1.0-updated</span></h4>
<div class='topic'><!-- START: 2.28.1 - juneau-marshall.SimpleVariableLanguage.SvlVariables -->
<p>
	Variables are defined through the {@link org.apache.juneau.svl.Var} API.
	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='bpcode w800'>
	<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='javatree'>
	<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 w800'>
	<tr>
		<th>Module</th><th>Class</th><th>Pattern</th>
	</tr>
	<tr class='dark'>
		<td rowspan='15' 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{key[,default]}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.SystemPropertiesVar}</td>
		<td class='code'>$S{key[,default]}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.ArgsVar}</td>
		<td class='code'>$A{key[,default]}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.ManifestFileVar}</td>
		<td class='code'>$MF{key[,default]}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.IfVar}</td>
		<td class='code'>$IF{arg,then[,else]}</td>
	</tr>
	<tr class='dark dd'>
		<td>{@link org.apache.juneau.svl.vars.SwitchVar}</td>
		<td class='code'>$SW{arg,pattern1:then1[,pattern2:then2...]}</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.PatternMatchVar}</td>
		<td class='code'>$PM{arg,pattern}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.PatternReplaceVar}</td>
		<td class='code'>$PR{arg,pattern,replace}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.PatternExtractVar}</td>
		<td class='code'>$PE{arg,pattern,groupdIndex}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.NotEmptyVar}</td>
		<td class='code'>$NE{arg}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.UpperCaseVar}</td>
		<td class='code'>$UC{arg}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.LowerCaseVar}</td>
		<td class='code'>$LC{arg}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.LenVar}</td>
		<td class='code'>$LN{arg[,delimiter]}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.SubstringVar}</td>
		<td class='code'>$ST{arg,start[,end]}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.html.HtmlWidgetVar}</td>
		<td class='code'>$W{name}</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[,default]}</td>
	</tr>
	<tr class='dark'>
		<td rowspan='15' 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[,default]}}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.rest.vars.ServletInitParamVar}</td>
		<td class='code'>$I{name[,default]}</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[,default]}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.rest.vars.SwaggerVar}</td>
		<td class='code'>$SS{key1[,key2...]}</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} <i>(deprecated)</i></td>
		<td class='code'>$W{name}</td>
	</tr>
</table>
</div><!-- END: 2.28.1 - juneau-marshall.SimpleVariableLanguage.SvlVariables -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.SimpleVariableLanguage.VarResolvers' id='juneau-marshall.SimpleVariableLanguage.VarResolvers'>2.28.2 - VarResolvers and VarResolverSessions</a></h4>
<div class='topic'><!-- START: 2.28.2 - juneau-marshall.SimpleVariableLanguage.VarResolvers -->
<p>
	The main class for performing variable resolution is {@link org.apache.juneau.svl.VarResolver}.
	Two methods are provided for resolving variables:
</p>
<ul class='javatree'>
	<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.
	For example, {@link org.apache.juneau.config.vars.ConfigVar} relies on the existence of a {@link org.apache.juneau.config.Config}.
	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 class='javatree'>
	<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 class='javatree'>
	<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 class='javatree'>
	<li class='jm'>{@link org.apache.juneau.svl.VarResolverSession#getSessionObject(Class, String, boolean)}
</ul>
<p>
	Var resolvers can be cloned and extended by using the {@link org.apache.juneau.svl.VarResolver#builder()} method.
	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='bpcode w800'>
	<jc>// Create a resolver that copies the default resolver and adds $C and $A vars.</jc>
	VarResolver myVarResolver = VarResolver.<jsf>DEFAULT</jsf>
		.builder()
		.vars(ConfigVar.<jk>class</jk>, ArgsVar.<jk>class</jk>)
		.build();
</p>
</div><!-- END: 2.28.2 - juneau-marshall.SimpleVariableLanguage.VarResolvers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.SimpleVariableLanguage.DefaultVarResolver' id='juneau-marshall.SimpleVariableLanguage.DefaultVarResolver'>2.28.3 - VarResolver.DEFAULT</a><span class='update'>8.1.0-new</span></h4>
<div class='topic'><!-- START: 2.28.3 - juneau-marshall.SimpleVariableLanguage.DefaultVarResolver -->
<p>
	{@link org.apache.juneau.svl.VarResolver#DEFAULT} is a reusable variable resolver with default support for the following variables:
</p>
<ul>
	<li><c>$S{key[,default]}</c> - {@link org.apache.juneau.svl.vars.SystemPropertiesVar}
	<li><c>$E{key[,default]}</c> - {@link org.apache.juneau.svl.vars.EnvVariablesVar}
	<li><c>$A{key[,default]}</c> - {@link org.apache.juneau.svl.vars.ArgsVar}
	<li><c>$MF{key[,default]}</c> - {@link org.apache.juneau.svl.vars.ManifestFileVar}
	<li><c>$SW{stringArg,pattern:thenValue[,pattern:thenValue...]}</c> - {@link org.apache.juneau.svl.vars.SwitchVar}
	<li><c>$IF{arg,then[,else]}</c> - {@link org.apache.juneau.svl.vars.IfVar}
	<li><c>$CO{arg[,arg2...]}</c> - {@link org.apache.juneau.svl.vars.CoalesceVar}
	<li><c>$PM{arg,pattern}</c> - {@link org.apache.juneau.svl.vars.PatternMatchVar}
	<li><c>$PR{stringArg,pattern,replace}</c>- {@link org.apache.juneau.svl.vars.PatternReplaceVar}
	<li><c>$PE{arg,pattern,groupIndex}</c> - {@link org.apache.juneau.svl.vars.PatternExtractVar}
	<li><c>$UC{arg}</c> - {@link org.apache.juneau.svl.vars.UpperCaseVar}
	<li><c>$LC{arg}</c> - {@link org.apache.juneau.svl.vars.LowerCaseVar}
	<li><c>$NE{arg}</c> - {@link org.apache.juneau.svl.vars.NotEmptyVar}
	<li><c>$LN{arg[,delimiter]}</c> - {@link org.apache.juneau.svl.vars.LenVar}
	<li><c>$ST{arg,start[,end]}</c> - {@link org.apache.juneau.svl.vars.SubstringVar}
</ul>
</div><!-- END: 2.28.3 - juneau-marshall.SimpleVariableLanguage.DefaultVarResolver -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.SimpleVariableLanguage.OtherNotes' id='juneau-marshall.SimpleVariableLanguage.OtherNotes'>2.28.4 - Other Notes</a></h4>
<div class='topic'><!-- START: 2.28.4 - juneau-marshall.SimpleVariableLanguage.OtherNotes -->
<ul class='spaced-list'>
	<li>
		The escape character <js>'\'</js> can be used when necessary to escape the following characters: 
		<c>$ , { }</c>
	<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 
		<c>'MYPROPERTY'</c> has the value <c>'$E{MYPROPERTY}'</c>).
		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. 
		<c>resolver.resolve(<js>"foobar"</js>)</c>) will simply be a no-op and return the same string.
</ul>
</div><!-- END: 2.28.4 - juneau-marshall.SimpleVariableLanguage.OtherNotes -->
</div><!-- END: 2.28 - juneau-marshall.SimpleVariableLanguage -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall.BestPractices' id='juneau-marshall.BestPractices'>2.29 - Best Practices</a></h3>
<div class='topic'><!-- START: 2.29 - juneau-marshall.BestPractices -->
<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.BeanTraverseContext#BEANTRAVERSE_detectRecursions BEANTRAVERSE_detectRecursions} 
		option on the {@link org.apache.juneau.serializer.Serializer} class can cause a performance penalty of 
		around 20%.  
		<br>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.
		<br>MessagePack is fastest and most compact of all.
	<li>
		The RDF parsers are SLOW.
		<br>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><!-- END: 2.29 - juneau-marshall.BestPractices -->
</div><!-- END: 2 - juneau-marshall -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-marshall-rdf' id='juneau-marshall-rdf'>3 - juneau-marshall-rdf</a></h2>
<div class='topic'><!-- START: 3 - juneau-marshall-rdf -->
<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<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>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	
<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-marshall-rdf-{@property juneauVersion}.jar 
</p>	
<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.marshall.rdf_{@property juneauVersion}.jar 
</p>	
<p>
	The <c>juneau-marshall-rdf</c> 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>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-marshall-rdf.RdfDetails' id='juneau-marshall-rdf.RdfDetails'>3.1 - RDF Details</a></h3>
<div class='topic'><!-- START: 3.1 - juneau-marshall-rdf.RdfDetails -->
<p>
	Juneau supports serializing and parsing arbitrary POJOs to and from the following RDF formats:
</p>
<ul>
	<li>RDF/XML
	<li>Abbreviated RDF/XML
	<li>N-Triple
	<li>Turtle
	<li>N3
</ul>

<p>
	The serializers and parsers work identically to those in <c>juneau-marshall</c>, but are
	packaged separately so that you don't need to pull in the Jena dependency unless you need it.
</p>

<p class='bpcode w800'>
	<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 = N3Serializer.<jsf>DEFAULT</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>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall-rdf.RdfDetails.Serializers' id='juneau-marshall-rdf.RdfDetails.Serializers'>3.1.1 - RDF Serializers</a></h4>
<div class='topic'><!-- START: 3.1.1 - juneau-marshall-rdf.RdfDetails.Serializers -->
<p>
	The {@link org.apache.juneau.jena.RdfSerializer} class is the top-level class for all Jena-based serializers.
	Language-specific serializers are defined as inner subclasses of the <c>RdfSerializer</c> class:
</p>	
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.jena.RdfSerializer}
	<ul>
		<li class='jc'>{@link org.apache.juneau.jena.RdfXmlSerializer}
		<li class='jc'>{@link org.apache.juneau.jena.RdfXmlAbbrevSerializer}
		<li class='jc'>{@link org.apache.juneau.jena.N3Serializer}
		<li class='jc'>{@link org.apache.juneau.jena.NTripleSerializer}
		<li class='jc'>{@link org.apache.juneau.jena.TurtleSerializer}
	</ul>
</ul>

<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonSerializer Common Serializer Properties}
	<li class='jic'>{@link org.apache.juneau.jena.RdfCommon}
	<ul>
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_embedding RDF_arp_embedding}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_err_ RDF_arp_err_}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_errorMode RDF_arp_errorMode}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_ign_ RDF_arp_ign_}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_iriRules RDF_arp_iriRules}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_warn_ RDF_arp_warn_}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_collectionFormat RDF_collectionFormat}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_juneauBpNs RDF_juneauBpNs}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_juneauNs RDF_juneauNs}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_language RDF_language}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_looseCollections RDF_looseCollections}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_abbrevBaseUri RDF_n3_abbrevBaseUri}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_indentProperty RDF_n3_indentProperty}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_minGap RDF_n3_minGap}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_objectLists RDF_n3_objectLists}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_propertyColumn RDF_n3_propertyColumn}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_subjectColumn RDF_n3_subjectColumn}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_useDoubles RDF_n3_useDoubles}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_usePropertySymbols RDF_n3_usePropertySymbols}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_useTripleQuotedStrings RDF_n3_useTripleQuotedStrings}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_widePropertyLen RDF_n3_widePropertyLen}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_allowBadUris RDF_rdfxml_allowBadUris}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_attributeQuoteChar RDF_rdfxml_attributeQuoteChar}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_blockRules RDF_rdfxml_blockRules}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_longId RDF_rdfxml_longId}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_relativeUris RDF_rdfxml_relativeUris}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_showDoctypeDeclaration RDF_rdfxml_showDoctypeDeclaration}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_showXmlDeclaration RDF_rdfxml_showXmlDeclaration}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_tab RDF_rdfxml_tab}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_xmlBase RDF_rdfxml_xmlBase}
	</ul>
	<li class='jc'>{@link org.apache.juneau.jena.RdfSerializer}
	<ul>
		<li class='jf'>{@link org.apache.juneau.jena.RdfSerializer#RDF_addBeanTypes RDF_addBeanTypes}
		<li class='jf'>{@link org.apache.juneau.jena.RdfSerializer#RDF_addLiteralTypes RDF_addLiteralTypes}
		<li class='jf'>{@link org.apache.juneau.jena.RdfSerializer#RDF_addRootProperty RDF_addRootProperty}
		<li class='jf'>{@link org.apache.juneau.jena.RdfSerializer#RDF_autoDetectNamespaces RDF_autoDetectNamespaces}
		<li class='jf'>{@link org.apache.juneau.jena.RdfSerializer#RDF_namespaces RDF_namespaces}				
		<li class='jf'>{@link org.apache.juneau.jena.RdfSerializer#RDF_useXmlNamespaces RDF_useXmlNamespaces}					
	</ul>
</ul>
<p>
	The following pre-configured serializers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.jena.RdfSerializer}
	<ul>
		<li class='jc'>{@link org.apache.juneau.jena.RdfXmlSerializer}
		<ul>
			<li class='jf'>{@link org.apache.juneau.jena.RdfXmlSerializer#DEFAULT DEFAULT}
		</ul>
		<li class='jc'>{@link org.apache.juneau.jena.RdfXmlAbbrevSerializer}
		<ul>
			<li class='jf'>{@link org.apache.juneau.jena.RdfXmlAbbrevSerializer#DEFAULT DEFAULT}
		</ul>
		<li class='jc'>{@link org.apache.juneau.jena.N3Serializer}
		<ul>
			<li class='jf'>{@link org.apache.juneau.jena.N3Serializer#DEFAULT DEFAULT}
		</ul>
		<li class='jc'>{@link org.apache.juneau.jena.NTripleSerializer}
		<ul>
			<li class='jf'>{@link org.apache.juneau.jena.NTripleSerializer#DEFAULT DEFAULT}
		</ul>
		<li class='jc'>{@link org.apache.juneau.jena.TurtleSerializer}
		<ul>
			<li class='jf'>{@link org.apache.juneau.jena.TurtleSerializer#DEFAULT DEFAULT}
		</ul>
	</ul>
</ul>
<p>
	Abbreviated RDF/XML is currently the most widely accepted and readable RDF syntax, so the examples shown here 
	will use that format.
</p>
</div><!-- END: 3.1.1 - juneau-marshall-rdf.RdfDetails.Serializers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall-rdf.RdfDetails.Parsers' id='juneau-marshall-rdf.RdfDetails.Parsers'>3.1.2 - RDF Parsers</a></h4>
<div class='topic'><!-- START: 3.1.2 - juneau-marshall-rdf.RdfDetails.Parsers -->
<p>
	The {@link org.apache.juneau.jena.RdfParser} class is the top-level class for all Jena-based parsers.
	Language-specific parsers are defined as inner subclasses of the <c>RdfParser</c> class:
</p>	
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.jena.RdfParser}
	<ul>
		<li class='jc'>{@link org.apache.juneau.jena.RdfXmlParser}
		<li class='jc'>{@link org.apache.juneau.jena.NTripleParser}
		<li class='jc'>{@link org.apache.juneau.jena.TurtleParser}
		<li class='jc'>{@link org.apache.juneau.jena.N3Parser}
	</ul>
</ul>
<p>
	The <c>RdfParser.Xml</c> parser handles both regular and abbreviated RDF/XML.
</p>
<p>
	The RDF parser provides the following settings:
</p>
<ul class='javatree'>
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.Common Common Properties}
	<li class='link'>{@doc juneau-marshall.ConfigurableProperties.CommonParser Common Parser Properties}
	<li class='jic'>{@link org.apache.juneau.jena.RdfCommon}
	<ul>
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_embedding RDF_arp_embedding}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_err_ RDF_arp_err_}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_errorMode RDF_arp_errorMode}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_ign_ RDF_arp_ign_}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_iriRules RDF_arp_iriRules}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_warn_ RDF_arp_warn_}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_collectionFormat RDF_collectionFormat}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_juneauBpNs RDF_juneauBpNs}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_juneauNs RDF_juneauNs}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_language RDF_language}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_looseCollections RDF_looseCollections}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_abbrevBaseUri RDF_n3_abbrevBaseUri}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_indentProperty RDF_n3_indentProperty}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_minGap RDF_n3_minGap}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_objectLists RDF_n3_objectLists}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_propertyColumn RDF_n3_propertyColumn}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_subjectColumn RDF_n3_subjectColumn}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_useDoubles RDF_n3_useDoubles}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_usePropertySymbols RDF_n3_usePropertySymbols}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_useTripleQuotedStrings RDF_n3_useTripleQuotedStrings}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_widePropertyLen RDF_n3_widePropertyLen}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_allowBadUris RDF_rdfxml_allowBadUris}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_attributeQuoteChar RDF_rdfxml_attributeQuoteChar}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_blockRules RDF_rdfxml_blockRules}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_longId RDF_rdfxml_longId}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_relativeUris RDF_rdfxml_relativeUris}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_showDoctypeDeclaration RDF_rdfxml_showDoctypeDeclaration}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_showXmlDeclaration RDF_rdfxml_showXmlDeclaration}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_tab RDF_rdfxml_tab}
		<li class='jf'>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_xmlBase RDF_rdfxml_xmlBase}
	</ul>
	<li class='jc'>{@link org.apache.juneau.jena.RdfParser}
	<ul>
		<li class='jf'>{@link org.apache.juneau.jena.RdfParser#RDF_trimWhitespace RDF_trimWhitespace}
	</ul>
</ul>
<p>
	The following pre-configured parsers are provided for convenience:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.jena.RdfParser}
	<ul>
		<li class='jc'>{@link org.apache.juneau.jena.RdfXmlParser}
		<ul>
			<li class='jf'>{@link org.apache.juneau.jena.RdfXmlParser#DEFAULT DEFAULT}
		</ul>
		<li class='jc'>{@link org.apache.juneau.jena.N3Parser}
		<ul>
			<li class='jf'>{@link org.apache.juneau.jena.N3Parser#DEFAULT DEFAULT}
		</ul>
		<li class='jc'>{@link org.apache.juneau.jena.NTripleParser}
		<ul>
			<li class='jf'>{@link org.apache.juneau.jena.NTripleParser#DEFAULT DEFAULT}
		</ul>
		<li class='jc'>{@link org.apache.juneau.jena.TurtleParser}
		<ul>
			<li class='jf'>{@link org.apache.juneau.jena.TurtleParser#DEFAULT DEFAULT}
		</ul>
	</ul>
</ul>
</div><!-- END: 3.1.2 - juneau-marshall-rdf.RdfDetails.Parsers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall-rdf.RdfDetails.RdfAnnotation' id='juneau-marshall-rdf.RdfDetails.RdfAnnotation'>3.1.3 - @Rdf Annotation</a></h4>
<div class='topic'><!-- START: 3.1.3 - juneau-marshall-rdf.RdfDetails.RdfAnnotation -->
<p>
	The {@link org.apache.juneau.jena.annotation.Rdf @Rdf} annotation
	is used to override the behavior of the RDF serializers and parsers on individual bean classes or properties.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.jena.annotation.Rdf}
	<ul>
		<li class='jf'>{@link org.apache.juneau.jena.annotation.Rdf#beanUri() beanUri}
		<li class='jf'>{@link org.apache.juneau.jena.annotation.Rdf#collectionFormat() collectionFormat}
		<li class='jf'>{@link org.apache.juneau.jena.annotation.Rdf#namespace() namespace}
		<li class='jf'>{@link org.apache.juneau.jena.annotation.Rdf#prefix() prefix}
	</ul>
</ul>
</div><!-- END: 3.1.3 - juneau-marshall-rdf.RdfDetails.RdfAnnotation -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall-rdf.RdfDetails.Namespaces' id='juneau-marshall-rdf.RdfDetails.Namespaces'>3.1.4 - Namespaces</a></h4>
<div class='topic'><!-- START: 3.1.4 - juneau-marshall-rdf.RdfDetails.Namespaces -->
<p>
	You'll notice in the previous example that Juneau namespaces are used to represent bean property names.
	These are used by default when namespaces are not explicitly specified.
</p>
<p>
	The <c>juneau</c> namespace is used for generic names for objects that don't have namespaces 
	associated with them.
</p>
<p>
	The <c>juneaubp</c> namespace is used on bean properties that don't have namespaces associated with 
	them.
</p>
<p>
	The easiest way to specify namespaces is through annotations.
	In this example, we're going to associate the prefix <c>'per'</c> to our bean class and all properties 
	of this class.
	We do this by adding the following annotation to our class:
</p>
<p class='bpcode w800'>
	<ja>@Rdf</ja>(prefix=<js>"per"</js>)
	<jk>public class</jk> Person {
</p>
<p>
	In general, the best approach is to define the namespace URIs at the package level using a 
	<c>package-info.java</c> class, like so:
</p>
<p class='bpcode w800'>
	<jc>// RDF namespaces used in this package</jc>
	<ja>@RdfSchema</ja>(
		prefix=<js>"ab"</js>,
		rdfNs={
			<ja>@RdfNs</ja>(prefix=<js>"ab"</js>, namespaceURI=<js>"http://www.apache.org/addressBook/"</js>),
			<ja>@RdfNs</ja>(prefix=<js>"per"</js>, namespaceURI=<js>"http://www.apache.org/person/"</js>),
			<ja>@RdfNs</ja>(prefix=<js>"addr"</js>, namespaceURI=<js>"http://www.apache.org/address/"</js>),
			<ja>@RdfNs</ja>(prefix=<js>"mail"</js>, namespaceURI=<js>"http://www.apache.org/mail/"</js>)
		}
	)
	<jk>package</jk> org.apache.juneau.sample.addressbook;
	<jk>import</jk> org.apache.juneau.xml.annotation.*;
</p>
<p>
	This assigns a default prefix of <js>"ab"</js> for all classes and properties within the project, and 
	specifies various other prefixes used within this project.
</p>
<p>
	Now when we rerun the sample code, we'll get the following:
</p>
<p class='bpcode w800'>
	<xt>&lt;rdf:RDF</xt>
	    <xa>xmlns:rdf</xa>=<xs>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</xs>
	    <xa>xmlns:j</xa>=<xs>"http://www.apache.org/juneau/"</xs>
	    <xa>xmlns:jp</xa>=<xs>"http://www.apache.org/juneaubp/"</xs>
	    <xa>xmlns:per</xa>=<xs>"http://www.apache.org/person/"</xs><xt>&gt;</xt>
	   <xt>&lt;rdf:Description&gt;</xt>
	      <xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
	      <xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
	   <xt>&lt;/rdf:Description&gt;</xt>
	<xt>&lt;/rdf:RDF&gt;</xt>
</p>
<p>
	Namespace auto-detection ({@link org.apache.juneau.xml.XmlSerializer#XML_autoDetectNamespaces}) is 
	enabled on serializers by default.
	This causes the serializer to make a first-pass over the data structure to look for namespaces.
	In high-performance environments, you may want to consider disabling auto-detection and providing an 
	explicit list of namespaces to the serializer to avoid this scanning step.
</p>
<p class='bpcode w800'>
	<jc>// Create a new serializer, but manually specify the namespaces.</jc>
	RdfSerializer s = RdfSerializer.<jsm>create</jsm>()
		.xmlabbrev()
		.set(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3)
		.autoDetectNamespaces(<jk>false</jk>)
		.namespaces(<js>"{per:'http://www.apache.org/person/'}"</js>)
		.build();
</p>
<p>
	This code change will produce the same output as before, but will perform slightly better since it doesn't 
	have to crawl the POJO tree before serializing the result.
</p>
</div><!-- END: 3.1.4 - juneau-marshall-rdf.RdfDetails.Namespaces -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall-rdf.RdfDetails.UriProperties' id='juneau-marshall-rdf.RdfDetails.UriProperties'>3.1.5 - URI Properties</a></h4>
<div class='topic'><!-- START: 3.1.5 - juneau-marshall-rdf.RdfDetails.UriProperties -->
<p>
	Bean properties of type <c>java.net.URI</c> or <c>java.net.URL</c> have special meaning to the 
	RDF serializer.
	They are interpreted as resource identifiers.
</p>
<p>
	In the following code, we're adding 2 new properties.
	The first property is annotated with <ja>@Beanp</ja> to identify that this property is the resource 
	identifier for this bean.
	The second un-annotated property is interpreted as a reference to another resource.
</p>
<p class='bpcode w800'>	
	<jk>public class</jk> Person {
		
		<jc>// Bean properties</jc>
		<ja>@Rdf</ja>(beanUri=<jk>true</jk>) 
		<jk>public</jk> URI <jf>uri</jf>;
		
		<jk>public</jk> URI <jf>addressBookUri</jf>;
	
		...
		
		<jc>// Normal constructor</jc>
		<jk>public</jk> Person(<jk>int</jk> id, String name, String uri, String addressBookUri) <jk>throws</jk> URISyntaxException {
			<jk>this</jk>.<jf>id</jf> = id;
			<jk>this</jk>.<jf>name</jf> = name;
			<jk>this</jk>.<jf>uri</jf> = <jk>new</jk> URI(uri);
			<jk>this</jk>.<jf>addressBookUri</jf> = <jk>new</jk> URI(addressBookUri);
		}
	}
</p>
<p>
	We alter our code to pass in values for these new properties.
</p>
<p class='bpcode w800'>
	<jc>// Create our bean.</jc>
	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"http://sample/addressBook/person/1"</js>, 
		<js>"http://sample/addressBook"</js>);
</p>
<p>
	Now when we run the sample code, we get the following:
</p>
<p class='bpcode w800'>
	<xt>&lt;rdf:RDF</xt>
	    <xa>xmlns:rdf</xa>=<xs>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</xs>
	    <xa>xmlns:j</xa>=<xs>"http://www.apache.org/juneau/"</xs>
	    <xa>xmlns:jp</xa>=<xs>"http://www.apache.org/juneaubp/"</xs>
	    <xa>xmlns:per</xa>=<xs>"http://www.apache.org/person/"</xs><xt>&gt;</xt>
	   <xt>&lt;rdf:Description <b><xa>rdf:about</xa>=<xs>"http://sample/addressBook/person/1"</xs></b>&gt;</xt>
	      <xt>&lt;per:addressBookUri</xt> <xa>rdf:resource</xa>=<xs>"http://sample/addressBook"</xs><xt>/&gt;</xt>
	      <xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
	      <xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
	   <xt>&lt;/rdf:Description&gt;</xt>
	<xt>&lt;/rdf:RDF&gt;</xt>
</p>
<p>
	The {@link org.apache.juneau.annotation.URI @URI} annotation can also be used on classes and properties 
	to identify them as URLs when they're not instances of <c>java.net.URI</c> or <c>java.net.URL</c> 
	(not needed if <c><ja>@Rdf</ja>(beanUri=<jk>true</jk>)</c> is already specified).
</p>
<p>
	The following properties would have produced the same output as before.  
	Note that the <ja>@URI</ja> annotation is only needed on the second property.
</p>
<p class='bpcode w800'>
	<jk>public class</jk> Person {
		
		<jc>// Bean properties</jc>
		<ja>@Rdf</ja>(beanUri=<jk>true</jk>) <jk>public</jk> String <jf>uri</jf>;
		
		<ja>@URI</ja> <jk>public</jk> String <jf>addressBookUri</jf>;
</p>
<p>
	Also take note of the {@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution},
	{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity}, and 
	and {@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext}
	settings that can be specified on the serializer to resolve relative and context-root-relative URIs to 
	fully-qualified URIs.
</p>
<p>
	This can be useful if you want to keep the URI authority and context root information out of the bean logic 
	layer.
</p>
<p>
	The following code produces the same output as before, but the URIs on the beans are relative.
</p>
<p class='bpcode w800'>
	<jc>// Create a new serializer with readable output.</jc>
	RdfSerializer s = RdfSerializer.<jsm>create</jsm>()
		.xmlabbrev()
		.set(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3);
		.relativeUriBase(<js>"http://myhost/sample"</js>);
		.absolutePathUriBase(<js>"http://myhost"</js>)
		.build();
		
	<jc>// Create our bean.</jc>
	Person p = <jk>new</jk> Person(1, <js>"John Smith"</js>, <js>"person/1"</js>, <js>"/"</js>);

	<jc>// Serialize the bean to RDF/XML.</jc>
	String rdfXml = s.serialize(p);
</p>
</div><!-- END: 3.1.5 - juneau-marshall-rdf.RdfDetails.UriProperties -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall-rdf.RdfDetails.RootProperty' id='juneau-marshall-rdf.RdfDetails.RootProperty'>3.1.6 - Root Property</a></h4>
<div class='topic'><!-- START: 3.1.6 - juneau-marshall-rdf.RdfDetails.RootProperty -->
<p>
	For all RDF languages, the POJO objects get broken down into simple triplets.
	Unfortunately, for tree-structured data like the POJOs shown above, this causes the root node of the tree 
	to become lost.
	There is no easy way to identify that <c>person/1</c> is the root node in our tree once in triplet 
	form, and in some cases it's impossible.
</p>
<p>
	By default, the {@link org.apache.juneau.jena.RdfParser} class handles this by scanning all the nodes and 
	identifying the nodes without incoming references.
	However, this is inefficient, especially for large models.
	And in cases where the root node is referenced by another node in the model by URL, it's not possible to 
	locate the root at all.
</p>
<p>
	To resolve this issue, the property {@link org.apache.juneau.jena.RdfSerializer#RDF_addRootProperty} 
	was introduced.
	When enabled, this adds a special <c>root</c> attribute to the root node to make it easy to locate 
	by the parser.
</p>
<p>
	To enable, set the <jsf>RDF_addRootProperty</jsf> property to <jk>true</jk> on the serializer:
</p>
<p class='bpcode w800'>
	<jc>// Create a new serializer.</jc>
	RdfSerializer s = RdfSerializer.<jsm>create</jsm>()
		.xmlabbrev()
		.set(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3),
		.addRootProperty(<jk>true</jk>)
		.build();
</p>	
<p>
	Now when we rerun the sample code, we'll see the added <c>root</c> attribute on the root resource.
</p>
<p class='bpcode w800'>
	<xt>&lt;rdf:RDF</xt>
	    <xa>xmlns:rdf</xa>=<xs>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</xs>
	    <xa>xmlns:j</xa>=<xs>"http://www.apache.org/juneau/"</xs>
	    <xa>xmlns:jp</xa>=<xs>"http://www.apache.org/juneaubp/"</xs>
	    <xa>xmlns:per</xa>=<xs>"http://www.apache.org/person/"</xs>
	    <xa>xmlns:mail</xa>=<xs>"http://www.apache.org/mail/"</xs>
	    <xa>xmlns:addr</xa>=<xs>"http://www.apache.org/address/"</xs><xt>&gt;</xt>
	   <xt>&lt;rdf:Description <xa>rdf:about</xa>=<xs>"http://sample/addressBook/person/1"</xs>&gt;</xt>
  	      <b><xt>&lt;j:root&gt;</xt>true<xt>&lt;/j:root&gt;</xt></b>
  	      <xt>&lt;per:addressBookUri</xt> <xa>rdf:resource</xa>=<xs>"http://sample/addressBook"</xs><xt>/&gt;</xt>
	      <xt>&lt;per:id&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
	      <xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
	      <xt>&lt;per:addresses&gt;</xt>
	         <xt>&lt;rdf:Seq&gt;</xt>
	            <xt>&lt;rdf:li&gt;</xt>
	               <xt>&lt;rdf:Description <xa>rdf:about</xa>=<xs>"http://sample/addressBook/address/1"</xs>&gt;</xt>
	                  <xt>&lt;addr:personUri <xa>rdf:resource</xa>=<xs>"http://sample/addressBook/person/1"</xs>/&gt;</xt>
	                  <xt>&lt;addr:id&gt;</xt>1<xt>&lt;/addr:id&gt;</xt>
	                  <xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
	                  <xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
	                  <xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
	                  <xt>&lt;mail:zip&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
	                  <xt>&lt;addr:isCurrent&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
	               <xt>&lt;/rdf:Description&gt;</xt>
	            <xt>&lt;/rdf:li&gt;</xt>
	         <xt>&lt;/rdf:Seq&gt;</xt>
	      <xt>&lt;/per:addresses&gt;</xt>
	   <xt>&lt;/rdf:Description&gt;</xt>
	<xt>&lt;/rdf:RDF&gt;</xt>
</p>
</div><!-- END: 3.1.6 - juneau-marshall-rdf.RdfDetails.RootProperty -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-marshall-rdf.RdfDetails.TypedLiterals' id='juneau-marshall-rdf.RdfDetails.TypedLiterals'>3.1.7 - Typed Literals</a></h4>
<div class='topic'><!-- START: 3.1.7 - juneau-marshall-rdf.RdfDetails.TypedLiterals -->
<p>
	XML-Schema data-types can be added to non-<c>String</c> literals through the 
	{@link org.apache.juneau.jena.RdfSerializer#RDF_addLiteralTypes} setting.
</p>
<p>
	To enable, set the <jsf>RDF_addLiteralTypes</jsf> property to <jk>true</jk> on the serializer:
</p>
<p class='bpcode w800'>
	<jc>// Create a new serializer (revert back to namespace autodetection).</jc>
	RdfSerializer s = RdfSerializer.<jsm>create</jsm>()
		.xmlabbrev()
		.set(RdfProperties.<jsf>RDF_rdfxml_tab</jsf>, 3),
		.addLiteralTypes(<jk>true</jk>)
		.build();
</p>	
<p>
	Now when we rerun the sample code, we'll see the added <c>root</c> attribute on the root resource.
</p>
<p class='bpcode w800'>
	<xt>&lt;rdf:RDF</xt>
	    <xa>xmlns:rdf</xa>=<xs>"http://www.w3.org/1999/02/22-rdf-syntax-ns#"</xs>
	    <xa>xmlns:j</xa>=<xs>"http://www.apache.org/juneau/"</xs>
	    <xa>xmlns:jp</xa>=<xs>"http://www.apache.org/juneaubp/"</xs>
	    <xa>xmlns:per</xa>=<xs>"http://www.apache.org/person/"</xs>
	    <xa>xmlns:mail</xa>=<xs>"http://www.apache.org/mail/"</xs>
	    <xa>xmlns:addr</xa>=<xs>"http://www.apache.org/address/"</xs><xt>&gt;</xt>
	   <xt>&lt;rdf:Description <xa>rdf:about</xa>=<xs>"http://sample/addressBook/person/1"</xs>&gt;</xt>
  	      <xt>&lt;per:addressBookUri</xt> <xa>rdf:resource</xa>=<xs>"http://sample/addressBook"</xs><xt>/&gt;</xt>
	      <xt>&lt;per:id</xt> <b><xa>rdf:datatype</xa>=<xs>"http://www.w3.org/2001/XMLSchema#int"</xs></b><xt>&gt;</xt>1<xt>&lt;/per:id&gt;</xt>
	      <xt>&lt;per:name&gt;</xt>John Smith<xt>&lt;/per:name&gt;</xt>
	      <xt>&lt;per:addresses&gt;</xt>
	         <xt>&lt;rdf:Seq&gt;</xt>
	            <xt>&lt;rdf:li&gt;</xt>
	               <xt>&lt;rdf:Description <xa>rdf:about</xa>=<xs>"http://sample/addressBook/address/1"</xs>&gt;</xt>
	                  <xt>&lt;addr:personUri <xa>rdf:resource</xa>=<xs>"http://sample/addressBook/person/1"</xs>/&gt;</xt>
	                  <xt>&lt;addr:id</xt> <b><xa>rdf:datatype</xa>=<xs>"http://www.w3.org/2001/XMLSchema#int"</xs></b>&gt;</xt>1<xt>&lt;/addr:id&gt;</xt>
	                  <xt>&lt;mail:street&gt;</xt>100 Main Street<xt>&lt;/mail:street&gt;</xt>
	                  <xt>&lt;mail:city&gt;</xt>Anywhereville<xt>&lt;/mail:city&gt;</xt>
	                  <xt>&lt;mail:state&gt;</xt>NY<xt>&lt;/mail:state&gt;</xt>
	                  <xt>&lt;mail:zip</xt> <b><xa>rdf:datatype</xa>=<xs>"http://www.w3.org/2001/XMLSchema#int"</xs></b>&gt;</xt>12345<xt>&lt;/mail:zip&gt;</xt>
	                  <xt>&lt;addr:isCurrent</xt> <b><xa>rdf:datatype</xa>=<xs>"http://www.w3.org/2001/XMLSchema#boolean"</xs></b>&gt;</xt>true<xt>&lt;/addr:isCurrent&gt;</xt>
	               <xt>&lt;/rdf:Description&gt;</xt>
	            <xt>&lt;/rdf:li&gt;</xt>
	         <xt>&lt;/rdf:Seq&gt;</xt>
	      <xt>&lt;/per:addresses&gt;</xt>
	   <xt>&lt;/rdf:Description&gt;</xt>
	<xt>&lt;/rdf:RDF&gt;</xt>
</p>
</div><!-- END: 3.1.7 - juneau-marshall-rdf.RdfDetails.TypedLiterals -->
</div><!-- END: 3.1 - juneau-marshall-rdf.RdfDetails -->
</div><!-- END: 3 - juneau-marshall-rdf -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-dto' id='juneau-dto'>4 - juneau-dto</a></h2>
<div class='topic'><!-- START: 4 - juneau-dto -->
<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<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>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	
<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-dto-{@property juneauVersion}.jar 
</p>	
<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.dto_{@property juneauVersion}.jar 
</p>	
<p>
	The <c>juneau-dto</c> library contains several predefined POJOs for generating commonly-used document types.
	This section describes support for these POJOs.
</p>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-dto.HTML5' id='juneau-dto.HTML5'>4.1 - HTML5</a></h3>
<div class='topic'><!-- START: 4.1 - juneau-dto.HTML5 -->
<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 w800'>
	<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>{@doc org.apache.juneau.dto.html5#Overview Overview}</p>
	<ol>
		<li><p>{@doc org.apache.juneau.dto.html5#Serialize Generating HTML5}</p>
		<li><p>{@doc org.apache.juneau.dto.html5#Parse Parsing HTML5}</p>
		<li><p>{@doc org.apache.juneau.dto.html5#Templates HTML5 Templates}</p>
	</ol>
</ol>
</div><!-- END: 4.1 - juneau-dto.HTML5 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-dto.Atom' id='juneau-dto.Atom'>4.2 - Atom</a></h3>
<div class='topic'><!-- START: 4.2 - juneau-dto.Atom -->
<p>
	The Juneau ATOM feed DTOs are simply beans with fluent-style setters.
	The following code shows a feed being created programmatically using the 
	{@link org.apache.juneau.dto.atom.AtomBuilder} class.
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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='bpcode w800'>
	<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>{@doc org.apache.juneau.dto.atom#Overview Overview}</p>
	<ol>
		<li><p>{@doc org.apache.juneau.dto.atom#Serialize Serializing ATOM feeds}</p>
		<ol>
			<li><p>{@doc org.apache.juneau.dto.atom#AtomJson ATOM/JSON}</p>
			<li><p>{@doc org.apache.juneau.dto.atom#AtomRdfXml ATOM/RDF/XML}</p>
			<li><p>{@doc org.apache.juneau.dto.atom#AtomHtml ATOM/HTML}</p>
		</ol>
		<li><p>{@doc org.apache.juneau.dto.atom#Parse Parsing ATOM feeds}</p>
	</ol>
</ol>
</div><!-- END: 4.2 - juneau-dto.Atom -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-dto.Swagger' id='juneau-dto.Swagger'>4.3 - Swagger</a></h3>
<div class='topic'><!-- START: 4.3 - juneau-dto.Swagger -->
<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='bpcode w800'>
	{
		<jok>"swagger"</jok>: <jov>"2.0"</jov>,
		<jok>"info"</jok>: {
			<jok>"title"</jok>: <jov>"Swagger Petstore"</jov>,
			<jok>"description"</jok>: <jov>"This is a sample server Petstore server."</jov>,
			<jok>"version"</jok>: <jov>"1.0.0"</jov>,
			<jok>"termsOfService"</jok>: <jov>"http://swagger.io/terms/"</jov>,
			<jok>"contact"</jok>: {
				<jok>"email"</jok>: <jov>"apiteam@swagger.io"</jov>
			},
			<jok>"license"</jok>: {
				<jok>"name"</jok>: <jov>"Apache 2.0"</jov>,
				<jok>"url"</jok>: <jov>"http://www.apache.org/licenses/LICENSE-2.0.html"</jov>
			}
		},
		<jok>"host"</jok>: <jov>"petstore.swagger.io"</jov>,
		<jok>"basePath"</jok>: <jov>"/v2"</jov>,
		<jok>"tags"</jok>: [
			{
				<jok>"name"</jok>: <jov>"pet"</jov>,
				<jok>"description"</jok>: <jov>"Everything about your Pets"</jov>,
				<jok>"externalDocs"</jok>: {
					<jok>"description"</jok>: <jov>"Find out more"</jov>,
					<jok>"url"</jok>: <jov>"http://swagger.io"</jov>
				}
			}
		],
		<jok>"schemes"</jok>: [
			<jov>"http"</jov>
		],
		<jok>"paths"</jok>: {
			<jok>"/pet"</jok>: {
				<jok>"post"</jok>: {
					<jok>"tags"</jok>: [
						<jov>"pet"</jov>
					],
					<jok>"summary"</jok>: <jov>"Add a new pet to the store"</jov>,
					<jok>"description"</jok>: <jov>""</jov>,
					<jok>"operationId"</jok>: <jov>"addPet"</jov>,
					<jok>"consumes"</jok>: [
						<jov>"application/json"</jov>,
						<jov>"text/xml"</jov>
					],
					<jok>"produces"</jok>: [
						<jov>"application/json"</jov>,
						<jov>"text/xml"</jov>
					],
					<jok>"parameters"</jok>: [
						{
							<jok>"in"</jok>: <jov>"body"</jov>,
							<jok>"name"</jok>: <jov>"body"</jov>,
							<jok>"description"</jok>: <jov>"Pet object that needs to be added to the store"</jov>,
							<jok>"required"</jok>: <jov>true</jov>
						}
					],
					<jok>"responses"</jok>: {
						<jok>"405"</jok>: {
							<jok>"description"</jok>: <jov>"Invalid input"</jov>
						}
					}
				}
			}
		}
	}		
</p>
<p>
	This document can be generated by the following Java code:
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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.
	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='bpcode w800'>
	<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='bpcode w800'>
	Swagger swagger = JsonParser.<jsf>DEFAULT</jsf>.parse(swaggerJson, Swagger.<jk>class</jk>);
</p>
</div><!-- END: 4.3 - juneau-dto.Swagger -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-dto.SwaggerUI' id='juneau-dto.SwaggerUI'>4.4 - Swagger UI</a></h3>
<div class='topic'><!-- START: 4.4 - juneau-dto.SwaggerUI -->
<p>
	The {@link org.apache.juneau.dto.swagger.ui.SwaggerUI} class is a DTO class for generating Swagger user interfaces
	from {@link org.apache.juneau.dto.swagger.Swagger} beans.
</p>
<p>
	The <c>PetStore</c> example described later provides an example of auto-generated Swagger JSON:
</p>
<img class='bordered w900' src='doc-files/SwaggerUI.json.png'>
<p>
	Using {@link org.apache.juneau.dto.swagger.ui.SwaggerUI}, we're able to render that JSON as a Swagger user interface
	when the request is asking for HTML:
</p>
<img class='bordered w900' src='doc-files/SwaggerUI.html.png'>

<p>
	The class itself is nothing more than a POJO swap that swaps out {@link org.apache.juneau.dto.swagger.Swagger} beans
	with {@link org.apache.juneau.dto.html5.Div} elements:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> SwaggerUI <jk>extends</jk> PojoSwap&lt;Swagger,Div&gt; {
	
		<ja>@Override</ja>
		<jk>public</jk> MediaType[] forMediaTypes() {
			<jc>// Only use this swap when the Accept type is HTML.</jc>
			<jk>return new</jk> MediaType[] {MediaType.<jsf>HTML</jsf>};
		}
	
		<ja>@Override</ja>
		<jk>public</jk> Div swap(BeanSession beanSession, Swagger swagger) <jk>throws</jk> Exception {
			...
		}
	}
</p>
<p>
	The {@link org.apache.juneau.rest.BasicRestServlet} class (describe later) shows how this swap is used in the REST interface to 
	generate the Swagger UI shown above:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
	
		<jc>// Allow OPTIONS requests to be simulated using ?method=OPTIONS query parameter.</jc>
		allowedMethodParams=<js>"OPTIONS"</js>,
	
		<jc>// POJO swaps to apply to all serializers/parsers.</jc>
		pojoSwaps={
			<jc>// Use the SwaggerUI swap when rendering Swagger beans.</jc>
			SwaggerUI.<jk>class</jk>
		},
	
		...
	)
	<jk>public abstract class</jk> BasicRestServlet <jk>extends</jk> RestServlet <jk>implements</jk> BasicRestConfig {
	
		<jd>/**
		 * [OPTIONS /*] - Show resource options.
		 */</jd>
		<ja>@RestMethod</ja>(
			name=<jsf>OPTIONS</jsf>, 
			path=<js>"/*"</js>,
			summary=<js>"Swagger documentation"</js>,
			description=<js>"Swagger documentation for this resource."</js>,
			htmldoc=<ja>@HtmlDoc</ja>(
				<jc>// Override the nav links for the swagger page.</jc>
				navlinks={
					<js>"back: servlet:/"</js>,
					<js>"json: servlet:/?method=OPTIONS&amp;Accept=text/json&amp;plainText=true"</js>
				},
				<jc>// Never show aside contents of page inherited from class.</jc>
				aside="<js>NONE"</js>
			)
		)
		<jk>public</jk> Swagger getOptions(RestRequest req) {
			<jc>// Localized Swagger for this resource is available through the RestRequest object.</jc>
			<jk>return</jk> req.getSwagger();
		}
	}
</p>
</div><!-- END: 4.4 - juneau-dto.SwaggerUI -->
</div><!-- END: 4 - juneau-dto -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-config' id='juneau-config'>5 - juneau-config</a></h2>
<div class='topic'><!-- START: 5 - juneau-config -->
<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<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>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	

<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-config-{@property juneauVersion}.jar 
</p>	

<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.config_{@property juneauVersion}.jar 
</p>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.Overview' id='juneau-config.Overview'>5.1 - Overview</a></h3>
<div class='topic'><!-- START: 5.1 - juneau-config.Overview -->
<p>
	The <c>juneau-config</c> library contains a powerful API for creating and using INI-style config files.
</p>
<h5 class='figure'>Example configuration file:</h5>
<p class='bpcode w800'>
	<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>
	Config files are accessed through the {@link org.apache.juneau.config.Config} class which
	are created through the {@link org.apache.juneau.config.ConfigBuilder} class.
	Builder creator methods are provided on the <c>Config</c> class:
</p>
<p class='bpcode w800'>
	<jc>// Create a Config object</jc>
	Config c = Config.<jsm>create</jsm>().name(<js>"MyConfig.cfg"</js>).build();
	
	<jc>// Shortcut</jc>
	Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).build();
</p>
<p>
	Once instantiated, reading values from the config are simple:
</p>
<p class='bpcode w800'>
	<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>
		Transactional modifications with commit/rollback capabilities.
	<li>
		A listener API.
	<li>
		Filesystem watcher integration allowing changes on the file system to be reflected in real-time.
	<li>
		Modifications through the Config class (e.g. add/remove/modify sections and keys, add/remove comments and whitespace, etc...) 
		<b>DO NOT</b> cause loss of formatting in the file.
		<br>All existing whitespace and comments are preserved for you!
	<li>
		Value encoding for added security.
	<li>
		Support for SVL variables.
	<li>
		Directly populate beans from config sections.
	<li>
		Accessing config sections through Java interface proxies.
	<li>
		An extensible storage API allows you to write your own config storage (e.g. storage in databases or the cloud).
</ul>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.Overview.SyntaxRules' id='juneau-config.Overview.SyntaxRules'>5.1.1 - Syntax Rules</a></h4>
<div class='topic'><!-- START: 5.1.1 - juneau-config.Overview.SyntaxRules -->
<ul class='spaced-list'>
	<li>
		Each config file contains zero or more sections containing zero or more entries:
		<p class='bcode w800'>
	<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 w800'>
	<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 w800'>
	<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 w800'>
	<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 w800'>
	<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 w800'>
	<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 w800'>
	<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 w800'>
	<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 w800'>
	/ \ [ ] = #
		</p>
	<li>
		Whitespace in section and key names is technically allowed but discouraged.
</ul>
</div><!-- END: 5.1.1 - juneau-config.Overview.SyntaxRules -->
</div><!-- END: 5.1 - juneau-config.Overview -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.EntryTypes' id='juneau-config.EntryTypes'>5.2 - Entry Types</a></h3>
<div class='topic'><!-- START: 5.2 - juneau-config.EntryTypes -->
<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>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.EntryTypes.PrimitiveTypes' id='juneau-config.EntryTypes.PrimitiveTypes'>5.2.1 - Primitive Types</a></h4>
<div class='topic'><!-- START: 5.2.1 - juneau-config.EntryTypes.PrimitiveTypes -->
<p>
	The most common case for configuration values are primitives.
</p>
<p class='bpcode w800'>
	<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>
	
	<cc># Doubles</cc>
	<ck>key5</ck> = <cv>6.67e−11</cv>
	<ck>key6</ck> = <cv>Infinity</cv>
</p>
<p>
	The following methods are provided for accessing primitive values:
</p>
<ul class='javatree'>
	<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='bpcode w800'>
	<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='bpcode w800'>
	<ck>hex1</ck> = <cv>0x12FE</cv>
	<ck>hex2</ck> = <cv>0X12FE</cv>
	<ck>octal1</ck> = <cv>01234</cv>
</p>
<p>
	Strings with newlines are treated as multi-line values that get broken into separate lines:
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<ck>key1</ck> = 
		<cv>This is a particularly long sentence that we want to split</cv>
		<cv>onto separate lines</cv>.
</p>
</div><!-- END: 5.2.1 - juneau-config.EntryTypes.PrimitiveTypes -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.EntryTypes.POJOs' id='juneau-config.EntryTypes.POJOs'>5.2.2 - POJOs</a></h4>
<div class='topic'><!-- START: 5.2.2 - juneau-config.EntryTypes.POJOs -->
<p>
	The following methods are provided for accessing POJO values:
</p>
<ul class='javatree'>
	<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 {@doc PojoCategories parsable} POJO type can be represented
	as a config value. 
	However in practice, we're typically talking about the following:
</p>
<ul>
	<li>Objects convertible from Strings.
	<li>Beans.
</ul>
<p>
	An example of an object convertible from a String was already shown in an example above.
	In that case, it was a URL which has a public constructor that takes in a String:
</p>
<p class='bpcode w800'>
	<cc># A POJO</cc>
	<ck>key4</ck> = <cv>http://bar</cv>
</p>
<p class='bpcode w800'>
	<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 {@doc juneau-marshall.JsonDetails.SimplifiedJson Simplified JSON} by default:
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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>(<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='javatree'>
	<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 on the following getters:
</p>
<ul class='javatree'>
	<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><!-- END: 5.2.2 - juneau-config.EntryTypes.POJOs -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.EntryTypes.Arrays' id='juneau-config.EntryTypes.Arrays'>5.2.3 - Arrays</a></h4>
<div class='topic'><!-- START: 5.2.3 - juneau-config.EntryTypes.Arrays -->
<p>
	The following methods are provided for accessing arrays:
</p>
<ul class='javatree'>
	<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 <c>getStringArray()</c> methods allow you to retrieve comma-delimited lists of values:
<p class='bpcode w800'>
	<ck>key1</ck> = <cv>foo, bar, baz</cv>
</p>
<p class='bpcode w800'>
	String[] key1 = c.getStringArray(<js>"key1"</js>);
</p>
<p>
	String arrays can also be represented in JSON when using the <c>getObject()</c> methods:
</p>
<p class='bpcode w800'>
	<ck>key1</ck> = <cv>['foo','bar','baz']</cv>
</p>
<p class='bpcode w800'>
	String[] key1 = c.getObject(<js>"key1"</js>, String[].<jk>class</jk>);
</p>
<p>
	Primitive arrays can also be retrieved using the <c>getObject()</c> methods:
</p>
<p class='bpcode w800'>
	<ck>key1</ck> = <cv>[1,2,3]</cv>
</p>
<p class='bpcode w800'>
	<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 <c>getObject()</c> methods:
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	Address[] addresses = c.getObject(<js>"addresses"</js>, Address[].<jk>class</jk>);
</p>
</div><!-- END: 5.2.3 - juneau-config.EntryTypes.Arrays -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.EntryTypes.Collections' id='juneau-config.EntryTypes.Collections'>5.2.4 - Collections</a></h4>
<div class='topic'><!-- START: 5.2.4 - juneau-config.EntryTypes.Collections -->
<p>
	The following methods are provided for accessing maps and collections:
</p>
<ul class='javatree'>
	<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 <c>Type,Type...</c> arguments allow you to specify the component types for maps and collections.
	<c>List</c> class arguments can be followed by zero or one arguments representing the entry types.
	<c>Map</c> class arguments can be followed by zero or two arguments representing the key and value types.
	The arguments can be chained to produce any data structure consisting of maps, collections, or POJOs.
</p>
<p>
	Examples are shown below:
</p>
<ul class='spaced-list'>
	<li><c>getObject(<js>"..."</js>, List.<jk>class</jk>)</c>
		<br>Produces: <c>List&lt;?&gt;</c>
	<li><c>getObject(<js>"..."</js>, LinkedList.<jk>class</jk>)</c>
		<br>Produces: <c>LinkedList&lt;?&gt;</c>
	<li><c>getObject(<js>"..."</js>, HashSet.<jk>class</jk>, Integer.<jk>class</jk>)</c>
		<br>Produces: <c>HashSet&lt;Integer&gt;</c>
	<li><c>getObject(<js>"..."</js>, Map.<jk>class</jk>)</c>
		<br>Produces: <c>Map&lt;?,?&gt;</c>
	<li><c>getObject(<js>"..."</js>, HashMap.<jk>class</jk>)</c>
		<br>Produces: <c>HashMap&lt;?,?&gt;</c>
	<li><c>getObject(<js>"..."</js>, LinkedHashMap.<jk>class</jk>, String.<jk>class</jk>, MyBean.<jk>class</jk>)</c>
		<br>Produces: <c>LinkedHashMap&lt;String,MyBean&gt;</c> 
	<li><c>getObject(<js>"..."</js>, HashMap.<jk>class</jk>, Integer.<jk>class</jk>, ArrayList.<jk>class</jk>, MyBean[].<jk>class</jk>)</c>
		<br>Produces: <c>LinkedHashMap&lt;Integer,ArrayList&lt;MyBean[]&gt;&gt;</c> 
</ul>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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='bpcode w800'>
	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>
<p class='bpcode w800'>
	ObjectMap m = c.getObject(<js>"key1"</js>, ObjectMap.<jk>class</jk>);
	ObjectList l = c.getObject(<js>"key2"</js>, ObjectList.<jk>class</jk>);
</p>
</div><!-- END: 5.2.4 - juneau-config.EntryTypes.Collections -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.EntryTypes.BinaryData' id='juneau-config.EntryTypes.BinaryData'>5.2.5 - Binary Data</a></h4>
<div class='topic'><!-- START: 5.2.5 - juneau-config.EntryTypes.BinaryData -->
<p>
	The following methods are provided for accessing binary data:
</p>
<ul class='javatree'>
	<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: <c><js>"Zm9vYmFycw=="</js></c>
	<li>Hexadecimal
		<br>Example: <c><js>"666F6F62617273"</js></c>
	<li>Spaced hexadecimal
		<br>Example: <c><js>"66 6F 6F 62 61 72 73"</js></c>
</ul>
<p>
	The binary data format is controlled via the following setting:
</p>
<ul class='javatree'>
	<li class='jf'>{@link org.apache.juneau.config.Config#CONFIG_binaryFormat}
</ul>
<p>
	For example:
</p>
<p class='bpcode w800'>
	<ck>key</ck> = <cv>Zm9vYmFycw==</cv>
</p>
<p class='bpcode w800'>
	<jk>byte</jk>[] bytes = c.getBytes(<js>"key"</js>);
</p>
<p>
	Binary lines can be split up into separate lines for readability:
</p>
<p class='bpcode w800'>
	<ck>key</ck> = 
		<cv>Zm9vYm
		Fycw==</cv>
</p>
<p>
	Binary data line wrapping can be controlled via the following setting:
</p>
<ul class='javatree'>
	<li class='jf'>{@link org.apache.juneau.config.Config#CONFIG_binaryLineLength}
</ul>
</div><!-- END: 5.2.5 - juneau-config.EntryTypes.BinaryData -->
</div><!-- END: 5.2 - juneau-config.EntryTypes -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.Variables' id='juneau-config.Variables'>5.3 - Variables</a></h3>
<div class='topic'><!-- START: 5.3 - juneau-config.Variables -->
<p>
	Config files can contain variables that get resolved dynamically using the previously-described {@link org.apache.juneau.svl.VarResolver} API.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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 value in this config file</cc>
	<ck>anotherLocale</ck> = <cv>$C{MySection/locale}</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/anotherLocale}}}</cv>

	<cc># A POJO with embedded variables</cc>
	<ck>aBean</ck> = <cv>{foo:'$S{foo}',baz:$C{MySection/anInt}}</cv>
</p>
<p class='bpcode w800'>
	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, <c>Configs</c> use the {@link org.apache.juneau.svl.VarResolver#DEFAULT} variable resolver
	which provides support for the following variables and constructs:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.svl.vars.SystemPropertiesVar} - <c>$S{key[,default]}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.EnvVariablesVar} - <c>$E{key[,default]}</c>
	<li class='jc'>{@link org.apache.juneau.config.vars.ConfigVar} - <c>$C{key[,default]}</c>
</ul>
<p>
	The variable resolver is controlled via the following setting:
</p>
<ul class='javatree'>
	<li class='jf'>{@link org.apache.juneau.config.Config#CONFIG_varResolver}
</ul>
<p>
	Additionally, the following method can be used to retrieve a <c>Config</c> with a different variable resolver:
</p>
<ul class='javatree'>
	<li class='jm'>{@link org.apache.juneau.config.Config#resolving(VarResolverSession)}
</ul>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.Variables.LogicVariables' id='juneau-config.Variables.LogicVariables'>5.3.1 - Logic Variables</a></h4>
<div class='topic'><!-- START: 5.3.1 - juneau-config.Variables.LogicVariables -->
<p>
	The default variable resolver also provides the following logic variables for performing simple logical operations:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.svl.vars.IfVar} - <c>$IF{arg,then[,else]}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.SwitchVar} - <c>$SW{arg,pattern1:then1[,pattern2:then2...]}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.CoalesceVar} - <c>$CO{arg1[,arg2...]}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.PatternMatchVar} - <c>$PM{arg,pattern}</c> 
	<li class='jc'>{@link org.apache.juneau.svl.vars.NotEmptyVar} - <c>$NE{arg}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.UpperCaseVar} - <c>$UC{arg}</c>
	<li class='jc'>{@link org.apache.juneau.svl.vars.LowerCaseVar} - <c>$LC{arg}</c>
</ul>
<p>
	The <c>$IF</c> variable can be used for simple if/else logic:
</p>
<p class='bpcode w800'>
	<cc># Value set to 'foo' if myBooleanProperty is true</cc>
	<ck>key1</ck> = 
		<cv>$IF{		
			$S{myBooleanProperty},
			foo
		}</cv>		
			
	<cc># Value set to 'foo' if myBooleanProperty is true, 'bar' if false.</cc>
	<ck>key2</ck> = 
		<cv>$IF{		
			$S{myBooleanProperty},
			foo,
			bar
		}</cv>		

	<cc># Value set to key1 value if myBooleanProperty is true, key2 value if false.</cc>
	<ck>key3</ck> = 
		<cv>$IF{		
			$S{myBooleanProperty},
			$C{key1},
			$C{key2}
		}</cv>		
</p>
<p>
	The <c>$SW</c> variable can be used for switch blocks based on pattern matching:
</p>
<p class='bpcode w800'>
	<cc># Shell command depends on the OS</cc>
	<ck>shellCommand</ck> = 
		<cv>$SW{		
			$LC{$S{os.name}},
			*win*: bat,
			linux: bash,
			*: sh
		}</cv>		
</p>
<p>
	The <c>$CO</c> variable can be used for coalescing of values (finding the first non-null/empty match):
</p>
<p class='bpcode w800'>
	<cc># Debug flag can be enabled by system property or environment variable.</cc>
	<ck>debug</ck> = 
		<cv>$CO{		
			$S{debug},
			$E{DEBUG},
			false
		}</cv>		
</p>
<p>
	The <c>$PM</c> variable can be used for calculating boolean values:
</p>
<p class='bpcode w800'>
	<cc># Debug flag can be enabled by system property or environment variable.</cc>
	<ck>isWindows</ck> = 
		<cv>$PM{		
			$LC{$S{os.name}},
			*win*
		}</cv>		
</p>
</div><!-- END: 5.3.1 - juneau-config.Variables.LogicVariables -->
</div><!-- END: 5.3 - juneau-config.Variables -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.EncodedEntries' id='juneau-config.EncodedEntries'>5.4 - Encoded Entries</a></h3>
<div class='topic'><!-- START: 5.4 - juneau-config.EncodedEntries -->
<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='bpcode w800'>
	<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>
<ul class='javatree'>
	<li class='jic'>{@link org.apache.juneau.config.encode.ConfigEncoder}
	<ul>
		<li class='jm'>{@link org.apache.juneau.config.encode.ConfigEncoder#encode(String,String) encode(String,String)}
		<li class='jm'>{@link org.apache.juneau.config.encode.ConfigEncoder#decode(String,String) decode(String,String)}
		<li class='jm'>{@link org.apache.juneau.config.encode.ConfigEncoder#isEncoded(String) isEncoded(String)}
	</ul>
</ul>
<p>
	Encoders are controlled via the following setting:
</p>
<ul class='javatree'>
	<li class='jf'>{@link org.apache.juneau.config.Config#CONFIG_encoder}
</ul>
<p>
	Encoded values can be set to plain-text values.  
	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#commit()} method.
	They can also be encoded immediately by calling {@link org.apache.juneau.config.Config#encodeEntries()}.
</p>
</div><!-- END: 5.4 - juneau-config.EncodedEntries -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.SectionMaps' id='juneau-config.SectionMaps'>5.5 - Section Maps</a></h3>
<div class='topic'><!-- START: 5.5 - juneau-config.SectionMaps -->
<p>
	Config sections can be retrieved in-bulk using  
	{@link org.apache.juneau.config.Config#getSectionAsMap(String)}.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<jc>// Example usage</jc>
	Config c = Config.<jsm>create</jsm>(<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>
<p>
	Maps created this way are snapshot copies of the section at the time of the method call.
</p>
</div><!-- END: 5.5 - juneau-config.SectionMaps -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.SectionBeans' id='juneau-config.SectionBeans'>5.6 - Section Beans</a></h3>
<div class='topic'><!-- START: 5.6 - juneau-config.SectionBeans -->
<p>
	Config files can also be used to directly populate beans using 
	{@link org.apache.juneau.config.Config#getSectionAsBean(String,Class,boolean)}.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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>(<js>"MyConfig.cfg"</js>).build();
	Address myAddress = c.getSectionAsBean(<js>"MyAddress"</js>, Address.<jk>class</jk>);
</p>
<p>
	Like maps, beans created this way are snapshot copies of the section at the time of the method call.
</p>
</div><!-- END: 5.6 - juneau-config.SectionBeans -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.SectionInterfaces' id='juneau-config.SectionInterfaces'>5.7 - Section Interfaces</a></h3>
<div class='topic'><!-- START: 5.7 - juneau-config.SectionInterfaces -->
<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>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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>(<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>// Commit your changes to the store.</jc>
	c.commit();
</p>
</div><!-- END: 5.7 - juneau-config.SectionInterfaces -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.SettingValues' id='juneau-config.SettingValues'>5.8 - Setting Values</a></h3>
<div class='topic'><!-- START: 5.8 - juneau-config.SettingValues -->
<p>
	The following methods allow you to add, remove, and modify entries and sections in a config file:
</p>
<ul class='javatree'>
	<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='bpcode w800'>
	<jc>// Construct the sample config file programmatically</jc>
	Config c = Config.<jsm>create</jsm>(<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>))
		.commit();
</p>
<p>
	The method {@link org.apache.juneau.config.Config#set(String,Object,Serializer,ConfigMod[],String,List)} can be used
	for adding comments and pre-lines to entries, and specifying encoded values.
</p>
<p class='bpcode w800'>
	<jc>// Set an encoded value with some comments.</jc>
	c.set(<js>"key1"</js>, 1, <jk>null</jk>, ConfigMod.<jsf>ENCODED</jsf>, <js>"Same-line comment"</js>, 
		Arrays.asList(
			<js>"# Comment 1"</js>, <js>""</js>, <js>"# Comment 2"</js>
		)
	);
</p>
<p class='bpcode w800'>
	<cc># Comment 1</cc>
	
	<cc># Comment 2</cc>
	<ck>key1</ck> = <cv>1</cv> <cc># Same-line comment</cc>
</p>	
<p>
	The last 4 arguments in {@link org.apache.juneau.config.Config#set(String,Object,Serializer,ConfigMod[],String,List)} 
	are optional in that if you pass <jk>null</jk>, the current value will not be overwritten.
	To unset the same-line comment, you should pass in a blank string.
	To remove pre-lines, you should pass in an empty list.
</p>	
<p>
	Sections can be added with optional pre-lines using the <c>setSection</c> methods:
</p>
<p class='bpcode w800'>
	<jc>// Set an encoded value with some comments.</jc>
	c.setSection(<js>"NewSection"</js>, 
		Arrays.asList(
			<js>"# Section comment 1"</js>, <js>""</js>, <js>"# Section comment 2"</js>
		)
	);
</p>
<p class='bpcode w800'>
	<cc># Section comment 1</cc>
	
	<cc># Section comment 2</cc>
	<cs>[NewSection]</cs>
</p>		
<p>
	Changes made to the configuration are transactional in nature.  
	They are kept in memory until you call the {@link org.apache.juneau.config.Config#commit()} method.
	Until then, you still see the modified values when you call any of the getters, but the modified values
	exist only in memory.
</p>
<p>
	Changes can be rolled back using the {@link org.apache.juneau.config.Config#rollback()} method.
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.SettingValues.FileSystemChanges' id='juneau-config.SettingValues.FileSystemChanges'>5.8.1 - File System Changes</a></h4>
<div class='topic'><!-- START: 5.8.1 - juneau-config.SettingValues.FileSystemChanges -->
<p>
	In general, external file modifications will be detected immediately in the <c>Config</c>
	object when a watcher thread is enabled (explained later).
	Otherwise, they are detected when a commit is performed.
</p>
<p>
	The <c>Config</c> object maintains an in-memory record of all changes that have been applied to it
	through getters and setters.
	When the underlying file changes, the new contents are loaded and the in-memory changes are then 
	applied to the new configuration.
	This provides the benefits of real-time updates of configurations while not losing any changes made in the JVM.
</p>
<p>
	If the <c>commit()</c> method is called on the <c>Config</c> objects after the file system
	contents have been modified, we will then reload the configuration from the file system, apply the
	changes, and then try to save to the file system again (up to 10 times).
</p>
<p>
	If the same entry is both internally and externally modified, the external modification will be 
	overwritten (although both change events will be seen by listeners).
</p>
</div><!-- END: 5.8.1 - juneau-config.SettingValues.FileSystemChanges -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.SettingValues.CustomEntrySerialization' id='juneau-config.SettingValues.CustomEntrySerialization'>5.8.2 - Custom Entry Serialization</a></h4>
<div class='topic'><!-- START: 5.8.2 - juneau-config.SettingValues.CustomEntrySerialization -->
<p>
	Setter methods that take in a <c>Serializer</c> can be used to provide custom serialization of entries
	instead of using the predefined serializer.
</p>
<p class='bpcode w800'>
	<jc>// Set an XML value instead of JSON.</jc>
	c.set(<js>"key1"</js>, myAddress, XmlSerializer.<jsf>DEFAULT_SQ_READABLE</jsf>);
</p>
<p class='bpcode w800'>
	<ck>key1</ck> = 
		<cv>&lt;address&gt;	
			&lt;street&gt;123 Main Street&lt;/street&gt;
			&lt;city&gt;Anywhere&lt;/city&gt;
			&lt;state&gt;NY&lt;/state&gt;
			&lt;zip&gt;12345&lt;/zip&gt;
		&lt;/address&gt;</cv>
</p>		
<p>
	The value can then be retrieved using the equivalent parser:
</p>
<p class='bpcode w800'>
	Address myAddress = c.getObject(<js>"key1"</js>, XmlParser.<jsf>DEFAULT</jsf>, Address.<jk>class</jk>);			
</p>
</div><!-- END: 5.8.2 - juneau-config.SettingValues.CustomEntrySerialization -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.SettingValues.BulkSettingValues' id='juneau-config.SettingValues.BulkSettingValues'>5.8.3 - Setting Values in Bulk</a></h4>
<div class='topic'><!-- START: 5.8.3 - juneau-config.SettingValues.BulkSettingValues -->
<p>
	The following methods can be used to bulk-load configuration values:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.config.Config}
	<ul>
		<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#load(Map) load(Map)}
		<li class='jm'>{@link org.apache.juneau.config.Config#load(Reader,boolean) load(Reader,boolean)}
		<li class='jm'>{@link org.apache.juneau.config.Config#load(String,boolean) load(String,boolean)}
	</ul>
</ul>
<p>
	Changes can then be committed using the {@link org.apache.juneau.config.Config#commit()} method.
</p>
</div><!-- END: 5.8.3 - juneau-config.SettingValues.BulkSettingValues -->
</div><!-- END: 5.8 - juneau-config.SettingValues -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.Listeners' id='juneau-config.Listeners'>5.9 - Listeners</a></h3>
<div class='topic'><!-- START: 5.9 - juneau-config.Listeners -->
<p>
	Configuration change events can be listened for using the following methods:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.config.Config}
	<ul>
		<li class='jm'>{@link org.apache.juneau.config.Config#addListener(ConfigEventListener) addListener(ConfigEventListener)}
		<li class='jm'>{@link org.apache.juneau.config.Config#removeListener(ConfigEventListener) removeListener(ConfigEventListener)}
	</ul>
</ul>
<p>
	The {@link org.apache.juneau.config.event.ConfigEventListener} interface consists of the following method:
</p>		
<ul class='javatree'>
	<li class='jic'>{@link org.apache.juneau.config.event.ConfigEventListener}
	<ul>
		<li class='jm'>{@link org.apache.juneau.config.event.ConfigEventListener#onConfigChange(ConfigEvents) onConfigChange(ConfigEvents)}
	</ul>
</ul>
<p>
	The {@link org.apache.juneau.config.event.ConfigEvent} class provides access to all the information about the updated entry:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.config.event.ConfigEvent}
	<ul>
		<li class='jm'>{@link org.apache.juneau.config.event.ConfigEvent#getType() getType()}
		<li class='jm'>{@link org.apache.juneau.config.event.ConfigEvent#getSection() getSection()}
		<li class='jm'>{@link org.apache.juneau.config.event.ConfigEvent#getKey() getKey()}
		<li class='jm'>{@link org.apache.juneau.config.event.ConfigEvent#getValue() getValue()}
		<li class='jm'>{@link org.apache.juneau.config.event.ConfigEvent#getModifiers() getModifiers()}
		<li class='jm'>{@link org.apache.juneau.config.event.ConfigEvent#getComment() getComment()}
		<li class='jm'>{@link org.apache.juneau.config.event.ConfigEvent#getPreLines() getPreLines}
	</ul>
</ul>
<p>
	The listener method is triggered:
</p>
<ul class='spaced-list'>
	<li>After {@link org.apache.juneau.config.Config#commit()} is called.
	<li>When the file changes on the file system. 
</ul>
<p>
	In both cases, the listener is triggered after the changes have been committed.
</p>
<p class='bpcode w800'>
	<jk>final</jk> Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).build();
	
	<jc>// Add a listener for changes to MySection/key1</jc>
	c.addListener(
		<jk>new</jk> ConfigEventListener() {
			<ja>@Override</ja>
			<jk>public void</jk> onConfigChange(ConfigEvents) {
				<jk>for</jk> (ConfigEvent event : events) {
					<jk>if</jk> (event.getType() == <jsf>SET_ENTRY</jsf>) {
						
						String section = event.getSection();
						String key = event.getKey();
					
						<jk>if</jk> (section.equals(<js>"MySection"</js>) &amp;&amp; key.equals(<js>"key1"</js>)) {
		
							<jc>// Get the new value from the event.</jc>
							String newVal = event.getValue();
							
							<jc>// Or get the new value from the config (since the change has already been committed).</jc>
							newVal = c.getString(<js>"MySection/key1"</js>);
						}
					}
				}
			}
		}
	)
</p>
</div><!-- END: 5.9 - juneau-config.Listeners -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.Serializing' id='juneau-config.Serializing'>5.10 - Serializing</a></h3>
<div class='topic'><!-- START: 5.10 - juneau-config.Serializing -->
<p>
	The following methods are used for serializing <c>Config</c> objects back into INI files:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.config.Config}
	<ul>
		<li class='jm'>{@link org.apache.juneau.config.Config#writeTo(Writer) writeTo(Writer)}
		<li class='jm'>{@link org.apache.juneau.config.Config#toString() toString()}
	</ul>
</ul>
<p>
	Both methods are thread safe.
</p>
<p>
	The <c>Config</c> class implements the {@link org.apache.juneau.Writable} which means it can be 
	returned as-is by REST methods to be serialized as INI text.
</p>
</div><!-- END: 5.10 - juneau-config.Serializing -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.Imports' id='juneau-config.Imports'>5.11 - Imports</a><span class='update'>8.1.0-updated</span></h3>
<div class='topic'><!-- START: 5.11 - juneau-config.Imports -->
<p>
	Configurations can import values from other configurations using the following syntax: 
</p>
<p class='bpcode w800'>
	<cc># Import values from configuration 'ParentConfig'</cc>
	<ci>&lt;ParentConfig&gt;</ci>

	<cc># Our normal section</cc>
	<cs>[Section1]</cs>
	...
</p>
<p>
	A configuration can contain zero or more imports anywhere in the file.
	However, for clarity, imports should normally be placed in the default section of the configuration file.
	The resolved configuration is retrieved from the configuration store used for the child configuration.
</p>
<p>
	Configuration imports can be nested arbitrarily deep.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<cc># MyConfig contents</cc>
	<ci>&lt;ParentConfig1&gt;</ci>
</p>
<p class='bpcode w800'>
	<cc># ParentConfig1 contents</cc>
	<ci>&lt;ParentConfig2&gt;</ci>
</p>
<p class='bpcode w800'>
	<cc># ParentConfig2 contents</cc>
	<cs>[Foo]</cs>
	<ck>bar</ck> = <cv>baz</cv>
</p>
<p class='bpcode w800'>
	<jc>// Java code</jc>
	Config c = ConfigBuilder.<jsm>create</jsm>(<js>"MyConfig"</js>).build();
	String foo = c.getString(<js>"Foo/bar"</js>);  <jc>// == "baz"</jc>
</p>
<p>
	Values can be overridden by child configurations.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<cc># MyConfig contents</cc>
	<ci>&lt;ParentConfig1&gt;</ci>
	
	<cs>[Foo]</cs>
	<ck>bar</ck> = <cv>baz</cv>
</p>
<p class='bpcode w800'>
	<cc># ParentConfig1 contents</cc>
	<ci>&lt;ParentConfig2&gt;</ci>
	
	<cs>[Foo]</cs>
	<ck>bar</ck> = <cv>qux</cv>
</p>
<p class='bpcode w800'>
	<cc># ParentConfig2 contents</cc>
	<cs>[Foo]</cs>
	<ck>bar</ck> = <cv>quux</cv>
</p>
<p class='bpcode w800'>
	Config c = ConfigBuilder.<jsm>create</jsm>(<js>"MyConfig"</js>).build();
	String foo = c.getString(<js>"Foo/bar"</js>);  <jc>// == "baz"</jc>
</p>

<p>
	Changes made to imported configurations are automatically reflected in the child configuration and
	partake in the listener API as if the entries were part of the child configuration.
	Only non-overridden values trigger listener events.  For example, if an imported configuration
	defines a value for <js>"Foo/bar"</js> and the child configuration does not, modifications to 
	<js>"Foo/bar"</js> value in the parent configuration will trigger a listener event in the child config.
	However, if the child configuration does also specify a value for <js>"Foo/bar"</js>, a change to the parent
	<js>"Foo/bar"</js> will NOT trigger a listener event because the value ends up not being changed from
	the perspective of the child configuration.
</p>
<p>
	Values can be overwritten in child configurations, but the values will only be set in that configuration
	and not the imported configuration.  
</p>
<p>
	Dynamically adding an import will cause change events to be generated for imported values.
</p>
<p class='bpcode w800'>
	<cc># MyConfig contents starting empty</cc>
</p>
<p class='bpcode w800'>
	<cc># ParentConfig contents</cc>
	<cs>[Foo]</cs>
	<ck>bar</ck> = <cv>baz</cv>
</p>
<p class='bpcode w800'>
	<jc>// Create our configuration.</jc>
	Config c = ConfigBuilder.<jsm>create</jsm>(<js>"MyConfig"</js>).build();
	
	<jc>// Create a listener that sets a flag if "Foo/bar" is set.</jc>	
	<jk>final boolean</jk>[] triggered = <jk>new boolean</jk>[1];
	ConfigEventListener l = <jk>new</jk> ConfigEventListener() {
		<jk>public void</jk> onConfigChange(ConfigEvents events) {
			triggered[0] = events.isKeyModified(<js>"Foo"</js>, <js>"bar"</js>));
		}
	};
	c.addListener(l);
	
	<jc>// Dynamically add an import to ParentConfig in the default section.</jc>
	c.setImport(<js>""</js>, <js>"ParentConfig"</js>);
	c.commit();
	
	<jc>// The new import statement should have triggered a config changes for imported values.</jc>
	<jsm>assertTrue</jsm>(triggered[0]);	
</p>
<p>
	Dynamically removing an import has the same effect as removing keys and generates <jsf>REMOVE_ENTRY</jsf> events.
</p>
<p>
	Note that when dynamically adding or removing imports, overridden keys in the child config will be filtered
	from the change events.
</p>
</div><!-- END: 5.11 - juneau-config.Imports -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.ConfigStores' id='juneau-config.ConfigStores'>5.12 - Config Stores</a></h3>
<div class='topic'><!-- START: 5.12 - juneau-config.ConfigStores -->
<p>
	Configuration files are stored in entities called Stores.
</p>
<p>
	The methods that need to be implemented on a store are:
</p>
<ul class='javatree'>
	<li class='jac'>{@link org.apache.juneau.config.store.ConfigStore}
	<ul>
		<li class='jm'>{@link org.apache.juneau.config.store.ConfigStore#read(String) read(String)} - Read a config file.
		<li class='jm'>{@link org.apache.juneau.config.store.ConfigStore#write(String,String,String) write(String,String,String)} - Write a config file.
		<li class='jm'>{@link org.apache.juneau.config.store.ConfigStore#update(String,String) update(String,String)} - Update the contents of a config file.
	</ul>
</ul>
<p>
	Read is self-explanatory:
</p>
<p class='bpcode w800'>
	<jk>public</jk> String read(String name) {
		<jc>// Return the contents of the specified configuration.</jc>
	}
</p>
<p>
	Write is slightly trickier:
</p>
<p class='bpcode w800'>
	<jk>public</jk> String write(String name, String oldContents, String newContents) {
	
		<jc>// If the old contents match the current stored contents, the new contents will get stored, 
		//	and the method returns null indicating success.
	
		// If the old contents DO NOT match the current stored contents (i.e. it was modified in some way), 
		//	the new contents are NOT stored, and the method returns the current stored contents.
	
		// If the old contents are null, then just always write the new contents.</jc>
	}
</p>
<p>
	The update method is called whenever the stored file gets modified externally:
</p>		
<p class='bpcode w800'>
	<jk>public</jk> String update(String name, String newContents) {
		<jc>// Do something with the updated contents.</jc>
	}
</p>
<p>
	Two configuration stores are provided by default:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.config.store.ConfigFileStore} - File-system storage.
	<li class='jc'>{@link org.apache.juneau.config.store.ConfigMemoryStore} - In-memory storage.
</ul>
<p>
	The store is defined on the <c>Config</c> object via the following setting:
</p>
<ul class='javatree'>
	<li class='jf'>{@link org.apache.juneau.config.Config#CONFIG_store}
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Create a config with in-memory storage.</jc>
	Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).store(ConfigMemoryStore.<jsf>DEFAULT</jsf>).build();
</p>
<p>
	The default store used is {@link org.apache.juneau.config.store.ConfigFileStore#DEFAULT} which defines
	the execution directory as the file system directory to store and retrieve files. 
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.ConfigStores.ConfigMemoryStore' id='juneau-config.ConfigStores.ConfigMemoryStore'>5.12.1 - ConfigMemoryStore</a></h4>
<div class='topic'><!-- START: 5.12.1 - juneau-config.ConfigStores.ConfigMemoryStore -->
<p>
	The {@link org.apache.juneau.config.store.ConfigMemoryStore} class is simply an in-memory storage
	location for configuration files.
	There is no hard persistence and is used primarily for testing purposes.
</p>
<p>
	However, the implementation provides a good idea on how stores work (especially the write method):
</p>
<p class='bpcode w800'>
	<jk>public class</jk> ConfigMemoryStore <jk>extends</jk> ConfigStore {
	
		<jc>// Some methods ommitted.</jc>
		
		<jk>private final</jk> ConcurrentHashMap&lt;String,String&gt; <jf>cache</jf> = <jk>new</jk> ConcurrentHashMap&lt;&gt;();
		
		<ja>@Override</ja> <jc>/* ConfigStore */</jc>
		<jk>public synchronized</jk> String read(String name) {
			<jk>return</jk> <jsm>emptyIfNull</jsm>(<jf>cache</jf>.get(name));
		}
	
		<ja>@Override</ja> <jc>/* ConfigStore */</jc>
		<jk>public synchronized</jk> String write(String name, String expectedContents, String newContents) {
	
			<jc>// This is a no-op.</jc>
			<jk>if</jk> (<jsm>isEquals</jsm>(expectedContents, newContents))
				<jk>return null</jk>;
			
			String currentContents = read(name);
			
			<jk>if</jk> (expectedContents != <jk>null</jk> &amp;&amp; ! <jsm>isEquals</jsm>(currentContents, expectedContents)) 
				<jk>return</jk> currentContents;
			
			update(name, newContents);
			
			<jc>// Success!</jc>
			<jk>return null</jk>;
		}
	
		
		<ja>@Override</ja> <jc>/* ConfigStore */</jc>
		<jk>public synchronized</jk> ConfigMemoryStore update(String name, String newContents) {
			<jf>cache</jf>.put(name, newContents);
			<jk>super</jk>.update(name, newContents);  <jc>// Trigger any listeners.</jc>
			<jk>return this</jk>;
		}
	}
</p>
</div><!-- END: 5.12.1 - juneau-config.ConfigStores.ConfigMemoryStore -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.ConfigStores.ConfigFileStore' id='juneau-config.ConfigStores.ConfigFileStore'>5.12.2 - ConfigFileStore</a></h4>
<div class='topic'><!-- START: 5.12.2 - juneau-config.ConfigStores.ConfigFileStore -->
<p>
	The {@link org.apache.juneau.config.store.ConfigFileStore} is the typical store used for configuration files.
	It provides the following configurable settings:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.config.store.ConfigFileStore}
	<ul>
		<li class='jm'>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_charset FILESTORE_charset}
		<li class='jm'>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_directory FILESTORE_directory}
		<li class='jm'>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_updateOnWrite FILESTORE_updateOnWrite}
		<li class='jm'>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_useWatcher FILESTORE_useWatcher}
		<li class='jm'>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_watcherSensitivity FILESTORE_watcherSensitivity}
	</ul>
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Create a config store with a watcher thread and high sensitivity.</jc>
	ConfigFileStore fs = ConfigFileStore.<jsm>create</jsm>().directory(<js>"configs"</js>).useWatcher().watcherSensitivity(<jsf>HIGH</jsf>).build();
	
	<jc>// Create a config using the store defined above.</jc>
	Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).store(fs).build();
</p>
</div><!-- END: 5.12.2 - juneau-config.ConfigStores.ConfigFileStore -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.ConfigStores.CustomConfigStores' id='juneau-config.ConfigStores.CustomConfigStores'>5.12.3 - Custom ConfigStores</a></h4>
<div class='topic'><!-- START: 5.12.3 - juneau-config.ConfigStores.CustomConfigStores -->
<p>
	The <c>ConfigStore</c> API has been written to allow easy development of custom configuration storage classes.
</p>
<p>
	The example below shows a starting point for an implementation based on polling a relational database.
	Completing it is left as an exercise:
</p>
<h5 class='figure'>Example Store Class:</h5>
<p class='bpcode w800'>
	<jk>public class</jk> ConfigSqlStore <jk>extends</jk> ConfigStore {

		<jc>// Configurable properties</jc>
		<jk>static final</jk> String
			<jsf>CONFIGSQLSTORE_jdbcUrl</jsf> = <js>"ConfigSqlStore.jdbcUrl.s"</js>,
			<jsf>CONFIGSQLSTORE_tableName</jsf> = <js>"ConfigSqlStore.tableName.s"</js>,
			<jsf>CONFIGSQLSTORE_nameColumn</jsf> = <js>"ConfigSqlStore.nameColumn.s"</js>,
			<jsf>CONFIGSQLSTORE_valueColumn</jsf> = <js>"ConfigSqlStore.valueColumn.s"</js>,
			<jsf>CONFIGSQLSTORE_pollInterval</jsf> = <js>"ConfigSqlStore.pollInterval.i"</js>;

		<jc>// Instance fields</jc>
		<jk>private final</jk> String <jf>jdbcUrl</jf>;
		<jk>private final</jk> String <jf>tableName</jf>, <jf>nameColumn</jf>, <jf>valueColumn</jf>;
		<jk>private final</jk> Timer <jf>watcher</jf>;
		<jk>private final</jk> ConcurrentHashMap&lt;String,String&gt; <jf>cache</jf> = <jk>new</jk> ConcurrentHashMap&lt;&gt;();

	
		<jc>// Constructor called from builder.</jc>
		<jk>protected</jk> ConfigSqlStore(PropertyStore ps) {
			<jk>super</jk>(ps);
			
			<jk>this</jk>.<jf>jdbcUrl</jf> = getStringProperty(<jsf>CONFIGSQLSTORE_jdbcUrl</jsf>, <js>"jdbc:derby:mydb"</js>);
			<jk>this</jk>.<jf>tableName</jf> = getStringProperty(<jsf>CONFIGSQLSTORE_tableName</jsf>);
			<jk>this</jk>.<jf>nameColumn</jf> = getStringProperty(<jsf>CONFIGSQLSTORE_nameColumn</jsf>);
			<jk>this</jk>.<jf>valueColumn</jf> = getStringProperty(<jsf>CONFIGSQLSTORE_valueColumn</jsf>);		

			<jk>int</jk> pollInterval = getStringProperty(<jsf>CONFIGSQLSTORE_pollInterval</jsf>, 600);  <jc>// Time in seconds.</jc>
			
			TimerTask timerTask = <jk>new</jk> TimerTask() {
				<ja>@Override</ja>
				<jk>public void</jk> run() {
					ConfigSqlStore.<jk>this</jk>.poll();
				}
			};

			<jk>this</jk>.<jf>watcher</jf> = <jk>new</jk> Timer(<js>"MyTimer"</js>);
			<jf>watcher</jf>.scheduleAtFixedRate(timerTask, 0, pollInterval * 1000);
		}
		
		<jk>private synchronized void</jk> poll() {
		
			<jc>// Loop through all our entries and find the latest values.</jc>
			<jk>for</jk> (Map.Entry&lt;String,String&gt; e : cache.entrySet()) {
				String name = e.getKey();
				String cacheContents = e.getValue();
				String newContents = getDatabaseValue(name);
				
				<jc>// Change detected!</jc>
				<jk>if</jk> (! cacheContents.equals(newContents)) 
					update(name, newContents);
			}
			
		}
		
		<jc>// Reads the value from the database.</jc>
		<jk>protected</jk> String getDatabaseValue(String name) {
			<jc>// Implement me!</jc>
		}
	
		<ja>@Override</ja> <jc>/* ConfigStore */</jc>
		<jk>public synchronized</jk> String read(String name) {
			String contents = <jf>cache</jf>.get(name);
			<jk>if</jk> (contents == <jk>null</jk>) {
				contents = getDatabaseValue(name);
				update(name, contents);
			}
			<jk>return</jk> contents;
		}
	
		<ja>@Override</ja> <jc>/* ConfigStore */</jc>
		<jk>public synchronized</jk> String write(String name, String expectedContents, String newContents) {
	
			<jc>// This is a no-op.</jc>
			<jk>if</jk> (<jsm>isEquals</jsm>(expectedContents, newContents))
				<jk>return null</jk>;
			
			String currentContents = read(name);
			
			<jk>if</jk> (expectedContents != <jk>null</jk> &amp;&amp; ! <jsm>isEquals</jsm>(currentContents, expectedContents)) 
				<jk>return</jk> currentContents;
			
			update(name, newContents);
			
			<jc>// Success!</jc>
			<jk>return null</jk>;
		}
	
		
		<ja>@Override</ja> <jc>/* ConfigStore */</jc>
		<jk>public synchronized</jk> ConfigSqlStore update(String name, String newContents) {
			<jf>cache</jf>.put(name, newContents);
			<jk>super</jk>.update(name, newContents);  <jc>// Trigger any listeners.</jc>
			<jk>return this</jk>;
		}
		
		<ja>@Override</ja> <jc>/* Closeable */</jc>
		<jk>public synchronized void</jk> close() {
			<jk>if</jk> (watcher != <jk>null</jk>)
				watcher.cancel();
		}
	}
</p>
<p>
	The purpose of the builder class is to simply set values in the {@link org.apache.juneau.PropertyStore}
	that's passed to the <c>ConfigStore</c>:
</p>
<h5 class='figure'>Example Builder Class:</h5>
<p class='bpcode w800'>
	<jk>public class</jk> ConfigSqlStoreBuilder <jk>extends</jk> ConfigStoreBuilder {

		<jk>public</jk> ConfigSqlStoreBuilder() {
			<jk>super</jk>();
		}

		<jk>public</jk> ConfigSqlStoreBuilder(PropertyStore ps) {
			<jk>super</jk>(ps);
		}

		<jk>public</jk> ConfigSqlStoreBuilder jdbcUrl(String value) {
			<jk>super</jk>.set(<jsf>CONFIGSQLSTORE_jdbcUrl</jsf>, value);
			<jk>return this</jk>;
		}

		<jk>public</jk> ConfigSqlStoreBuilder tableName(String value) {
			<jk>super</jk>.set(<jsf>CONFIGSQLSTORE_tableName</jsf>, value);
			<jk>return this</jk>;
		}

		<jk>public</jk> ConfigSqlStoreBuilder nameColumn(String value) {
			<jk>super</jk>.set(<jsf>CONFIGSQLSTORE_nameColumn</jsf>, value);
			<jk>return this</jk>;
		}

		<jk>public</jk> ConfigSqlStoreBuilder valueColumn(String value) {
			<jk>super</jk>.set(<jsf>CONFIGSQLSTORE_valueColumn</jsf>, value);
			<jk>return this</jk>;
		}

		<jk>public</jk> ConfigSqlStoreBuilder pollInterval(<jk>int</jk> value) {
			<jk>super</jk>.set(<jsf>CONFIGSQLSTORE_pollInterval</jsf>, value);
			<jk>return this</jk>;
		}

		<ja>@Override</ja> <jc>/* ContextBuilder */</jc>
		<jk>public</jk> ConfigFileStore build() {
			<jk>return new</jk> ConfigFileStore(getPropertyStore());
		}
	}
</p>
</div><!-- END: 5.12.3 - juneau-config.ConfigStores.CustomConfigStores -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-config.ConfigStores.ConfigStoreListeners' id='juneau-config.ConfigStores.ConfigStoreListeners'>5.12.4 - ConfigStore Listeners</a></h4>
<div class='topic'><!-- START: 5.12.4 - juneau-config.ConfigStores.ConfigStoreListeners -->
<p>
	The <c>ConfigStore</c> class has the following listener methods:
</p>
<ul class='javatree'>
	<li class='jac'>{@link org.apache.juneau.config.store.ConfigStore}
	<ul>
		<li class='jm'>{@link org.apache.juneau.config.store.ConfigStore#register(String,ConfigStoreListener) register(String,ConfigStoreListener)} - Register a listener on the specified config name.
		<li class='jm'>{@link org.apache.juneau.config.store.ConfigStore#unregister(String,ConfigStoreListener) unregister(String,ConfigStoreListener)} - Unregister a listener on the specified config name.
	</ul>
</ul>
<p>
	Note that this is a different listener than {@link org.apache.juneau.config.event.ConfigEventListener}.
	In this case, we're just listening for changed files:
</p>		
<ul class='javatree'>
	<li class='jic'>{@link org.apache.juneau.config.store.ConfigStoreListener}
	<ul>
		<li class='jm'>{@link org.apache.juneau.config.store.ConfigStoreListener#onChange(String)} - Called when file changes.  New contents are passed in.
	</ul>
</ul>
<p>
	This listener is used by the <c>Config</c> class to listen for changes on the file system so that it can be
	updated in real-time.
</p>
</div><!-- END: 5.12.4 - juneau-config.ConfigStores.ConfigStoreListeners -->
</div><!-- END: 5.12 - juneau-config.ConfigStores -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.ReadOnlyConfigs' id='juneau-config.ReadOnlyConfigs'>5.13 - Read-only Configs</a></h3>
<div class='topic'><!-- START: 5.13 - juneau-config.ReadOnlyConfigs -->
<p>
	The following settings can be used to create read-only <c>Config</c> objects:
</p>
<ul class='javatree'>
	<li class='jf'>{@link org.apache.juneau.config.Config#CONFIG_readOnly}
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Create a read-only config</jc>
	Config c = Config.<jsm>create</jsm>(<js>"MyConfig.cfg"</js>).readOnly().build();
</p>
<p>
	This causes all methods that make modifications to throw {@link java.lang.UnsupportedOperationException}.
</p>
</div><!-- END: 5.13 - juneau-config.ReadOnlyConfigs -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.ClosingConfigs' id='juneau-config.ClosingConfigs'>5.14 - Closing Configs</a></h3>
<div class='topic'><!-- START: 5.14 - juneau-config.ClosingConfigs -->
<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>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Create a transient config.</jc>
	Config c = Config.<jsm>create</jsm>(<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><!-- END: 5.14 - juneau-config.ClosingConfigs -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-config.SystemDefaultConfig' id='juneau-config.SystemDefaultConfig'>5.15 - System Default Config</a><span class='update'>8.0.0-new, 8.1.0-updated</span></h3>
<div class='topic'><!-- START: 5.15 - juneau-config.SystemDefaultConfig -->
<p>
	Each JVM has a system default config.  This is a configuration file that serves as the default
	configuration for the system.  It's accessed using the following static methods:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.config.Config}
	<ul>
		<li class='jm'>{@link org.apache.juneau.config.Config#getSystemDefault() getSystemDefault()}
		<li class='jm'>{@link org.apache.juneau.config.Config#setSystemDefault(Config) setSystemDefault(Config)}
	</ul>
</ul>
<p>
	If you do not specify a system default config, one will be automatically searched for.
	The search is done in the following order:
</p>
<ol class='spaced-list'>
	<li>
		If the system property <js>"juneau.configFile"</js> is set, we search for this file in first the home
		directory and then the classpath.
	<li>
		In the home directory:
		<ol>
			<li><c>&lt;jar-name&gt;.cfg</c>
			<li>Any file that end with <c>.cfg</c>.  First one matched alphabetically is used.
		</ol>
	<li>
		In the context classpath root package (i.e. inside the jar itself):
		<ol>
			<li><c>&lt;jar-name&gt;.cfg</c>
			<li><c>juneau.cfg</c>
			<li><c>default.cfg</c>
			<li><c>application.cfg</c>
			<li><c>app.cfg</c>
			<li><c>settings.cfg</c>
			<li><c>application.properties</c>
		</ol>
</ol>
<p>
	Later in the section on REST resources, we describe how to associate configurations with REST resources
	using the {@link org.apache.juneau.rest.annotation.Rest#config() @Rest(config)} annotation.
	The system default configuration can be referenced with the keyword <c>SYSTEM_DEFAULT</c> like so:
</p>
<p class='bpcode w800'>
	<jc>// Always use system default.</jc>
	<ja>@Rest</ja>(config=<js>"SYSTEM_DEFAULT"</js>)

	<jc>// Use system property if set or the system default if not.</jc>
	<ja>@Rest</ja>(config=<js>"$S{juneau.configFile,SYSTEM_DEFAULT}"</js>)
</p>
<p>
	By default, all properties in the system default configuration are automatically set as system properties.
	This can be disabled by setting the system property <js>"juneau.disableAutoSystemProps"</js> to <js>"true"</js>.
</p>
</div><!-- END: 5.15 - juneau-config.SystemDefaultConfig -->
</div><!-- END: 5 - juneau-config -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server' id='juneau-rest-server'>6 - juneau-rest-server</a></h2>
<div class='topic'><!-- START: 6 - juneau-rest-server -->
<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<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>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	

<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-rest-server-{@property juneauVersion}.jar 
</p>	

<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.rest.server_{@property juneauVersion}.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.
	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.  
	The developer can work entirely with POJOs and let the Juneau framework handle all the serialization and 
	parsing work.  
	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.  
	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.  
	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.	
	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>
		Support for parsing all HTTP parts (headers, query, formData, path variables) using Swagger formatting rules and validations.
		<br>Not limited to simple POJOs, but rather you can represent arbitrarily-complex POJOs in any HTTP part using UON notation.
	<li>
		Auto-created Swagger JSON and Swagger UI available through OPTIONS requests of resources.
	<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>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HelloWorldExample' id='juneau-rest-server.HelloWorldExample'>6.1 - Hello World Example</a></h3>
<div class='topic'><!-- START: 6.1 - juneau-rest-server.HelloWorldExample -->
<p>
	A REST resource is simply a Java class annotated with {@link org.apache.juneau.rest.annotation.Rest}.
	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>.  
	This example is located in the <l>juneau-examples-rest</l> project.
	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='bpcode w800'>
	<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='bpcode w800'>
	<jc>// Sample REST resource that prints out a simple "Hello world!" message.</jc>
	<ja>@Rest</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> BasicRestServlet {
	
		<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>
<p class='bpcode w800'>
	http://localhost:10000/helloWorld
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.HelloWorldExample.1.png'>
<p>
	It doesn't much simpler than that.  
	In this case, we're simply returning a string that will be converted to any of the supported languages (e.g. 
	JSON, XML, HTML, ...).
	However, we could have returned any POJO consisting of beans, maps, collections, etc...
</p>
<p>
	The {@link org.apache.juneau.rest.BasicRestServlet} 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.  
	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><!-- END: 6.1 - juneau-rest-server.HelloWorldExample -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.ClassHierarchy' id='juneau-rest-server.ClassHierarchy'>6.2 - Class Hierarchy</a><span class='update'>8.1.0-updated</span></h3>
<div class='topic'><!-- START: 6.2 - juneau-rest-server.ClassHierarchy -->
<p>
	The class hierarchy for the REST servlet class is shown below:
</p>
<ul class='javatree'>
	<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.BasicRestServlet org.apache.juneau.rest.BasicRestServlet}
						<br>Provides a default set of serializers, parsers, options page, stylesheet, and other common settings.
						<ul>
							<li class='jac'>{@link org.apache.juneau.rest.BasicRestServletGroup org.apache.juneau.rest.BasicRestServletGroup}
								<br>A default implementation for "router" pages.
							</li>
						</ul>
					</li>
				</ul>
			</li>
		</ul>
	</li>
</ul>
<p>
	For top-level resources, you'll typically extend from one of the classes above.
</p>
<p>
	For child resources, you can either extend from one of the classes above, or extend from one of the following
	that provides identical support but does not extent from <c>HttpServlet</c>:
</p>
<ul class='javatree'>
	<li class='jic'>
		{@link org.apache.juneau.rest.BasicRestConfig} 
		<ul>
			<li class='jac'>{@link org.apache.juneau.rest.BasicRest org.apache.juneau.rest.BasicRest}
				<br>Provides a default set of serializers, parsers, options page, stylesheet, and other common settings.
				<ul>
					<li class='jac'>{@link org.apache.juneau.rest.BasicRestGroup org.apache.juneau.rest.BasicRestGroup}
						<br>A default implementation for "router" pages.
					</li>
				</ul>
			</li>
		</ul>
	</li>
</ul>
<p>
	One reason to use the latter classes as your base classes is when you're implementing REST resources as 
	<ja>@Bean</ja>-annotated Spring Beans and you don't want them to be automatically registered as top-level servlets.
</p>

<p>
	The servlets with RDF support require Jena on the classpath.  
	All other serializers and parsers do not have any external library dependencies.
	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 class='javatree'>
	<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><!-- END: 6.2 - juneau-rest-server.ClassHierarchy -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation' id='juneau-rest-server.Instantiation'>6.3 - Instantiation</a></h3>
<div class='topic'><!-- START: 6.3 - juneau-rest-server.Instantiation -->
<p>
	REST resources are deployed in one of two ways:
</p>
<ul class='spaced-list'>
	<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.
</p>
<p>
	<b>When deployed as a child of another resource, you MAY extend from one of the servlet classes but it's 
	not necessary.</b>
	The only requirement is that the class be annotated with <ja>@Rest</ja> and have one of the following constructors:
</p>
<ul class='javatree'>
	<li class='jm'><c><jk>public</jk> T()</c>
	<li class='jm'><c><jk>public</jk> T(RestContextBuilder)</c>
</ul>
<p>
	And even that requirement is relaxed if you implement your own REST resource resolver (described later).
</p>
<p>
	For example:
</p>
<p class='bpcode w800'>
	<jc>// Top level resource is deployed like any other servlet and must subclass from RestServlet.</jc>
	<ja>@Rest</ja>(
		path=<js>"/top"</js>,
		children={
			ChildResource.<jk>class</jk>  <jc>// Accessed via URI "/top/child"</jc>
		}
	)
	<jk>public class</jk> TopLevelResource <jk>extends</jk> BasicRestServlet {...}
</p>
<p class='bpcode w800'>
	<jc>// Child resources can inherit from RestServlet but it's not a requirement.</jc>
	<ja>@Rest</ja>(
		path=<js>"/child"</js>
	)
	<jk>public class</jk> ChildResource <jk>extends</jk> WhateverYouWant {...}
</p>		
<p>
	That's all there is to it!
	There's no code scanning, module configuration/initialization classes, or anything complex like that.
	It's just a servlet.
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.RestServlet' id='juneau-rest-server.Instantiation.RestServlet'>6.3.1 - RestServlet</a></h4>
<div class='topic'><!-- START: 6.3.1 - juneau-rest-server.Instantiation.RestServlet -->
<p>
	The {@link org.apache.juneau.rest.RestServlet} class is the entry point for your REST resources.
	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>@Rest</l>
	annotations on that class and all child classes.
	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.BasicRestServlet}.
	The <l>RestServlet</l> class by itself is not configured with any serializers and parsers, and therefore
	not very useful on it's own.
	However, the class does provide a couple of convenience methods to be aware of:
</p>
<ul class='javatree'>
	<li class='jac'><c>{@link org.apache.juneau.rest.RestServlet} <jk>extends</jk> HttpServlet</c>
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.RestServlet#init(ServletConfig) init(ServletConfig)} - Can override to provide custom initialization.
		<li class='jm'>{@link org.apache.juneau.rest.RestServlet#service(HttpServletRequest,HttpServletResponse) service(HttpServletRequest,HttpServletResponse)} - Can override to provide custom request handling.
		<li class='jm'>{@link org.apache.juneau.rest.RestServlet#destroy() destroy()} - Can override to provide custom cleanup.
		<li class='jm'>{@link org.apache.juneau.rest.RestServlet#getContext() getContext()} - Returns all aspects of the configuration of your resource pulled from all annotations on the class/parent-classes and methods.
		<li class='jm'>{@link org.apache.juneau.rest.RestServlet#log(Level,String,Object...) log(Level,String,Object...)} - Convenience logging method.
		<li class='jm'>{@link org.apache.juneau.rest.RestServlet#log(Level,Throwable,String,Object...) log(Level,Throwable,String,Object...)} - Convenience logging method.
	</ul>
</ul>
</div><!-- END: 6.3.1 - juneau-rest-server.Instantiation.RestServlet -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRestServlet' id='juneau-rest-server.Instantiation.BasicRestServlet'>6.3.2 - BasicRestServlet</a><span class='update'>8.1.0-updated</span></h4>
<div class='topic'><!-- START: 6.3.2 - juneau-rest-server.Instantiation.BasicRestServlet -->
<p>
	The {@link org.apache.juneau.rest.BasicRestServlet} 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.
	<li>Default contents for HTML views.
</ul>
<p>
	The contents of the class is shown below.
	You should notice that very little code is being used and everything is configurable through
	annotations:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
	
		<jc>// Allow OPTIONS requests to be simulated using ?method=OPTIONS query parameter. </jc>
		allowedMethodParams=<js>"OPTIONS"</js>,
		
		<jc>// HTML-page specific settings.</jc>
		htmldoc=<ja>@HtmlDoc</ja>(
			<jc>// Basic page navigation links.</jc>
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		)
	)
	<jk>public abstract class</jk> BasicRestServlet <jk>extends</jk> RestServlet <jk>implements</jk> BasicRestConfig {
	
		<jd>/**
		 * [OPTIONS /*] - Show resource options.
		 *
		 * <ja>@param</ja> req The HTTP request.
		 * <ja>@return</ja> A bean containing the contents for the OPTIONS page.
		 */</jd>
		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>,
			
			summary=<js>"Swagger documentation"</js>,
			description=<js>"Swagger documentation for this resource."</js>,
			
			htmldoc=<ja>@HtmlDoc</ja>(
				<jc>// Override the nav links for the swagger page.</jc>
				navlinks={
					<js>"back: servlet:/"</js>,
					<js>"json: servlet:/?method=OPTIONS&amp;Accept=text/json&amp;plainText=true"</js>
				},
				<jc>// Never show aside contents of page inherited from class.</jc>
				aside=<js>"NONE"</js>
			)
		)
		<ja>@JsonSchemaConfig</ja>(
			<jc>// Add descriptions to the following types when not specified:</jc>
			addDescriptionsTo=<js>"bean,collection,array,map,enum"</js>,
			<jc>// Add x-example to the following types:</jc>
			addExamplesTo=<js>"bean,collection,array,map"</js>,
			<jc>// Don't generate schema information on the Swagger bean itself or HTML beans.</jc>
			ignoreTypes=<js>"Swagger,org.apache.juneau.dto.html5.*"</js>,
			<jc>// Use $ref references for bean definitions to reduce duplication in Swagger.</jc>
			useBeanDefs=<js>"true"</js>
		)
		<ja>@BeanConfig</ja>(
			<jc>// When parsing generated beans, ignore unknown properties that may only exist as getters and not setters.</jc>
			ignoreUnknownBeanProperties=<js>"true"</js>,
			<jc>// POJO swaps to apply to all serializers/parsers on this method.</jc>
			pojoSwaps={
				<jc>// Use the SwaggerUI swap when rendering Swagger beans.</jc>
				<jc>// This is a per-media-type swap that only applies to text/html requests.</jc>
				SwaggerUI.<jk>class</jk>
			}
		)
		<jk>public</jk> Swagger getOptions(RestRequest req) {
			<jc>// Localized Swagger for this resource is available through the RestRequest object.</jc>
			<jk>return</jk> req.getSwagger();
		}
	}
</p>
<p>
	Additional annotations are pulled in from the {@link org.apache.juneau.rest.BasicRestConfig} interface which simply
	exists to define a common set of annotations.  
	Notice that it has no code at all.
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
	
		<jc>// Default serializers for all Java methods in the class.</jc>
		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>
		},
		
		<jc>// Default parsers for all Java methods in the class.</jc>
		parsers={
			JsonParser.<jk>class</jk>,
			JsonParser.Simple.<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>
		},

		<jc>// HTML-page specific settings</jc>
		htmldoc=<ja>@HtmlDoc</ja>(
		
			<jc>// Default page header contents.</jc>
			header={
				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>, <jc>// Use @Rest(title)</jc>
				<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>, <jc>// Use either @RestMethod(summary) or @Rest(description)</jc>
				<js>"$C{REST/header}"</js> <jc>// Extra header HTML defined in external config file.</jc>
			},
			
			<jc>// Basic page navigation links.</jc>
			navlinks={
				<js>"up: request:/.."</js>
			},
			
			<jc>// Default stylesheet to use for the page.
			// Can be overridden from external config file.
			// Default is DevOps look-and-feel (aka Depression look-and-feel).</jc>
			stylesheet=<js>"$C{REST/theme,servlet:/htdocs/themes/devops.css}"</js>,
			
			<jc>// Default contents to add to the &lt;head&gt; section of the HTML page.
			// Use it to add a favicon link to the page.</jc>
			head={
				<js>"&lt;link rel='icon' href='$U{$C{REST/favicon}}'/&gt;"</js>
			},
			
			<jc>// No default page footer contents.
			// Can be overridden from external config file.</jc>
			footer=<js>"$C{REST/footer}"</js>,
			
			<jc>// By default, table cell contents should not wrap.</jc>
			nowrap=<js>"true"</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"
		// By default, we define static files through the external configuration file.</jc>
		staticFiles={<js>"$C{REST/staticFiles}"</js>}
	)
	<ja>@SerializerConfig</ja>(
		<jc>// Enable automatic resolution of URI objects to root-relative values.</jc>
		uriResolution=<js>"ROOT_RELATIVE"</js>
	)
	<jk>public interface</jk> BasicRestConfig {}
</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>
	It's important to notice that the <ja>@Rest</ja> annotation is inheritable and overridable from parent
	class and interfaces.  
	They'll all get merged into a single set of annotation values for the resource class.
</p>
<p>
	Not shown but equally important is that all of the annotations shown have programmatic equivalents via the {@link org.apache.juneau.rest.RestContextBuilder} class
	which can be manipulated during servlet initialization.
	(As a general rule, all annotations throughout Juneau have programmatic equivalents.)
</p>
<p>
	There's a lot going on in this class.
	But not to worry, the details will be described later.
</p>
</div><!-- END: 6.3.2 - juneau-rest-server.Instantiation.BasicRestServlet -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRest' id='juneau-rest-server.Instantiation.BasicRest'>6.3.3 - BasicRest</a><span class='update'>8.1.0-new</span></h4>
<div class='topic'><!-- START: 6.3.3 - juneau-rest-server.Instantiation.BasicRest -->
<p>
	The {@link org.apache.juneau.rest.BasicRest} class is identical to the {@link org.apache.juneau.rest.BasicRestServlet} class except that
	it does not extend from <c>HttpServlet</c>.
	It defines the exact same set of serializers, parsers, etc., but it cannot be deployed as a top-level
	servlet.  It can however be used for child resources registered via the {@link org.apache.juneau.rest.annotation.Rest#children() @Rest(children)} 
	annotation. 
</p>
<p>
	The code for this class is virtually identical to {@link org.apache.juneau.rest.BasicRestServlet} but lacks a parent class:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
	
		<jc>// Allow OPTIONS requests to be simulated using ?method=OPTIONS query parameter. </jc>
		allowedMethodParams=<js>"OPTIONS"</js>,
		
		<jc>// HTML-page specific settings.</jc>
		htmldoc=<ja>@HtmlDoc</ja>(
			<jc>// Basic page navigation links.</jc>
			navlinks={
				<js>"up: request:/.."</js>,
				<js>"options: servlet:/?method=OPTIONS"</js>
			}
		)
	)
	<jk>public abstract class</jk> BasicRest <jk>implements</jk> BasicRestConfig {
	
		<jd>/**
		 * [OPTIONS /*] - Show resource options.
		 *
		 * <ja>@param</ja> req The HTTP request.
		 * <ja>@return</ja> A bean containing the contents for the OPTIONS page.
		 */</jd>
		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>,
			
			summary=<js>"Swagger documentation"</js>,
			description=<js>"Swagger documentation for this resource."</js>,
			
			htmldoc=<ja>@HtmlDoc</ja>(
				<jc>// Override the nav links for the swagger page.</jc>
				navlinks={
					<js>"back: servlet:/"</js>,
					<js>"json: servlet:/?method=OPTIONS&amp;Accept=text/json&amp;plainText=true"</js>
				},
				<jc>// Never show aside contents of page inherited from class.</jc>
				aside=<js>"NONE"</js>
			)
		)
		<ja>@JsonSchemaConfig</ja>(
			<jc>// Add descriptions to the following types when not specified:</jc>
			addDescriptionsTo=<js>"bean,collection,array,map,enum"</js>,
			<jc>// Add x-example to the following types:</jc>
			addExamplesTo=<js>"bean,collection,array,map"</js>,
			<jc>// Don't generate schema information on the Swagger bean itself or HTML beans.</jc>
			ignoreTypes=<js>"Swagger,org.apache.juneau.dto.html5.*"</js>,
			<jc>// Use $ref references for bean definitions to reduce duplication in Swagger.</jc>
			useBeanDefs=<js>"true"</js>
		)
		<ja>@BeanConfig</ja>(
			<jc>// When parsing generated beans, ignore unknown properties that may only exist as getters and not setters.</jc>
			ignoreUnknownBeanProperties=<js>"true"</js>,
			<jc>// POJO swaps to apply to all serializers/parsers on this method.</jc>
			pojoSwaps={
				<jc>// Use the SwaggerUI swap when rendering Swagger beans.</jc>
				<jc>// This is a per-media-type swap that only applies to text/html requests.</jc>
				SwaggerUI.<jk>class</jk>
			}
		)
		<jk>public</jk> Swagger getOptions(RestRequest req) {
			<jc>// Localized Swagger for this resource is available through the RestRequest object.</jc>
			<jk>return</jk> req.getSwagger();
		}
	}
</p>
</div><!-- END: 6.3.3 - juneau-rest-server.Instantiation.BasicRest -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.Children' id='juneau-rest-server.Instantiation.Children'>6.3.4 - Children</a></h4>
<div class='topic'><!-- START: 6.3.4 - juneau-rest-server.Instantiation.Children -->
<p>
	Child Resources are REST servlets or objects that are linked to parent resources through the 
	{@link org.apache.juneau.rest.annotation.Rest#children() @Rest(children)} annotation.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jd>/** Parent Resource */</jd>
	<ja>@Rest</ja>(
		path=<js>"/parent"</js>,
		children={FooResource.<jk>class</jk>}
	)
	<jk>public</jk> MyResource <jk>extends</jk> BasicRestServlet {...}
</p>
<p class='bpcode w800'>
	<jd>/** Child Resource */</jd>
 	<ja>@Rest</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. 
	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.
	Initialization of and access to the child resources occurs through the parent resource.
	Children can be nested arbitrary deep to create complex REST interfaces with a single top-level REST servlet.
</p>
<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_children}
</ul>
</div><!-- END: 6.3.4 - juneau-rest-server.Instantiation.Children -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRestServletGroup' id='juneau-rest-server.Instantiation.BasicRestServletGroup'>6.3.5 - BasicRestServletGroup</a><span class='update'>8.1.0-updated</span></h4>
<div class='topic'><!-- START: 6.3.5 - juneau-rest-server.Instantiation.BasicRestServletGroup -->
<p>
	The {@link org.apache.juneau.rest.BasicRestServletGroup} 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='bpcode w800'>		
	<jd>/**
	 * Sample REST resource showing how to implement a "router" resource page.
	 */</jd>
	<ja>@Rest</ja>(
		path=<js>"/"</js>,
		title=<js>"Root resources"</js>,
		description=<js>"Example of a router resource page."</js>,
		children={
			HelloWorldResource.<jk>class</jk>,
			PetStoreResource.<jk>class</jk>,
			DtoExamples.<jk>class</jk>,
			ConfigResource.<jk>class</jk>,
			LogsResource.<jk>class</jk>,
			ShutdownResource.<jk>class</jk>
		}
	)
	<jk>public class</jk> RootResources <jk>extends</jk> BasicRestServletGroup {
		<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>
<p class='bpcode w800'>
	http://localhost:10000
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.RouterPages.1.png'/>
<p> 
	The {@link org.apache.juneau.rest.BasicRestServletGroup} class is nothing more than a subclass of 
	{@link org.apache.juneau.rest.BasicRestServlet} with a <l>getChildren()</l> method mapped to the servlet 
	root path.
	The method returns a POJO with is just a linked-list of beans with name/description properties.
</p>	
<p class='bpcode w800'>
	<jc>// The entire contents of the BasicRestServletGroup class.</jc>
	
	<jk>public class</jk> BasicRestServletGroup <jk>extends</jk> BasicRestServlet {
	
		<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><!-- END: 6.3.5 - juneau-rest-server.Instantiation.BasicRestServletGroup -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.BasicRestGroup' id='juneau-rest-server.Instantiation.BasicRestGroup'>6.3.6 - BasicRestGroup</a><span class='update'>8.1.0-new</span></h4>
<div class='topic'><!-- START: 6.3.6 - juneau-rest-server.Instantiation.BasicRestGroup -->
<p>
	The {@link org.apache.juneau.rest.BasicRestGroup} class is identical to the {@link org.apache.juneau.rest.BasicRestServletGroup} class except that
	it does not extend from <c>HttpServlet</c>.
	It defines the exact same set of serializers, parsers, etc., but it cannot be deployed as a top-level
	servlet.  It can however be used for child resources registered via the {@link org.apache.juneau.rest.annotation.Rest#children() @Rest(children)} 
	annotation. 
</p>
<p class='bpcode w800'>
	<jc>// The entire contents of the BasicRestGroup class.</jc>
	
	<jk>public class</jk> BasicRestGroup <jk>extends</jk> BasicRest {
	
		<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><!-- END: 6.3.6 - juneau-rest-server.Instantiation.BasicRestGroup -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.ResourceResolvers' id='juneau-rest-server.Instantiation.ResourceResolvers'>6.3.7 - Resource Resolvers</a></h4>
<div class='topic'><!-- START: 6.3.7 - juneau-rest-server.Instantiation.ResourceResolvers -->
<p>
	By default, you can add the {@link org.apache.juneau.rest.annotation.Rest @Rest}
	to any class as long as it has one of the following constructors:
</p>
<ul class='javatree'>
	<li class='jm'><c><jk>public</jk> T()</c>
	<li class='jm'><c><jk>public</jk> T(RestContextBuilder)</c>
</ul>
<p>
	The latter 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='javatree'>
	<li class='jic'>{@link org.apache.juneau.rest.RestResourceResolver}
	<ul>
		<li class='jc'>{@link org.apache.juneau.rest.BasicRestResourceResolver}
	</ul>
</ul>
<p>
	This API can be extended to provide your own custom resource resolution.
	Later topics discuss how to use this API to instantiate resources using Spring.
</p>
<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_resourceResolver}
</ul>
</div><!-- END: 6.3.7 - juneau-rest-server.Instantiation.ResourceResolvers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Instantiation.LifecycleHooks' id='juneau-rest-server.Instantiation.LifecycleHooks'>6.3.8 - Lifecycle Hooks</a></h4>
<div class='topic'><!-- START: 6.3.8 - juneau-rest-server.Instantiation.LifecycleHooks -->
<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='bpcode w800'>
	<ja>@Rest</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='bpcode w800'>
	<ja>@Rest</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>

<ul class='seealso'>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.RestHook}
</ul>
</div><!-- END: 6.3.8 - juneau-rest-server.Instantiation.LifecycleHooks -->
</div><!-- END: 6.3 - juneau-rest-server.Instantiation -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Rest' id='juneau-rest-server.Rest'>6.4 - @Rest</a><span class='update'>8.1.2-updated</span></h3>
<div class='topic'><!-- START: 6.4 - juneau-rest-server.Rest -->
<p>
	The {@link org.apache.juneau.rest.annotation.Rest @Rest} annotation is the primary way of defining
	and configuring REST resource classes.
	The functionality of the class itself is covered in detail in the topics below.
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Rest.AnnotationInheritance' id='juneau-rest-server.Rest.AnnotationInheritance'>6.4.1 - Annotation Inheritance</a></h4>
<div class='topic'><!-- START: 6.4.1 - juneau-rest-server.Rest.AnnotationInheritance -->
<p>
	The {@link org.apache.juneau.rest.annotation.Rest @Rest} annotation can also be used on parents and interfaces of resource classes.
	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>
<h5 class='figure'>Inheritance rules</h5>
<table class='styled w800'>
	<tr>
		<th><l>Annotation</l></th>
		<th><l>Inheritence Rules</l></th>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.rest.annotation.Rest#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.Rest#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.Rest#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.Rest#serializers() serializers()}</td>
		<td>
			Serializers on child override those on parent class.
			<br>{@link org.apache.juneau.rest.Inherit} class can be used to inherit and augment values from parent.
			<br>{@link org.apache.juneau.rest.None} class can be used to suppress inheriting from parent.
			<br>Serializers on methods take precedence over those on classes.
		</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.rest.annotation.Rest#parsers() parsers()}</td>
		<td>
			Parsers on child override those on parent class.
			<br>{@link org.apache.juneau.rest.Inherit} class can be used to inherit and augment values from parent.
			<br>{@link org.apache.juneau.rest.None} class can be used to suppress inheriting from parent.
			<br>Parsers on methods take precedence over those on classes.
		</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.rest.annotation.Rest#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.Rest#encoders() encoders()}</td>
		<td>
			Encoders on child are combined with those on parent class.
		</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.rest.annotation.Rest#reqHeaders() reqHeaders()}</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.Rest#resHeaders() resHeaders()}</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.Rest#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.Rest#path() path()}</td>
		<td>
			Path is searched for in child-to-parent order.
		</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.rest.annotation.Rest#title() title()}</td>
		<td>
			Label is searched for in child-to-parent order.
		</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.rest.annotation.Rest#description() description()}</td>
		<td>
			Description is searched for in child-to-parent order.
		</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.rest.annotation.Rest#config() config()}</td>
		<td>
			Config file is searched for in child-to-parent order.
		</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.rest.annotation.Rest#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><!-- END: 6.4.1 - juneau-rest-server.Rest.AnnotationInheritance -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Rest.RestPath' id='juneau-rest-server.Rest.RestPath'>6.4.2 - @Rest(path)</a><span class='update'>8.1.0-new, 8.1.2-updated</span></h4>
<div class='topic'><!-- START: 6.4.2 - juneau-rest-server.Rest.RestPath -->
<p>
	The {@link org.apache.juneau.rest.annotation.RestResource#path() @RestResource(path)} annotation is used in the following situations:
<p>
<ul class='spaced-list'>
	<li>
		On child resources (resource classes attached to parents via the {@link org.apache.juneau.rest.annotation.RestResource#children() @RestResource(children)} annotation) to identify
		the subpath used to access the child resource relative to the parent.
	<li>
		On top-level {@link org.apache.juneau.rest.RestServlet} classes deployed as Spring beans when {@link org.apache.juneau.rest.springboot.JuneauRestInitializer} is being used.
</ul>

<h5 class='topic'>On child resources</h5>
<p>
	The typical usage is to define a path to a child resource relative to the parent resource.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestResource</ja>(
		children={
			ChildResource.<jk>class</jk>
		}
	)
	<jk>public class</jk> TopLevelResource <jk>extends</jk> BasicRestServlet {...}
</p>
<p class='bpcode w800'>
	<ja>@RestResource</ja>(
		path=<js>"/child"</js>,
		children={
			GrandchildResource.<jk>class</jk>
		}
	)
	<jk>public class</jk> ChildResource {...}
</p>
<p class='bpcode w800'>
	<ja>@RestResource</ja>(
		path=<js>"/grandchild"</js>
	)
	<jk>public class</jk> GrandchildResource {
		<ja>@RestMethod</ja>(
			path=<js>"/"</js>
		)
		<jk>public</jk> String sayHello() {
			<jk>return</jk> <js>"Hello!"</js>;
		}
	}
</p>
<p>
	In the example above, assuming the <c>TopLevelResource</c> servlet is deployed to path <c>/myContext/myServlet</c>,
	then the <c>sayHello</c> method is accessible through the URI <c>/myContext/myServlet/child/grandchild</c>.
</p>
<p>
	Note that in this scenario, the <c>path</c> attribute is not defined on the top-level resource.
	Specifying the path on the top-level resource has no effect, but can be used for readability purposes.
</p>

<h5 class='topic'>On top-level resources deployed as Spring beans</h5>
<p>
	The path can also be used on top-level resources deployed as Spring beans when used with the {@link org.apache.juneau.rest.springboot.JuneauRestInitializer}
	Spring Boot initializer class:
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@SpringBootApplication</ja>
	<ja>@Controller</ja>
	<jk>public class</jk> App {

		<jc>// Our entry-point method.</jc>
		<jk>public static void</jk> main(String[] args) {
			<jk>new</jk> SpringApplicationBuilder(App.<jk>class</jk>)
				.initializers(<jk>new</jk> JuneauRestInitializer(App.<jk>class</jk>))
				.run(args);
		}

		<jc>// Our top-level servlet.</jc>
		<ja>@Bean</ja>
		<ja>@JuneauRestRoot</ja>
		<jk>public</jk> MyResource getMyResource() {
			<jk>return new</jk> MyResource();
		}
	}
</p>
<p class='bpcode w800'>
	<ja>@RestResource</ja>(
		path=<js>"/myResource"</js>
	)
	<jk>public class</jk> MyResource <jk>extends</jk> BasicRestServlet {...}
</p>

<p>
	In this case, the servlet will get registered using the path defined on the resource class.
</p>

<h5 class='topic'>Path variables</h5>
<p>
	The path can contain variables that get resolved to {@link org.apache.juneau.http.annotation.Path @Path} parameters
	or access through the {@link org.apache.juneau.rest.RestRequest#getPathMatch()} method.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode'>
	<ja>@RestResource</ja>(
		path=<js>"/myResource/{foo}/{bar}"</js>
	)
	<jk>public class</jk> MyResource <jk>extends</jk> BasicRestServlet {

		<ja>@RestMethod</ja>(
			path=<js>"/{baz}"</js>
		)
		<jk>public void</jk> String doX(<ja>@Path</ja> String foo, <ja>@Path</ja> <jk>int</jk> bar, <ja>@Path</ja> MyPojo baz) {
			...
		}
	}
</p>
<p>
	Variables can be used on either top-level or child resources and can be defined on multiple levels.
</p>
<div class='info'>
	All variables in the path must be specified or else the target will not resolve and a <c>404</c> will result.
</div>
<p>
	When variables are used on a path of a top-level resource deployed as a Spring bean in a Spring Boot application,
	the first part of the URL must be a literal which will be used as the servlet path of the registered servlet.
</p>
</div><!-- END: 6.4.2 - juneau-rest-server.Rest.RestPath -->
</div><!-- END: 6.4 - juneau-rest-server.Rest -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestContext' id='juneau-rest-server.RestContext'>6.5 - RestContext</a></h3>
<div class='topic'><!-- START: 6.5 - juneau-rest-server.RestContext -->
<p>
	The {@link org.apache.juneau.rest.RestContext} object is the workhorse class for all of the configuration
	of a single REST resource class.
	It's by-far the most important class in the REST API.
</p>
<p>
	Every class annotated with <l>@Rest</l> ends up with an instance of this object.
	The object itself is read-only and unchangeable.
	It is populated through the following:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.Rest} - 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.
	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.
	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='bpcode w800'>
	<jc>// Option #1 - Pass in through constructor.</jc>
	<jk>public</jk> MyResource(RestContextBuilder builder) {
			builder
				.pojoSwaps(TemporalCalendarSwap.Rfc1123DateTime.<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(TemporalCalendarSwap.Rfc1123DateTime.<jk>class</jk>)
				.set(<jsf>PARSER_debug</jsf>, <jk>true</jk>);
	}
</p>
<p>
	Warning:  The builder class is huge.
	Through it, you can configure bean/serializer/parser settings, define config files, children, 
		resource finders, info providers, etc...
</p>
</div><!-- END: 6.5 - juneau-rest-server.RestContext -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod' id='juneau-rest-server.RestMethod'>6.6 - @RestMethod</a></h3>
<div class='topic'><!-- START: 6.6 - juneau-rest-server.RestMethod -->
<p>
	REST Java methods are identified on REST servlets using the 
	{@link org.apache.juneau.rest.annotation.RestMethod @RestMethod} annotation. 
	The annotation allows the framework to identify the available REST methods through reflection.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
	<jk>public</jk> String sayHello() {
		<jk>return</jk> <js>"Hello world!"</js>;
	}
</p>

<p>
	When the <c>name</c> and/or <c>path</c> values are not specified, their values are inferred
	from the Java method name. 
</p>
<p>
	The HTTP method can be inferred from the Java method by starting the method name with any of the following:
</p>
<ul>
	<li><c>get</c>
	<li><c>put</c>
	<li><c>post</c>
	<li><c>delete</c>
	<li><c>options</c>
	<li><c>head</c>
	<li><c>trace</c>
	<li><c>patch</c>
</ul>
<p>
	If <c>path</c> is not defined, it's inferred from the Java method name (minus the prefix above).
</p>

<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Method="GET", path="/foo"</jc>
	<ja>@RestMethod</ja>
	<jk>public</jk> String getFoo() {...}
</p>
<p class='bpcode w800'>
	<jc>// Method="DELETE", path="/foo"</jc>
	<ja>@RestMethod</ja>
	<jk>public</jk> String deleteFoo() {...}
</p>
<p class='bpcode w800'>
	<jc>// Method="GET", path="/foo"</jc>
	<jc>// "GET" is default</jc>
	<ja>@RestMethod</ja>
	<jk>public</jk> String foo() {...}
</p>
<p class='bpcode w800'>
	<jc>// Method="GET", path="/"</jc>
	<ja>@RestMethod</ja>(path=<js>"/"</js>)
	<jk>public</jk> String foo() {...}
</p>
<p class='bpcode w800'>
	<jc>// Method="GET", path="/"</jc>
	<ja>@RestMethod</ja>
	<jk>public</jk> String get() {...}
</p>
<p class='bpcode w800'>
	<jc>// Method="POST", path="/"</jc>
	<ja>@RestMethod</ja>
	<jk>public</jk> String post() {...}
</p>

<p>
	If <c>name</c> and <c>path</c> are both specified, the Java method name can be anything.
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.MethodParameters' id='juneau-rest-server.RestMethod.MethodParameters'>6.6.1 - Java Method Parameters</a></h4>
<div class='topic'><!-- START: 6.6.1 - juneau-rest-server.RestMethod.MethodParameters -->
<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 class='spaced-list'>
			<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 <c>RestRequest</c>.
					<li class='jc'>{@link org.apache.juneau.rest.RestResponse} - The response object.
					<li class='jc'>{@link javax.servlet.http.HttpServletResponse} - The superclass of <c>RestResponse</c>.
				</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.RequestPath} - 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 <c><ja>@RestMethod</ja>(name=<js>"*"</js>)</c>)
					<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.parser.ReaderParser} - The reader parser matching the request content type.
					<li class='jc'>{@link org.apache.juneau.parser.InputStreamParser} - The input stream 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.http.annotation.Path} - Variables in matched URL path patterns.
			<li class='ja'>{@link org.apache.juneau.http.annotation.FormData} - Multipart form post parameter values.
			<li class='ja'>{@link org.apache.juneau.http.annotation.HasFormData} - Denotes whether the form data parameter exists.
			<li class='ja'>{@link org.apache.juneau.http.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.http.annotation.HasQuery} - Denotes whether the query parameter exists.
			<li class='ja'>{@link org.apache.juneau.http.annotation.Header} - A header value.
			<li class='ja'>{@link org.apache.juneau.http.annotation.Body} - The HTTP content parsed as a POJO.
			<li class='ja'>{@link org.apache.juneau.rest.annotation.Method} - The HTTP method name. 
			<li class='ja'>{@link org.apache.juneau.http.annotation.Request} - HTTP request parts available through a proxy bean interface.
			<li class='ja'>{@link org.apache.juneau.http.annotation.Response} - HTTP response parts available through a POJO.
			<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseHeader} - HTTP response header.
			<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseStatus} - HTTP response status code.
		</ul>
</ul>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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>(<js>"a1"</js>) String a1,
		<ja>@Path</ja>(<js>"a2"</js>) <jk>int</jk> a2,
		<ja>@Path</ja>(<js>"a3"</js>) 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>@Path</ja>(<js>"/*"</js>) 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>
<ul class='notes'>
	<li>All annotations have programmatic equivalents on the {@link org.apache.juneau.rest.RestRequest} class.
</ul>
<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_paramResolvers} - For configuring custom parameter types.
</ul>
</div><!-- END: 6.6.1 - juneau-rest-server.RestMethod.MethodParameters -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RestRequest' id='juneau-rest-server.RestMethod.RestRequest'>6.6.2 - RestRequest</a></h4>
<div class='topic'><!-- START: 6.6.2 - juneau-rest-server.RestMethod.RestRequest -->
<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.
	It can be accessed by passing it as a parameter on your REST Java method:
</p>
<p class='bpcode w800'>
	<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='javatree'>
	<li class='jc'><c>{@link org.apache.juneau.rest.RestRequest} <jk>extends</jk> HttpServletRequest</c>
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getHeaders() getHeaders()} - HTTP request headers.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getQuery() getQuery()} - Query parameters.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getFormData() getFormData()} - Form-data parameters.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getBody() getBody()} - HTTP request body.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getPathMatch() getPathMatch()} - Path match variables.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getLogger() getLogger()} - Logging.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getInfoProvider() getInfoProvider()} - Swagger documentation provider.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getSwagger() getSwagger()} - Generated Swagger information.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getConfig() getConfig()} - External configuration API.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getVarResolverSession() getVarResolverSession()} - String variable resolver.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getMessageBundle() getMessageBundle()} - Localized messages.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getProperties() getProperties()} - Configuration properties.
		<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getClasspathReaderResource(String,boolean,MediaType,boolean) getClasspathReaderResource(String,boolean,MediaType,boolean)} - Various methods for retrieving static files from classpath.
	</ul>
</ul>
</div><!-- END: 6.6.2 - juneau-rest-server.RestMethod.RestRequest -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RestResponse' id='juneau-rest-server.RestMethod.RestResponse'>6.6.3 - RestResponse</a></h4>
<div class='topic'><!-- START: 6.6.3 - juneau-rest-server.RestMethod.RestResponse -->
<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.
	It can be accessed by passing it as a parameter on your REST Java method:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RestResponse req) {...}			
</p>
<p>
	Some important methods on this class are:
</p>
<ul class='javatree'>
	<li class='jc'><c>{@link org.apache.juneau.rest.RestResponse} <jk>extends</jk> HttpServletResponse</c>
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.RestResponse#setOutput(Object) setOutput(Object)} - Set response output programmatically.
		<li class='jm'>{@link org.apache.juneau.rest.RestResponse#getHtmlDocBuilder() getHtmlDocBuilder()} - Set HTTP page contents programmatically.
		<li class='jm'>{@link org.apache.juneau.rest.RestResponse#getDirectWriter(String) getDirectWriter(String)} - Direct access to underlying response writer.
	</ul>
</ul>
</div><!-- END: 6.6.3 - juneau-rest-server.RestMethod.RestResponse -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RequestBody' id='juneau-rest-server.RestMethod.RequestBody'>6.6.4 - RequestBody</a></h4>
<div class='topic'><!-- START: 6.6.4 - juneau-rest-server.RestMethod.RequestBody -->
<p>
	The {@link org.apache.juneau.rest.RequestBody} object is the API for accessing the body of an HTTP request.
	It can be accessed by passing it as a parameter on your REST Java method:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestBody body) {...}			
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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>
	Some important methods on this class are:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.rest.RequestBody} 
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.RequestBody#getReader() getReader()} - Get body as a Reader.
		<li class='jm'>{@link org.apache.juneau.rest.RequestBody#getInputStream() getInputStream()} - Get body as an InputStream.
		<li class='jm'>{@link org.apache.juneau.rest.RequestBody#asType(Class) asType(Class)} - Get body converted to a POJO.
		<li class='jm'>{@link org.apache.juneau.rest.RequestBody#asType(Type,Type...) asType(Type,Type...)} - Get body converted to a map or collection of POJOs.
		<li class='jm'>{@link org.apache.juneau.rest.RequestBody#asString() asString()} - Get body as a simple string.
		<li class='jm'>{@link org.apache.juneau.rest.RequestBody#asHex() asHex()} - Get body as a hex-encoded string.
		<li class='jm'>{@link org.apache.juneau.rest.RequestBody#asSpacedHex() asSpacedHex()} - Get body as spaced-hex-encoded string.
	</ul>
</ul>

<ul class='seealso'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
</ul>
</div><!-- END: 6.6.4 - juneau-rest-server.RestMethod.RequestBody -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RequestHeaders' id='juneau-rest-server.RestMethod.RequestHeaders'>6.6.5 - RequestHeaders</a></h4>
<div class='topic'><!-- START: 6.6.5 - juneau-rest-server.RestMethod.RequestHeaders -->
<p>
	The {@link org.apache.juneau.rest.RequestHeaders} object is the API for accessing the headers of an HTTP request.
	It can be accessed by passing it as a parameter on your REST Java method:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestHeaders headers) {...}			
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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>
	Some important methods on this class are:
</p>
<ul class='javatree'>
	<li class='jc'><c>{@link org.apache.juneau.rest.RequestHeaders} <jk>extends</jk> TreeMap&lt;String,String[]&gt;</c>
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#get(String,Class) get(String,Class)} - Get header value converted to a POJO.
		<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#get(String,Type,Type...) get(String,Type,Type)} - Get header value converted to a map or collection of POJOs.
		<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#getString(String,String) getString(String,String)} - Get header value as a simple string.
		<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#getInt(String,int) getInt(String,int)} - Get header value as an integer.
		<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#getBoolean(String,boolean) getBoolean(String,boolean)} - Get header value as a boolean.
		<li class='jm'>{@link org.apache.juneau.rest.RequestHeaders#addDefault(String,Object) addDefault(String,Object)} - Programmatically set a default value for a header.
	</ul>
</ul>

<ul class='seealso'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Header}
</ul>
</div><!-- END: 6.6.5 - juneau-rest-server.RestMethod.RequestHeaders -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RequestAttributes' id='juneau-rest-server.RestMethod.RequestAttributes'>6.6.6 - RequestAttributes</a><span class='update'>8.1.0-new</span></h4>
<div class='topic'><!-- START: 6.6.6 - juneau-rest-server.RestMethod.RequestAttributes -->
<p>
	The {@link org.apache.juneau.rest.RequestAttributes} object is the API for accessing the standard servlet attributes on an HTTP request 
	(i.e. {@link javax.servlet.ServletRequest#getAttribute(String)}.
	It wraps the request attributes in a {@link java.util.Map} interface and provides several convenience methods.
</p>
<p>
	The <c>RequestAttributes</c> object extends from {@link org.apache.juneau.ObjectMap} so all the convenience methods defined on
	that API are also available when working with request attributes: 
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestAttributes attributes) {...}			
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestAttributes attributes) {

		<jc>// Add a default value.</jc>
		attributes.putIfNotExists(<js>"Foo"</js>, 123);
	
		<jc>// Get an attribute value as a POJO.</jc>
		UUID etag = attributes.get(<js>"ETag"</js>, UUID.<jk>class</jk>);
	}			
</p>
<p>
	Modifications made to request attributes through the <c>RequestAttributes</c> bean are automatically reflected in
	the underlying servlet request attributes making it possible to mix the usage of both APIs.
</p>
</div><!-- END: 6.6.6 - juneau-rest-server.RestMethod.RequestAttributes -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RequestQuery' id='juneau-rest-server.RestMethod.RequestQuery'>6.6.7 - RequestQuery</a></h4>
<div class='topic'><!-- START: 6.6.7 - juneau-rest-server.RestMethod.RequestQuery -->
<p>
	The {@link org.apache.juneau.rest.RequestQuery} object is the API for accessing the GET query parameters of an HTTP request.
	It can be accessed by passing it as a parameter on your REST Java method:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestQuery query) {...}			
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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.
	This can be useful in cases where you're mixing GET parameters and FORM POSTS and you don't want to 
	inadvertently read the body of the request to get a query parameter.
</p>
<p>
	Some important methods on this class are:
</p>
<ul class='javatree'>
	<li class='jc'><c>{@link org.apache.juneau.rest.RequestQuery} <jk>extends</jk> LinkedHashMap&lt;String,String[]&gt;</c>
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#get(String,Class) get(String,Class)} - Get query parameter value converted to a POJO.
		<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#get(String,Type,Type...) get(String,Type,Type)} - Get query parameter value converted to a map or collection of POJOs.
		<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#getString(String,String) getString(String,String)} - Get query parameter value as a simple string.
		<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#getInt(String,int) getInt(String,int)} - Get query parameter value as an integer.
		<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#getBoolean(String,boolean) getBoolean(String,boolean)} - Get query parameter value as a boolean.
		<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#addDefault(String,Object) addDefault(String,Object)} - Programmatically set a default value for a query parameter.
		<li class='jm'>{@link org.apache.juneau.rest.RequestQuery#getSearchArgs() getSearchArgs()} - Returns query parameter search arguments.
	</ul>
</ul>

<ul class='seealso'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Query}
	<li class='ja'>{@link org.apache.juneau.http.annotation.HasQuery}
</ul>
</div><!-- END: 6.6.7 - juneau-rest-server.RestMethod.RequestQuery -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RequestFormData' id='juneau-rest-server.RestMethod.RequestFormData'>6.6.8 - RequestFormData</a></h4>
<div class='topic'><!-- START: 6.6.8 - juneau-rest-server.RestMethod.RequestFormData -->
<p>
	The {@link org.apache.juneau.rest.RequestFormData} object is the API for accessing the HTTP request body as form data.
	It can be accessed by passing it as a parameter on your REST Java method:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestFormData query) {...}			
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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>
	Some important methods on this class are:
</p>
<ul class='javatree'>
	<li class='jc'><c>{@link org.apache.juneau.rest.RequestFormData} <jk>extends</jk> LinkedHashMap&lt;String,String[]&gt;</c>
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#get(String,Class) get(String,Class)} - Get form-data parameter values converted to a POJO.
		<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#get(String,Type,Type...) get(String,Type,Type)} - Get form-data parameter value converted to a map or collection of POJOs.
		<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#getString(String,String) getString(String,String)} - Get form-data parameter value as a simple string.
		<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#getInt(String,int) getInt(String,int)} - Get form-data parameter value as an integer.
		<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#getBoolean(String,boolean) getBoolean(String,boolean)} - Get form-data parameter value as a boolean.
		<li class='jm'>{@link org.apache.juneau.rest.RequestFormData#addDefault(String,Object) addDefault(String,Object)} - Programmatically set a default value for a form-data parameter.
	</ul>
</ul>

<ul class='seealso'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData}
	<li class='ja'>{@link org.apache.juneau.http.annotation.HasFormData}
</ul>
</div><!-- END: 6.6.8 - juneau-rest-server.RestMethod.RequestFormData -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RestMethodPath' id='juneau-rest-server.RestMethod.RestMethodPath'>6.6.9 - @RestMethod(path)</a></h4>
<div class='topic'><!-- START: 6.6.9 - juneau-rest-server.RestMethod.RestMethodPath -->
<p>
	The {@link org.apache.juneau.rest.annotation.RestMethod#path() @RestMethod(path)} annotation allows 
	you to define URL path patterns to match against.
	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.
	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='bpcode w800'>
	<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>(<js>"foo"</js>) String foo, <ja>@Path</ja>(<js>"bar"</js>) <jk>int</jk> bar, <ja>@Path</ja>(<js>"baz"</js>) MyEnum baz, <ja>@Path</ja>(<js>"bing"</js>) UUID bing) {
		...
	}
</p>
<p>
	By default, path patterns are matched using a best-match heuristic. 
	When overlaps occur, URLs are matched from most-specific to most-general order:
</p>
<p class='bpcode w800'>
	<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.
	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.  
	Any remainder after the match can be accessed through 
	{@link org.apache.juneau.rest.RequestPath#getRemainder()} or parameters with the 
	<c><ja>@Path</ja>(<js>"/*"</js>)</c> annotation.
	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='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/*"</js>)
	<jk>public void</jk> doGet(<ja>@Path</ja>(<js>"/*"</js>) 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 {@doc PojoCategories parsable} type.
	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='bpcode w800'>
	<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>
<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_path}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Path}
	<li class='jc'>{@link org.apache.juneau.rest.RequestPath}
</ul>
</div><!-- END: 6.6.9 - juneau-rest-server.RestMethod.RestMethodPath -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RequestPathMatch' id='juneau-rest-server.RestMethod.RequestPathMatch'>6.6.10 - RequestPathMatch</a></h4>
<div class='topic'><!-- START: 6.6.10 - juneau-rest-server.RestMethod.RequestPathMatch -->
<p>
	The {@link org.apache.juneau.rest.RequestPath} object is the API for accessing the matched variables
	and remainder on the URL path.
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(...)
	<jk>public</jk> Object myMethod(RequestPathMatch path) {...}			
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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>
	Some important methods on this class are:
</p>
<ul class='javatree'>
	<li class='jc'><c>{@link org.apache.juneau.rest.RequestPath} <jk>extends</jk> TreeMap&lt;String,String&gt;</c>
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.RequestPath#get(String,Class) get(String,Class)} - Get path match variable converted to a POJO.
		<li class='jm'>{@link org.apache.juneau.rest.RequestPath#get(String,Type,Type...) get(String,Type,Type)} - Get path match variable converted to a map or collection of POJOs.
		<li class='jm'>{@link org.apache.juneau.rest.RequestPath#getString(String) getString(String)} - Get patch match variable as a simple string.
		<li class='jm'>{@link org.apache.juneau.rest.RequestPath#getInt(String) getInt(String)} - Get path match variable as an integer.
		<li class='jm'>{@link org.apache.juneau.rest.RequestPath#getBoolean(String) getBoolean(String)} - Get path match variable as a boolean.
		<li class='jm'>{@link org.apache.juneau.rest.RequestPath#getRemainder() getRemainder()} - Get the path match remainder.
	</ul>
</ul>

<ul class='seealso'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Path}
</ul>
</div><!-- END: 6.6.10 - juneau-rest-server.RestMethod.RequestPathMatch -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.MethodReturnTypes' id='juneau-rest-server.RestMethod.MethodReturnTypes'>6.6.11 - Method Return Types</a></h4>
<div class='topic'><!-- START: 6.6.11 - juneau-rest-server.RestMethod.MethodReturnTypes -->
<p>
	The return type can be any serializable POJO as defined in {@doc PojoCategories}.
	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='bpcode w800'>
	<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.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='javatree'>
	<li class='jic'>{@link org.apache.juneau.rest.ResponseHandler}
	<ul>
		<li class='jc'>{@link org.apache.juneau.rest.reshandlers.DefaultHandler}
		<li class='jc'>{@link org.apache.juneau.rest.reshandlers.InputStreamHandler}
		<li class='jc'>{@link org.apache.juneau.rest.reshandlers.ReaderHandler}
	</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='bpcode w800'>
	<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>(<js>"personId"</js>) 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>(<js>"personId"</js>) 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>(<js>"personId"</js>) 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>
<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_responseHandlers} - For configuring custom response handlers.
</ul>
</div><!-- END: 6.6.11 - juneau-rest-server.RestMethod.MethodReturnTypes -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.ReaderResource' id='juneau-rest-server.RestMethod.ReaderResource'>6.6.12 - ReaderResource</a></h4>
<div class='topic'><!-- START: 6.6.12 - juneau-rest-server.RestMethod.ReaderResource -->
<p>
	The {@link org.apache.juneau.http.ReaderResource} class is a convenience object for defining thread-safe
	reusable character-based responses.
	In essence, it's a container for character data with optional response headers and support for
	resolving SVL variables.
</p>

<p>
	The class is annotated with {@link org.apache.juneau.http.annotation.Response @Response}
	which allows it to be returned as responses by REST methods.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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>
</div><!-- END: 6.6.12 - juneau-rest-server.RestMethod.ReaderResource -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.StreamResource' id='juneau-rest-server.RestMethod.StreamResource'>6.6.13 - StreamResource</a></h4>
<div class='topic'><!-- START: 6.6.13 - juneau-rest-server.RestMethod.StreamResource -->
<p>
	The {@link org.apache.juneau.http.StreamResource} class is the binary equivalent to the {@link org.apache.juneau.http.ReaderResource} object.
	In essence, it's a container for binary data with optional response headers.
</p>
<p>
	The class is annotated with {@link org.apache.juneau.http.annotation.Response @Response}
	which allows it to be returned as responses by REST methods.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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>
</div><!-- END: 6.6.13 - juneau-rest-server.RestMethod.StreamResource -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.RestMethodMatchers' id='juneau-rest-server.RestMethod.RestMethodMatchers'>6.6.14 - @RestMethod(matchers)</a></h4>
<div class='topic'><!-- START: 6.6.14 - juneau-rest-server.RestMethod.RestMethodMatchers -->
<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='bpcode w800'>
	<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='bpcode w800'>
	<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>

<ul class='notes'>
	<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>

<ul class='seealso'>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#matchers RestMethod(matchers)}
	<li class='jc'>{@link org.apache.juneau.rest.matchers.MultipartFormDataMatcher}
	<li class='jc'>{@link org.apache.juneau.rest.matchers.UrlEncodedFormMatcher}
</ul>
</div><!-- END: 6.6.14 - juneau-rest-server.RestMethod.RestMethodMatchers -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.PredefinedResponses' id='juneau-rest-server.RestMethod.PredefinedResponses'>6.6.15 - Predefined Responses</a></h4>
<div class='topic'><!-- START: 6.6.15 - juneau-rest-server.RestMethod.PredefinedResponses -->
<p>
	Predefined response beans are provided for all standard HTTP responses.
	These can be used as-is or extended to provide customized HTTP responses. 
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"POST"</js>, path=<js>"/pets"</js>)
	<jk>public</jk> Ok addPet(<ja>@Body</ja> Pet pet) {
		<jsm>addPet</jsm>(Pet);
		
		<jc>// Predefined "200 OK" response bean.</jc>
		<jk>return new</jk> Ok();  <jc>// Could also use Ok.OK instance</jc> 
	}
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"POST"</js>, path=<js>"/pets"</js>)
	<jk>public</jk> SeeOther addPet(<ja>@Body</ja> Pet pet) {
		<jsm>addPet</jsm>(Pet);
		
		<jc>// Predefined "302 See Other" response bean with redirect to /pets.</jc>
		<jk>return new</jk> SeeOther(<js>"servlet:/pets"</js>);  
	}
</p>
<ul class='javatree'>
	<li class='jp'>{@link org.apache.juneau.http.response}
	<ul>
		<li class='jc'>{@link org.apache.juneau.http.response.Accepted}
		<li class='jc'>{@link org.apache.juneau.http.response.AlreadyReported}
		<li class='jc'>{@link org.apache.juneau.http.response.Continue}
		<li class='jc'>{@link org.apache.juneau.http.response.Created}
		<li class='jc'>{@link org.apache.juneau.http.response.EarlyHints}
		<li class='jc'>{@link org.apache.juneau.http.response.Found}
		<li class='jc'>{@link org.apache.juneau.http.response.IMUsed}
		<li class='jc'>{@link org.apache.juneau.http.response.MovedPermanently}
		<li class='jc'>{@link org.apache.juneau.http.response.MultipleChoices}
		<li class='jc'>{@link org.apache.juneau.http.response.MultiStatus}
		<li class='jc'>{@link org.apache.juneau.http.response.NoContent}
		<li class='jc'>{@link org.apache.juneau.http.response.NonAuthoritiveInformation}
		<li class='jc'>{@link org.apache.juneau.http.response.NotModified}
		<li class='jc'>{@link org.apache.juneau.http.response.Ok}
		<li class='jc'>{@link org.apache.juneau.http.response.PartialContent}
		<li class='jc'>{@link org.apache.juneau.http.response.PermanentRedirect}
		<li class='jc'>{@link org.apache.juneau.http.response.Processing}
		<li class='jc'>{@link org.apache.juneau.http.response.ResetContent}
		<li class='jc'>{@link org.apache.juneau.http.response.SeeOther}
		<li class='jc'>{@link org.apache.juneau.http.response.SwitchingProtocols}
		<li class='jc'>{@link org.apache.juneau.http.response.TemporaryRedirect}
		<li class='jc'>{@link org.apache.juneau.http.response.UseProxy}
	</ul>
</ul>
<p>
	These predefined response beans are an example of {@link org.apache.juneau.http.annotation.Response @Response}-annotated 
	objects that are describe in detail later.
	Without going into details, this is how the {@link org.apache.juneau.http.response.SeeOther} is defined:
</p>
<p class='bpcode w800'>
	<ja>@Response</ja>(
		code=303  <jc>// Set automatically on response</jc>,
		description=<js>"See Other"</js> <jc>// Used in generated Swagger</jc>
	)
	<jk>public class</jk> SeeOther {

		<jk>private final</jk> String <jf>message</jf>;
		<jk>private final</jk> URI <jf>location</jf>;

		<jc>// Constructors omitted.</jc>	

		<jc>// Used to populate Location response header.</jc>	
		<ja>@ResponseHeader</ja>(name=<js>"Location"</js>)
		<jk>public</jk> URI getLocation() {
			<jk>return</jk> <jf>location</jf>;
		}
	
		<jc>// Used during serialization.</jc>	
		<ja>@ResponseBody</ja>
		<jk>public</jk> String toString() {
			<jk>return</jk> <jf>message</jf>;
		}
	}
</p>
<p>
	The {@link org.apache.juneau.rest.helper.SeeOtherRoot} class shows how these predefined beans can be extended.
</p>
<p class='bpcode w800'>
	<ja>@Response</ja>(
		description=<js>"Redirect to servlet root"</js> <jc>// Override description in generated Swagger.</jc>
	)
	<jk>public class</jk> SeeOtherServletRoot <jk>extends</jk> SeeOther {
	
		<jk>public</jk> SeeOtherServletRoot() {
			<jk>super</jk>(URI.create("servlet:/"));
		}
	}
</p>
<p>
	Note that the runtime behavior of the following code is identical to the example above.
	However, the important distinction is that in the previous example, the 302 response would show in
	the generated Swagger (since we can see the response through reflection), whereas it will NOT show up
	in the following example (since all we see is an Object response). 
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"POST"</js>, path=<js>"/pets"</js>)
	<jk>public</jk> Object addPet(<ja>@Body</ja> Pet pet) {
		<jsm>addPet</jsm>(Pet);
		
		<jc>// Note the Object return type.</jc>
		<jk>return new</jk> SeeOther(<js>"servlet:/pets"</js>);  
	}
</p>
</div><!-- END: 6.6.15 - juneau-rest-server.RestMethod.PredefinedResponses -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.PredefinedExceptions' id='juneau-rest-server.RestMethod.PredefinedExceptions'>6.6.16 - Predefined Exceptions</a></h4>
<div class='topic'><!-- START: 6.6.16 - juneau-rest-server.RestMethod.PredefinedExceptions -->
<p>
	Exceptions are defined for all standardized HTTP responses.
	These can be used to trigger HTTP errors simply by throwing an exception.
</p>
<p>
	These are identical in behavior to the Predefined Responses in the previous section, except these are meant
	to be thrown instead of returned.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/user/login"</js>)
	<jk>public</jk> Ok login(
		<ja>@FormData</ja>(<js>"username"</js>) String username, 
		<ja>@FormData</ja>(<js>"password"</js>) String password,
	) <jk>throws</jk> Unauthorized 
	{
		<jk>if</jk> (! <jsm>isOK</jsm>(username, password))
			<jk>throw new</jk> Unauthorized(<js>"You're not welcome!"</js>);
			
		<jk>return</jk> Ok.<jsf>OK</jsf>;
	}
</p>
<ul class='javatree'>
	<li class='jp'>{@link org.apache.juneau.http.exception}
	<ul>
		<li class='jc'>{@link org.apache.juneau.http.exception.BadRequest}
		<li class='jc'>{@link org.apache.juneau.http.exception.Conflict}
		<li class='jc'>{@link org.apache.juneau.http.exception.ExpectationFailed}
		<li class='jc'>{@link org.apache.juneau.http.exception.FailedDependency}
		<li class='jc'>{@link org.apache.juneau.http.exception.Forbidden}
		<li class='jc'>{@link org.apache.juneau.http.exception.Gone}
		<li class='jc'>{@link org.apache.juneau.http.exception.HttpVersionNotSupported}
		<li class='jc'>{@link org.apache.juneau.http.exception.InsufficientStorage}
		<li class='jc'>{@link org.apache.juneau.http.exception.InternalServerError}
		<li class='jc'>{@link org.apache.juneau.http.exception.LengthRequired}
		<li class='jc'>{@link org.apache.juneau.http.exception.Locked}
		<li class='jc'>{@link org.apache.juneau.http.exception.LoopDetected}
		<li class='jc'>{@link org.apache.juneau.http.exception.MethodNotAllowed}
		<li class='jc'>{@link org.apache.juneau.http.exception.MisdirectedRequest}
		<li class='jc'>{@link org.apache.juneau.http.exception.NetworkAuthenticationRequired}
		<li class='jc'>{@link org.apache.juneau.http.exception.NotAcceptable}
		<li class='jc'>{@link org.apache.juneau.http.exception.NotExtended}
		<li class='jc'>{@link org.apache.juneau.http.exception.NotFound}
		<li class='jc'>{@link org.apache.juneau.http.exception.NotImplemented}
		<li class='jc'>{@link org.apache.juneau.http.exception.PayloadTooLarge}
		<li class='jc'>{@link org.apache.juneau.http.exception.PreconditionFailed}
		<li class='jc'>{@link org.apache.juneau.http.exception.PreconditionRequired}
		<li class='jc'>{@link org.apache.juneau.http.exception.RangeNotSatisfiable}
		<li class='jc'>{@link org.apache.juneau.http.exception.RequestHeaderFieldsTooLarge}
		<li class='jc'>{@link org.apache.juneau.http.exception.ServiceUnavailable}
		<li class='jc'>{@link org.apache.juneau.http.exception.TooManyRequests}
		<li class='jc'>{@link org.apache.juneau.http.exception.Unauthorized}
		<li class='jc'>{@link org.apache.juneau.http.exception.UnavailableForLegalReasons}
		<li class='jc'>{@link org.apache.juneau.http.exception.UnprocessableEntity}
		<li class='jc'>{@link org.apache.juneau.http.exception.UnsupportedMediaType}
		<li class='jc'>{@link org.apache.juneau.http.exception.UpgradeRequired}
		<li class='jc'>{@link org.apache.juneau.http.exception.UriTooLong}
		<li class='jc'>{@link org.apache.juneau.http.exception.VariantAlsoNegotiates}
	</ul>
</ul>
<p>
	These exception extend from {@link java.lang.RuntimeException}, so they can optionally be specified in the thrown
	declaration of the method.
	The important distinction is that when part of the thrown declaration, they show up in the generated Swagger
	documentation, whereas they don't if not.  This behavior can be used to define what error conditions show in your Swagger doc.
</p>
</div><!-- END: 6.6.16 - juneau-rest-server.RestMethod.PredefinedExceptions -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestMethod.PredefinedHelperBeans' id='juneau-rest-server.RestMethod.PredefinedHelperBeans'>6.6.17 - Predefined Helper Beans</a></h4>
<div class='topic'><!-- START: 6.6.17 - juneau-rest-server.RestMethod.PredefinedHelperBeans -->
<p>
	The {@link org.apache.juneau.rest.helper} package contains several predefined beans to help when constructing
	REST interfaces.
</p>
<ul class='javatree'>
	<li class='jp'>{@link org.apache.juneau.rest.helper}
	<ul>
		<li class='jc'>{@link org.apache.juneau.rest.helper.BeanDescription}
		<li class='jc'>{@link org.apache.juneau.rest.helper.ChildResourceDescriptions}
		<li class='jc'>{@link org.apache.juneau.rest.helper.ResourceDescription}
		<li class='jc'>{@link org.apache.juneau.rest.helper.ResourceDescriptions}
		<li class='jc'>{@link org.apache.juneau.rest.helper.SeeOtherRoot}
	</ul>
</ul>

<h5 class='topic'>ResourceDescription, ResourceDescrptions</h5>
<p>
	The {@link org.apache.juneau.rest.helper.ResourceDescription} class is a bean with name/description
	properties for labeling and linking to child resources.
	The following examples is pulled from the REST examples:
</p>
<p class='bpcode w800'>
	<ja>@Resource</ja>
	<jk>public class</jk> PredefinedLabelsResource {
	
		<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='bpcode w800'>
	<jk>public class</jk> ResourceDescription {

		<jc>// Renders as hyperlink when serialized as HTML.</jc>
		<ja>@Html</ja>(link=<js>"servlet:/{name}"</js>)
		<jk>public</jk> String getName() {...}
		
		<jk>public</jk> String getDescription() {...}
	}
</p>
<p>
	{@link org.apache.juneau.rest.helper.ResourceDescriptions} is a convenience class for doing the same.
	The example above can also be written as follows (which you'll notice is more concise):
</p>
<p class='bpcode w800'>
	<ja>@Resource</ja>
	<jk>public class</jk> PredefinedLabelsResource {
	
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
		<jk>public</jk> ResourceDescriptions getChildMethods() {
			<jk>return new</jk> ResourceDescriptions()
				.append(<js>"beanDescription"</js>, <js>"BeanDescription"</js>)
				.append(<js>"htmlLinks"</js>, <js>"HtmlLink"</js>);
		}
	}
</p>
<h5 class='topic'>@HtmlLink, LinkString</h5>
<p>
	The {@link org.apache.juneau.html.annotation.HtmlLink @HtmlLink} annotation can also be useful
	for rendering custom hyperlinks:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>
	<jk>public</jk> MyLink[] htmlLinks() {
		<jk>return new</jk> MyLink[] {
			<jk>new</jk> MyLink(<js>"apache"</js>, <js>"http://apache.org"</js>),
			<jk>new</jk> MyLink(<js>"juneau"</js>, <js>"http://juneau.apache.org"</js>)
		};
	}
</p>
<p class='bpcode w800'>
	<ja>@HtmlLink</ja>(nameProperty=<js>"name"</js>, hrefProperty=<js>"href"</js>)
	<jk>public class</jk> MyLink {
	
		<jc>// Simple bean properties.</jc>
		<jk>public</jk> String <jf>name</jf>, <jf>href</jf>;  
	
		<jk>public</jk> MyLink(String name, String href) {
			<jk>this</jk>.<jf>name</jf> = name;
			<jk>this</jk>.<jf>href</jf> = href;
		}
	}
</p>			
<p>
	The {@link org.apache.juneau.dto.LinkString LinkString} bean is a predefined <ja>@HtmlLink</ja> bean provided
	to simplify specifying actions.
	The following is equivalent to above.
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>
	<jk>public</jk> LinkString[] htmlLinks() {
		<jk>return new</jk> LinkString[] {
			<jk>new</jk> LinkString(<js>"apache"</js>, <js>"http://apache.org"</js>),
			<jk>new</jk> LinkString(<js>"juneau"</js>, <js>"http://juneau.apache.org"</js>)
		};
	}
</p>			
<p>
	Both examples render the following consisting of a list of hyperlinks:
</p>
<img class='bordered' src='doc-files/juneau-rest-server.PredefinedLabelBeans.3.png' style='width:92px'/>
<p>
	In all other languages, it gets serialized as a simple bean with two properties.
</p>

<h5 class='topic'>BeanDescription</h5>
<p>
	The {@link org.apache.juneau.rest.helper.BeanDescription} class provides a simple view
	of a bean and it's properties.
</p>
<p class='bpcode w800'>
	<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'/>

<h5 class='topic'>ChildResourceDescriptions</h5>
<p>
	The {@link org.apache.juneau.rest.helper.ChildResourceDescriptions} is a convenience bean for generating
	a table of child resources.
</p>
<p>
	The {@link org.apache.juneau.rest.BasicRestServletGroup} class uses this to generate router pages:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>
	<jk>public abstract class</jk> BasicRestServletGroup <jk>extends</jk> BasicRestServlet {
	
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>, summary=<js>"Navigation page"</js>)
		<jk>public</jk> ChildResourceDescriptions getChildren(RestRequest req) <jk>throws</jk> Exception {
			<jk>return new</jk> ChildResourceDescriptions(req);
		}
	}
</p>
<p>
	Note that all it requires is a {@link org.apache.juneau.rest.RestRequest} object and it will generate a router
	page using reflection against the resource class.
</p>
<p>
	For example, the <c>RootResources</c> page in the REST examples renders the child resources attached to the root resource:
</p>
<img class='bordered' src='doc-files/juneau-rest-server.PredefinedLabelBeans.4.png' style='width:800px'/>
<p>
	The <c>RootResources</c> page consists of the following and extends from the {@link org.apache.juneau.rest.BasicRestServletGroup} class:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		...
		children={
			HelloWorldResource.<jk>class</jk>,
			PetStoreResource.<jk>class</jk>,
			DtoExamples.<jk>class</jk>,
			PhotosResource.<jk>class</jk>,
			SqlQueryResource.<jk>class</jk>,
			ConfigResource.<jk>class</jk>,
			LogsResource.<jk>class</jk>,
			DebugResource.<jk>class</jk>,
			ShutdownResource.<jk>class</jk>
		}
	)
	<jk>public class</jk> RootResources <jk>extends</jk> BasicRestServletJenaGroup {}
</p>

<h5 class='topic'>SeeOtherRoot</h5>
<p>
	The {@link org.apache.juneau.rest.helper.SeeOtherRoot} class can be used to redirect to the root URI
	of a resource class.
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"POST"</js>, path=<js>"/pets"</js>)
	<jk>public</jk> SeeOtherRoot addPet(<ja>@Body</ja> Pet pet) {
		<jsm>addPet</jsm>(Pet);
		
		<jc>// Redirects to the servlet root URL.</jc>
		<jk>return</jk> SeeOtherRoot.INSTANCE;  
	}
</p>
<p>
	The runtime behavior is the same as the following:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"POST"</js>, path=<js>"/pets"</js>)
	<jk>public</jk> SeeOther addPet(<ja>@Body</ja> Pet pet) {
		<jsm>addPet</jsm>(Pet);
		
		<jc>// Redirects to the servlet root URL.</jc>
		<jk>return new</jk> SeeOther(URI.<jsm>create</jsm>(<js>"servlet:/"</js>));  
	}
</p>
<p>
	One distinction is that the former defines the description <js>"Redirect to servlet root"</js> in the generated Swagger documentation.
</p>
</div><!-- END: 6.6.17 - juneau-rest-server.RestMethod.PredefinedHelperBeans -->
</div><!-- END: 6.6 - juneau-rest-server.RestMethod -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.restRPC' id='juneau-rest-server.restRPC'>6.7 - restRPC</a><span class='update'>8.0.0-updated</span></h3>
<div class='topic'><!-- START: 6.7 - juneau-rest-server.restRPC -->
<p>
	The restRPC (RPC over REST) API allows the creation of client-side remote proxy interfaces for calling methods on server-side POJOs using entirely REST.
</p>

<h5 class='topic'>Remote Interfaces</h5>
<p>
	The following example shows a remote interface:
</p>
<p class='bpcode w800'>
	<ja>@RemoteInterface</ja> <jc>// Annotation is optional</jc>
	<jk>public interface</jk> IAddressBook {

		<jk>void</jk> init() <jk>throws</jk> Exception;
	
		List&lt;Person&gt; getPeople();
	
		List&lt;Address&gt; getAddresses();
	
		<jk>int</jk> 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);
	
		Person removePerson(<jk>int</jk> id);
	}
</p>			
<p>
	The requirements for a remote interface method are:
</p>
<ul class='spaced-list'>
	<li>
		Must be public.
	<li>
		Can be called anything.
	<li>
		Can have any number of {@doc PojoCategories serializable and parsable} parameters.
	<li>
		Can return a {@doc PojoCategories serializable and parsable} value.
	<li>
		Can throw any <c>Throwables</c>.
</ul>
<p>
	Throwables with public no-arg or single-arg-string constructors are automatically recreated on the client side
	when thrown on the server side.
</p>

<h5 class='topic'>Client side</h5>
<p>
	Remote Interface proxies are instantiated on the client side using one of the following methods:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.rest.client.RestClient}
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.client.RestClient#getRrpcInterface(Class) getRrpcInterface(Class)}
		<li class='jm'>{@link org.apache.juneau.rest.client.RestClient#getRrpcInterface(Class,Object) getRrpcInterface(Class,Object)}
		<li class='jm'>{@link org.apache.juneau.rest.client.RestClient#getRrpcInterface(Class,Object,Serializer,Parser) getRrpcInterface(Class,Object,Serializer,Parser)}
	</ul>
</ul>
<p>
	Since we build upon the existing <c>RestClient</c> 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 <c>HttpClient</c> for 
	handling various scenarios involving authentication and Internet proxies.
</p>
<p>
	Here's an example of the above interface being used:
</p>
<p class='bpcode w800'>
	<jc>// Create a RestClient using JSON for serialization, and point to the server-side remote interface servlet.</jc>
	RestClient client = RestClient.<jsm>create</jsm>()
		.json()
		.rootUrl(<js>"http://localhost:10000/remote"</js>)
		.build();
	
	<jc>// Create a proxy interface.</jc>
	IAddressBook ab = client.getRrpcInterface(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='bpcode w800'>
	HTTP POST http://localhost:10000/remote/org.apache.juneau.examples.addressbook.IAddressBook/createPerson(org.apache.juneau.examples.addressbook.Person)
	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>

<h5 class='topic'>Server side</h5>
<p>
	There are two ways to expose remote interfaces on the server side:
</p>
<ol class='spaced-list'>
	<li>
		Extending from {@link org.apache.juneau.rest.remote.RrpcServlet}.
	<li>
		Using a <c><ja>@RestMethod</ja>(name=<jsf>RRPC</jsf>)</c> annotation on a Java method.
</ol>
<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 remote interface service can be made directly from
	a browser with no coding involved.
</p>

<h5 class='topic'>RrpcServlet</h5>
<p>
	The {@link org.apache.juneau.rest.remote.RrpcServlet} class is a simple specialized servlet with an abstract 
	<c>getServiceMap()</c> method to define the server-side POJOs:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/remote"</js>
	)
	<jk>public class</jk> SampleRrpcServlet <jk>extends</jk> RrpcServlet {
	
		<jc>// Our server-side POJO.</jc>
		<jk>private</jk> AddressBook <jf>addressBook</jf> = <jk>new</jk> AddressBook();
	
		<ja>@Override</ja> <jc>/* RrpcServlet */</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>

<h5 class='topic'>@RestMethod(name=RRPC)</h5>
<p>
	The <c><ja>@RestMethod</ja>(name=<jsf>RRPC</jsf>)</c> 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='bpcode w800'>
	<jc>// Our exposed interface.</jc>
	<ja>@RestMethod</ja>(name=<jsf>RRPC</jsf>, path=<js>"/addressbookproxy/*"</js>)
	<jk>public</jk> IAddressBook getProxy() {
		<jk>return</jk> addressBook;
	}
</p>

<h5 class='topic'>RrpcServlet in a browser</h5>
<p>
	If you point your browser to the servlet above, you get a list of available interfaces:
</p>
<p class='bpcode w800'>
	http://localhost:10000/remote
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.restRPC.1.png'>
<p>
	Clicking the hyperlinks on each shows you the list of methods that can be invoked on that service.
	Note that the <c>IAddressBook</c> link shows that you can only invoke methods defined on that
	interface, whereas the <c>AddressBook</c> link shows ALL public methods defined on that class.
</p>
<h5 class='figure'>IAddressBook</h5>
<p class='bpcode w800'>
	http://localhost:10000/remote/org.apache.juneau.examples.addressbook.IAddressBook
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.restRPC.2.png'>
<p>
	Since <c>AddressBook</c> extends from <c>LinkedList</c>, you may notice familiar collections
	framework methods listed.
</p>
<h5 class='figure'>AddressBook</h5>
<p class='bpcode w800'>
	http://localhost:10000/remote/org.apache.juneau.examples.addressbook.AddressBook
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.restRPC.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='bpcode w800'>
	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 = SimpleJsonSerializer.<jsf>DEFAULT_READABLE</jsf>.toString(args);
	System.<jsf>err</jsf>.println(asJson);
</p>
<p>
	That produces the following JSON output:
</p>
<p class='bpcode w800'>
	[
		{
			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 the following URL:
</p>
<p class='bpcode w800'>
	http://localhost:10000/remote/org.apache.juneau.examples.addressbook.IAddressBook/createPerson(org.apache.juneau.examples.addressbook.CreatePerson)
</p>
<p>
	Make sure that we specify the <c>Content-Type</c> of the body as <c>text/json</c>.
	We also want the results to be returned as JSON, so we set the <c>Accept</c> header to 
	<c>text/json</c> as well.
</p>
<img class='bordered w400' src='doc-files/juneau-rest-server.restRPC.4.png'>
<p>
	When we execute the POST, we should see the following successful response whose body contains the returned 
	<c>Person</c> bean serialized to JSON:
</p>
<img class='bordered w400' src='doc-files/juneau-rest-server.restRPC.5.png'>
<p>
	From there, we could use the following code snippet to reconstruct the response object from JSON:
</p>
<p class='bpcode w800'>
	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='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/remote"</js>,
		
		<jc>// Allow us to use method=POST from a browser.</jc>
		allowedMethodParams=<js>"*"</js>
	)
	<jk>public class</jk> SampleRrpcServlet <jk>extends</jk> RrpcServlet {
</p>
<p>
	For example, to invoke the <c>getPeople()</c> method on our bean:
</p>
<p class='bpcode w800'>
	http://localhost:10000/remote/org.apache.juneau.examples.addressbook.IAddressBook/getPeople?method=POST
</p>			
<img class='bordered w800' src='doc-files/juneau-rest-server.restRPC.6.png'>
<p>
	Here we call the <c>findPerson(<jk>int</jk>)</c> method to retrieve a person and get the 
	returned POJO (in this case as HTML since that's what's in the <c>Accept</c> header when calling from a 
	browser):
</p>
<p class='bpcode w800'>
	http://localhost:10000/remote/org.apache.juneau.examples.addressbook.IAddressBook/findPerson(int)?method=POST&amp;body=@(3)
</p>			
<img class='bordered w800' src='doc-files/juneau-rest-server.restRPC.7.png'>
<p>
	When specifying the POST body as a <c>&amp;body</c> 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 <c>&amp;Content-Type=text/json</c> in the URL parameters
	but passing in unencoded JSON in a URL may not work in all browsers.  
	Therefore, UON is preferred.
</p>
<p>
	The hyperlinks on the method names above lead you to a simple form-entry page where you can test
	passing parameters in UON notation as URL-encoded form posts.
</p>
<h5 class='figure'>Sample form entry page</h5>
<img class='bordered w800' src='doc-files/juneau-rest-server.restRPC.8.png'>
<h5 class='figure'>Sample form entry page results</h5>
<img class='bordered w800' src='doc-files/juneau-rest-server.restRPC.9.png'>
</div><!-- END: 6.7 - juneau-rest-server.restRPC -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.OpenApiSchemaPartParsing' id='juneau-rest-server.OpenApiSchemaPartParsing'>6.8 - OpenAPI Schema Part Parsing</a></h3>
<div class='topic'><!-- START: 6.8 - juneau-rest-server.OpenApiSchemaPartParsing -->
<p>
	Parameters annotated with any of the following are parsed using the registered {@link org.apache.juneau.oapi.OpenApiParser} and
	therefore support OpenAPI syntax and validation:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Header}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Query}
	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Path}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Body} (<c>Content-Type</c> must match <js>"text/openapi"</js>)
</ul>
<p>
	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) in a query parameter can be converted to a 2-dimensional array of <c>Longs</c>:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"GET"</js>, path=<js>"/testQuery"</js>)	
	<jk>public void</jk> testQuery(
		<ja>@Query</ja>(
			name=<js>"queryParamName"</js>,
			collectionFormat=<js>"pipes"</js>,
			items=<ja>@SubItems</ja>(
				collectionFormat=<js>"csv"</js>,
				type=<js>"integer"</js>, 
				format=<js>"int64"</js>,
				minimum=<js>"0"</js>,
				maximum=<js>"100"</js>
				minLength=1,
				maxLength=10
			),
			minLength=1,
			maxLength=10
		)
		Long[][] queryParameter
	) {...}
</p>
<p>
	Input will be converted based on the types and formats defined in the schema definition.
	Input validations such as <c>minLength/maxLength</c> that don't match the input will result in automatic <c>400 Bad Request</c> responses.
</p>
<p>
	The following shows the same for a request body:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/testBody"</js>)	
	<jk>public void</jk> testBody(
		<ja>@Body</ja>(
			parsers=OpenApiParser.<jk>class</jk>,
			defaultContentType=<js>"text/openapi"</js>,
			schema=<ja>@Schema</ja>(
				items=<ja>@Items</ja>(
					collectionFormat=<js>"pipes"</js>,
					items=<ja>@SubItems</ja>(
						collectionFormat=<js>"csv"</js>,
						type=<js>"integer"</js>, 
						format=<js>"int64"</js>,
						minimum=<js>"0"</js>,
						maximum=<js>"100"</js>
						minLength=1,
						maxLength=10
					)
				),
				minLength=1,
				maxLength=10
			)
		)
		Long[][] body
	) {...}
</p>
<p>
	The list of valid POJO types for parameters depends on type and format of the value or items/entries of the value.
	For example, instead of <c>Longs</c> in the example above, we could also define a 2-dimensional array of POJOs convertible from <c>Longs</c>:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
	<jk>public void</jk> testBody(<ja>@Body</ja>(...) MyPojo[][] body) {...}
	
	<jc>// POJO convertible from a Long.</jc>
	<jk>public class</jk> MyPojo {
		<jk>public</jk> MyPojo(Long input) {...}
	}
</p>
<p>
	Or even POJOs that take in arrays of <c>Longs[]</c>:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
	<jk>public void</jk> testBody(<ja>@Body</ja>(...) MyPojo[] body) {...}
	
	<jc>// POJO convertible from a Long[].</jc>
	<jk>public class</jk> MyPojo {
		<jk>public</jk> MyPojo(Long[] input) {...}
	}
</p>
<p>
	Or even POJOs that take in the whole 2-dimensional array:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/2dLongArray"</js>)	
	<jk>public void</jk> testBody(<ja>@Body</ja>(...) MyPojo body) {...}
	
	<jc>// POJO convertible from a Long[][].</jc>
	<jk>public class</jk> MyPojo {
		<jk>public</jk> MyPojo(Long[][] input) {...}
	}
</p>
<p>
	As you can see, the complexity of possible input types expands significantly.
	For more information about valid parameter types, see {@doc juneau-marshall.OpenApiDetails.Parsers OpenAPI Parsers}
</p>
</div><!-- END: 6.8 - juneau-rest-server.OpenApiSchemaPartParsing -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.OpenApiSchemaPartSerializing' id='juneau-rest-server.OpenApiSchemaPartSerializing'>6.9 - OpenAPI Schema Part Serializing</a></h3>
<div class='topic'><!-- START: 6.9 - juneau-rest-server.OpenApiSchemaPartSerializing -->
<p>
	Parameters annotated with any of the following are serialized using the registered {@link org.apache.juneau.oapi.OpenApiSerializer} and
	therefore support OpenAPI syntax and validation:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseHeader}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Response} (<c>Accept</c> must match <js>"text/openapi"</js>)
</ul>
<p>
	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) in a response header can be converted to a 2-dimensional array of <c>Longs</c>:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"GET"</js>, path=<js>"/testResponseHeader"</js>)	
	<jk>public void</jk> testResponseHeader(
		<ja>@ResponseHeader</ja>(
			name=<js>"My-Header"</js>,
			collectionFormat=<js>"pipes"</js>,
			items=<ja>@SubItems</ja>(
				collectionFormat=<js>"csv"</js>,
				type=<js>"integer"</js>, 
				format=<js>"int64"</js>,
				minimum=<js>"0"</js>,
				maximum=<js>"100"</js>
				minLength=1,
				maxLength=10
			),
			minLength=1,
			maxLength=10
		)
		Value&lt;Long[][]&gt; header
	) {
		header.set(<jk>new</jk> Long[][]{...});
	}
</p>
<p>
	The following shows the same for a response body:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"GET"</js>, path=<js>"/testResponseBody"</js>)	
	<jk>public void</jk> testResponseBody(
		<ja>@Response</ja>(
			serializers=OpenApiSerialier.<jk>class</jk>,
			defaultAccept=<js>"text/openapi"</js>,
			schema=<ja>@Schema</ja>(
				items=<ja>@Items</ja>(
					collectionFormat=<js>"pipes"</js>,
					items=<ja>@SubItems</ja>(
						collectionFormat=<js>"csv"</js>,
						type=<js>"integer"</js>, 
						format=<js>"int64"</js>,
						minimum=<js>"0"</js>,
						maximum=<js>"100"</js>
						minLength=1,
						maxLength=10
					)
				),
				minLength=1,
				maxLength=10
			)
		)
		Value&lt;Long[][]&gt; responseBody
	) {...}
</p>
<p>
	For more information about the valid parameter types, see {@doc juneau-marshall.OpenApiDetails.Serializers OpenAPI Serializers}
</p>
</div><!-- END: 6.9 - juneau-rest-server.OpenApiSchemaPartSerializing -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations' id='juneau-rest-server.HttpPartAnnotations'>6.10 - HTTP-Part Annotations</a></h3>
<div class='topic'><!-- START: 6.10 - juneau-rest-server.HttpPartAnnotations -->
<p>
	The annotations used for defining the schema for request HTTP parts are:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Header}
	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Query}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Path}
	<li class='ja'>{@link org.apache.juneau.http.annotation.HasFormData}
	<li class='ja'>{@link org.apache.juneau.http.annotation.HasQuery}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Request}
</ul>
<p>
	The annotations used for defining the schema for response HTTP parts are:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseBody}
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseHeader}
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseStatus}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Response}
</ul>
<p>
	The sub-annotations used in the annotation above are:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.jsonschema.annotation.Schema}
	<li class='ja'>{@link org.apache.juneau.jsonschema.annotation.Items}
</ul>

<ul class='notes'>
	<li>
		Annotation parameter values will be aggregated when used on POJO parent and child classes. 
		<br>Values on child classes override values on parent classes.
	<li>
		Annotation parameter values will be aggregated when used on both POJOs and REST methods. 
		<br>Values on methods override values on POJO classes.
</ul>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.Body' id='juneau-rest-server.HttpPartAnnotations.Body'>6.10.1 - @Body</a><span class='update'>8.1.0-updated</span></h4>
<div class='topic'><!-- START: 6.10.1 - juneau-rest-server.HttpPartAnnotations.Body -->
<p>
	The {@link org.apache.juneau.http.annotation.Body @Body} annotation is used to identify POJOs to be used as the body of an HTTP request.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#api() api} - Free-form Swagger JSON.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#description() description} - Description.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#example() example} - Serialized example.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#examples() examples} - Serialized examples per media type.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#required() required} - Input validation.  Body must be present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#schema() schema} - Swagger schema.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#value() value} - Free-form Swagger JSON.
	</ul>
</ul>

<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Defined on parameter</jc>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> addPet(<ja>@Body</ja> Pet pet) {...}
</p>
<p class='bpcode w800'>
	<jc>// Defined on POJO class</jc>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> addPet(Pet pet) {...}
	
	<ja>@Body</ja>
	<jk>public class</jk> Pet {...}
</p>
<p>
	This is functionally equivalent to the following code:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> addPet(RestRequest req) {
		Person person = req.getBody().asType(Pet.<jk>class</jk>);
		...
	}
</p>
<p>
	Any of the following types can be used for the parameter or POJO class (matched in the specified order):
</p>
<ol class='spaced-list'>
	<li>
		{@link java.io.Reader}
		<br><ja>@Body</ja> annotation is optional.
		<br><c>Content-Type</c> is ignored.
	<li>
		{@link java.io.InputStream}
		<br><ja>@Body</ja> annotation is optional.
		<br><c>Content-Type</c> is ignored.
	<li>
		Any {@doc PojoCategories Parsable POJO} type.
		<br><c>Content-Type</c> is required to identify correct parser.
	<li>
		Objects convertible from {@link java.io.Reader} by having one of the following non-deprecated methods:
		<ul>
			<li><c><jk>public</jk> T(Reader in) {...}</c>
			<li><c><jk>public static</jk> T <jsm>create</jsm>(Reader in) {...}</c>
			<li><c><jk>public static</jk> T <jsm>fromReader</jsm>(Reader in) {...}</c>
		</ul>
		<c>Content-Type</c> must not be present or match an existing parser so that it's not parsed as a POJO.
	<li>
		Objects convertible from {@link java.io.InputStream} by having one of the following non-deprecated methods:
		<ul>
			<li><c><jk>public</jk> T(InputStream in) {...}</c>
			<li><c><jk>public static</jk> T <jsm>create</jsm>(InputStream in) {...}</c>
			<li><c><jk>public static</jk> T <jsm>fromInputStream</jsm>(InputStream in) {...}</c>
		</ul>
		<c>Content-Type</c> must not be present or match an existing parser so that it's not parsed as a POJO.
	<li>
		Objects convertible from {@link java.lang.String} by having one of the following non-deprecated methods:
		<ul>
			<li><c><jk>public</jk> T(String in) {...}</c>
			<li><c><jk>public static</jk> T <jsm>create</jsm>(String in) {...}</c>
			<li><c><jk>public static</jk> T <jsm>fromString</jsm>(String in) {...}</c>
			<li><c><jk>public static</jk> T <jsm>parse</jsm>(String in) {...}</c>
			<li><c><jk>public static</jk> T <jsm>parseString</jsm>(String in) {...}</c>
			<li><c><jk>public static</jk> T <jsm>forName</jsm>(String in) {...}</c>
			<li><c><jk>public static</jk> T <jsm>forString</jsm>(String in) {...}</c>
		</ul>
		Note that this also includes all enums.
	<li>
		Any {@link java.util.Optional} of anything on this list.
</ol>
<p>
	The {@link org.apache.juneau.oapi.OpenApiSerializer} class can be used to serialize HTTP bodies to OpenAPI-based output.
</p>
<p>
	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) can be converted to a 2-dimensional array of <c>Longs</c>:
</p>
<p class='bpcode w800'>
	<jc>// Body is a pipe-delimited list of comma-delimited lists of longs.</jc>
	<ja>@RestMethod</ja>(
		method=<js>"POST"</js>, 
		path=<js>"/testBody"</js>,
		serializers=OpenApiSerializers.<jk>class</jk>,
		defaultAccept=<js>"text/openapi"</js>
	)	
	<jk>public void</jk> testBody(
		<ja>@Body</ja>(
			schema=<ja>@Schema</ja>(
				items=<ja>@Items</ja>(
					collectionFormat=<js>"pipes"</js>,
					items=<ja>@SubItems</ja>(
						collectionFormat=<js>"csv"</js>,
						type=<js>"integer"</js>, 
						format=<js>"int64"</js>,
						minimum=<js>"0"</js>,
						maximum=<js>"100"</js>
						minLength=1,
						maxLength=10
					)
				),
				minLength=1,
				maxLength=10
			)
		)
		Long[][] body
	) {...}
</p>
<p>
	Input will be converted based on the types and formats defined in the schema definition.
	Input validations such as <c>minLength/maxLength</c> that don't match the input will result in automatic <c>400 Bad Request</c> responses.
</p>
<p>
	For more information about valid parameter types when using OpenAPI parsing, see {@doc juneau-marshall.OpenApiDetails.Parsers OpenAPI Parsers}
</p>

<p>
	The <ja>@Body</ja> annotation is also used for supplying swagger information about the body of the request.
	This information is used to populate the auto-generated Swagger documentation and UI.
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Normal</jc>
	<ja>@Body</ja>(
		description=<js>"Pet object to add to the store"</js>,
		required=<jk>true</jk>,
		example=<js>"{name:'Doggie',price:9.99,species:'Dog',tags:['friendly','cute']}"</js>
	)
</p>
<p class='bpcode w800'>
	<jc>// Free-form</jc>
	<jc>// Note the extra field</jc>
	<ja>@Body</ja>({
		<js>"description: 'Pet object to add to the store',"</js>,
		<js>"required: true,"</js>,
		<js>"example: {name:'Doggie',price:9.99,species:'Dog',tags:['friendly','cute']},"</js>
		<js>"x-extra: 'extra field'"</js>
	})
</p>
<p>
	{@doc DefaultRestSvlVariables} (e.g. "$L{my.localized.variable}")
	are supported on annotation fields.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Localized</jc>
	<ja>@Body</ja>(
		description=<js>"$L{PetObjectDescription}"</js>
	)
</p>

<ul class='notes'>
	<li>
		Annotation parameter values will be aggregated when used on POJO parent and child classes. 
		<br>Values on child classes override values on parent classes.
	<li>
		Annotation parameter values will be aggregated when used on both POJOs and REST methods. 
		<br>Values on methods override values on POJO classes.
</ul>

<div class='warn'>
	If using this annotation on a Spring bean, note that you are likely to encounter issues when using on parameterized
	types such as <code>List&lt;MyBean&gt;</code>.  This is due to the fact that Spring uses CGLIB to recompile classes
 	at runtime, and CGLIB was written before generics were introduced into Java and is a virtually-unsupported library.
 	Therefore, parameterized types will often be stripped from class definitions and replaced with unparameterized types
	(e.g. <code>List</code>).  Under these circumstances, you are likely to get <code>ClassCastExceptions</code>
	when trying to access generalized <code>ObjectMaps</code> as beans.  The best solution to this issue is to either
	specify the parameter as a bean array (e.g. <code>MyBean[]</code>) or declare the method as final so that CGLIB
	will not try to recompile it.
</div>


<ul class='seealso'>
	<li class='jc'>{@link org.apache.juneau.rest.RequestBody}
	<li class='link'>{@doc juneau-rest-server.OpenApiSchemaPartParsing}
</ul>
</div><!-- END: 6.10.1 - juneau-rest-server.HttpPartAnnotations.Body -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.FormData' id='juneau-rest-server.HttpPartAnnotations.FormData'>6.10.2 - @FormData</a><span class='update'>8.1.0-updated</span></h4>
<div class='topic'><!-- START: 6.10.2 - juneau-rest-server.HttpPartAnnotations.FormData -->
<p>
	The {@link org.apache.juneau.http.annotation.FormData @FormData} annotation is used to retrieve request form post entries.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_default() _default} - Default value if not present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_enum() _enum} - Input validation.  Must match one of the values.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#allowEmptyValue() allowEmptyValue} - Input validation.  Allow empty value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#api() api()} - Free-form Swagger JSON.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#collectionFormat() collectionFormat} - How collections of items are formatted.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#description() description} - Description.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#example() example()} - Serialized example.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMaximum() exclusiveMaximum} - Input validation.  Whether maximum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMinimum() exclusiveMinimum} - Input validation.  Whether minimum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#format() format} - The schema type format. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#items() items} - The schema of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maximum() maximum} - Input validation.  Maximum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxItems() maxItems} - Input validation.  Maximum number of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxLength() maxLength} - Input validation.  Maximum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minimum() minimum} - Input validation.  Minimum numeric value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minItems() minItems} - Input validation.  Minimum number of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minLength() minLength} - Input validation.  Minimum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#multipleOf() multipleOf} - Input validation.  Number must be a multiple of.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#name() name} - Form data entry name.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#parser() parser} - Override the part parser.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#pattern() pattern} - Input validation.  Must match regular expression.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#required() required} - Input validation.  Form data entry must be present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#type() type} - The schema type.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#uniqueItems() uniqueItems} - Input validation. Collections must contain unique items only.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#value() value} - Free-form Swagger JSON.
	</ul>
</ul>

<p>
	The most typical scenario is to simply use the <c>value</c> field to define form data parameter names:
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>	
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> doPost(
		<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='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> doPost(RestRequest req) {
		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 special name <js>"*"</js> (or blank) can be used to represent all values.
	When used, the data type must be a <c>Map</c> or bean.
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Multiple values passed as a map.</jc>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> doPost(<ja>@FormData</ja>(<js>"*"</js>) Map&lt;String,Object&gt; map) {...}
</p>
<p class='bpcode w800'>
	<jc>// Same, but name "*" is inferred.</jc>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> doPost(<ja>@FormData</ja> Map&lt;String,Object&gt; map) {...}
</p>
<p class='bpcode w800'>
	<jc>// Multiple values passed as a bean.</jc>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> doPost(<ja>@FormData</ja> MyBean bean) {...}
</p>

<p>
	The registered {@link org.apache.juneau.rest.RestContext#REST_partParser REST_partParser} is used to convert strings
	to POJOs and controls what POJO types are supported.
	By default, this is the {@link org.apache.juneau.oapi.OpenApiParser} which supports the standard Swagger-based rules for parsing.
</p>
<p>
	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) can be converted to a 2-dimensional array of <c>Longs</c>:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/testFormData"</js>)	
	<jk>public void</jk> testFormData(
		<ja>@FormData</ja>(
			name=<js>"formDataParamName"</js>,
			collectionFormat=<js>"pipes"</js>,
			items=<ja>@SubItems</ja>(
				collectionFormat=<js>"csv"</js>,
				type=<js>"integer"</js>, 
				format=<js>"int64"</js>,
				minimum=<js>"0"</js>,
				maximum=<js>"100"</js>
				minLength=1,
				maxLength=10
			),
			minLength=1,
			maxLength=10
		)
		Long[][] formDataParameter
	) {...}
</p>
<p>
	Input will be converted based on the types and formats defined in the schema definition.
	Input validations such as <c>minLength/maxLength</c> that don't match the input will result in automatic <c>400 Bad Request</c> responses.
</p>
<p>
	For more information about valid parameter types, see {@doc juneau-marshall.OpenApiDetails.Parsers OpenAPI Parsers}
</p>

<p>
	The <ja>@FormData</ja> annotation is also used for supplying swagger information about the HTTP part.
	This information is used to populate the auto-generated Swagger documentation and UI.
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Normal</jc>
	<ja>@FormData</ja>(
		name=<js>"name"</js>,
		description=<js>"Pet name"</js>,
		required=<jk>true</jk>,
		example=<js>"Doggie"</js>
	)
</p>
<p class='bpcode w800'>
	<jc>// Free-form</jc>
	<jc>// Note the extra field</jc>
	<ja>@FormData</ja>(
		name=<js>"name"</js>,
		api={
			<js>"description: 'Pet name',"</js>,
			<js>"required: true,"</js>,
			<js>"example: 'Doggie',"</js>
			<js>"x-extra: 'extra field'"</js>
		}
	)
</p>
<p>
	{@doc DefaultRestSvlVariables} (e.g. "$L{my.localized.variable}")
	are supported on annotation fields.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@FormData</ja>(
		description=<js>"$L{PetNameDescription}"</js>
	)
</p>

<div class='warn'>
	This annotation should not be combined with the {@link org.apache.juneau.http.annotation.Body @Body} annotation or {@link org.apache.juneau.rest.RestRequest#getBody()} method
	for <c>application/x-www-form-urlencoded POST</c> 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.http.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.
</div>

<div class='warn'>
	If using this annotation on a Spring bean, note that you are likely to encounter issues when using on parameterized
	types such as <code>List&lt;MyBean&gt;</code>.  This is due to the fact that Spring uses CGLIB to recompile classes
 	at runtime, and CGLIB was written before generics were introduced into Java and is a virtually-unsupported library.
 	Therefore, parameterized types will often be stripped from class definitions and replaced with unparameterized types
	(e.g. <code>List</code>).  Under these circumstances, you are likely to get <code>ClassCastExceptions</code>
	when trying to access generalized <code>ObjectMaps</code> as beans.  The best solution to this issue is to either
	specify the parameter as a bean array (e.g. <code>MyBean[]</code>) or declare the method as final so that CGLIB
	will not try to recompile it.
</div>

<ul class='seealso'>
	<li class='jc'>{@link org.apache.juneau.rest.RequestFormData}
	<li class='link'>{@doc juneau-rest-server.OpenApiSchemaPartParsing}
</ul>
</div><!-- END: 6.10.2 - juneau-rest-server.HttpPartAnnotations.FormData -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.HasFormData' id='juneau-rest-server.HttpPartAnnotations.HasFormData'>6.10.3 - @HasFormData</a></h4>
<div class='topic'><!-- START: 6.10.3 - juneau-rest-server.HttpPartAnnotations.HasFormData -->
<p>
	This annotation can be used to detect the existence of a parameter when it's not set to a particular value.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.HasFormData}
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> doPost(<ja>@HasFormData</ja>(<js>"p1"</js>) <jk>boolean</jk> p1) {...}
</p>
<p>
	This is functionally equivalent to the following code:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>POST</jsf>)
	<jk>public void</jk> doPost(RestRequest req) {
		<jk>boolean</jk> p1 = req.hasFormData(<js>"p1"</js>);
		...
	}
</p>
<p>
	The parameter type must be either <jk>boolean</jk> or {@link java.lang.Boolean}.
</p>
<p>
	The following table shows the behavioral differences between <ja>@HasFormData</ja> and <ja>@FormData</ja>:
</p>
<table class='styled w400'>
	<tr>
		<th><c>Body content</c></th>
		<th><c><ja>@HasFormData</ja>(<js>"a"</js>)</c></th>
		<th><c><ja>@FormData</ja>(<js>"a"</js>)</c></th>
	</tr>
	<tr>
		<td><c>a=foo</c></td>
		<td><jk>true</jk></td>
		<td><js>"foo"</js></td>
	</tr>
	<tr>
		<td><c>a=</c></td>
		<td><jk>true</jk></td>
		<td><js>""</js></td>
	</tr>
	<tr>
		<td><c>a</c></td>
		<td><jk>true</jk></td>
		<td><jk>null</jk></td>
	</tr>
	<tr>
		<td><c>b=foo</c></td>
		<td><jk>false</jk></td>
		<td><jk>null</jk></td>
	</tr>
</table>
 
<h5 class='topic'>Important note concerning FORM posts</h5>
<p>
	This annotation should not be combined with the {@link org.apache.juneau.http.annotation.Body @Body} annotation or {@link org.apache.juneau.rest.RestRequest#getBody()} method
	for <c>application/x-www-form-urlencoded POST</c> posts, since it will trigger the underlying servlet API to
	parse the body content as key-value pairs, resulting in empty content.
</p>
<p>
	The {@link org.apache.juneau.http.annotation.HasQuery @HasQuery} annotation can be used to check for the existing of a URL parameter in the URL string
	without triggering the servlet to drain the body content.
</p>
</div><!-- END: 6.10.3 - juneau-rest-server.HttpPartAnnotations.HasFormData -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.Query' id='juneau-rest-server.HttpPartAnnotations.Query'>6.10.4 - @Query</a></h4>
<div class='topic'><!-- START: 6.10.4 - juneau-rest-server.HttpPartAnnotations.Query -->
<p>
	The {@link org.apache.juneau.http.annotation.Query @Query} annotation is used to retrieve request URL query parameters.
	It's identical to {@link org.apache.juneau.http.annotation.FormData @FormData}, but only retrieves the parameter from the URL string, not URL-encoded form posts.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Query}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_default() _default} - Default value if not present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_enum() _enum} - Input validation.  Must match one of the values.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#allowEmptyValue() allowEmptyValue} - Input validation.  Allow empty value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#api() api} - Free-form Swagger JSON.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#collectionFormat() collectionFormat} - How collections of items are formatted.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#description() description} - Description.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#example() example} - Serialized example.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMaximum() exclusiveMaximum} - Input validation.  Whether maximum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMinimum() exclusiveMinimum} - Input validation.  Whether minimum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#format() format} - The schema type format. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#items() items} - The schema of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maximum() maximum} - Input validation.  Maximum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxItems() maxItems} - Input validation.  Maximum number of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxLength() maxLength} - Input validation.  Maximum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minimum() minimum} - Input validation.  Minimum numeric value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minItems() minItems} - Input validation.  Minimum number of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minLength() minLength} - Input validation.  Minimum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#multipleOf() multipleOf} - Input validation.  Number must be a multiple of.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#name() name} - Query parameter name.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#parser() parser} - Override the part parser.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#pattern() pattern} - Input validation.  Must match regular expression.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#required() required} - Input validation.  Query parameter must be present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#type() type} - The schema type.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#uniqueItems() uniqueItems} - Input validation. Collections must contain unique items only.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#value() value} - Free-form Swagger JSON.
	</ul>
</ul>

<p>
	Unlike {@link org.apache.juneau.http.annotation.FormData @FormData}, using this annotation does not result in the servlet reading the contents of
	URL-encoded form posts.
	Therefore, this annotation can be used in conjunction with the {@link org.apache.juneau.http.annotation.Body @Body} annotation or
	{@link org.apache.juneau.rest.RestRequest#getBody()} method for <c>application/x-www-form-urlencoded POST</c> calls.
</p>
<p>
	The most typical scenario is to simply use the <c>value</c> field to define query parameter names:
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(
		<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='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(RestRequest req) {
		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 special name <js>"*"</js> (or blank) can be used to represent all values.
	When used, the data type must be a <c>Map</c> or bean.
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Multiple values passed as a map.</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(<ja>@Query</ja>(<js>"*"</js>) Map&lt;String,Object&gt; map) {...}
</p>
<p class='bpcode w800'>
	<jc>// Same, but name "*" is inferred.</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(<ja>@Query</ja> Map&lt;String,Object&gt; map) {...}
</p>
<p class='bpcode w800'>
	<jc>// Multiple values passed as a bean.</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(<ja>@Query</ja> MyBean bean) {...}
</p>

<p>
	The registered {@link org.apache.juneau.rest.RestContext#REST_partParser REST_partParser} is used to convert strings
	to POJOs and controls what POJO types are supported.
	By default, this is the {@link org.apache.juneau.oapi.OpenApiParser} which supports the standard Swagger-based rules for parsing.
</p>
<p>
	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) can be converted to a 2-dimensional array of <c>Longs</c>:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"GET"</js>, path=<js>"/testQuery"</js>)	
	<jk>public void</jk> testQuery(
		<ja>@Query</ja>(
			name=<js>"queryParamName"</js>,
			collectionFormat=<js>"pipes"</js>,
			items=<ja>@SubItems</ja>(
				collectionFormat=<js>"csv"</js>,
				type=<js>"integer"</js>, 
				format=<js>"int64"</js>,
				minimum=<js>"0"</js>,
				maximum=<js>"100"</js>
				minLength=1,
				maxLength=10
			),
			minLength=1,
			maxLength=10
		)
		Long[][] queryParameter
	) {...}
</p>
<p>
	Input will be converted based on the types and formats defined in the schema definition.
	Input validations such as <c>minLength/maxLength</c> that don't match the input will result in automatic <c>400 Bad Request</c> responses.
</p>
<p>
	For more information about valid parameter types, see {@doc juneau-marshall.OpenApiDetails.Parsers OpenAPI Parsers}
</p>

<p>
	The <ja>@Query</ja> annotation is also used for supplying swagger information about the HTTP part.
	This information is used to populate the auto-generated Swagger documentation and UI.
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Normal</jc>
	<ja>@Query</ja>(
		name=<js>"name"</js>,
		description=<js>"Pet name"</js>,
		required=<jk>true</jk>,
		example=<js>"Doggie"</js>
	)
</p>
<p class='bpcode w800'>
	<jc>// Free-form</jc>
	<jc>// Note the extra field</jc>
	<ja>@Query</ja>(
		name=<js>"name"</js>,
		api={
			<js>"description: 'Pet name',"</js>,
			<js>"required: true,"</js>,
			<js>"example: 'Doggie',"</js>
			<js>"x-extra: 'extra field'"</js>
		}
	)
</p>
<p>
	{@doc DefaultRestSvlVariables} (e.g. "$L{my.localized.variable}")
	are supported on annotation fields.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Query</ja>(
		description=<js>"$L{PetNameDescription}"</js>
	)
</p>


<ul class='seealso'>
	<li class='jc'>{@link org.apache.juneau.rest.RequestQuery}
	<li class='link'>{@doc juneau-rest-server.OpenApiSchemaPartParsing}
</ul>
</div><!-- END: 6.10.4 - juneau-rest-server.HttpPartAnnotations.Query -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.HasQuery' id='juneau-rest-server.HttpPartAnnotations.HasQuery'>6.10.5 - @HasQuery</a></h4>
<div class='topic'><!-- START: 6.10.5 - juneau-rest-server.HttpPartAnnotations.HasQuery -->
<p>
	Identical to {@link org.apache.juneau.http.annotation.HasFormData @HasFormData}, but only checks the existing of the parameter in the URL string, not
	URL-encoded form posts.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.HasQuery}
</ul>
<p>
	Unlike {@link org.apache.juneau.http.annotation.HasFormData @HasFormData}, using this annotation does not result in the servlet reading the contents
	of URL-encoded form posts.
	Therefore, this annotation can be used in conjunction with the {@link org.apache.juneau.http.annotation.Body @Body} annotation or
	{@link org.apache.juneau.rest.RestRequest#getBody()} method for <c>application/x-www-form-urlencoded POST</c> calls.
 </p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(<ja>@HasQuery</ja>(<js>"p1"</js>) <jk>boolean</jk> p1) {...}
</p>
<p>
	This is functionally equivalent to the following code:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(RestRequest req) {
		<jk>boolean</jk> p1 = req.hasQuery(<js>"p1"</js>);
		...
	}
</p>
<p>
	The parameter type must be either <jk>boolean</jk> or {@link java.lang.Boolean}.
</p>
<p>
	The following table shows the behavioral differences between <ja>@HasQuery</ja> and <ja>@Query</ja>:
</p>
<table class='styled w400'>
	<tr>
		<th><c>Query content</c></th>
		<th><c><ja>@HasQuery</ja>(<js>"a"</js>)</c></th>
		<th><c><ja>@Query</ja>(<js>"a"</js>)</c></th>
	</tr>
	<tr>
		<td><c>?a=foo</c></td>
		<td><jk>true</jk></td>
		<td><js>"foo"</js></td>
	</tr>
	<tr>
		<td><c>?a=</c></td>
		<td><jk>true</jk></td>
		<td><js>""</js></td>
	</tr>
	<tr>
		<td><c>?a</c></td>
		<td><jk>true</jk></td>
		<td><jk>null</jk></td>
	</tr>
	<tr>
		<td><c>?b=foo</c></td>
		<td><jk>false</jk></td>
		<td><jk>null</jk></td>
	</tr>
</table>
</div><!-- END: 6.10.5 - juneau-rest-server.HttpPartAnnotations.HasQuery -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.Header' id='juneau-rest-server.HttpPartAnnotations.Header'>6.10.6 - @Header</a></h4>
<div class='topic'><!-- START: 6.10.6 - juneau-rest-server.HttpPartAnnotations.Header -->
<p>
	The {@link org.apache.juneau.http.annotation.Header @Header} annotation is used to retrieve request headers.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Header}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_default() _default} - Default value if not present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_enum() _enum} - Input validation.  Must match one of the values.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#allowEmptyValue() allowEmptyValue} - Input validation.  Allow empty value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#api() api} - Free-form Swagger JSON.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#collectionFormat() collectionFormat} - How collections of items are formatted.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#description() description} - Description.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#example() example} - Serialized example.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMaximum() exclusiveMaximum} - Input validation.  Whether maximum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMinimum() exclusiveMinimum} - Input validation.  Whether minimum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#format() format} - The schema type format. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#items() items} - The schema of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maximum() maximum} - Input validation.  Maximum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxItems() maxItems} - Input validation.  Maximum number of items in a collection. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxLength() maxLength} - Input validation.  Maximum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minimum() minimum} - Input validation.  Minimum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minItems() minItems} - Input validation.  Minimum number of items in a collection. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minLength() minLength} - Input validation.  Minimum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#multipleOf() multipleOf} - Input validation.  Number must be a multiple of.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#name() name} - Header name.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#parser() parser} - Override the part parser.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#pattern() pattern} - Input validation.  Must match regular expression.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#required() required} - Input validation.  Header must be present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#type() type} - The schema type.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#uniqueItems() uniqueItems} - Input validation. Collections must contain unique items only.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#value() value} - Free-form Swagger JSON.
	</ul>
</ul>
<p>
	The most typical scenario is to simply use the <c>value</c> field to define header parameter names:
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(<ja>@Header</ja>(<js>"ETag"</js>) UUID etag) {...}
</p>
<p>
	This is functionally equivalent to the following code:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(RestRequest req) {
		RequestHeaders h = req.getHeaders();
		UUID etag = h.get(<js>"ETag"</js>, UUID.<jk>class</jk>);
	}
</p>

<p>
	The special name <js>"*"</js> (or blank) can be used to represent all values.
	When used, the data type must be a <c>Map</c> or bean.
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Multiple values passed as a map.</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(<ja>@Header</ja>(<js>"*"</js>) Map&lt;String,Object&gt; map) {...}
</p>
<p class='bpcode w800'>
	<jc>// Same, but name "*" is inferred.</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(<ja>@Header</ja> Map&lt;String,Object&gt; map) {...}
</p>
<p class='bpcode w800'>
	<jc>// Multiple values passed as a bean.</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>)
	<jk>public void</jk> doGet(<ja>@Header</ja> MyBean bean) {...}
</p>

<p>
	The registered {@link org.apache.juneau.rest.RestContext#REST_partParser REST_partParser} is used to convert strings
	to POJOs and controls what POJO types are supported.
	By default, this is the {@link org.apache.juneau.oapi.OpenApiParser} which supports the standard Swagger-based rules for parsing.
</p>
<p>
	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) can be converted to a 2-dimensional array of <c>Longs</c>:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"GET"</js>, path=<js>"/testHeader"</js>)	
	<jk>public void</jk> testHeader(
		<ja>@Header</ja>(
			name=<js>"My-Header"</js>,
			collectionFormat=<js>"pipes"</js>,
			items=<ja>@SubItems</ja>(
				collectionFormat=<js>"csv"</js>,
				type=<js>"integer"</js>, 
				format=<js>"int64"</js>,
				minimum=<js>"0"</js>,
				maximum=<js>"100"</js>
				minLength=1,
				maxLength=10
			),
			minLength=1,
			maxLength=10
		)
		Long[][] myHeader
	) {...}
</p>
<p>
	Input will be converted based on the types and formats defined in the schema definition.
	Input validations such as <c>minLength/maxLength</c> that don't match the input will result in automatic <c>400 Bad Request</c> responses.
</p>
<p>
	For more information about valid parameter types, see {@doc juneau-marshall.OpenApiDetails.Parsers OpenAPI Parsers}
</p>

<p>
	The <ja>@Header</ja> annotation is also used for supplying swagger information about the HTTP part.
	This information is used to populate the auto-generated Swagger documentation and UI.
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Normal</jc>
	<ja>@Header</ja>(
		name=<js>"Pet-Name"</js>,
		description=<js>"Pet name"</js>,
		required=<jk>true</jk>,
		example=<js>"Doggie"</js>
	)
</p>
<p class='bpcode w800'>
	<jc>// Free-form</jc>
	<jc>// Note the extra field</jc>
	<ja>@Header</ja>(
		name=<js>"Pet-Name"</js>,
		api={
			<js>"description: 'Pet name',"</js>,
			<js>"required: true,"</js>,
			<js>"example: 'Doggie',"</js>
			<js>"x-extra: 'extra field'"</js>
		}
	)
</p>
<p>
	{@doc DefaultRestSvlVariables} (e.g. "$L{my.localized.variable}")
	are supported on annotation fields.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Header</ja>(
		description=<js>"$L{PetNameDescription}"</js>
	)
</p>

<ul class='seealso'>
	<li class='jc'>{@link org.apache.juneau.rest.RequestHeaders}
	<li class='link'>{@doc juneau-rest-server.OpenApiSchemaPartParsing}
</ul>
</div><!-- END: 6.10.6 - juneau-rest-server.HttpPartAnnotations.Header -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.Path' id='juneau-rest-server.HttpPartAnnotations.Path'>6.10.7 - @Path</a></h4>
<div class='topic'><!-- START: 6.10.7 - juneau-rest-server.HttpPartAnnotations.Path -->
<p>
	The {@link org.apache.juneau.http.annotation.Path @Path} annotation is used to retrieve request path parameters.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Path}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#_enum() _enum} - Input validation.  Must match one of the values.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#allowEmptyValue() allowEmptyValue} - Input validation.  Allow empty value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#api() api} - Free-form Swagger JSON.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#collectionFormat() collectionFormat} - How collections of items are formatted.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#description() description} - Description.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#example() example} - Serialized example.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMaximum() exclusiveMaximum} - Input validation.  Whether maximum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMinimum() exclusiveMinimum} - Input validation.  Whether minimum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#format() format} - The schema type format. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#items() items} - The schema of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maximum() maximum} - Input validation.  Maximum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maxLength() maxLength} - Input validation.  Maximum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minimum() minimum} - Input validation.  Minimum numeric value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minLength() minLength} - Input validation.  Minimum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#multipleOf() multipleOf} - Input validation.  Number must be a multiple of.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#name() name} - Path variable name.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#parser() parser} - Override the part parser.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#pattern() pattern} - Input validation.  Must match regular expression.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#type() type} - The schema type.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#value() value} - Free-form Swagger JSON.
	</ul>
</ul>
<p>
	The most typical scenario is to simply use the <c>value</c> field to define path parameter names:
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/myurl/{foo}/{bar}/{baz}/*"</js>)
	<jk>public void</jk> doGet(
			<ja>@Path</ja>(<js>"foo"</js>) String foo,
			<ja>@Path</ja>(<js>"bar"</js>) <jk>int</jk> bar,
			<ja>@Path</ja>(<js>"baz"</js>) UUID baz,
			<ja>@Path</ja>(<js>"/*"</js>) String remainder 
		) {...}
</p>
<p>
	This is functionally equivalent to the following code:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/myurl/{foo}/{bar}/{baz}/*"</js>)
	<jk>public void</jk> doGet(RestRequest req) {
		RequestPath p = req.getPathMatch();
		String foo = p.getString(<js>"foo"</js>);
		<jk>int</jk> bar = p.get(<js>"bar"</js>, <jk>int</jk>.<jk>class</jk>);
		UUID baz = p.get(<js>"baz"</js>, UUID.<jk>class</jk>);
		String remainder = p.getRemainder();
	}
</p>
<p>
	Note that the path variable name <js>"/*"</js> can be used to represent the remainder of the path match.
</p>

<p>
	The special name <js>"*"</js> (or blank) can be used to represent all values.
	When used, the data type must be a <c>Map</c> or bean.
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Multiple values passed as a map.</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{a}/{b}/{c}/*"</js>)
	<jk>public void</jk> doGet(<ja>@Path</ja>(<js>"*"</js>) Map&lt;String,Object&gt; map) {...}
</p>
<p class='bpcode w800'>
	<jc>// Same, but name "*" is inferred.</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{a}/{b}/{c}/*"</js>)
	<jk>public void</jk> doGet(<ja>@Path</ja> Map&lt;String,Object&gt; map) {...}
</p>
<p class='bpcode w800'>
	<jc>// Multiple values passed as a bean.</jc>
	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{a}/{b}/{c}/*"</js>)
	<jk>public void</jk> doGet(<ja>@Path</ja> MyBean bean) {...}
</p>

<p>
	The registered {@link org.apache.juneau.rest.RestContext#REST_partParser REST_partParser} is used to convert strings
	to POJOs and controls what POJO types are supported.
	By default, this is the {@link org.apache.juneau.oapi.OpenApiParser} which supports the standard Swagger-based rules for parsing.
</p>

<p>
	For example, the following shows how a pipe-delimited list of comma-delimited numbers (e.g. <js>"1,2,3|4,5,6|7,8,9"</js>) can be converted to a 2-dimensional array of <c>Longs</c>:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"/testPath/{pathParam}"</js>)	
	<jk>public void</jk> testPath(
		<ja>@Path</ja>(
			name=<js>"pathParam"</js>,
			collectionFormat=<js>"pipes"</js>,
			items=<ja>@SubItems</ja>(
				collectionFormat=<js>"csv"</js>,
				type=<js>"integer"</js>, 
				format=<js>"int64"</js>,
				minimum=<js>"0"</js>,
				maximum=<js>"100"</js>
				minLength=1,
				maxLength=10
			),
			minLength=1,
			maxLength=10
		)
		Long[][] pathParameter
	) {...}
</p>
<p>
	Input will be converted based on the types and formats defined in the schema definition.
	Input validations such as <c>minLength/maxLength</c> that don't match the input will result in automatic <c>400 Bad Request</c> responses.
</p>
<p>
	For more information about valid parameter types, see {@doc juneau-marshall.OpenApiDetails.Parsers OpenAPI Parsers}
</p>

<p>
	The <ja>@Path</ja> annotation is also used for supplying swagger information about the HTTP part.
	This information is used to populate the auto-generated Swagger documentation and UI.
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Normal</jc>
	<ja>@Path</ja>(
		name=<js>"name"</js>,
		description=<js>"Pet name"</js>,
		example=<js>"Doggie"</js>
	)
</p>
<p class='bpcode w800'>
	<jc>// Free-form</jc>
	<jc>// Note the extra field</jc>
	<ja>@Path</ja>(
		name=<js>"name"</js>,
		api={
			<js>"description: 'Pet name',"</js>,
			<js>"example: 'Doggie',"</js>
			<js>"x-extra: 'extra field'"</js>
		}
	)
</p>
<p>
	{@doc DefaultRestSvlVariables} (e.g. "$L{my.localized.variable}")
	are supported on annotation fields.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Path</ja>(
		description=<js>"$L{PetNameDescription}"</js>
	)
</p>

<ul class='seealso'>
	<li class='jc'>{@link org.apache.juneau.rest.RequestPath}
	<li class='link'>{@doc juneau-rest-server.OpenApiSchemaPartParsing}
</ul>
</div><!-- END: 6.10.7 - juneau-rest-server.HttpPartAnnotations.Path -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.Request' id='juneau-rest-server.HttpPartAnnotations.Request'>6.10.8 - @Request</a></h4>
<div class='topic'><!-- START: 6.10.8 - juneau-rest-server.HttpPartAnnotations.Request -->
<p>
	The {@link org.apache.juneau.http.annotation.Request @Request} annotation can be applied to a parameter interface type of a <ja>@RestMethod</ja>-annotated method 
	to identify it as an interface for retrieving HTTP parts through a bean-like interface.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Request}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Request#partParser() partParser} - Override the part parser.
	</ul>
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(path=<js>"/pets/{petId}"</js>)
	<jk>public void</jk> putPet(UpdatePet updatePet) {...}

	<ja>@Request</ja>
	<jk>public interface</jk> UpdatePet {

		<ja>@Path</ja> 
		<jk>int</jk> getPetId();

		<ja>@Query</ja>(name=<js>"verbose"</js>)
		<jk>boolean</jk> isDebug();

		<ja>@Header</ja>(<js>"*"</js>)
		Map&lt;String,Object&gt; getAllHeaders();

		<ja>@Body</ja>
		Pet getPet();
	}
</p>
<p>
	The example above is identical in behavior to specifying individual annotated parameters on the <ja>@RestMethod</ja>-annotated method:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(path=<js>"/pets/{petId}"</js>)
	<jk>public void</jk> putPet(
		<ja>@Path</ja>(<js>"petId"</js>) <jk>int</jk> petId,
		<ja>@Query</ja>(<js>"verbose"</js>) <jk>boolean</jk> debug,
		<ja>@Header</ja>(<js>"*"</js>) Map&lt;String,Object&gt; allHeaders,
		<ja>@Body</ja> Pet pet
	) 
	{...}
</p>
<p>
	The return types of the getters must be the supported parameter types for the HTTP-part annotation used.
	Schema-based serialization and parsing is used just as if used as individual parameter types.
	Annotations used are the exact same used on REST parameters and have all the
	same feature support including automatic Swagger validation and documentation.  
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Request</ja>
	<jk>public interface</jk> Request {

		<jc>// Schema-based query parameter:  Pipe-delimited lists of comma-delimited lists of integers.</jc>
		<ja>@Query</ja>(
			collectionFormat=<js>"pipes"</js>
			items=<ja>@Items</ja>(
				items=<ja>@SubItems</ja>(
					collectionFormat=<js>"csv"</js>
					type=<js>"integer"</js>,
					minimum=1,
					maximum=100
				),
				maximumLength=10
			)
		)
		<jk>int</jk>[][] getPipedCdlInts();
	}
</p>
<p>
	For clarity, the <ja>@Request</ja> annotation can be defined on the parameter, class, or both.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(path=<js>"/pets/{petId}"</js>)
	<jk>public void</jk> putPet(<ja>@Request</ja> UpdatePet updatePet) {...}

	<ja>@Request</ja>
	<jk>public interface</jk> UpdatePet {...}
</p>
</div><!-- END: 6.10.8 - juneau-rest-server.HttpPartAnnotations.Request -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.Response' id='juneau-rest-server.HttpPartAnnotations.Response'>6.10.9 - @Response</a></h4>
<div class='topic'><!-- START: 6.10.9 - juneau-rest-server.HttpPartAnnotations.Response -->
<p>
	The {@link org.apache.juneau.http.annotation.Response @Response} annotation is used to identify schema information about an HTTP response.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Response}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Response#api() api} - Free-form Swagger JSON.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Response#code() code} - HTTP status code.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Response#description() description} - Description.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Response#example() example} - Serialized example.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Response#examples() examples} - Serialized examples per media type.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Response#headers() headers} - Swagger about headers added to response.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Response#partSerializer() partSerializer} - Override the part serializer.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Response#schema() schema} - Swagger schema.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Response#value() value} - Free-form Swagger JSON.
	</ul>
</ul>
<p>
	It can be used in the following locations:
</p>
<ul>
	<li>Exception classes thrown from <ja>@RestMethod</ja>-annotated methods.
	<li>Return type classes of <ja>@RestMethod</ja>-annotated methods.
	<li><ja>@RestMethod</ja>-annotated methods themselves.
	<li>Arguments and argument-types of <ja>@RestMethod</ja>-annotated methods.
</ul>

<p>
	When the <ja>@Response</ja> annotation is applied to classes, the following annotations can be used on 
	public non-static methods of the class to identify parts of a response:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseStatus} 
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseHeader} 
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseBody} 
</ul>
	
<h5 class='topic'>@Resource on exception classes</h5>
<p>
	When applied to an exception class, this annotation defines Swagger schema and information on non-200 return types.
</p>
<p>
	The following example shows the <ja>@Response</ja> annotation used to define an exception for an invalid login attempt:
</p>
<p class='bpcode w800'>
	<jc>// Our annotated exception.</jc>
	<ja>@Response</ja>(
		code=401, 
		description=<js>"Invalid username or password provided"</js> <jc>// Description show in Swagger</jc>
	)
	<jk>public class</jk> InvalidLogin <jk>extends</jk> Exception {
		<jk>public</jk> InvalidLogin() {
			<jk>super</jk>(<js>"Invalid username or password."</js>);  <jc>// Message sent in response</jc>
		}
	}

	<jc>// Our REST method that throws an annotated exception.</jc>
	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/user/login"</js>)
	<jk>public</jk> Ok login(
		<ja>@FormData</ja>(<js>"username"</js>) String username, 
		<ja>@FormData</ja>(<js>"password"</js>) String password
	) <jk>throws</jk> InvalidLogin 
	{
		checkCredentials(username, password);
		<jk>return new</jk> Ok();
	}
</p>
<p>
	Custom exceptions can also extend from one of the predefined HTTP exceptions such as the {@link org.apache.juneau.http.exception.Unauthorized} exception:
</p>
<p class='bpcode w800'>
	<jc>// Our annotated exception.</jc>
	<ja>@Response</ja>(
		description=<js>"Invalid username or password provided"</js> <jc>// Overridden from parent class</jc>
	) 
	<jk>public class</jk> InvalidLogin <jk>extends</jk> Unauthorized {
		<jk>public</jk> InvalidLogin() {
			<jk>super</jk>(<js>"Invalid username or password."</js>); 
		}
	}

	<jc>// Parent predefined exception class.</jc>
	<ja>@Response</ja>(
		code=401, 
		description=<js>"Unauthorized"</js>
	)
	<jk>public class</jk> Unauthorized <jk>extends</jk> RestException {...}
</p>

<h5 class='topic'>@Resource on return type classes</h5>
<p>
	When applied type classes returned by a Java method, this annotation defines schema and Swagger information on the body of responses.
</p>
<p>
	In the example above, we're using the <c>Ok</c> class which is defined like so:
</p>
<p class='bpcode w800'>
	<ja>@Response</ja>(
		code=200, 
		description=<js>"OK"</js>
	)
	<jk>public class</jk> Ok {

		<ja>@ResponseBody</ja>
		<jk>public</jk> String toString() {
			<jk>return</jk> <js>"OK"</js>;
		}
	}
</p>
<p>
	Another example showing how a redirect can be defined:
</p>
<p class='bpcode w800'>
	<ja>@Response</ja>(
		code=307,
		description=<js>"Temporary Redirect"</js>
	)
	<jk>public class</jk> Redirect {
		<jk>private final</jk> URI <jf>location</jf>;
	
		<jk>public</jk> Redirect(URI location) {
			<jk>this</jk>.<jf>location</jf> = location;
		}
	
		<ja>@ResponseHeader</ja>(
			name=<js>"Location"</js>,
			format=<js>"uri"</js>
		)
		<jk>public</jk> URI getLocation() {
			<jk>return</jk> location;
		}

		<ja>@ResponseBody</ja>
		<jk>public</jk> String toString() {
			<jk>return</jk> <js>"Temporary Redirect"</js>;
		}
	}
</p>
<p class='bpcode w800'>
	<jc>// Usage</jc>
	<ja>@RestMethod</ja>(method=<jsf>POST</jsf>)
	<jk>public</jk> Redirect addPet(Pet pet) {
		<jc>// Redirect to servlet root</jc>
		<jk>return new</jk> Redirect(URI.<jsm>create</jsm>(<js>"servlet:/"</js>));
	}
</p>

<h5 class='topic'>@Resource on @RestMethod-annotated methods</h5>
<p>
	The <ja>@Response</ja> annotation can also be applied to the Java method itself which is effectively
	the same as applying it to the return type (albeit for this method only).
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/user/login"</js>)
	<ja>@Response</ja>(code=200, description=<js>"OK"</js>)
	<jk>public</jk> Ok login(
		<ja>@FormData</ja>(<js>"username"</js>) String username, 
		<ja>@FormData</ja>(<js>"password"</js>) String password
	) <jk>throws</jk> InvalidLogin
	{
		checkCredentials(username, password);
		<jk>return new</jk> Ok();
	}
</p>
<p>
	The <ja>@Response</ja> annotation can be simultaneously on both the Java method and return type.
	When used in both locations, the annotation values are combined, but values defined on the
	method return annotation take precedence over the values defined on the type.
</p>

<h5 class='topic'>@Resource on @RestMethod-annotated method parameters</h5>
<p>
	The <ja>@Response</ja> annotation can also be applied to the Java method parameters when the parameter type 
	is {@link org.apache.juneau.Value} (a placeholder for objects).
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/user/login"</js>)
	<jk>public void</jk> login(
		<ja>@FormData</ja>(<js>"username"</js>) String username, 
		<ja>@FormData</ja>(<js>"password"</js>) String password,
		<ja>@Response</ja>(code=200, description=<js>"Login succeeded"</js>) Value&lt;String&gt; body
	) <jk>throws</jk> InvalidLogin 
	{
		checkCredentials(username, password);
		body.set(<js>"OK"</js>);
	}
</p>
<p>
	<ja>@Response</ja>-annotated types can also be used as value parameters:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(...)
	<jk>public void</jk> login(
		...
		<ja>@Response</ja> Value&lt;Ok&gt; res
	) <jk>throws</jk> InvalidLogin 
	{
		...
		res.set(<jk>new</jk> Ok());
	}
</p>
<p>
	In the above example, the <ja>@Response</ja> annotation is optional since it is inferred from the class
	that it's a <ja>@Response</ja> bean.
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/user/login"</js>)
	<jk>public void</jk> login(
		...
		Value&lt;Ok&gt; res  <jc>// @Response annotation not needed.</jc>
	) <jk>throws</jk> InvalidLogin 
	{
		...
		res.set(<jk>new</jk> Ok());
	}
</p>

<h5 class='topic'>@ResponseStatus on methods of @Response-annotated types</h5>
<p>
	The {@link org.apache.juneau.http.annotation.ResponseStatus @ResponseStatus} annotation can be used on 
	the method of a <ja>@Response</ja>-annotated class to identify HTTP response
	statuses other than <c>200</c> (the default).	
</p>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Response</ja>
	<jk>public class</jk> AddPetSuccess {
 
		<ja>@ResponseStatus</ja>
		<jk>public int</jk> getStatus() {
			<jk>return</jk> 201;
		}

		<ja>@Override</ja>
		<jk>public</jk> String toString() {
			<jk>return</jk> <js>"Pet was successfully added"</js>;
		}
	}
</p>


<h5 class='topic'>@ResponseHeader on methods of @Response-annotated types</h5>
<p>
	The {@link org.apache.juneau.http.annotation.ResponseHeader @ResponseHeader} annotation can be used on
	the method of a <ja>@Response</ja>-annotated class to identify a header
	to add to the response.
</p>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Response</ja>
	<jk>public class</jk> AddPetSuccess {
 
		<ja>@ResponseHeader</ja>(
			name=<js>"X-PetId"</js>,
			type=<js>"integer"</js>,
			format=<js>"int32"</js>,
			description=<js>"ID of added pet."</js>,
			example=<js>"123"</js>
		)
		<jk>public int</jk> getPetId() {...}
	}
</p>

<h5 class='topic'>@ResponseBody on methods of @Response-annotated types</h5>
<p>
	The {@link org.apache.juneau.http.annotation.ResponseBody @ResponseBody} annotation can be used on
	the method of a <ja>@Response</ja>-annotated class to identify a POJO
	as the body of the HTTP response.
</p>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Response</ja>
	<jk>public class</jk> AddPetSuccess {
 
		<ja>@ResponseBody</ja>
		<jk>public</jk> Pet getPet() {...}
	}
</p>

<p>
	If a <ja>@Response</ja> class does not have a <ja>@ResponseBody</ja>-annotated method, then the response
	object itself is serialized in the response (typically using <c>toString()</c>).
</p>

<h5 class='topic'>Notes about OpenAPI part serialization</h5>
<p>
	By default, POJOs representing the body of the request are serialized using the Juneau serializer
	matching the requesting <c>Accept</c> header.
	The {@link org.apache.juneau.oapi.OpenApiSerializer} class can be used to serialize response bodies using OpenAPI rules.
</p>
<p>
	The following examples show part-schema-based serialization of response bodies:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>
	<jk>public class</jk> ExampleResource {

		<jc>// Example 1 - String[] should be serialized using part serializer.</jc>
		<ja>@Response</ja>(
			serializers=OpenApiSerializer.<jk>class</jk>,
			defaultAccept=<js>"text/openapi"</js>
		)
		<ja>@RestMethod</ja>
		<jk>public</jk> String[] example1() {
			<jk>return new</jk> String[]{<js>"foo"</js>,<js>"bar"</js>};
		}

		<jc>// Example 2 - Same as above.  Annotation on parameter.</jc>
		<ja>@RestMethod</ja>
		<jk>public void</jk> example2(
			<ja>@Response</ja>(
				serializers=OpenApiSerializer.<jk>class</jk>,
				defaultAccept=<js>"text/openapi"</js>
			) 
			Value&lt;String[]&gt; body
		) 
		{
			body.set(<jk>new</jk> String[]{<js>"foo"</js>,<js>"bar"</js>});
		}
	}
</p>
<p>
	The <c><ja>@Response</ja>(schema)</c> annotation can be used to define the format of the output using OpenAPI-based rules.
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>
	<jk>public class</jk> ExampleResource {

		<ja>@Response</ja>(
			serializers=OpenApiSerializer.<jk>class</jk>,
			defaultAccept=<js>"text/openapi"</js>,
			schema=<ja>@Schema</ja>(collectionFormat=<js>"pipes"</js>)
		)
		<ja>@RestMethod</ja>
		<jk>public</jk> String[] example1() {
			<jk>return new</jk> String[]{<js>"foo"</js>,<js>"bar"</js>};
		}
	}
</p>

<h5 class='topic'>Swagger documentation</h5>
<p>
	The attributes on this annotation are also used to populate the generated Swagger for the method.
	For example, in the case of the <c>InvalidLogin</c> example above, the following Swagger is generated:
</p>
<p class='bpcode w800'>
	<jok>'/user/login'</jok>: {
		<jok>get</jok>: {
			<jok>responses</jok>: {
				<jok>401</jok>: {
					<jok>description</jok>: <jov>'Invalid username or password provided'</jov>
				}
			}
		}
	}
</p>

<h5 class='topic'>Automatic HTTP status</h5>
<p>
	When the {@link org.apache.juneau.http.annotation.Response#code() @Response(code)} value is specified, 
	the HTTP status is automatically set to that value on the response regardless of how it's used.
</p>
<p>
	The following two examples are equivalent:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/ok"</js>)
	<jk>public void</jk> sendContinue(
		<ja>@Response</ja>(code=100) Value&lt;String&gt; body
	) 
	{
		body.set(<js>"OK"</js>);
	}
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/ok"</js>)
	<jk>public void</jk> sendContinue(RestResponse res) {
		res.setStatus(100);
		res.setOutput(<js>"OK"</js>);
	}
</p>

<ul class='seealso'>
	<li class='link'>{@doc juneau-rest-server.OpenApiSchemaPartSerializing}
</ul>
</div><!-- END: 6.10.9 - juneau-rest-server.HttpPartAnnotations.Response -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.ResponseHeader' id='juneau-rest-server.HttpPartAnnotations.ResponseHeader'>6.10.10 - @ResponseHeader</a></h4>
<div class='topic'><!-- START: 6.10.10 - juneau-rest-server.HttpPartAnnotations.ResponseHeader -->
<p>
	The {@link org.apache.juneau.http.annotation.ResponseHeader @ResponseHeader} annotation can be applied to <ja>@RestMethod</ja>-annotated parameters to denote them as an HTTP response headers.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseHeader}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#_default() _default} - Default value if not present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#_enum() _enum} - Output validation.  Must match one of the values.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#$ref() $ref} - Schema reference.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#api() api} - Free-form Swagger JSON.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#code() code} - HTTP status codes that this header applies to.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#collectionFormat() collectionFormat} - How collections of items are formatted.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#description() description} - Description.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#example() example} - Serialized example.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#exclusiveMaximum() exclusiveMaximum} - Output validation.  Whether maximum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#exclusiveMinimum() exclusiveMinimum} - Output validation.  Whether minimum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#format() format} - The schema type format.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#items() items} - The schema of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#maximum() maximum} - Output validation.  Maximum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#maxItems() maxItems} - Output validation.  Maximum number of items in a collection. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#maxLength() maxLength} - Output validation.  Maximum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#minimum() minimum} - Output validation.  Minimum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#minItems() minItems} - Output validation.  Minimum number of items in a collection. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#minLength() minLength} - Output validation.  Minimum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#multipleOf() multipleOf} - Output validation.  Number must be a multiple of.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#name() name} - Header name.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#pattern() pattern} - Output validation.  Must match regular expression.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#serializer() serializer} - Override the part serializer.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#type() type} - The schema type.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#uniqueItems() uniqueItems} - Output validation. Collections must contain unique items only.
		<li class='jf'>{@link org.apache.juneau.http.annotation.ResponseHeader#value() value} - Free-form Swagger JSON.
	</ul>
</ul>
<p>
	This annotation can only be applied to parameters of type {@link org.apache.juneau.Value}.
</p>
<p>
	The following examples show 3 different ways of accomplishing the same task of setting an HTTP header
	on a response:
</p>
<p class='bpcode w800'>
	<jc>// Example #1 - Setting header directly on RestResponse object.</jc>
	<ja>@RestMethod</ja>(...)
	<jk>public void</jk> login(RestResponse res) {
		res.setHeader(<js>"X-Rate-Limit"</js>, 1000);
		...
	}
 
	<jc>// Example #2 - Use on parameter.</jc>
	<ja>@RestMethod</ja>(...)
	<jk>public void</jk> login(
			<ja>@ResponseHeader</ja>(
				name=<js>"X-Rate-Limit"</js>,
				type=<js>"integer"</js>,
				format=<js>"int32"</js>,
				description=<js>"Calls per hour allowed by the user."</js>,
				example=<js>"123"</js>
			)
			Value&lt;Integer&gt; rateLimit
 	) 
 	{
		rateLimit.set(1000);
		...
	}

	<jc>// Example #3 - Use on type.</jc>
	<ja>@RestMethod</ja>(...)
	<jk>public void</jk> login(Value&lt;RateLimit&gt; rateLimit) {
		rateLimit.set(<jk>new</jk> RateLimit());
		...
	}

	<ja>@ResponseHeader</ja>(
		name=<js>"X-Rate-Limit"</js>, 
		type=<js>"integer"</js>, 
		format=<js>"int32"</js>, 
		description=<js>"Calls per hour allowed by the user."</js>, 
		example=<js>"123"</js>
	)
	<jk>public class</jk> RateLimit {
		<jc>// OpenApiSerializer knows to look for this method based on format/type.</jc>
		<jk>public</jk> Integer toInteger() {
			<jk>return</jk> 1000;
		}
	}
</p>

<h5 class='topic'>Swagger documentation</h5>
<p>
	The attributes on this annotation are also used to populate the generated Swagger for the method.
	For example, in the case of the <c>X-Rate-Limit</c> example above, the following Swagger is generated:
</p>
<p class='bpcode w800'>
	<jok>'/user/login'</jok>: {
		<jok>get</jok>: {
			<jok>responses</jok>: {
				<jok>200</jok>: {
					<jok>headers</jok>: {
						<jok>'X-Rate-Limit'</jok>: {
							<jok>type</jok>: <jov>'integer'</jov>,
							<jok>format</jok>: <jov>'int32'</jov>,
							<jok>description</jok>: <jov>'Calls per hour allowed by the user.'</jov>,
							<jok>example</jok>: <jov>'123'</jov>
						}
					}
				}
			}
		}
	}
</p>
</div><!-- END: 6.10.10 - juneau-rest-server.HttpPartAnnotations.ResponseHeader -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpPartAnnotations.ResponseStatus' id='juneau-rest-server.HttpPartAnnotations.ResponseStatus'>6.10.11 - @ResponseStatus</a></h4>
<div class='topic'><!-- START: 6.10.11 - juneau-rest-server.HttpPartAnnotations.ResponseStatus -->
<p>
	The {@link org.apache.juneau.http.annotation.ResponseStatus @ResponseStatus} annotation annotation can be applied to <ja>@RestMethod</ja>-annotated parameters to denote them as an HTTP response status codes.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseStatus}
</ul>
<p>
	This can only be applied to parameters of the {@link org.apache.juneau.Value} class with an {@link java.lang.Integer} type.
</p>

<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Defined on parameter.</jc>
	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/user/login"</js>)
	<jk>public void</jk> login(
		<ja>@FormData</ja>(<js>"username"</js>) String username, 
		<ja>@FormData</ja>(<js>"password"</js>) String password,
		<ja>@ResponseStatus</ja> Value&lt;Integer&gt; status
	) 
	{
		<jk>if</jk> (! isValid(username, password))
			status.set(401);
	}
</p>
</div><!-- END: 6.10.11 - juneau-rest-server.HttpPartAnnotations.ResponseStatus -->
</div><!-- END: 6.10 - juneau-rest-server.HttpPartAnnotations -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HandlingFormPosts' id='juneau-rest-server.HandlingFormPosts'>6.11 - Handling Form Posts</a></h3>
<div class='topic'><!-- START: 6.11 - juneau-rest-server.HandlingFormPosts -->
<p>
	The best way to handle a form post is usually by using an input bean.
	The following is a 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>.
</p>
<p class='bpcode w800'>				
	<ja>@Rest</ja>(
		path=<js>"/urlEncodedForm"</js>
	)
	<jk>public class</jk> UrlEncodedFormResource <jk>extends</jk> BasicRestServlet {
	
		<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>@Swap</ja>(TemporalCalendarSwap.IsoLocalDateTime.<jk>class</jk>)
			<jk>public</jk> Calendar <jf>aDate</jf>;
		}
	}		
</p>	
<p>
	Another possibility is to access the form parameters individually:	
</p>	
<p class='bpcode w800'>
	<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.  
	The latter approach only supports URL-Encoding.
</p>
<div 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()}
</div>
</div><!-- END: 6.11 - juneau-rest-server.HandlingFormPosts -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HandlingMultiPartFormPosts' id='juneau-rest-server.HandlingMultiPartFormPosts'>6.12 - Handling Multi-Part Form Posts</a><span class='update'>8.0.0-updated</span></h3>
<div class='topic'><!-- START: 6.12 - juneau-rest-server.HandlingMultiPartFormPosts -->
<p>
	The Juneau framework does not natively support multipart form posts.  
	However, it can be done in conjunction with the Apache Commons File Upload library or through the Servlet 3.0 API directly.
</p>	
<p>
	The following is an example that uses the File Upload library to allow files to be uploaded as multipart form posts.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Rest</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>
<p>
	The following shows using the <l>HttpServletRequest.getParts()</l> method to retrieve multi-part form posts when using Jetty.
	This example is pulled from the PetStore application.
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		...
	)
	<jk>public</jk> SeeOtherRoot uploadFile(RestRequest req) <jk>throws</jk> Exception {
    	
		<jc>// Required for Jetty.</jc>
		MultipartConfigElement mce = <jk>new</jk> MultipartConfigElement((String)<jk>null</jk>);
		req.setAttribute(<js>"org.eclipse.jetty.multipartConfig"</js>, mce);  
       
		String id = UUID.<jsm>randomUUID</jsm>().toString();
		BufferedImage img = <jk>null</jk>;
		<jk>for</jk> (Part part : req.getParts()) {
			<jk>switch</jk> (part.getName()) {
				<jk>case</jk> <js>"id"</js>:
					id = IOUtils.<jsm>read</jsm>(part.getInputStream());
					<jk>break</jk>;
				<jk>case</jk> <js>"file"</js>:
					img = ImageIO.<jsm>read</jsm>(part.getInputStream());
			}
		}
		addPhoto(id, img);
		<jk>return new</jk> SeeOtherRoot(); <jc>// Redirect to the servlet root.</jc>
	}
</p>
</div><!-- END: 6.12 - juneau-rest-server.HandlingMultiPartFormPosts -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Serializers' id='juneau-rest-server.Serializers'>6.13 - Serializers</a></h3>
<div class='topic'><!-- START: 6.13 - juneau-rest-server.Serializers -->
<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#getMediaTypeRanges()} method.
</p>
<p>
	Serializers can be associated with REST servlets in the following ways:
</p>
<ul class='javatree'>
	<li class='ja'>
		{@link org.apache.juneau.rest.annotation.Rest#serializers() Rest(serializers)} 
		- Annotation on resource Java class.
	<li class='ja'>
		{@link org.apache.juneau.rest.annotation.RestMethod#serializers() 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='bpcode w800'>
	<jc>// Option #1 - Defined via annotation.</jc>
	<ja>@Rest</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>

<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_serializers}
</ul>
</div><!-- END: 6.13 - juneau-rest-server.Serializers -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Parsers' id='juneau-rest-server.Parsers'>6.14 - Parsers</a></h3>
<div class='topic'><!-- START: 6.14 - juneau-rest-server.Parsers -->
<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='javatree'>
	<li class='ja'>
		{@link org.apache.juneau.rest.annotation.Rest#parsers() Rest(parsers)} 
		- Annotation on resource Java class.
	<li class='ja'>
		{@link org.apache.juneau.rest.annotation.RestMethod#parsers() 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='bpcode w800'>
	<jc>// Option #1 - Defined via annotation.</jc>
	<ja>@Rest</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>
<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_parsers}
</ul>
</div><!-- END: 6.14 - juneau-rest-server.Parsers -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.ConfigurableProperties' id='juneau-rest-server.ConfigurableProperties'>6.15 - Configurable Properties</a><span class='update'>8.1.0-updated</span></h3>
<div class='topic'><!-- START: 6.15 - juneau-rest-server.ConfigurableProperties -->
<p>
	As shown in previous sections, Juneau serializers and parsers are highly-configurable through properties.
	(See {@doc ConfigurableProperties})
</p>
<p>
	These properties can be defined for serializers and parsers registered on a REST resource via the following:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.Rest#properties() Rest(properties)} 
	<li class='jc'>{@link org.apache.juneau.rest.RestContextBuilder} - Various methods on the context builder.
</ul>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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>@Rest</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> BasicRestServlet {...}
</p>
<p>
	The programmatic equivalent to this is:
</p>
<p class='bpcode w800'>
	<jc>// Servlet with properties applied</jc>
	<ja>@Rest</ja>(...)
	<jk>public</jk> MyRestServlet <jk>extends</jk> BasicRestServlet {
	
		<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 class='javatree'>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#properties() RestMethod(properties)} 
	<li class='jc'>{@link org.apache.juneau.rest.RequestProperties} 
</ul>
<p class='bpcode w800'>
	<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>
<ul class='seealso'>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.Rest#flags() Rest(flags)} - Shorthand for boolean properties.
	<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#flags() RestMethod(flags)} - Shorthand for boolean properties.
	<li class='jc'>{@link org.apache.juneau.rest.RestContextProperties} 
	<li class='jc'>{@link org.apache.juneau.rest.RestMethodProperties} 
</ul>
</div><!-- END: 6.15 - juneau-rest-server.ConfigurableProperties -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.ConfigurableAnnotations' id='juneau-rest-server.ConfigurableAnnotations'>6.16 - Configurable Annotations</a><span class='update'>8.1.0-new</span></h3>
<div class='topic'><!-- START: 6.16 - juneau-rest-server.ConfigurableAnnotations -->
<p>
	Config annotations allow you to define serializer and parser properties using specialized annotations.
	All configuration properties have annotation-equivalents.
</p>
<p>
	The following shows the difference between the two approaches:
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Servlet with properties applied</jc>
	<ja>@Rest</ja>(
		properties={
			<ja>@Property</ja>(name=<jsf>BEAN_sortProperties</jsf>, value=<js>"true"</js>),
			<ja>@Property</ja>(name=<jsf>SERIALIZER_trimNulls</jsf>, value=<js>"true"</js>),
			<ja>@Property</ja>(name=<jsf>JSON_escapeSolidus</jsf>, value=<js>"true"</js>)
		}
	)
	<jk>public</jk> MyRestServlet <jk>extends</jk> BasicRestServlet {...}
</p>
<p class='bpcode w800'>
	<jc>// Servlet with config annotations applied</jc>
	<ja>@Rest</ja>(
		...
	)
	<ja>@BeanConfig</ja>(sortProperties=<js>"true"</js>)
	<ja>@SerializerConfig</ja>(trimNulls=<js>"true"</js>)
	<ja>@JsonConfig</ja>(escapeSolidus=<js>"true"</js>)
	<jk>public</jk> MyRestServlet <jk>extends</jk> BasicRestServlet {...}
</p>
<p>
	Using config annotations is often cleaner and supports the same SVL variable support as those in the REST annotations.
</p>
<p>
	Config annotations are defined for all serializers and parsers:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.annotation.BeanConfig BeanConfig}
	<li class='ja'>{@link org.apache.juneau.csv.annotation.CsvConfig CsvConfig}
	<li class='ja'>{@link org.apache.juneau.html.annotation.HtmlConfig HtmlConfig}
	<li class='ja'>{@link org.apache.juneau.html.annotation.HtmlDocConfig HtmlDocConfig}
	<li class='ja'>{@link org.apache.juneau.jso.annotation.JsoConfig JsoConfig}
	<li class='ja'>{@link org.apache.juneau.json.annotation.JsonConfig JsonConfig}
	<li class='ja'>{@link org.apache.juneau.jsonschema.annotation.JsonSchemaConfig JsonSchemaConfig}
	<li class='ja'>{@link org.apache.juneau.msgpack.annotation.MsgPackConfig MsgPackConfig}
	<li class='ja'>{@link org.apache.juneau.oapi.annotation.OpenApiConfig OpenApiConfig}
	<li class='ja'>{@link org.apache.juneau.parser.annotation.ParserConfig ParserConfig}
	<li class='ja'>{@link org.apache.juneau.plaintext.annotation.PlainTextConfig PlainTextConfig}
	<li class='ja'>{@link org.apache.juneau.jena.annotation.RdfConfig RdfConfig}
	<li class='ja'>{@link org.apache.juneau.serializer.annotation.SerializerConfig SerializerConfig}
	<li class='ja'>{@link org.apache.juneau.soap.annotation.SoapXmlConfig SoapXmlConfig}
	<li class='ja'>{@link org.apache.juneau.uon.annotation.UonConfig UonConfig}
	<li class='ja'>{@link org.apache.juneau.urlencoding.annotation.UrlEncodingConfig UrlEncodingConfig}
	<li class='ja'>{@link org.apache.juneau.xml.annotation.XmlConfig XmlConfig}
</ul>
<p>
	Config annotations can be defined at both the class and method level just like properties.
</p>
</div><!-- END: 6.16 - juneau-rest-server.ConfigurableAnnotations -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Transforms' id='juneau-rest-server.Transforms'>6.17 - Transforms</a><span class='update'>8.1.0-updated</span></h3>
<div class='topic'><!-- START: 6.17 - juneau-rest-server.Transforms -->
<p>
	The Juneau serializers and parsers can be configured on how to handle POJOs through the use of Transforms.
	(See {@doc juneau-marshall.Transforms Transforms})
</p>
<p>
	Transforms are associated serializers and parsers registered on a REST resource via the following:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#beanFilters() BeanConfig(beanFilters)} - On class or methods. 
	<li class='ja'>{@link org.apache.juneau.annotation.BeanConfig#pojoSwaps() BeanConfig(pojoSwaps)} - On class or methods. 
	<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='bpcode w800'>
	<jc>// Servlet with transforms applied</jc>
	<ja>@Rest</ja>(
		...
	)
	<ja>@BeanConfig</ja>(
		pojoSwaps={
			<jc>// Calendars should be serialized/parsed as ISO8601 date-time strings</jc>
			TemporalCalendarSwap.IsoInstant.<jk>class</jk>,

			<jc>// Byte arrays should be serialized/parsed as BASE64-encoded strings</jc>
			ByteArraySwap.Base64.<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>
			MyInterface.<jk>class</jk>
		}
	)
	<jk>public</jk> MyRestServlet <jk>extends</jk> BasicRestServlet {...}
</p>
<p>
	The programmatic equivalent to this is:
</p>
<p class='bpcode w800'>
	<jc>// Servlet with properties applied</jc>
	<ja>@Rest</ja>(...)
	<jk>public</jk> MyRestServlet <jk>extends</jk> BasicRestServlet {
	
		<jk>public</jk> MyRestServlet(RestContextBuilder builder) {
			
			builder
				.pojoSwaps(
					TemporalCalendarSwap.IsoInstant.<jk>class</jk>,
					ByteArraySwap.Base64.<jk>class</jk>
				) 
				.beanFilters(MyInterface.<jk>class</jk>);
		}
	}
</p>
</div><!-- END: 6.17 - juneau-rest-server.Transforms -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.URIs' id='juneau-rest-server.URIs'>6.18 - URIs</a></h3>
<div class='topic'><!-- START: 6.18 - juneau-rest-server.URIs -->
<p>
	As mention earlier {@doc juneau-marshall.URIs here}, Juneau serializers have sophisticated support for transforming relative URIs to absolute form.
</p>
<p>
	The following example shows a REST method that returns a list of URIs of various forms: 
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		uriAuthority=<js>"http://foo.com:123"</js>,
		uriContext=<js>"/myContext"</js>
	)
	<jk>public class</jk> MyResource {
	
		<ja>@RestMethod</ja>
		<jk>public</jk> URI[] getURIs() {
			<jk>return new</jk> URI[] {
				URI.<jsm>create</jsm>(<js>"http://www.apache.org/f1a"</js>),
				URI.<jsm>create</jsm>(<js>"/f1b"</js>),
				URI.<jsm>create</jsm>(<js>"/f1c/x/y"</js>),
				URI.<jsm>create</jsm>(<js>"f1d"</js>),
				URI.<jsm>create</jsm>(<js>"f1e/x/y"</js>),
				URI.<jsm>create</jsm>(<js>""</js>),
				URI.<jsm>create</jsm>(<js>"context:/f2a/x"</js>),
				URI.<jsm>create</jsm>(<js>"context:/f2b"</js>),
				URI.<jsm>create</jsm>(<js>"context:/"</js>),
				URI.<jsm>create</jsm>(<js>"context:/.."</js>),
				URI.<jsm>create</jsm>(<js>"servlet:/f3a/x"</js>),
				URI.<jsm>create</jsm>(<js>"servlet:/f3b"</js>),
				URI.<jsm>create</jsm>(<js>"servlet:/"</js>),
				URI.<jsm>create</jsm>(<js>"servlet:/.."</js>),
				URI.<jsm>create</jsm>(<js>"request:/f4a/x"</js>),
				URI.<jsm>create</jsm>(<js>"request:/f4b"</js>),
				URI.<jsm>create</jsm>(<js>"request:/"</js>),
				URI.<jsm>create</jsm>(<js>"request:/.."</js>)
			};
		}
	}	
</p>
<p>
	When requested as JSON, it produces the following result:
</p>
<p class='bpcode w800'>
	{
		<jok>f1a</jok>:<jov>'http://www.apache.org/f1a'</jov>,
		<jok>f1b</jok>:<jov>'http://foo.com:123/f1b'</jov>,
		<jok>f1c</jok>:<jov>'http://foo.com:123/f1c/x/y'</jov>,
		<jok>f1d</jok>:<jov>'http://foo.com:123/myContext/myServlet/f1d'</jov>,
		<jok>f1e</jok>:<jov>'http://foo.com:123/myContext/myServlet/f1e/x/y'</jov>,
		<jok>f1f</jok>:<jov>'http://foo.com:123/myContext/myServlet'</jov>,
		<jok>f2a</jok>:<jov>'http://foo.com:123/myContext/f2a/x'</jov>,
		<jok>f2b</jok>:<jov>'http://foo.com:123/myContext/f2b'</jov>,
		<jok>f2c</jok>:<jov>'http://foo.com:123/myContext'</jov>,
		<jok>f2d</jok>:<jov>'http://foo.com:123'</jov>,
		<jok>f3a</jok>:<jov>'http://foo.com:123/myContext/myServlet/f3a/x'</jov>,
		<jok>f3b</jok>:<jov>'http://foo.com:123/myContext/myServlet/f3b'</jov>,
		<jok>f3c</jok>:<jov>'http://foo.com:123/myContext/myServlet'</jov>,
		<jok>f3d</jok>:<jov>'http://foo.com:123/myContext'</jov>,
		<jok>f4a</jok>:<jov>'http://foo.com:123/myContext/myServlet/myPath/f4a/x'</jov>,
		<jok>f4b</jok>:<jov>'http://foo.com:123/myContext/myServlet/myPath/f4b'</jov>,
		<jok>f4c</jok>:<jov>'http://foo.com:123/myContext/myServlet/myPath'</jov>,
		<jok>f4d</jok>:<jov>'http://foo.com:123/myContext/myServlet'</jov>
	}
</p>
<p>
	URI resolution is controlled by the following settings:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.rest.RestContext}
	<ul>
		<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_uriAuthority REST_uriAuthority}
		<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_uriContext REST_uriContext}
		<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_uriRelativity REST_uriRelativity}
		<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_uriResolution REST_uriResolution}
	</ul>	
</ul>

<p>
	URIs are resolved by both regular and part serializers.
</p>
</div><!-- END: 6.18 - juneau-rest-server.URIs -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Guards' id='juneau-rest-server.Guards'>6.19 - Guards</a></h3>
<div class='topic'><!-- START: 6.19 - juneau-rest-server.Guards -->
<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 class='javatree'>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.Rest#guards() Rest(guards)} 
	<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#guards() RestMethod(guards)} 
	<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#guards(Class...)} 
</ul>
<p class='bpcode w800'>
	<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>@Rest</ja>(guards=BillyGuard.<jk>class</jk>)
	<jk>public</jk> MyRestServlet <jk>extends</jk> BasicRestServlet {

 		<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='bpcode w800'>
	<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='bpcode w800'>
	<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.
	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='bpcode w800'>
	<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.
	If multiple guards are present, ALL guards must pass.
</p>
<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_guards}
</ul>
</div><!-- END: 6.19 - juneau-rest-server.Guards -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RoleGuards' id='juneau-rest-server.RoleGuards'>6.20 - Role guards</a><span class='update'>8.1.0-new</span></h3>
<div class='topic'><!-- START: 6.20 - juneau-rest-server.RoleGuards -->
<p>
	Specialized guards are provided for controlling access to servlet classes and methods based on user roles.
	These are controlled via annotations on the REST class and methods:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.Rest}
	<ul>
		<li class='jf'>{@link org.apache.juneau.rest.annotation.Rest#roleGuard() roleGuard()}
		<li class='jf'>{@link org.apache.juneau.rest.annotation.Rest#rolesDeclared() rolesDeclared()}
	</ul>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod}
	<ul>
		<li class='jf'>{@link org.apache.juneau.rest.annotation.RestMethod#roleGuard() roleGuard()}
		<li class='jf'>{@link org.apache.juneau.rest.annotation.RestMethod#rolesDeclared() rolesDeclared()}
	</ul>
</ul>
<p>
	The <c>roleGuard()</c> annotation is an expression that defines whether a user with specified roles are allowed
	to access methods.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Only admin users or users with both read/write and special access 
	// can run any methods on this class.</jc>
	<ja>@Rest</ja>(
		path=<js>"/foo"</js>,
		roleGuard=<js>"ROLE_ADMIN || (ROLE_READ_WRITE &amp;&amp; ROLE_SPECIAL)"</js>
	)
	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {
		...
	}
</p>
<p>
	The syntax allows for any of the following:
</p>
<ul>
	<li><js>"foo"</js> - Single arguments.
	<li><js>"foo,bar,baz"</js> - Multiple OR'ed arguments.
	<li><js>"foo | bar | baz"</js> - Multiple OR'ed arguments, pipe syntax.
	<li><js>"foo || bar || baz"</js> - Multiple OR'ed arguments, Java-OR syntax.
	<li><js>"fo*"</js> - Patterns including <js>'*'</js> and <js>'?'</js>.
	<li><js>"fo* &amp; *oo"</js> - Multiple AND'ed arguments, ampersand syntax.
	<li><js>"fo* &amp;&amp; *oo"</js> - Multiple AND'ed arguments, Java-AND syntax.
	<li><js>"fo* || (*oo || bar)"</js> - Parenthesis.
</ul>

<p>
 	If patterns are used, you must specify the list of declared roles using the <c>rolesDeclared()</c> annotations.
 	This declares the list of all possible user roles and is needed because the servlet API does not provide this
 	capability.
</p>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		rolesDeclared=<js>"ROLE_ADMIN,ROLE_READ_WRITE,ROLE_READ_ONLY,ROLE_SPECIAL"</js>,
		roleGuard=<js>"ROLE_ADMIN || (*WRITE* &amp;&amp; *SPECIAL*)"</js>
	)
	<jk>public class</jk> MyResource <jk>extends</jk> RestServlet {
		...
	}
</p>
</div><!-- END: 6.20 - juneau-rest-server.RoleGuards -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Converters' id='juneau-rest-server.Converters'>6.21 - Converters</a></h3>
<div class='topic'><!-- START: 6.21 - juneau-rest-server.Converters -->
<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 class='javatree'>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.Rest#converters() Rest(converters)} 
	<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#converters() RestMethod(converters)} 
	<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#converters(Class...)} 
</ul>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Associate the Traversable converter to all Java REST methods in this servlet</jc>
	<ja>@Rest</ja>(converters=Traversable.<jk>class</jk>)
	<jk>public</jk> MyRestServlet <jk>extends</jk> BasicRestServlet {
		...
	}
</p>
<p>
	They can also be defined at the method level:
</p>
<p class='bpcode w800'>
	<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>(<js>"id"</js>) <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.  
	In this code, the 3rd parameter is the object that was returned by the Java method.
	The converter uses the {@link org.apache.juneau.utils.PojoRest} wrapper class to address nodes in the 
	tree.
</p>
<p class='bpcode w800'>
	<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='javatree'>
	<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>

<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_converters} 
</ul>
</div><!-- END: 6.21 - juneau-rest-server.Converters -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Messages' id='juneau-rest-server.Messages'>6.22 - Messages</a></h3>
<div class='topic'><!-- START: 6.22 - juneau-rest-server.Messages -->
<p>
	The {@link org.apache.juneau.rest.annotation.Rest#messages @Rest(messages)} annotation is used to associate a resource bundle with a servlet class.
</p>
<p class='bpcode w800'>
	<jc>// Servlet with associated resource bundle</jc>
	<ja>@Rest</ja>(messages=<js>"nls/MyMessages"</js>)
	<jk>public</jk> MyRestServlet <jk>extends</jk> BasicRestServlet {

		<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='bpcode w800'>
	<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='bpcode w800'>
	<cc>#--------------------------------------------------------------------------------
	# Contents of MyMessages.properties
	#--------------------------------------------------------------------------------</cc>
	<ck>greeting</ck> = Hello!
</p>	 	
<p class='bpcode w800'>
	<cc>#--------------------------------------------------------------------------------
	# Contents of shared MyMessages.properties
	#--------------------------------------------------------------------------------</cc>
	<ck>MyRestServlet.greeting</ck> = Hello!
</p>

<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_messages}
</ul>
</div><!-- END: 6.22 - juneau-rest-server.Messages -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Encoders' id='juneau-rest-server.Encoders'>6.23 - Encoders</a></h3>
<div class='topic'><!-- START: 6.23 - juneau-rest-server.Encoders -->
<p>
	The {@link org.apache.juneau.rest.annotation.Rest#encoders @Rest(encoders)} annotation can 
	be used to associate character encoders with a servlet class.
	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='bpcode w800'>
	<jc>// Servlet with automated support for GZIP compression</jc>
	<ja>@Rest</ja>(encoders={GzipEncoder.<jk>class</jk>})
	<jk>public</jk> MyRestServlet <jk>extends</jk> BasicRestServlet {
		...
	}
</p>
<p>
	Juneau defines the following encoders out-of-the-box:
</p>
<ul class='javatree'>
	<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>

<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_encoders}
</ul>
</div><!-- END: 6.23 - juneau-rest-server.Encoders -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.SvlVariables' id='juneau-rest-server.SvlVariables'>6.24 - SVL Variables</a></h3>
<div class='topic'><!-- START: 6.24 - juneau-rest-server.SvlVariables -->
<p>	
	In the previous examples, there were several cases where embedded variables were contained within
	annotation values:
</p>
<p class='bpcode w800'>
	<ja>@Rest</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.
	This is called Simple Variable Language, or SVL, and is defined here: {@doc juneau-marshall.SimpleVariableLanguage Simple Variable Language}.
</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 class='javatree'>
	<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#vars(Class[])}
</ul>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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>@Rest</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 class='javatree'>
	<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 class='spaced-list'>
	<li><l>Initialization-time variables</l>
		<br>These are variables that can be used in many of the annotations in {@link org.apache.juneau.rest.annotation.Rest @Rest}. 
		<br>The {@link org.apache.juneau.rest.RestContext#getVarResolver()} method returns initialization-time variables only.
	<li><l>Request-time variables</l>
		<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>
<h5 class='figure'><a href='#DefaultRestSvlVariables' id='DefaultRestSvlVariables'>Default REST SVL Variables:</a></h5>
<table class='styled w800'>
	<tr>
		<th>Module</th><th>Class</th><th>Pattern</th><th>Initialization<br>time</th><th>Request<br>time</th><th>Examples</th>
	</tr>
	<tr class='dark'>
		<td rowspan='11' 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{key[,default]}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$E{PATH}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.SystemPropertiesVar}</td>
		<td class='code'>$S{key[,default]}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$S{java.home}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.ArgsVar}</td>
		<td class='code'>$A{key[,default]}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$A{foo,null}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.ManifestFileVar}</td>
		<td class='code'>$MF{key[,default]}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$MF{Main-Class}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.IfVar}</td>
		<td class='code'>$IF{arg,then[,else]}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$IF{$S{my.boolean.property},foo,bar}</td>
	</tr>
	<tr class='dark dd'>
		<td>{@link org.apache.juneau.svl.vars.SwitchVar}</td>
		<td class='code'>$SW{arg,p1:then1[,p2:then2...]}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$SW{$P{os.name},*win*:Windows,*:Something else}</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>
		<td class='code'>$CO{$S{my.property},$E{my.property},n/a}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.PatternMatchVar}</td>
		<td class='code'>$PM{arg,pattern}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$PM{$P{os.name},*win*}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.NotEmptyVar}</td>
		<td class='code'>$NE{arg}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$NE{$S{foo}}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.UpperCaseVar}</td>
		<td class='code'>$UC{arg}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$UC{$S{foo}}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.svl.vars.LowerCaseVar}</td>
		<td class='code'>$LC{arg}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$LC{$S{foo}}</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[,default]}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$C{REST/staticFiles}</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[,default]}}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$F{resources/MyAsideMessage.html, Oops not found!}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.rest.vars.ServletInitParamVar}</td>
		<td class='code'>$I{name[,default]}</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$I{my.param}</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>
		<td class='code'>$L{MyMessage,foo,bar}</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>
		<td class='code'>$RA{attrName}</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>
		<td class='code'>$RF{paramName}</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>
		<td class='code'>$RH{Header-Name}</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>
		<td class='code'>$RP{pathVAr}</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>
		<td class='code'>$RQ{paramName}</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>
		<td class='code'>$R{contextPath}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.rest.vars.RestInfoVar}</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>
		<td class='code'>$RI{externalDocs}</td>
	</tr>
	<tr class='dark'>
		<td>{@link org.apache.juneau.rest.vars.SerializedRequestAttrVar}</td>
		<td class='code'>$SA{contentType,key[,default]}</td>
		<td style='text-align:center;font-weight:bold'>no</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$SA{application/json,$RA{foo}}</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>
		<td class='code'>$U{servlet:/foo}</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>
		<td class='code'>$U{servlet:/foo?bar=$UE{$RA{bar}}</td>
	</tr>
	<tr class='dark dd'>
		<td>{@link org.apache.juneau.rest.vars.WidgetVar}</td>
		<td class='code'>$W{name}</td>
		<td style='text-align:center;font-weight:bold'>no</td>
		<td style='text-align:center;font-weight:bold'>yes</td>
		<td class='code'>$W{MenuItemWidget}</td>
	</tr>
</table>
</div><!-- END: 6.24 - juneau-rest-server.SvlVariables -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.ConfigurationFiles' id='juneau-rest-server.ConfigurationFiles'>6.25 - Configuration Files</a></h3>
<div class='topic'><!-- START: 6.25 - juneau-rest-server.ConfigurationFiles -->
<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='bpcode w800'>
	<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='bpcode w800'>
	Config c = Config.<jsm>create</jsm>(<js>"myconfig.cfg"</js>).build();
	String path = c.getString(<js>"MyProperties/path"</js>);
	File javaHome = c.getObject(<js>"MyProperties/javaHome"</js>, File.<jk>class</jk>);
	String customMessage = c.getString(<js>"MyProperties/customMessage"</js>);
</p>
<p>
	Configuration files are associated with REST resources through the following:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.Rest#config() Rest(config)}
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Rest</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.  
	For example, the Microservice API {@link org.apache.juneau.rest.BasicRestServlet} class defines the 
	location of the config file as a system property <l>"juneau.configFile"</l>:
</p>
<p class='bpcode w800'>
	<ja>@Rest</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='bpcode w800'>
	<ja>@Rest</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 c = builder.getConfig();
			<jf>path</jf> = c.getString(<js>"MyProperties/path"</js>);
			<jf>javaHome</jf> = c.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='bpcode w800'>
	<ja>@Rest</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='bpcode w800'>
	<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='bpcode w800'>
	<jd>/** 
	 * Sample REST resource that prints out a simple "Hello world!" message.
	 */</jd>
	 <ja>@Rest</ja>(
	 	config=<js>"config_dir/myconfig.cfg"</js>,
	 	...
	 )
 	<jk>public class</jk> HelloWorldResource <jk>extends</jk> BasicRestServlet {
		
		<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='bpcode w800'>
	<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='bpcode w800'>
	<cc>#-------------------------------------------</cc>
	<cc># Contents of HelloWorldResource.properties </cc>
	<cc>#-------------------------------------------</cc>
	<ck>localizedMessage</ck> = <cv>Hello {0}!</cv>
</p>
<p class='bpcode w800'>
	<jd>/** 
	 * Sample REST resource that prints out a simple "Hello world!" message.
	 */</jd>
	 <ja>@Rest</ja>(
	 	messages=<js>"HelloWorldResources"</js>,
	 	config=<js>"config_dir/myconfig.cfg"</js>,
	 	...
	 )
 	<jk>public class</jk> HelloWorldResource <jk>extends</jk> BasicRestServlet {
		
		<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>

<ul class='seealso'>
	<li>{@doc juneau-config}
</ul>
</div><!-- END: 6.25 - juneau-rest-server.ConfigurationFiles -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.StaticFiles' id='juneau-rest-server.StaticFiles'>6.26 - Static files</a></h3>
<div class='topic'><!-- START: 6.26 - juneau-rest-server.StaticFiles -->
<p>
	The {@link org.apache.juneau.rest.annotation.Rest#staticFiles @Rest(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='bpcode w800'>
	<jk>package</jk> com.foo.mypackage;

	<ja>@Rest</ja>(
		path=<js>"/myresource"</js>,
		staticFiles={<js>"htdocs:docs"</js>}
	)
	<jk>public class</jk> MyResource <jk>extends</jk> BasicRestServlet {...}
</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>

<ul class='notes'>
	<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>

<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_staticFiles}
</ul>
</div><!-- END: 6.26 - juneau-rest-server.StaticFiles -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.ClientVersioning' id='juneau-rest-server.ClientVersioning'>6.27 - Client Versioning</a></h3>
<div class='topic'><!-- START: 6.27 - juneau-rest-server.ClientVersioning -->
<p>
	Client version headers are used to support backwards compatibility for breaking REST interface changes.
	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 class='javatree'>
	<li class='ja'>{@link org.apache.juneau.rest.annotation.Rest#clientVersionHeader() Rest(clientVersionHeader)}
	<li class='jm'>{@link org.apache.juneau.rest.RestContextBuilder#clientVersionHeader(String)}
	<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#clientVersion() RestMethod(clientVersion)}
</ul>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Option #1 - Defined via annotation resolving to a config file setting with default value.</jc>
	<ja>@Rest</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>

<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_clientVersionHeader}
</ul>
</div><!-- END: 6.27 - juneau-rest-server.ClientVersioning -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestInfoProvider' id='juneau-rest-server.RestInfoProvider'>6.28 - RestInfoProvider</a></h3>
<div class='topic'><!-- START: 6.28 - juneau-rest-server.RestInfoProvider -->
<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.
	It can be overridden to provide your own custom Swagger documentation.
</p>
<p>
	The methods on this interface are:
</p>
<ul class='javatree'>
	<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='javatree'>
	<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 class='javatree'>
	<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>BasicRestInfoProvider</l> class described next.
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.RestInfoProvider.BasicRestInfoProvider' id='juneau-rest-server.RestInfoProvider.BasicRestInfoProvider'>6.28.1 - BasicRestInfoProvider</a></h4>
<div class='topic'><!-- START: 6.28.1 - juneau-rest-server.RestInfoProvider.BasicRestInfoProvider -->
<p>
	The {@link org.apache.juneau.rest.BasicRestInfoProvider} 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>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>
</div><!-- END: 6.28.1 - juneau-rest-server.RestInfoProvider.BasicRestInfoProvider -->
</div><!-- END: 6.28 - juneau-rest-server.RestInfoProvider -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger' id='juneau-rest-server.Swagger'>6.29 - Swagger</a></h3>
<div class='topic'><!-- START: 6.29 - juneau-rest-server.Swagger -->
<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>
<p>
	As described previously, the <c>PetStore</c> example provides an example of auto-generated Swagger JSON:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.1.png'>
<p>
	Using {@link org.apache.juneau.dto.swagger.ui.SwaggerUI}, we're able to render that JSON as a Swagger user interface:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.2.png'>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.BasicRestServlet' id='juneau-rest-server.Swagger.BasicRestServlet'>6.29.1 - BasicRestServlet</a><span class='update'>8.1.0-updated</span></h4>
<div class='topic'><!-- START: 6.29.1 - juneau-rest-server.Swagger.BasicRestServlet -->
<p>
	Any subclass of {@link org.apache.juneau.rest.BasicRestServlet} gets an auto-generated Swagger UI when performing an <c>OPTIONS</c>
	request with <c>Accept:text/html</c>.
</p>
<p>
	The underlying mechanics are simple.  
	The {@link org.apache.juneau.rest.BasicRestServlet#getOptions(RestRequest)} method returns a {@link org.apache.juneau.dto.swagger.Swagger} bean
	consisting of information gathered from annotations and other sources.
	Then that bean is swapped for a {@link org.apache.juneau.dto.swagger.ui.SwaggerUI} bean when rendered as HTML.
</p>
<p>
	Here's the class that defines the behavior:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
	
		<jc>// Allow OPTIONS requests to be simulated using ?method=OPTIONS query parameter.</jc>
		allowedMethodParams=<js>"OPTIONS"</js>,
	
		...
	)
	<jk>public abstract class</jk> BasicRestServlet <jk>extends</jk> RestServlet <jk>implements</jk> BasicRestConfig {
	
		<jd>/**
		 * [OPTIONS /*] - Show resource options.
		 *
		 * <ja>@param</ja> req The HTTP request.
		 * <ja>@return</ja> A bean containing the contents for the OPTIONS page.
		 */</jd>
		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>,
			
			summary=<js>"Swagger documentation"</js>,
			description=<js>"Swagger documentation for this resource."</js>,
			
			htmldoc=<ja>@HtmlDoc</ja>(
				<jc>// Override the nav links for the swagger page.</jc>
				navlinks={
					<js>"back: servlet:/"</js>,
					<js>"json: servlet:/?method=OPTIONS&amp;Accept=text/json&amp;plainText=true"</js>
				},
				<jc>// Never show aside contents of page inherited from class.</jc>
				aside=<js>"NONE"</js>
			)
		)
		<ja>@JsonSchemaConfig</ja>(
			<jc>// Add descriptions to the following types when not specified:</jc>
			addDescriptionsTo=<js>"bean,collection,array,map,enum"</js>,
			<jc>// Add x-example to the following types:</jc>
			addExamplesTo=<js>"bean,collection,array,map"</js>,
			<jc>// Don't generate schema information on the Swagger bean itself or HTML beans.</jc>
			ignoreTypes=<js>"Swagger,org.apache.juneau.dto.html5.*"</js>,
			<jc>// Use $ref references for bean definitions to reduce duplication in Swagger.</jc>
			useBeanDefs=<js>"true"</js>
		)
		<ja>@BeanConfig</ja>(
			<jc>// When parsing generated beans, ignore unknown properties that may only exist as getters and not setters.</jc>
			ignoreUnknownBeanProperties=<js>"true"</js>,
			<jc>// POJO swaps to apply to all serializers/parsers on this method.</jc>
			pojoSwaps={
				<jc>// Use the SwaggerUI swap when rendering Swagger beans.</jc>
				<jc>// This is a per-media-type swap that only applies to text/html requests.</jc>
				SwaggerUI.<jk>class</jk>
			}
		)
		<jk>public</jk> Swagger getOptions(RestRequest req) {
			<jc>// Localized Swagger for this resource is available through the RestRequest object.</jc>
			<jk>return</jk> req.getSwagger();
		}
	}
</p>
<p>
	Note that to have your resource create Swagger UI, you must either extend from {@link org.apache.juneau.rest.BasicRestServlet} or provide
	your own <ja>@RestMethod</ja>-annotated method that returns a {@link org.apache.juneau.dto.swagger.Swagger} object and a {@link org.apache.juneau.dto.swagger.ui.SwaggerUI} swap.
</p>
</div><!-- END: 6.29.1 - juneau-rest-server.Swagger.BasicRestServlet -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.BasicSwaggerInfo' id='juneau-rest-server.Swagger.BasicSwaggerInfo'>6.29.2 - Basic Swagger Info</a></h4>
<div class='topic'><!-- START: 6.29.2 - juneau-rest-server.Swagger.BasicSwaggerInfo -->
<p>
	Let's look at the various parts of the <c>Petstore</c> application Swagger UI to see how they are defined.
</p>
<p>
	The top part of the page shows general information about the REST interface:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.3.png'>
<p>
	The information is pulled from the {@link org.apache.juneau.rest.annotation.Rest#swagger() @Rest(swagger)} annotation.
</p>
<h5 class='figure'>org.apache.juneau.examples.rest.petstore.PetStoreResource</h5>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/petstore"</js>,
		title=<js>"Petstore application"</js>,
		...
		swagger=@ResourceSwagger(<js>"$F{PetStoreResource.json}"</js>),
		...
	)
	<jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestServletJena {...}
</p>
<p>
	In this particular case, the Swagger is pulled in from a localized Swagger JSON file located in the 
	<c>org.apache.juneau.examples.rest.petstore</c> package using the {@link org.apache.juneau.rest.vars.FileVar $F} variable.
</p>
<h5 class='figure'>PetStoreResource.json</h5>
<p class='bpcode w800'>
	{
		<jok>"swagger"</jok>: <jov>"2.0"</jov>,
		<jok>"info"</jok>: {
			<jok>"version"</jok>: <jov>"1.0.0"</jov>,
			<jok>"title"</jok>: <jov>"Swagger Petstore"</jov>,
			<jok>"termsOfService"</jok>: <jov>"You are on your own."</jov>,
			<jok>"contact"</jok>: {
				<jok>"name"</jok>: <jov>"Juneau Development Team"</jov>,
				<jok>"email"</jok>: <jov>"dev@juneau.apache.org"</jov>,
				<jok>"url"</jok>: <jov>"http://juneau.apache.org"</jov>
			},
			<jok>"license"</jok>: {
				<jok>"name"</jok>: <jov>"Apache 2.0"</jov>,
				<jok>"url"</jok>: <jov>"http://www.apache.org/licenses/LICENSE-2.0.html"</jov>
			}
		},
		<jok>"externalDocs"</jok>: {
			<jok>"description"</jok>: <jov>"Find out more about Juneau"</jov>,
			<jok>"url"</jok>: <jov>"http://juneau.apache.org"</jov>
		},
		...
	}
</p>
<p>
	Note that the {@link org.apache.juneau.rest.vars.FileVar $F} variable allows for request-locale-sensitive name matching so that you can provide
	localized Swagger information.
</p>
<p>
	The {@link org.apache.juneau.rest.vars.FileVar $F} variable simply expands to a string to fill the {@link org.apache.juneau.rest.annotation.ResourceSwagger#value() @ResourceSwagger(value)}
	annotation.  
	You could equivalently embed JSON directly into your annotation like so:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/petstore"</js>,
		title=<js>"Petstore application"</js>,
		...
		swagger=<ja>@ResourceSwagger</ja>(
			<jc>// Raw Simplified JSON.</jc>
			<jc>// Values are concatenated.
			<js>"{"</js>,
				<js>"swagger: '2.0',"</js>,
				<js>"version: '1.0.0',"</js>,
				...
			<js>"}"</js>
		),
		...
	)
	<jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestServletJena {...}
</p>
<p>
	However, a more typical (and less error-prone) scenario is to define all of your Swagger as annotations:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/petstore"</js>,
		title=<js>"Petstore application"</js>,
		...
		swagger=<ja>@ResourceSwagger</ja>(
			version=<js>"1.0.0"</js>,
			title=<js>"Swagger Petstore"</js>,
			termsOfService=<js>"You are on your own."</js>,
			contact=<ja>@Contact</ja>(
				name=<js>"Juneau Development Team"</js>,
				email=<js>"dev@juneau.apache.org"</js>,
				url=<js>"http://juneau.apache.org"</js>
			),
			license=<ja>@License</ja>(
				name=<js>"Apache 2.0"</js>,
				url=<js>"http://www.apache.org/licenses/LICENSE-2.0.html"</js>
			),
			externalDocs=<ja>@ExternalDocs</ja>(
				description=<js>"Find out more about Juneau"</js>,
				url=<js>"http://juneau.apache.org"</js>
			)
		),
		...
	)
	<jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestServletJena {...}
</p>
<p>
	All annotations support {@doc DefaultRestSvlVariables SVL variables}, so you could for example
	pull localized strings from resource bundles using {@link org.apache.juneau.rest.vars.LocalizationVar $L} variables.
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/petstore"</js>,
		title=<js>"Petstore application"</js>,
		messages=<js>"nls/MyMessages"</js>,
		...
		swagger=<ja>@ResourceSwagger</ja>(
			version=<js>"1.0.0"</js>,
			title=<js>"$L{myTitle}"</js>,
			termsOfService=<js>"$L{myTermsOfService}"</js>,
			contact=<ja>@Contact</ja>(
				name=<js>"$L{myTeam}"</js>,
				email=<js>"dev@juneau.apache.org"</js>,
				url=<js>"http://juneau.apache.org"</js>
			),
			license=<ja>@License</ja>(
				name=<js>"Apache 2.0"</js>,
				url=<js>"http://www.apache.org/licenses/LICENSE-2.0.html"</js>
			),
			externalDocs=<ja>@ExternalDocs</ja>(
				description=<js>"$L{myExternalDocsDescription}"</js>,
				url=<js>"http://juneau.apache.org"</js>
			)
		),
		...
	)
	<jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestServletJena {...}
</p>
<p>
	A third option is to define your Swagger information in your {@link org.apache.juneau.rest.annotation.Rest#messages @Rest(messages)} resource
	bundle using predefined Swagger keywords:
</p>
<p class='bpcode w800'>
	<mk>PetStoreResource.version</mk> = <mv>1.0.0</mv>
	<mk>PetStoreResource.title</mk> = <mv>Swagger Petstore</mv>
	<mk>PetStoreResource.termsOfService</mk> = <mv>You are on your own.</mv>
	<mk>PetStoreResource.contact</mk> = <mv>{name:'Juneau Development Team', email:'dev@juneau.apache.org',...}</mv>
	<mk>PetStoreResource.license</mk> = <mv>{name:'Apache 2.0',...}</mv>
	<mk>PetStoreResource.externalDocs</mk> = <mv>{description:'Find out more about Juneau',...}</mv>
</p>
<p>
	Information defined in multiple locations are merged into a single set of data.  
	When the same information is provided in multiple locations, the following order-of-precedence is used:
</p>
<ol>
	<li>Java annotations
	<li>Resource bundle
	<li>Swagger JSON file
</ol>
</div><!-- END: 6.29.2 - juneau-rest-server.Swagger.BasicSwaggerInfo -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.Tags' id='juneau-rest-server.Swagger.Tags'>6.29.3 - Tags</a></h4>
<div class='topic'><!-- START: 6.29.3 - juneau-rest-server.Swagger.Tags -->
<p>
	Tags allow you to group operations into general categories.
	In the user interface, these can be expanded/collapsed by clicking on the tag sections.
	In the example below, the <c>pet</c> and <c>store</c> tag sections are collapsed
	and the <c>user</c> section is not:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.4.png'>
<p>
	Tags are also defined in the <ja>@ResourceSwagger</ja> annotation
</p>
<h5 class='figure'>PetStoreResource.json</h5>
<p class='bpcode w800'>
	<jok>"tags"</jok>: [
		{
			<jok>"name"</jok>: <jov>"pet"</jov>,
			<jok>"description"</jok>: <jov>"Everything about your Pets"</jov>,
			<jok>"externalDocs"</jok>: {
				<jok>"description"</jok>: <jov>"Find out more"</jov>,
				<jok>"url"</jok>: <jov>"http://juneau.apache.org"</jov>
			}
		},
		{
			<jok>"name"</jok>: <jov>"store"</jov>,
			<jok>"description"</jok>: <jov>"Access to Petstore orders"</jov>
		},
		{
			<jok>"name"</jok>: <jov>"user",
			<jok>"description"</jok>: <jov>"Operations about user"</jov>,
			<jok>"externalDocs"</jok>: {
				<jok>"description"</jok>: <jov>"Find out more about our store"</jov>,
				<jok>"url"</jok>: <jov>"http://juneau.apache.org"</jov>
			}
		}
	],
</p>
<p>
	The annotation-only approach is shown here:
</p>
<h5 class='figure'>org.apache.juneau.examples.rest.petstore.PetStoreResource</h5>
<p class='bpcode w800'>
	swagger=<ja>@ResourceSwagger</ja>(
		...
		tags={
			<ja>@Tag</ja>(
				name=<js>"pet"</js>,
				description=<js>"Everything about your Pets"</js>,
				externalDocs=<ja>@ExternalDocs</ja>(
					description=<js>"Find out more"</js>,
					url=<js>"http://juneau.apache.org"</js>
				)
			),
			<ja>@Tag</ja>(
				name=<js>"store"</js>,
				description=<js>"Access to Petstore orders"</js>
			),
			<ja>@Tag</ja>(
				name=<js>"user"</js>,
				description=<js>"Operations about user"</js>,
				externalDocs=<ja>@ExternalDocs</ja>(
					description=<js>"Find out more about our store"</js>,
					url=<js>"http://juneau.apache.org"</js>
				)
			)
		}
	),
</p>
<p>
	Tags are associated with operations using the {@link org.apache.juneau.rest.annotation.MethodSwagger#tags() @MethodSwagger(tags)} annotation:
</p>

<h5 class='figure'>GET /user operation</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		name=<jsf>GET</jsf>,
		path=<js>"/user"</js>,
		summary=<js>"Petstore users"</js>,
		swagger=<ja>@MethodSwagger</ja>(
			tags=<js>"user"</js>
		)
	)
	<jk>public</jk> Collection&lt;User&gt; getUsers() <jk>throws</jk> NotAcceptable {...}
</p>
<p>
	Operations can be mapped to multiple tags.
</p>
<p>
	Tags are optional.
	Operations not mapped to tags are listed in the UI before tagged operations.
</p>
<p>
	For example, the <c>getTopPage()</c> method in <c>PetStoreResource</c> is not tagged, 
	as well as the <c>getOptions()</c> method inherited from <c>BaseRestServlet</c>, so these
	show up at the top of the page:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.5.png'>
</div><!-- END: 6.29.3 - juneau-rest-server.Swagger.Tags -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.Operations' id='juneau-rest-server.Swagger.Operations'>6.29.4 - Operations</a></h4>
<div class='topic'><!-- START: 6.29.4 - juneau-rest-server.Swagger.Operations -->
<p>
	<ja>@RestMethod</ja>-annotated methods automatically get rendered as Swagger operations:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.Operations.1.png'>
<p>
	The following shows the annotations defined on the <c>GET /pet</c> operation:
</p>
<h5 class='figure'>PetStoreResource.getPets()</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		name=<jsf>GET</jsf>,
		path=<js>"/pet"</js>,
		summary=<js>"All pets in the store"</js>,
		swagger=<ja>@MethodSwagger</ja>(
			tags=<js>"pet"</js>,
			...
		),
		...
	)
	<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable {
		<jk>return</jk> <jsf>store</jsf>.getPets();
	}
</p> 
<p>
	Methods marked as deprecated will show up as deprecated in the Swagger UI:	
</p>
<h5 class='figure'>PetStoreResource.findPetsByTag()</h5>
<p class='bpcode w800'>	
	<ja>@RestMethod</ja>(
		name=<jsf>GET</jsf>,
		path=<js>"/pet/findByTags"</js>,
		summary=<js>"Finds Pets by tags"</js>,
		...
	)
	<ja>@Deprecated</ja>
	<jk>public</jk> Collection&lt;Pet&gt; findPetsByTags(...) {
		...
	}
</p>
</div><!-- END: 6.29.4 - juneau-rest-server.Swagger.Operations -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.Parameters' id='juneau-rest-server.Swagger.Parameters'>6.29.5 - Parameters</a></h4>
<div class='topic'><!-- START: 6.29.5 - juneau-rest-server.Swagger.Parameters -->
<p>
	Expanding operations shows you a list of parameters:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.Operations.2.png'> 
<p>
	Parameter information can be defined in a couple of ways.  The typical way is through annotations on parameters
	being passed to your <ja>@RestMethod</ja>-annotated method, like so:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		...
	)
	<jk>public</jk> Collection&lt;Pet&gt; getPets(
			<ja>@Query</ja>(
				name=<js>"s"</js>,
				description={
					<js>"Search."</js>,
					<js>"Key/value pairs representing column names and search tokens."</js>,
					<js>"'*' and '?' can be used as meta-characters in string fields."</js>,
					<js>"'&gt;', '&gt;=', '&lt;', and '&lt;=' can be used as limits on numeric and date fields."</js>,
					<js>"Date fields can be matched with partial dates (e.g. '2018' to match any date in the year 2018)."</js>
				},
				type=<js>"array"</js>,
				collectionFormat=<js>"csv"</js>,
				example=<js>"Bill*,birthDate>2000"</js>
			) 
			String[] s,
			<ja>@Query</ja>(
				name=<js>"v"</js>,
				description={
					<js>"View."</js>,
					<js>"Column names to display."</js>
				},
				type=<js>"array"</js>,
				collectionFormat=<js>"csv"</js>,
				example=<js>"name,birthDate"</js>
			) 
			String[] v,
			...
		) <jk>throws</jk> NotAcceptable {
		...
	}
</p>
<p>
	<b>Note:</b>  The <c>type</c> and <c>collectionFormat</c> values above are optional and auto-detected based on the
	parameter class type if omitted.  They're included here for clarity.
	The examples will be explained in the next section.
</p>
<p>
	Another option is to specify your parameter information in the <c>parameters</c> annotation as free-form Simple JSON.
	In the case of the <c>PetStoreResource.getPets()</c> method, we pull this information from a static field
	defined in the {@link org.apache.juneau.rest.converters.Queryable} class:
</p>
<h5 class='figure'>PetStoreResource.getPets()</h5>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		name=<jsf>GET</jsf>,
		path=<js>"/pet"</js>,
		summary=<js>"All pets in the store"</js>,
		swagger=<ja>@MethodSwagger</ja>(
			tags=<js>"pet"</js>,
			parameters={
				Queryable.<jsf>SWAGGER_PARAMS</jsf>
			}
		),
		...
		converters={Queryable.<jk>class</jk>}
	)
	<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable {
		<jk>return</jk> <jf>store</jf>.getPets();
	}
</p>
<h5 class='figure'>Queryable</h5>
<p class='bpcode w800'>
	<jk>public class</jk> Queryable <jk>implements</jk> RestConverter {
	
		<jk>public static final</jk> String <jsf>SWAGGER_PARAMS</jsf>=<js>""</js>
			+ <js>"{"</js>
				+ <js>"in:'query',"</js>
				+ <js>"name:'s',"</js>
				+ <js>"description:'"</js>
					+ <js>"Search.\n"</js>
					+ <js>"Key/value pairs representing column names and search tokens.\n"</js>
					+ <js>"\\'*\\' and \\'?\\' can be used as meta-characters in string fields.\n"</js>
					+ <js>"\\'&gt;\\', \\'&gt;=\\', \\'&lt;\\', and \\'&lt;=\\' can be used as limits on numeric and date fields.\n"</js>
					+ <js>"Date fields can be matched with partial dates (e.g. \\'2018\\' to match any date in the year 2018)."</js>
				+ <js>"',"</js>
				+ <js>"type:'array',"</js>
				+ <js>"collectionFormat:'csv',"</js>
				+ <js>"x-examples:{example:'?s=Bill*,birthDate>2000'}"</js>
			+ <js>"},"</js>
			+ <js>"{"</js>
				+ <js>"in:'query',"</js>
				+ <js>"name:'v',"</js>
				+ <js>"description:'"</js>
					+ <js>"View.\n"</js>
					+ <js>"Column names to display."</js>
				+ <js>"',"</js>
				+ <js>"type:'array',"</js>
				+ <js>"collectionFormat:'csv',"</js>
				+ <js>"x-examples:{example:'?v=name,birthDate'}"</js>
			+ <js>"},"</js>
			...
		;
	}
</p>
<p>
	This information could have also been defined in the Swagger JSON for the resource as well.
</p>
<p>
	The parameter section contains information about the request body as well for PUT and POST methods, as shown here:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.Parameters.2.png'> 
<p>
	The definition of this method is shown here:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		summary=<js>"Add a new pet to the store"</js>,
		swagger=<ja>@MethodSwagger</ja>(
			tags=<js>"pet"</js>
		)
	)
	<jk>public</jk> Ok postPet(
			<ja>@Body</ja>(description=<js>"Pet object to add to the store"</js>) PetCreate pet
		) <jk>throws</jk> IdConflict, NotAcceptable, UnsupportedMediaType {

		<jf>store</jf>.create(pet);
		<jk>return</jk> <jsf>OK</jsf>;
	}
</p>
<p>
	Note that the schema information on the body parameter is automatically detected if not provided.
</p>
</div><!-- END: 6.29.5 - juneau-rest-server.Swagger.Parameters -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.ParameterExamples' id='juneau-rest-server.Swagger.ParameterExamples'>6.29.6 - Parameter Examples</a><span class='update'>8.1.0-updated</span></h4>
<div class='topic'><!-- START: 6.29.6 - juneau-rest-server.Swagger.ParameterExamples -->
<p>
	The <c>model</c> select box in the parameters can be expanded to show examples:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.Parameters.1.png'>
<p>
	The examples for query/form-data/path/header parameters can be defined using the <c>example</c> attribute on your annotated parameters as shown here:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		...
	)
	<jk>public</jk> Collection&lt;Pet&gt; getPets(
			<ja>@Query</ja>(
				name=<js>"s"</js>,
				description={
					<js>"Search."</js>,
					<js>"Key/value pairs representing column names and search tokens."</js>,
					<js>"'*' and '?' can be used as meta-characters in string fields."</js>,
					<js>"'&gt;', '&gt;=', '&lt;', and '&lt;=' can be used as limits on numeric and date fields."</js>,
					<js>"Date fields can be matched with partial dates (e.g. '2018' to match any date in the year 2018)."</js>
				},
				type=<js>"array"</js>,
				collectionFormat=<js>"csv"</js>,
				example=<js>"Bill*,birthDate>2000"</js>
			) 
			...
		) <jk>throws</jk> NotAcceptable {
		...
	}
</p>
<p>
	This value gets converted to an <c>x-examples</c> attribute in your parameter information:
</p>
<p class='bpcode w800'>
	{
		<jok>"swagger"</jok>: <jov>"2.0"</jov>,
		<jok>"paths"</jok>: {
			<jok>"/pet"</jok>: {
				<jok>"get"</jok>: {
					<jok>"operationId"</jok>: <jov>"getPets"</jov>,
					<jok>"summary"</jok>: <jov>"All pets in the store"</jov>,
					<jok>"parameters"</jok>: [
						{
							<jok>"in"</jok>: <jov>"query"</jov>,
							<jok>"name"</jok>: <jov>"s"</jov>,
							...
							<jok>"x-examples"</jok>: {
								<jok>"example"</jok>: <jov>"?s=Bill*,birthDate>2000"</jov>
							}
						},
	...
</p>
<p>
	Examples for request bodies includes all supported <c>Content-Type</c> values: 
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.Parameters.3.png'> 
<p>
	These are based on the parsers registered on your servlet or method.
</p>
<p>
	Selecting any of the content types shows you a representative example for the POJO:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.Parameters.4.png'> 
<p>
	There are several options for defining examples for request bodies:
</p>
<ul class='spaced-list'>
	<li>
		{@link org.apache.juneau.http.annotation.Body#example() @Body(example)} annotation.
	<li>
		{@link org.apache.juneau.http.annotation.Body#examples() @Body(examples)} annotation.
	<li>
		Defining an <js>"x-examples"</js> field in the inherited Swagger JSON body field (classpath file or <c><ja>@ResourceSwagger</ja>(value)</c>/<c><ja>@MethodSwagger</ja>(value)</c>).
	<li>
		Defining an <js>"x-examples"</js> field in the Swagger Schema Object for the body (including referenced <js>"$ref"</js> schemas).
	<li>
		Allowing Juneau to auto-generate a code example.
</ul>
<p>
	When using {@link org.apache.juneau.http.annotation.Body#example() @Body(example)}, you specify a Simple JSON representation of your POJO.
	The Swagger generator will then convert that JSON into a POJO using the registered serializers on the REST method to produce examples for all
 	supported language types.
</p>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
 	<jc>// A JSON representation of a PetCreate object.</jc>
	<ja>@Body</ja>(
		example=<js>"{name:'Doggie',price:9.99,species:'Dog',tags:['friendly','cute']}"</js>
	)
</p>

<p>
	The {@link org.apache.juneau.http.annotation.Body#examples() @Body(examples)} annotation allows you to specify raw output values per media type.
	This field allows you to override the behavior and show examples for only specified media types or different examples for different media types.
</p>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// A JSON representation of a PetCreate object.</jc>
	<ja>@Body</ja>(
		examples={
			<js>"'application/json':'{name:\\'Doggie\\',species:\\'Dog\\'}',"</js>,
			<js>"'text/uon':'(name:Doggie,species=Dog)'"</js>
		}
	)
</p>
<p>
	The Swagger generator uses these to create an <c>x-examples</c> entry in your generated Swagger:
</p>
<p class='bpcode w800'>
	<jok>"/pet"</jok>: {
		<jok>"post"</jok>: {
			<jok>"operationId"</jok>: <jov>"postPet"</jov>,
			<jok>"summary"</jok>: <jov>"Add a new pet to the store"</jov>,
			<jok>"parameters"</jok>: [
				{
					<jok>"in"</jok>: <jov>"body"</jov>,
					<jok>"description"</jok>: <jov>"Pet object to add to the store"</jov>,
					<jok>"required"</jok>: <jov>true</jov>,
					<jok>"schema"</jok>: {
						<jok>"$ref"</jok>: <jov>"#/definitions/PetCreate"</jov>
					},
					<jok>"x-examples"</jok>: {
						<jok>"application/json"</jok>: <jov>"{\n\t\"name\": \"Doggie\",\n\t\"species\": \"Dog\",\n\t\"price\": 9.99,\n\t\"tags\": [\n..."</jov>,
						<jok>"application/json+simple"</jok>: <jov>"{\n\tname: 'Doggie',\n\tspecies: 'Dog',\n\tprice: 9.99,\n\ttags: [\n\t\t'friendly..."</jov>,
						<jok>"text/xml"</jok>: <jov>"&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;object&gt;\n\t&lt;name&gt;Doggie&lt;/name&amp;..."</jov>,
						<jok>"text/html+stripped"</jok>: <jov>"&lt;table&gt;\n\t&lt;tr&gt;\n\t\t&lt;td&gt;name&lt;/td&gt;\n\t\t&lt;td&gt;Doggie&lt;/t..."</jov>,
						<jok>"text/uon"</jok>: <jov>"(\n\tname=Doggie,\n\tspecies=Dog,\n\tprice=9.99,\n\ttags=@(\n\t\tfriendly,\n\t\tcute\n\t)\n)"</jov>,
						<jok>"application/x-www-form-urlencoded"</jok>: <jov>"name=Doggie\n&amp;species=Dog\n&amp;price=9.99\n&amp;tags=@(\n\tfriendly,\n\tcute\n)"</jov>,
						<jok>"text/openapi"</jok>: <jov>"(\n\tname=Doggie,\n\tspecies=Dog,\n\tprice=9.99,\n\ttags=@(\n\t\tfriendly,\n\t\tcute\n\t)\n)"</jov>,
						<jok>"octal/msgpack"</jok>: <jov>"84 A4 6E 61 6D 65 A6 44 6F 67 67 69 65 A7 73 70 65 63 69 65 73 A3 44 6F 67 A5 70 72 69 63 6..."</jov>,
						<jok>"text/plain"</jok>: <jov>"{name:'Doggie',species:'Dog',price:9.99,tags:['friendly','cute']}"</jov>,
						<jok>"text/xml+rdf"</jok>: <jov>"&lt;rdf:RDF\n    xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n    xmlns:j=\"ht..."</jov>,
						<jok>"text/turtle"</jok>: <jov>"@prefix jp:      &lt;http://www.apache.org/juneaubp/&gt; .\n@prefix j:       &lt;http://www.a..."</jov>,
						<jok>"text/n-triple"</jok>: <jov>"_:A59722791X3aX165d321a2b4X3aXX2dX7fca &lt;http://www.apache.org/juneaubp/name&gt; \"Doggie..."</jov>,
						<jok>"text/n3"</jok>: <jov>"@prefix jp:      &lt;http://www.apache.org/juneaubp/&gt; .\n@prefix j:       &lt;http://www.apach..."</jov>
					}
				}
			],
</p>
<p>
	Another option is to define these directly in your resource Swagger JSON file, or via {@link org.apache.juneau.rest.annotation.Rest#swagger() @Rest(swagger)}/{@link org.apache.juneau.rest.annotation.RestMethod#swagger() @RestMethod(swagger)}. 
</p>
<p>
	Juneau also supports auto-generation of JSON-Schema directly from POJO classes.
	By default, the generated swagger uses to the {@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo} 
	setting to automatically add examples to beans, collections, arrays, and maps:
</p>
<p class='bpcode w800'>
	<jk>public abstract class</jk> BasicRestServlet <jk>extends</jk> RestServlet <jk>implements</jk> BasicRestConfig {

		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>,
			...
		)
		<ja>@JsonSchemaConfig</ja>(
			<jc>// Add x-example to the following types:</jc>
			addExamplesTo=<js>"bean,collection,array,map"</js>,
			...
		)
		<jk>public</jk> Swagger getOptions(RestRequest req) {...}
</p>
<p>
	Examples can be defined via static methods, fields, and annotations on the classes themselves.
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Annotation on class.</jc>
	<ja>@Example</ja>(<js>"{name:'Doggie',price:9.99,species:'Dog',tags:['friendly','cute']}"</js>)
	<jk>public class</jk> PetCreate {
		...
	}
</p>
<p class='bpcode w800'>
	<jc>// Annotation on static method.</jc>
	<jk>public class</jk> PetCreate {
		<ja>@Example</ja>
		<jk>public static</jk> PetCreate <jsm>sample</jsm>() {
			<jk>return new</jk> PetCreate(<js>"Doggie"</js>, 9.99f, <js>"Dog"</js>, <jk>new</jk> String[] {<js>"friendly"</js>,<js>"cute"</js>});
		}
	}
</p>
<p class='bpcode w800'>
	<jc>// Static method with specific name 'example'.</jc>
	<jk>public class</jk> PetCreate {
		<jk>public static</jk> PetCreate <jsm>example</jsm>() {
			<jk>return new</jk> PetCreate(<js>"Doggie"</js>, 9.99f, <js>"Dog"</js>, <jk>new</jk> String[] {<js>"friendly"</js>,<js>"cute"</js>});
		}
	}
</p>
<p class='bpcode w800'>
	<jc>// Static field.</jc>
	<jk>public class</jk> PetCreate {
		<ja>@Example</ja>
		<jk>public static</jk> PetCreate <jsf>EXAMPLE</jsf> = <jk>new</jk> PetCreate(<js>"Doggie"</js>, 9.99f, <js>"Dog"</js>, <jk>new</jk> String[] {<js>"friendly"</js>,<js>"cute"</js>});
	}
</p>
<p>
	Examples can also be specified via generic properties as well using the {@link org.apache.juneau.BeanContext#BEAN_examples} property or {@link org.apache.juneau.annotation.BeanConfig#examples() @BeanConfig(examples)} annotation at either the class or method level.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Examples defined at class level.</jc>
	<ja>@Rest</ja>(...)
	<ja>@BeanConfig</ja>(
		examples=<js>"{PetCreate: {name:'Doggie',price:9.99,species:'Dog',tags:['friendly','cute']}}"</js>
	)
</p>
<ul class='seealso'>
	<li class='ja'>{@link org.apache.juneau.annotation.Example}
	<li class='jc'>{@link org.apache.juneau.BeanContext}
	<ul>
		<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_examples BEAN_examples}
	</ul>
	<li class='jc'>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator}
	<ul>
		<li class='jf'>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}
		<li class='jf'>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}
	</ul>
</ul>
</div><!-- END: 6.29.6 - juneau-rest-server.Swagger.ParameterExamples -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.Responses' id='juneau-rest-server.Swagger.Responses'>6.29.7 - Responses</a></h4>
<div class='topic'><!-- START: 6.29.7 - juneau-rest-server.Swagger.Responses -->
<p>
	Under the input parameters are listed the possible responses for the resource:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.Operations.3.png'> 
<p>
	The <c>200</c> response is determined by the return type on the method, in this case a collection of <c>Pet</c> objects:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		name=<jsf>GET</jsf>,
		path=<js>"/pet"</js>,
		summary=<js>"All pets in the store"</js>,
		...
	)
	<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable {
		<jk>return</jk> <jf>store</jf>.getPets();
	}
</p>
<p>
	Note that additional responses can be specified by throwing exceptions annotated with the {@link org.apache.juneau.http.annotation.Response @Response} annotation such
	as this one:
</p>
<p class='bpcode w800'>
	<ja>@Response</ja>(code=406, description=<js>"Not Acceptable"</js>)
	<jk>public class</jk> NotAcceptable <jk>extends</jk> RestException {...}
</p>
<p>
	Like input parameters, the Swagger for responses can be define in multiple locations such as:
</p>
<ul>
	<li>{@link org.apache.juneau.http.annotation.Response @Response} annotated classes, methods, and parameters.
	<li>{@link org.apache.juneau.rest.annotation.Rest#swagger() @Rest(swagger)} / {@link org.apache.juneau.rest.annotation.RestMethod#swagger() @RestMethod(swagger)} annotations.
</ul>

<ul class='seealso'>
	<li class='link'>{@doc juneau-rest-server.HttpPartAnnotations.Response}
	<li class='link'>{@doc juneau-rest-server.HttpPartAnnotations.ResponseHeader}
	<li class='link'>{@doc juneau-rest-server.HttpPartAnnotations.ResponseStatus}
</ul>
</div><!-- END: 6.29.7 - juneau-rest-server.Swagger.Responses -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.ResponseExamples' id='juneau-rest-server.Swagger.ResponseExamples'>6.29.8 - Response Examples</a></h4>
<div class='topic'><!-- START: 6.29.8 - juneau-rest-server.Swagger.ResponseExamples -->
<p>
	The <c>model</c> select box in the responses can be expanded to show examples:
</p>
<h5 class='figure'>PetStoreResource.getPet()</h5>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.ResponseExamples.1.png'> 
<p>
	Examples are provided for any supported <c>Accept</c> type based on the serializers defined on your
	servlet/method.
</p>
<h5 class='figure'>application/json+simple</h5>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.ResponseExamples.2.png'> 
<h5 class='figure'>text/uon</h5>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.ResponseExamples.3.png'> 
<p>
	Examples are pulled from the <c>examples</c> attribute in the response object of the generated Swagger JSON:
</p>
<p class='bpcode w800'>
	<jok>"/pet/{petId}"</jok>: {
		<jok>"get"</jok>: {
			<jok>"operationId"</jok>: <jov>"getPet"</jov>,
			<jok>"summary"</jok>: <jov>"Find pet by ID"</jov>,
			<jok>"description"</jok>: <jov>"Returns a single pet"</jov>,
			<jok>"responses"</jok>: {
				<jok>"200"</jok>: {
					<jok>"description"</jok>: <jov>"OK"</jov>,
					<jok>"schema"</jok>: {
						<jok>"$ref"</jok>: <jov>"#/definitions/Pet"</jov>
					},
					<jok>"examples"</jok>: {
						<jok>"text/html+stripped"</jok>: <jov>"&lt;table&gt;\n\t&lt;tr&gt;\n\t\t&lt;td&gt;id&lt;/td&gt;\n\t\t&lt;td&gt;\t\t\t&lt;a href=\"..."</jov>,
						<jok>"text/html+schema"</jok>: <jov>"&lt;html&gt;\n\t&lt;head&gt;\n\t\t&lt;link rel='icon' href='$U{servlet:/htdocs/cat.png}'/&gt;..."</jov>,
						<jok>"application/json"</jok>: <jov>"{\n\t\"id\": 123,\n\t\"species\": {\n\t\t\"name\": \"Dog\",\n\t\t\"id\": 123\n\t},\n\t\"name\..."</jov>,
						<jok>"application/json+simple"</jok>: <jov>"{\n\tid: 123,\n\tspecies: {\n\t\tname: 'Dog',\n\t\tid: 123\n\t},\n\tname: 'Doggie',\n\..."</jov>,
						<jok>"application/json+schema"</jok>: <jov>"{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"id\": {\n\t\t\t\"type\": \"inte..."</jov>,
						<jok>"text/xml"</jok>: <jov>"&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;Pet&gt;\n\t&lt;id&gt;123&lt;/id&gt;\n\t&lt;spec..."</jov>,
						<jok>"text/xml+schema"</jok>: <jov>"&lt;schema xmlns=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"http://www.apache.org/..."</jov>,
						<jok>"text/uon"</jok>: <jov>"(\n\tid=123,\n\tspecies=(\n\t\tname=Dog,\n\t\tid=123\n\t),\n\tname=Doggie,\n\ttags=@(\n\t\t(\n\t\t\tn..."</jov>,
						<jok>"application/x-www-form-urlencoded"</jok>: <jov>"id=123\n&amp;species=(\n\tname=Dog,\n\tid=123\n)\n&amp;name=Doggie\n&amp;tags=@(\n\t(\n\..."</jov>,
						<jok>"text/openapi"</jok>: <jov>"(\n\tid=123,\n\tspecies=(\n\t\tname=Dog,\n\t\tid=123\n\t),\n\tname=Doggie,\n\ttags=@(\n\t\t(\n\t\..."</jov>,
						<jok>"octal/msgpack"</jok>: <jov>"86 A2 69 64 7B A7 73 70 65 63 69 65 73 82 A4 6E 61 6D 65 A3 44 6F 67 A2 69 64 7B A4 6E 61 6D 65 ..."</jov>,
						<jok>"text/xml+soap"</jok>: <jov>"&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;Envelope soap=\"http://www.w3.org/2003/05/..."</jov>,
						<jok>"text/plain"</jok>: <jov>"{id:123,species:{name:'Dog',id:123},name:'Doggie',tags:[{name:'MyTag',id:123}],price:0.0,status:'AV..."</jov>,
						<jok>"text/xml+rdf"</jok>: <jov>"&lt;rdf:RDF\n    xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n    xmlns:j=\"http://..."</jov>,
						<jok>"text/xml+rdf+abbrev"</jok>: <jov>"&lt;rdf:RDF\n    xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n    xmlns:j=\"..."</jov>,
						<jok>"text/turtle"</jok>: <jov>"@prefix jp:      &lt;http://www.apache.org/juneaubp/&gt; .\n@prefix j:       &lt;http://www.apache..."</jov>,
						<jok>"text/n-triple"</jok>: <jov>"_:A720f0f4fX3aX165d4974933X3aXX2dX7f93 &lt;http://www.apache.org/juneaubp/name&gt; \"Dog\" .\n_:..."</jov>,
						<jok>"text/n3"</jok>: <jov>"@prefix jp:      &lt;http://www.apache.org/juneaubp/&gt; .\n@prefix j:       &lt;http://www.apache.org..."</jov>
</p>
<p>
	There are several options for defining examples for response bodies:
</p>
<ul class='spaced-list'>
	<li>
		{@link org.apache.juneau.http.annotation.Response#example() @Response(example)} annotation.
	<li>
		{@link org.apache.juneau.http.annotation.Response#examples() @Response(examples)} annotation.
	<li>
		Defining an <js>"examples"</js> field in the inherited Swagger JSON response object (classpath file or <c><ja>@ResourceSwagger</ja>(value)</c>/<c><ja>@MethodSwagger</ja>(value)</c>).
	<li>
		Defining an <js>"examples"</js> field in the Swagger Schema Object for the response object (including referenced <js>"$ref"</js> schemas).
	<li>
		Allowing Juneau to auto-generate a code example.
</ul>

<p>
	The {@link org.apache.juneau.http.annotation.Response#example @Response(example)} annotation can be used on either your <ja>@RestMethod</ja>-annotated
	method or return class to define the example of the body.
</p>	
<p class='bpcode w800'>
	<jc>// A JSON representation of a Pet object.</jc>
	<ja>@Response</ja>(
		example=<js>"{name:'Doggie',price:9.99,species:'Dog',tags:['friendly','cute']}"</js>
	)
</p>
<p>
	This is a Simple JSON representation of the body that is converted to a POJO and then serialized to all the registered serializers on the REST method to produce examples for all
	supported language types.
	These values are then used to automatically populate the <c>examples</c> field.
</p>
<p>
	Direct per-media-type examples can also be defined using the {@link org.apache.juneau.http.annotation.Response#examples @Response(examples)} annotation:
</p>
<p class='bpcode w800'>
	<jc>// A JSON representation of a PetCreate object.</jc>
	<ja>@Response</ja>(
		examples={
			<js>"'application/json':'{name:\\'Doggie\\',species:\\'Dog\\'}',"</js>,
			<js>"'text/uon':'(name:Doggie,species=Dog)'"</js>
		}
	)
</p>

<p>
	Juneau also supports auto-generation of JSON-Schema directly from POJO classes.
	By default, the generated swagger uses to the {@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo} 
	setting to automatically add examples to beans, collections, arrays, and maps:
</p>
<p>
	In particular, examples can be defined via static methods, fields, and annotations on the classes themselves.
</p>
<p class='bpcode w800'>
	<jc>// Annotation on class.</jc>
	<ja>@Example</ja>(<js>"{name:'Doggie',price:9.99,species:'Dog',tags:['friendly','cute']}"</js>)
	<jk>public class</jk> PetCreate {
		...
	}
</p>
<p class='bpcode w800'>
	<jc>// Annotation on static method.</jc>
	<jk>public class</jk> PetCreate {
		<ja>@Example</ja>
		<jk>public static</jk> PetCreate <jsm>sample</jsm>() {
			<jk>return new</jk> PetCreate(<js>"Doggie"</js>, 9.99f, <js>"Dog"</js>, <jk>new</jk> String[] {<js>"friendly"</js>,<js>"cute"</js>});
		}
	}
</p>
<p class='bpcode w800'>
	<jc>// Static method with specific name 'example'.</jc>
	<jk>public class</jk> PetCreate {
		<jk>public static</jk> PetCreate <jsm>example</jsm>() {
			<jk>return new</jk> PetCreate(<js>"Doggie"</js>, 9.99f, <js>"Dog"</js>, <jk>new</jk> String[] {<js>"friendly"</js>,<js>"cute"</js>});
		}
	}
</p>
<p class='bpcode w800'>
	<jc>// Static field.</jc>
	<jk>public class</jk> PetCreate {
		<ja>@Example</ja>
		<jk>public static</jk> PetCreate <jsf>EXAMPLE</jsf> = <jk>new</jk> PetCreate(<js>"Doggie"</js>, 9.99f, <js>"Dog"</js>, <jk>new</jk> String[] {<js>"friendly"</js>,<js>"cute"</js>});
	}
</p>
<p>
	Examples can also be specified via generic properties as well using the {@link org.apache.juneau.BeanContext#BEAN_examples} property 
	or {@link org.apache.juneau.annotation.BeanConfig#examples @BeanConfig(examples)} annotation at either the class or method level.
</p>
<p class='bpcode w800'>
	<jc>// Examples defined at class level.</jc>
	<ja>@Rest</ja>(...)
	<ja>@BeanConfig</ja>(
		examples=<js>"{PetCreate: {name:'Doggie',price:9.99,species:'Dog',tags:['friendly','cute']}}"</js>
	)
</p>
<p>
	Response headers are also rendered in the Swagger UI:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.ResponseExamples.4.png'> 
<p>
	These can be auto-generated from {@link org.apache.juneau.http.annotation.ResponseHeader @ResponseHeader} annotations defined on either
	method parameters or type classes.
	The example above shows one of each:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		name=<jsf>GET</jsf>,
		path=<js>"/user/login"</js>,
		summary=<js>"Logs user into the system"</js>,
		swagger=<ja>@MethodSwagger</ja>(
			tags=<js>"user"</js>
		)
	)
	<jk>public</jk> Ok login(
			<ja>@Query</ja>(
				name=<js>"username"</js>,
				description=<js>"The username for login"</js>,
				required=<jk>true</jk>,
				example=<js>"myuser"</js>
			)
			String username,
			<ja>@Query</ja>(
				name=<js>"password"</js>,
				description=<js>"The password for login in clear text"</js>,
				required=<jk>true</jk>,
				example=<js>"abc123"</js>
			)
			String password,
			<ja>@ResponseHeader</ja>(
				name=<js>"X-Rate-Limit"</js>,
				type=<js>"integer"</js>,
				format=<js>"int32"</js>,
				description=<js>"Calls per hour allowed by the user."</js>,
				example=<js>"123"</js>
			)
			Value&lt;Integer&gt; rateLimit,
			Value&lt;ExpiresAfter&gt; expiresAfter,
			RestRequest req,
			RestResponse res
		) <jk>throws</jk> InvalidLogin, NotAcceptable {

		<jk>if</jk> (! <jf>store</jf>.isValid(username, password))
			<jk>throw new</jk> InvalidLogin();

		Date d = <jk>new</jk> Date(System.<jsm>currentTimeMillis</jsm>() + 30 * 60 * 1000);
		req.getSession().setAttribute(<js>"login-expires"</js>, d);
		rateLimit.set(1000);
		expiresAfter.set(<jk>new</jk> ExpiresAfter(d));
		<jk>return</jk> <jsf>OK</jsf>;
	}
</p>
<p class='bpcode w800'>	
	<ja>@ResponseHeader</ja>(
		name=<js>"X-Expires-After"</js>,
		type=<js>"string"</js>,
		format=<js>"date-time"</js>,
		description=<js>"Date in UTC when token expires"</js>,
		example=<js>"2012-10-21"</js>
	)
	<jk>public static class</jk> ExpiresAfter {
		<jk>private final</jk> Calendar <jf>c</jf>;
		<jk>public</jk> ExpiresAfter(Date d) {
			<jk>this</jk>.<jf>c</jf> = <jk>new</jk> GregorianCalendar();
			<jf>c</jf>.setTime(d);
		}
		<jk>public</jk> Calendar toCalendar() {
			<jk>return</jk> <jf>c</jf>;
		}
	}
</p>
</div><!-- END: 6.29.8 - juneau-rest-server.Swagger.ResponseExamples -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.Models' id='juneau-rest-server.Swagger.Models'>6.29.9 - Models</a></h4>
<div class='topic'><!-- START: 6.29.9 - juneau-rest-server.Swagger.Models -->
<p>
	The {@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_useBeanDefs} setting can be used to reduce the size of your
	generated Swagger JSON files by creating model definitions for beans and referencing those definitions through <c>$ref</c> attributes.
</p>
<p>
	By default, this flag is enabled when extending from {@link org.apache.juneau.rest.BasicRestServlet}:
</p>
<p class='bpcode w800'>
	<jk>public abstract class</jk> BasicRestServlet <jk>extends</jk> RestServlet <jk>implements</jk> BasicRestConfig {
		
		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>,
			...
			flags={
				<jc>// Use $ref references for bean definitions to reduce duplication in Swagger.</jc>
				<jsf>JSONSCHEMA_useBeanDefs</jsf>
			}
		)
		<jk>public</jk> Swagger getOptions(RestRequest req) {...}
</p>
<p>
	In the Swagger UI, this causes bean definitions to show up in the Models section at the bottom of the page:
</p>
<h5 class='figure'>Models section</h5>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.Models.1.png'> 
<h5 class='figure'>Models section with Order bean expanded</h5>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.Models.2.png'> 
<p>
	In the generated Swagger JSON, embedded schema information for beans will be replaced with references such as the one shown below for the <c>Order</c> bean:
</p>
<p class='bpcode w800'>
	{
		<jok>"swagger"</jok>: <jov>"2.0"</jov>,
		<jok>"paths"</jok>: {
			<jok>"/store/order"</jok>: {
				<jok>"get"</jok>: {
					<jok>"operationId"</jok>: <jov>"getOrders"</jov>,
					<jok>"summary"</jok>: <jov>"Petstore orders"</jov>,
					<jok>"responses"</jok>: {
						<jok>"200"</jok>: {
							<jok>"description"</jok>: <jov>"OK"</jov>,
							<jok>"schema"</jok>: {
								<jok>"description"</jok>: <jov>"java.util.Collection&lt;org.apache.juneau.examples.rest.petstore.Order&gt;"</jov>,
								<jok>"type"</jok>: <jov>"array"</jov>,
								<jok>"items"</jok>: {
									<jok>"$ref"</jok>: <jov>"#/definitions/Order"</jov>
								}
							},
							...
						...
					...
				...
			...
		},
		<jok>"definitions"</jok>: {
			<jok>"Order"</jok>: {
				<jok>"type"</jok>: <jov>"object"</jov>,
				<jok>"properties"</jok>: {
					<jok>"id"</jok>: {
						<jok>"type"</jok>: <jov>"integer"</jov>,
						<jok>"format"</jok>: <jov>"int64"</jov>
					},
					<jok>"petId": {
						<jok>"type"</jok>: <jov>"integer"</jov>,
						<jok>"format"</jok>: <jov>"int64"</jov>
					},
					<jok>"shipDate"</jok>: {
						<jok>"type"</jok>: <jov>"string"</jov>
					},
					<jok>"status"</jok>: {
						<jok>"type"</jok>: <jov>"string"</jov>,
						<jok>"enum"</jok>: [
							<jov>"PLACED"</jov>,
							<jov>"APPROVED"</jov>,
							<jov>"DELIVERED"</jov>
						]
					}
				},
				<jok>"description"</jok>: <jov>"org.apache.juneau.examples.rest.petstore.Order"</jov>,
				<jok>"example"</jok>: {
					<jok>"id"</jok>: <jov>123</jov>,
					<jok>"petId"</jok>: <jov>456</jov>,
					<jok>"shipDate"</jok>: <jov>"2012-12-21"</jov>,
					<jok>"status"</jok>: <jov>"APPROVED"</jov>
				}
			},
		...
	}
</p>
<p>
	Note that this does not affect how the information is rendered for that bean in the Swagger UI:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.Swagger.Models.3.png'>
</div><!-- END: 6.29.9 - juneau-rest-server.Swagger.Models -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Swagger.Stylesheet' id='juneau-rest-server.Swagger.Stylesheet'>6.29.10 - SwaggerUI.css</a></h4>
<div class='topic'><!-- START: 6.29.10 - juneau-rest-server.Swagger.Stylesheet -->
<p>
	The look-and-feel of the Swagger UI is controlled via a single CSS file:  <c>SwaggerUI.css</c>.
</p>
<p>
	In the microservice template, this file is located in the <c>files/htdocs/styles</c> directory.
	It's a simple straightforward file consisting of less than 350 lines.
	This file can be modified to change the look-and-feel of your Swagger UI.
</p>
</div><!-- END: 6.29.10 - juneau-rest-server.Swagger.Stylesheet -->
</div><!-- END: 6.29 - juneau-rest-server.Swagger -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.ExecutionStatistics' id='juneau-rest-server.ExecutionStatistics'>6.30 - REST method execution statistics</a><span class='update'><b>8.1.3-new</b></span></h3>
<div class='topic'><!-- START: 6.30 - juneau-rest-server.ExecutionStatistics -->
<p>
	<ja>@RestResource</ja> annotated classes get automated timing and error statistic information for all <ja>@RestMethod</ja>
	and <ja>@RestHook</ja> annotated methods on the class.
</p>
<p>
	The statistics are made available via the subpath <c>/stats</c> as shown below in the <c>HelloWorldResource</c> example:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.ExecutionStatistics.1.png'>
<p>
	The default REST configuration provides a link to the stats in the navlinks section of the page:
</p>
<img class='bordered w900' src='doc-files/juneau-rest-server.ExecutionStatistics.2.png'>
<p>
	The exception hash shown is the same hash that is shown in the log file and provides a quick way of locating
	the exception in the logs.
</p>
<p>
	Programmatic access to the statistics are provided via the following methods:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.rest.RestContext}
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.RestContext#getStats() getStats()}
		<li class='jm'>{@link org.apache.juneau.rest.RestContext#getMethodExecStats() getMethodExecStats()}
		<li class='jm'>{@link org.apache.juneau.rest.RestContext#getMethodExecStatsReport() getMethodExecStatsReport()}
	</ul>
</ul>
</div><!-- END: 6.30 - juneau-rest-server.ExecutionStatistics -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HtmlDocAnnotation' id='juneau-rest-server.HtmlDocAnnotation'>6.31 - @HtmlDocConfig</a><span class='update'>8.1.0-updated</span></h3>
<div class='topic'><!-- START: 6.31 - juneau-rest-server.HtmlDocAnnotation -->
<p>
	The {@link org.apache.juneau.html.annotation.HtmlDocConfig @HtmlDocConfig} annotation is used to customize the HTML 
	view of your serialized POJOs.
	It's used in the following locations:
</p>
<ul>
	<li>{@link org.apache.juneau.rest.annotation.Rest @Rest}-annotated classes. 
	<li>{@link org.apache.juneau.rest.annotation.RestMethod @RestMethod}-annotated methods.
</ul>
<p>
	The annotation itself is just a convenience for setting configuration properties set
	on the {@link org.apache.juneau.html.HtmlDocSerializer} class.
	For example, the following two pieces of code are equivalent:
</p>
<p class='bpcode w800'>
	<jc>// Title defined via property.</jc>
	<ja>@Rest</ja>(
		properties={
			<ja>@Property</ja>(name=<jsf>HTMLDOC_title</jsf>, value=<js>"My Resource Page"</js>)
		}
	)

	<jc>// Title defined via @HtmlDoc annotation.</jc>
	<ja>@Rest</ja>()
	<ja>@HtmlDocConfig</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='bpcode w800'>
	<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='bpcode w800'>
	<jd>/** 
	 * Sample REST resource that prints out a simple "Hello world!" message.
	 */</jd>
	<ja>@Rest</ja>(
		path=<js>"/helloWorld"</js>
	)
	<ja>@HtmlDocConfig</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> BasicRestServlet {...}
</p>
<p>
	SVL variables can be used in any of these annotations:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/helloWorld"</js>,
		<jc>// Register a config file.</jc>
		config=<js>"MyConfig.cfg"</js>
	)
	<ja>@HtmlDocConfig</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> BasicRestServlet {...}
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HtmlDocAnnotation.UIvsDI' id='juneau-rest-server.HtmlDocAnnotation.UIvsDI'>6.31.1 - User Interfaces (UI) vs. Developer Interfaces (DI)</a></h4>
<div class='topic'><!-- START: 6.31.1 - juneau-rest-server.HtmlDocAnnotation.UIvsDI -->
<p>
	An important distinction needs to be made about the HTML representations produced by the REST
	API.  These should not be considered User Interfaces, but rather Developer Interfaces.
</p>
<p>
	UIs should hide the end-user from the underlying architecture.
	The audience generally consists of non-technical people not interested in how the UI works.  
</p>
<p>
	DIs, on the other hand, should NOT hide the end-user from the underlying architecture.  
	Instead, it's a thin veneer over the REST interface with the following goals:
</p>
<ul class='spaced-list'>
	<li>Make it easy for the developer to explore and understand the REST API.
	<li>Make it easy for the developer to debug the REST API using simple tools (hopefully just a browser).
</ul>		
<p>
	As a result, the following guidelines are recommended: 
</p>		
<ul class='spaced-list'>
	<li>
		Use titles/descriptions/asides to describe why the REST interface exists.
		A developer knowing little about it should be able to access it with a browser and quickly 
		understand what it is and how to use it.
	<li>
		Don't hide the raw data!  
		The HTML view should simply be considered an easier-to-read representation of the data normally 
		rendered in JSON or some other format.
	<li>
		Limit your use of Javascript!  
		You can use it sparingly if you want to implement something simple like a pull-down menu to 
		simplify some debug task, but remember that your audience cares more about interacting with your 
		service programmatically using REST.  
		Remember that the HTML is just icing on the cake.
	<li>
		Don't use it to implement a Web 2.0 interface!  
		If you want a Web 2.0 UI, implement it separately ON TOP OF this REST interface.
		The architecture is flexible enough that you could in theory pull in and use jQuery, React, 
		Angular, or any number of sophisticated Javascript UI frameworks.  Resist the urge to do so.
</ul>
</div><!-- END: 6.31.1 - juneau-rest-server.HtmlDocAnnotation.UIvsDI -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HtmlDocAnnotation.Widgets' id='juneau-rest-server.HtmlDocAnnotation.Widgets'>6.31.2 - Widgets</a></h4>
<div class='topic'><!-- START: 6.31.2 - juneau-rest-server.HtmlDocAnnotation.Widgets -->
<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 class='javatree'>
	<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='bpcode w800'>
	<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='javatree'>
	<li class='jac'>{@link org.apache.juneau.rest.widget.Widget}
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getHtml(RestRequest,RestResponse) getHtml(RestRequest,RestResponse)}
		<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getStyle(RestRequest,RestResponse) getStyle(RestRequest,RestResponse)}
		<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getScript(RestRequest,RestResponse) getScript(RestRequest,RestResponse)}
	</ul>
</ul>
<p>
	The HTML content returned by the {@link org.apache.juneau.rest.widget.Widget#getHtml(RestRequest,RestResponse) getHtml(RestRequest,RestResponse)}
	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,RestResponse) getScript(RestRequest,RestResponse)}
	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,RestResponse) getScript(RestRequest,RestResponse)}
	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.
	It shows an example of a widget that renders an image located in the <c>htdocs</c> static files
	directory in your classpath (see {@link org.apache.juneau.rest.annotation.Rest#staticFiles() @Rest(staticFiles)}):
</p>
<p class='bpcode w800'>
	<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='javatree'>
	<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='bpcode w800'>
	<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>
<ul class='seealso'>
	<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_widgets}
</ul>
</div><!-- END: 6.31.2 - juneau-rest-server.HtmlDocAnnotation.Widgets -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HtmlDocAnnotation.PredefinedWidgets' id='juneau-rest-server.HtmlDocAnnotation.PredefinedWidgets'>6.31.3 - Predefined Widgets</a></h4>
<div class='topic'><!-- START: 6.31.3 - juneau-rest-server.HtmlDocAnnotation.PredefinedWidgets -->
<p>
	The {@link org.apache.juneau.rest.widget} package contains predefined reusable widgets.
</p>
<ul class='javatree'>
	<li class='jp'>{@link org.apache.juneau.rest.widget}
	<ul>
		<li class='jac'>{@link org.apache.juneau.rest.widget.Widget}
		<ul>
			<li class='jac'>{@link org.apache.juneau.rest.widget.MenuItemWidget}
			<ul>
				<li class='jc'>{@link org.apache.juneau.rest.widget.ContentTypeMenuItem}
				<li class='jc'>{@link org.apache.juneau.rest.widget.QueryMenuItem}
				<li class='jc'>{@link org.apache.juneau.rest.widget.ThemeMenuItem}
			</ul>
			<li class='jc'>{@link org.apache.juneau.rest.widget.PoweredByJuneau}
		</ul>
		<li class='jc'>{@link org.apache.juneau.rest.widget.Tooltip}
	</ul>
</ul>

<h5 class='topic'>MenuItemWidget</h5>
<p>
	{@link org.apache.juneau.rest.widget.MenuItemWidget} is an abstract class for rendering menu items with drop-downs.
	It defines some simple CSS and Javascript for enabling drop-down menus in the nav section of the page (although 
	nothing keeps you from using it in an arbitrary location in the page).
</p>
<p>
	The script specifies a <js>"menuClick(element)"</js> function that toggles the visibility of the next sibling of the element.
</p>
<p>
	Subclasses implement the following two methods:
</p>
<ul class='javatree'>
	<li class='jac'>{@link org.apache.juneau.rest.widget.MenuItemWidget}
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.widget.MenuItemWidget#getLabel(RestRequest,RestResponse) getLabel(RestRequest,RestResponse)} - The menu item label.
		<li class='jm'>{@link org.apache.juneau.rest.widget.MenuItemWidget#getContent(RestRequest,RestResponse) getContent(RestRequest,RestResponse)} - The menu item content.
	</ul>
</ul>
<p>
	For example, to render a link that brings up a simple dialog in a div tag:
</p>
<p class='bpcode w800'>
	<ja>@Override</ja>
	<jk>public</jk> String getLabel() {
		<jk>return</jk> <js>"my-menu-item"</js>;
	};
 
	<ja>@Override</ja>
	<jk>public</jk> Div getLabel() {
		<jk>return</jk> Html5Builder.<jsm>div</jsm>(<js>"Surprise!"</js>).style(<js>"color:red"</js>);
	};
</p>
<p>
	The HTML content returned by the {@link org.apache.juneau.rest.widget.MenuItemWidget#getHtml(RestRequest,RestResponse) getHtml(RestRequest,RestResponse)} method is added where the <js>"$W{...}"</js> is referenced in the page.
</p>

<h5 class='topic'>ContentTypeMenuItem</h5>
<p>
	{@link org.apache.juneau.rest.widget.ContentTypeMenuItem} is a predefined Widget that returns back a list of hyperlinks for rendering the contents of a page in a variety of content types.
</p>
<p>
	The variable it resolves is <js>"$W{ContentTypeMenuItem}"</js>.
</p>
<p>
	An example of this widget can be found in the <c>PetStoreResource</c> in the examples that provides a drop-down menu item for rendering all other supported content types in plain text:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		name=<jsf>GET</jsf>,
		path=<js>"/"</js>,
		widgets={
			ContentTypeMenuItem.<jk>class</jk>,
		},
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: ..."</js>,
				<js>"options: ..."</js>,
				<js>"$W{QueryMenuItem}"</js>,
				<js>"$W{ContentTypeMenuItem}"</js>,
				<js>"$W{ThemeMenuItem}"</js>,
				<js>"source: ..."</js>
			}
		)
	)
	<jk>public</jk> Collection&lt;Pet&gt; getPets() {
</p>
<p>
	It renders the following popup-box:
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.HtmlDocAnnotation.PredefinedWidgets.1.png'>

<h5 class='topic'>QueryMenuItem</h5>
<p>
	{@link org.apache.juneau.rest.widget.QueryMenuItem} is a predefined Widget that returns a menu-item drop-down form for entering search/view/sort arguments.
</p>
<p>
	The variable it resolves is <js>"$W{QueryMenuItem}"</js>.
</p>
<p>
	This widget is designed to be used in conjunction with the {@link org.apache.juneau.rest.converters.Queryable} converter, although implementations
	can process the query parameters themselves if they wish to do so by using the {@link org.apache.juneau.rest.RequestQuery#getSearchArgs()}
	method to retrieve the arguments and process the data themselves.
</p>
<p>
	An example of this widget can be found in the <c>PetStoreResource</c> in the examples that provides
	search/view/sort capabilities against the collection of POJOs:
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		name=<jsf>GET</jsf>,
		path=<js>"/"</js>,
		widgets={
			QueryMenuItem.<jk>class</jk>,
		},
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: ..."</js>,
				<js>"options: ..."</js>,
				<js>"$W{QueryMenuItem}"</js>,
				<js>"$W{ContentTypeMenuItem}"</js>,
				<js>"$W{ThemeMenuItem}"</js>,
				<js>"source: ..."</js>
			}
		),
		converters=Queryable.<jk>class</jk>
	)
	<jk>public</jk> Collection&lt;Pet&gt; getPets() {
</p>
<p>
	It renders the following popup-box:
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.HtmlDocAnnotation.PredefinedWidgets.2.png'>
<p>
	Tooltips are provided by hovering over the field names.
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.HtmlDocAnnotation.PredefinedWidgets.3.png'>

<p>
	When submitted, the form submits a GET request against the current URI with special GET search API query parameters.
	(e.g. <js>"?s=column1=Foo*&amp;v=column1,column2&amp;o=column1,column2-&amp;p=100&amp;l=100"</js>).
	The {@link org.apache.juneau.rest.converters.Queryable} class knows how to perform these filters against collections of POJOs.
</p>

<h5 class='topic'>ThemeMenuItem</h5>
<p>
	{@link org.apache.juneau.rest.widget.ThemeMenuItem} is a predefined Widget that returns back a list of hyperlinks for rendering the contents of a page in the various default styles.
</p>
<p>
	The variable it resolves is <js>"$W{ThemeMenuItem}"</js>.
</p>
<p>
	An example of this widget can be found in the <c>PetStoreResource</c> in the examples that provides
	a drop-down menu item for rendering all other supported content types in plain text:
</p>
<p class='bpcode w800'>
	<ja>@RestMethod</ja>(
		name=<jsf>GET</jsf>,
		path=<js>"/"</js>,
		widgets={
			ThemeMenuItem.<jk>class</jk>,
		},
		htmldoc=<ja>@HtmlDoc</ja>(
			navlinks={
				<js>"up: ..."</js>,
				<js>"options: ..."</js>,
				<js>"$W{QueryMenuItem}"</js>,
				<js>"$W{ContentTypeMenuItem}"</js>,
				<js>"$W{ThemeMenuItem}"</js>,
				<js>"source: ..."</js>
			}
		)
	)
	<jk>public</jk> Collection&lt;Pet&gt; getPets() {
</p>

<h5 class='topic'>PoweredByJuneau</h5>
<p>
	{@link org.apache.juneau.rest.widget.PoweredByJuneau} is a predefined Widget that places a powered-by-Juneau message on a page.
</p>
<p>
	The variable it resolves is <js>"$W{PoweredByJuneau}"</js>.
</p>
<p>
	It produces a simple Apache Juneau icon floating on the right.
	Typically it's used in the footer of the page, as shown below in the <c>AddressBookResource</c> from the examples:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/addressBook"</js>,
		widgets={
			PoweredByJuneau.<jk>class</jk>
		},
		htmldoc=<ja>@HtmlDoc</ja>(
			footer=<js>"$W{PoweredByJuneau}"</js>
		)
</p>
<p>
	It renders the following image:
</p>
<img class='bordered' src='doc-files/juneau-rest-server.HtmlDocAnnotation.PredefinedWidgets.4.png'>
 
<h5 class='topic'>Tooltip</h5>
<p>
	{@link org.apache.juneau.rest.widget.Tooltip} is a predefined template for adding tooltips to HTML5 bean constructs, typically in menu item widgets.
</p>
<p>
	The following examples shows how tooltips can be added to a menu item widget.
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyFormMenuItem <jk>extends</jk> MenuItemWidget {
	
		<ja>@Override</ja>
		<jk>public</jk> String getLabel(RestRequest req) <jk>throws</jk> Exception {
			<jk>return</jk> <js>"myform"</js>;
		}
	
		<ja>@Override</ja>
		<jk>public</jk> Object getContent(RestRequest req) <jk>throws</jk> Exception {
			<jk>return</jk> div(
				<jsm>form</jsm>().id(<js>"form"</js>).action(<js>"servlet:/form"</js>).method(<jsf>POST</jsf>).children(
					<jsm>table</jsm>(
						<jsm>tr</jsm>(
							<jsm>th</jsm>(<js>"Field 1:"</js>),
							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"field1"</js>).type(<js>"text"</js>)),
							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"(?)"</js>, <js>"This is field #1!"</js>, br(), <js>"(e.g. '"</js>, code(<js>"Foo"</js>), <js>"')"</js>))
						),
						<jsm>tr</jsm>(
							<jsm>th</jsm>(<js>"Field 2:"</js>),
							<jsm>td</jsm>(<jsm>input</jsm>().name(<js>"field2"</js>).type(<js>"text"</js>)),
							<jsm>td</jsm>(<jk>new</jk> Tooltip(<js>"(?)"</js>, <js>"This is field #2!"</js>, br(), <js>"(e.g. '"</js>, code(<js>"Bar"</js>), <js>"')"</js>))
						)
					)
				)
			);
		}
	}
</p>
</div><!-- END: 6.31.3 - juneau-rest-server.HtmlDocAnnotation.PredefinedWidgets -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HtmlDocAnnotation.UiCustomization' id='juneau-rest-server.HtmlDocAnnotation.UiCustomization'>6.31.4 - UI Customization</a></h4>
<div class='topic'><!-- START: 6.31.4 - juneau-rest-server.HtmlDocAnnotation.UiCustomization -->
<p>
	The HTML views of POJOs can somewhat be considered a rudimentary User Interface.
	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.
	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>
<p class='bpcode w800'>
	http://localhost:10000/helloWorld
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.UiCustomization.1.png'>
<p>
	The Juneau REST framework does not provide specific branding support (i.e. there is no concept of a brand icon).
	Instead, it just uses the existing open-ended API for defining branding via annotations on your REST classes.
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		...
		<jc>// HTML-page specific settings</jc>
		htmldoc=<ja>@HtmlDoc</ja>(
	
			<jc>// Default page header contents.</jc>
			header={
				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,  <jc>// Use @Rest(title)</jc>
				<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>, <jc>// Use either @RestMethod(summary) or @Rest(description)</jc>
				<js>"$C{REST/header}"</js>  <jc>// Extra header HTML defined in external config file.</jc>
			},
	
			<jc>// Default stylesheet to use for the page.
			// Can be overridden from external config file.
			// Default is DevOps look-and-feel (aka Depression look-and-feel).</jc>
			stylesheet=<js>"$C{REST/theme,servlet:/htdocs/themes/devops.css}"</js>,
	
			<jc>// Default contents to add to the &lt;head&gt; section of the HTML page.
			// Use it to add a favicon link to the page.</jc>
			head={
				<js>"&lt;link rel='icon' href='$U{$C{REST/favicon}}'/&gt;"</js>
			},
	
			<jc>// No default page footer contents.
			// Can be overridden from external config file.</jc>
			footer=<js>"$C{REST/footer}"</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"
		// By default, we define static files through the external configuration file.</jc>
		staticFiles=<js>"$C{REST/staticFiles}"</js>
	)
	<jk>public interface</jk> BasicRestConfig {}
</p>
<p class='bpcode w800'>			
	<ja>@Rest</ja>(
		...
		htmldoc=<ja>@HtmlDoc</ja>(
			htmldoc=<ja>@HtmlDoc</ja>(
				<jc>// Basic page navigation links.</jc>
				navlinks={
					<js>"up: request:/.."</js>,
					<js>"options: servlet:/?method=OPTIONS"</js>
				}
			)
		),
		...
	)
	<jk>public abstract class</jk> BasicRestServlet <jk>extends</jk> RestServlet <jk>implements</jk> BasicRestConfig {...}
</p>
<p class='bpcode w800'>			
	<ja>@Rest</ja>
	<jk>public abstract class</jk> BasicRestServletGroup <jk>extends</jk> BasicRestServlet {...}
</p>
<p class='bpcode w800'>			
	<ja>@Rest</ja>(
		htmldoc=<ja>@HtmlDoc</ja>(
			widgets={
				ContentTypeMenuItem.<jk>class</jk>,
				ThemeMenuItem.<jk>class</jk>
			},
			navlinks={
				<js>"options: ?method=OPTIONS"</js>,
				<js>"$W{ContentTypeMenuItem}"</js>,
				<js>"$W{ThemeMenuItem}"</js>,
				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"</js>
			},
			aside={
				<js>"&lt;div style='max-width:400px' class='text'&gt;"</js>,
				<js>"	&lt;p&gt;This is an example of a 'router' page that serves as a jumping-off point to child resources.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Resources can be nested arbitrarily deep through router pages.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Note the &lt;span class='link'&gt;options&lt;/span&gt; link provided that lets you see the generated swagger doc for this page.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Also note the &lt;span class='link'&gt;sources&lt;/span&gt; link on these pages to view the source code for the page.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;All content on pages in the UI are serialized POJOs.  In this case, it's a serialized array of beans with 2 properties, 'name' and 'description'.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Other features (such as this aside) are added through annotations.&lt;/p&gt;"</js>,
				<js>"&lt;/div&gt;"</js>
			}
		),
		...
	)
	<jk>public class</jk> RootResources <jk>extends</jk> BasicRestServletGroup {...}
</p>

<p>
	The default annotation values use {@link org.apache.juneau.config.vars.ConfigVar $C} variables to pull in values from an optional
	external configuration file such as the one shown below:
</p>
<p class='bpcode w800'>
	<cc>#=======================================================================================================================
	# REST settings
	#=======================================================================================================================</cc>
	<cs>[REST]</cs>
	
	<ck>staticFiles</ck> = <cv>htdocs:files/htdocs</cv>
	
	<cc># Stylesheet to use for HTML views.</cc>
	<ck>theme</ck> = <cv>servlet:/htdocs/themes/devops.css</cv>
	
	<ck>headerIcon</ck> = <cv>servlet:/htdocs/images/juneau.png</cv>
	<ck>headerLink</ck> = <cv>http://juneau.apache.org</cv>
	<ck>footerIcon</ck> = <cv>servlet:/htdocs/images/asf.png</cv>
	<ck>footerLink</ck> = <cv>http://www.apache.org</cv>
	
	<ck>favicon</ck> = <cv>$C{REST/headerIcon}</cv>
	<ck>header</ck> = 
		<cv>&lt;a href='$U{$C{REST/headerLink}}'&gt;</cv>
			<cv>&lt;img src='$U{$C{REST/headerIcon}}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;</cv>
		<cv>&lt;/a&gt;</cv>
	<ck>footer</ck> = 
		<cv>&lt;a href='$U{$C{REST/footerLink}}'&gt;</cv>
			<cv>&lt;img src='$U{$C{REST/footerIcon}}' style='float:right;padding-right:20px;height:32px'/&gt;</cv>
		<cv>&lt;/a&gt;</cv>
</p>
<p>
	The take-away here is that the "User Interface" is open-ended, lets you define pretty much anything you want through arbitrary HTML, 
	and allows you either hardcode your interface inside annotations or pull them in via string variables from other places such as
	external config files.
</p>
<ul class='seealso'>
	<li class='link'>{@doc juneau-microservice-jetty.UiCustomization}
</ul>
</div><!-- END: 6.31.4 - juneau-rest-server.HtmlDocAnnotation.UiCustomization -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HtmlDocAnnotation.Stylesheets' id='juneau-rest-server.HtmlDocAnnotation.Stylesheets'>6.31.5 - Stylesheets</a><span class='update'>8.1.0-updated</span></h4>
<div class='topic'><!-- START: 6.31.5 - juneau-rest-server.HtmlDocAnnotation.Stylesheets -->
<p>
	The sample root page renders in the default "devops" look-and-feel:
</p>
<p class='bpcode w800'>
	http://localhost:10000
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.Stylesheets.0.png'>
<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>
<p class='bpcode w800'>
	http://localhost:10000/?stylesheet=styles%2Flight.css
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.Stylesheets.2.png'>
<p>
	And the "dark" look-and-feel:
</p>
<p class='bpcode w800'>
	http://localhost:10000/?stylesheet=styles%2Fdark.css
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.Stylesheets.3.png'>
<p>
	The stylesheet URL is controlled by the {@link org.apache.juneau.html.annotation.HtmlDocConfig#stylesheet() @HtmlDocConfig(stylesheet)} annotation.
	The {@link org.apache.juneau.rest.BasicRestServlet} class defines the stylesheet served up as a static file:
<p class='bpcode w800'>
	<ja>@Rest</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> BasicRestServlet <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
	<c>org/apache/juneau/rest/styles/devops.css</c>.
</p>
<p>
	To provide your own stylesheet, simply override the stylesheet attribute and point to a different
	file:	
</p>
<p class='bpcode w800'>
	<ja>@Rest</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> BasicRestServlet {...}
</p>
<p>
	You can try out different stylesheets by passing in a <c>stylesheet</c> attribute in the request
	URL.
	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='bpcode w800'>
	<ja>@Rest</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> BasicRestServletJenaGroup {...}
</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.
	In the case of <l>StyleMenuItem</l>, it's simply returning a list of links wrapped in a div tag:
</p>
<p class='bpcode w800'>
	<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><!-- END: 6.31.5 - juneau-rest-server.HtmlDocAnnotation.Stylesheets -->
</div><!-- END: 6.31 - juneau-rest-server.HtmlDocAnnotation -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.DefaultHeaders' id='juneau-rest-server.DefaultHeaders'>6.32 - Default Headers</a></h3>
<div class='topic'><!-- START: 6.32 - juneau-rest-server.DefaultHeaders -->
<p>
	The following annotations are provided for specifying default header values for requests and responses:
</p>
<ul class='javatree'>
	<li class='ja'>
		{@link org.apache.juneau.rest.annotation.Rest#reqHeaders() Rest(reqHeaders)} 
		<br>Defines default headers on request when the client doesn't specify them.
	<li class='ja'>
		{@link org.apache.juneau.rest.annotation.Rest#resHeaders() Rest(resHeaders)}
		<br>Appends the specified headers if they weren't already set programmatically.	
</ul>		

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Servlet with default headers</jc>
	<ja>@Rest</ja>(

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

		<jc>// Add a version header attribute to all responses</jc>
		resHeaders={<js>"X-Version: 1.0"</js>}
	)
	<jk>public</jk> MyRestServlet <jk>extends</jk> BasicRestServlet {
		...
	}			
</p>
<p>
	Default headers can also be specified programmatically by overriding the following methods:
</p>
<ul class='javatree'>
	<li class='jac'>
		{@link org.apache.juneau.rest.RestContextBuilder}
		<ul>
			<li class='jm'>
				{@link org.apache.juneau.rest.RestContextBuilder#reqHeaders(String[])}
			<li class='jm'>
				{@link org.apache.juneau.rest.RestContextBuilder#resHeaders(String[])}
		</ul>
	</li>
</ul>
</div><!-- END: 6.32 - juneau-rest-server.DefaultHeaders -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.LoggingAndDebugging' id='juneau-rest-server.LoggingAndDebugging'>6.33 - Logging / Debugging</a><span class='update'>8.1.0-new</span></h3>
<div class='topic'><!-- START: 6.33 - juneau-rest-server.LoggingAndDebugging -->
<p>
	The REST APIs provides support for fine-tuned control of logging for HTTP requests and responses.
</p>
<p>
	The APIs involved are:
</p>
<ul class='javatree'>
	<li class='ja'>
		{@link org.apache.juneau.rest.annotation.Rest}
		<ul>
			<li class='jm'>{@link org.apache.juneau.rest.annotation.Rest#logging() logging()} - Class-level logging configuration and rules.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.Rest#debug() debug()} - Enable debug mode.
		</ul>
	</li>
	<li class='ja'>
		{@link org.apache.juneau.rest.annotation.RestMethod}
		<ul>
			<li class='jm'>{@link org.apache.juneau.rest.annotation.RestMethod#logging() logging()} - Class-level logging configuration.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.RestMethod#debug() debug()} - Enable debug mode.
		</ul>
	</li>
	<li class='jc'>
		{@link org.apache.juneau.rest.RestContext}
		<ul>
			<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_callLoggerConfig REST_callLoggerConfig} - Underlying configuration property for {@link org.apache.juneau.rest.annotation.Rest#logging() @Rest(logging)}.
			<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_debug REST_debug} - Underlying configuration property for {@link org.apache.juneau.rest.annotation.Rest#debug() @Rest(debug)}.
		</ul>
	</li>
	<li class='ja'>
		{@link org.apache.juneau.rest.annotation.Logging} - Annotation for {@link org.apache.juneau.rest.annotation.Rest#logging() @Rest(logging)} and {@link org.apache.juneau.rest.annotation.RestMethod#logging() @RestMethod(logging)}
		<ul>
			<li class='jm'>{@link org.apache.juneau.rest.annotation.Logging#level() level()} - The logging level.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.Logging#rules() rules()} - The logging rules.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.Logging#useStackTraceHashing() useStackTraceHashing()} - Enables de-duplication of logged stack traces and replacement with hash IDs. 
			<li class='jm'>{@link org.apache.juneau.rest.annotation.Logging#stackTraceHashingTimeout() stackTraceHashingTimeout()} - Controls how frequently hashed stack traces are re-logged.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.Logging#disabled() disabled()} - Disables logging completely or per-request.
		</ul>
	</li>
	<li class='ja'>
		{@link org.apache.juneau.rest.annotation.LoggingRule} - Annotation for {@link org.apache.juneau.rest.annotation.Logging#rules() @Logging(rules)}
		<ul>
			<li class='jm'>{@link org.apache.juneau.rest.annotation.LoggingRule#level() level()} - The logging level.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.LoggingRule#codes() codes()} - Status code patterns and ranges to match against.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.LoggingRule#exceptions() exceptions()} - Exception class names and patterns to match against.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.LoggingRule#debugOnly() debugOnly()} - Match only if debug is set on the request.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.LoggingRule#req() req()} - The level of request detail.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.LoggingRule#res() res()} - The level of response detail.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.LoggingRule#verbose() verbose()} - Shortcut for <jsf>LONG</jsf> request and response detail.
			<li class='jm'>{@link org.apache.juneau.rest.annotation.LoggingRule#disabled() disabled()} - Disables logging completely or per-request.
		</ul>
	</li>
</ul>

<h5 class='topic'>Request/response details</h5>
<p>
	The amount of detail on requests and responses is controlled via the {@link org.apache.juneau.rest.annotation.LoggingRule#req() @LoggingRule(req)} 
	and {@link org.apache.juneau.rest.annotation.LoggingRule#res() @LoggingRule(res)} annotations:
</p>
<ul>
	<li><js>"short"</js> - Results in simple one-line log lines containing the HTTP method + url + response code.
	<li><js>"medium"</js> - Also includes headers and body length information (if debug enabled).
	<li><js>"large"</js> - Dumps the entire request/response bodies (if debug enabled).
</ul>
<p>
	The following code shows the output produced using the <js>"short"</js> setting:
</p>
<p class='bpcode'>
	<ja>@Rest</ja>(
		logging=<ja>@Logging</ja>(
			level=<js>"info"</js>,
			rules={
				<ja>@LoggingRule</ja>(codes<js>"500-"</js>, level=<js>"warning"</js>, req=<js>"short"</js>, res=<js>"short"</js>)
			}
		)
	)
	<jk>public static class</jk> MyRestClass {

		<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"foo"</js>)
		<jk>public</jk> String myRestMethod(RestRequest req, RestResponse res) <jk>throws</jk> Exception {
			res.setStatus(500);
			res.setHeader(<js>"Foo"</js>, <js>"bar"</js>);
			res.setException(<jk>new</jk> StringIndexOutOfBoundsException());  <jc>// Could also throw.</jc>
			<jk>return</jk> req.getBody().asString();
		}
	}

	<jk>static</jk> MockRest <jsf>MY_REST</jsf> = MockRest.<jsm>build</jsm>(MyRestClass.<jk>class</jk>, <jk>null</jk>);

	<ja>@Test</ja>
	<jk>public void</jk> test() <jk>throws</jk> Exception {
		<jsf>MY_REST</jsf>.<jsm>post</jsm>(<js>"/foo?foo=bar"</js>, <js>"Foo"</js>).header(<js>"Foo"</js>, <js>"bar"</js>).execute().assertStatus(500);
	}
</p>
<p>
	The log output produced from the code above looks like this:
</p>
<p class='bpcode'>
	WARNING: [500] HTTP POST /foo
	java.lang.StringIndexOutOfBoundsException
		at org.apache.juneau.rest.annotation.RestResourceLoggingTest$MyRestClass.myRestMethod(RestResourceLoggingTest.java:672)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		...
</p>
<p>
	In comparison, using <js>"long"</js> formatting adds information about headers and body.  
</p>
<p class='bpcode'>
	<ja>@Rest</ja>(
		debug=<js>"true"</js>,  <jc>// Needed to capture request/response bodies for logging.</jc>
		logging=<ja>@Logging</ja>(
			level=<js>"info"</js>,
			rules={
				<ja>@LoggingRule</ja>(codes<js>"500-"</js>, level=<js>"warning"</js>, req=<js>"long"</js>, res=<js>"long"</js>)
			}
		)
	)
</p>
<p>
	Request/response bodies are only cached for logging if debugging is enabled via the <c class='snippet'>debug=<js>"true"</js></c> flag.
</p>
<p>
	The log file now contains the following with shows the contents of the request and response bodies in both UTF-8
	and spaced-hex:
<p>
<p class='bpcode'>
	WARNING: 
	=== HTTP Request (incoming) ===================================================
	[500] HTTP POST /foo?foo=bar
		Request length: 3 bytes
		Response code: 500
		Response length: 3 bytes
		Exec time: 20ms
	---Request Headers---
		Foo: bar
	---Response Headers---
		Foo: bar
		Content-Type: text/plain
	---Request Body UTF-8---
	Foo
	---Request Body Hex---
	46 6F 6F
	---Response Body UTF-8---
	Foo
	---Response Body Hex---
	46 6F 6F
	=== END ===================================================================
	java.lang.StringIndexOutOfBoundsException
		at org.apache.juneau.rest.annotation.RestResourceLoggingTest$MyRestClass.myRestMethod(RestResourceLoggingTest.java:672)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		...
</p>

<h5 class='topic'>Rule matching</h5>
<p>
	Logging rules can match against status codes, exception class names, and the debug flag.
	<br>The following shows various examples of logging rule matches.
</p>

<p class='bpcode'>
	<ja>@Rest</ja>(
		logging=<ja>@Logging</ja>(
			rules={
				<jc>// Individual status codes.</jc>
				<ja>@LoggingRule</ja>(codes=<js>"300"</js>, ...)

				<jc>// Ranges of status codes.</jc>
				<ja>@LoggingRule</ja>(codes=<js>"400-499"</js>, ...)
				<ja>@LoggingRule</ja>(codes=<js>">=500"</js>, ...)

				<jc>// All codes.</jc>
				<ja>@LoggingRule</ja>(codes=<js>"*"</js>, ...)

				<jc>// Full class names of exceptions.</jc>
				<ja>@LoggingRule</ja>(exceptions=<js>"java.lang.StringIndexOutOfBoundsException"</js>, ...)

				<jc>// Exception class name patterns.</jc>
				<ja>@LoggingRule</ja>(exceptions=<js>"String*Exception *Foo*Exception"</js>, ...)

				<jc>// Match when debug enabled only.</jc>
				<ja>@LoggingRule</ja>(codes=<js>"*"</js>, debugOnly=<js>"true"</js>, ...)
			}
		)
	)
</p>
<p>
	Rules are matched in the order listed on the annotation.  
	Rules on methods are matched before rules on classes.
	Rules on child methods/classes are matched before rules on parent classes.
</p>

<h5 class='topic'>Debug mode</h5>
<p>
	The debug mode setting allows HTTP request/response bodies to be cached in memory for logging purposes:
</p>
<p class='bpcode'>
	<ja>@Rest</ja>(
		debug=<js>"true"</js>
	)
</p>

<p>
	The possible values for the debug setting are (case-insensitive):
</p>
<ul>
	<li><js>"true"</js> - Debug mode enabled.
	<li><js>"false"</js> (default) - Debug mode disabled.
	<li><js>"per-request"</js> - Debug mode is enabled only on requests containing an <c class='snippet'>X-Debug: true</c> header.
</ul>
<p>
	Note that caching HTTP bodies in memory can produce significant performance penalties, so use the setting wisely.
	<br>In particular, do not leave this setting enabled on production instances since it can easily lead to 
	denial-of-service attacks.
</p>
<p>
	Servlet code can check the debug setting via the {@link org.apache.juneau.rest.RestRequest#isDebug()} method allowing it to be used
	for custom purposes.
</p>
<p>
	Debug mode can also be enabled on a request by calling the {@link org.apache.juneau.rest.RestRequest#setDebug(Boolean)} or 
	{@link org.apache.juneau.rest.RestResponse#setDebug(Boolean)} methods.  Note however that you must be sure not to have already consumed
	the request or started writing the response before calling this method.
</p>

<h5 class='topic'>No-trace (disabled) mode</h5>
<p>
	The {@link org.apache.juneau.rest.annotation.Logging#disabled() @Logging(disabled)} and {@link org.apache.juneau.rest.annotation.LoggingRule#disabled() @LoggingRule(disabled)} annotations
	can be used to disable logging entirely or on a per-request basis:
</p>
<p class='bpcode'>
	<ja>@Rest</ja>(
		logging=<ja>@Logging</ja>(
			disabled=<js>"true"</js>
			rules={
				<ja>@LoggingRule</ja>(
					codes<js>"500-"</js>, 
					disabled=<js>"false"</js>
				)
			}
		)
	)
</p>
<p>
	The possible values for the disabled setting are (case-insensitive):
</p>
<ul>
	<li><js>"true"</js> - Logging disabled.
	<li><js>"false"</js> (default) - Logging not disabled.
	<li><js>"per-request"</js> - Logging is disabled only on requests containing a <c class='snippet'>X-NoTrace: true</c> header.
</ul>
<p>
	Disabled logging is particularly useful when running testcases that are expected to throw exceptions or cause
	other errors and you don't want these errors logged.
</p>
<p>
	Disabled logging can also be set on a request by calling the {@link org.apache.juneau.rest.RestRequest#setNoTrace(Boolean)} or 
	{@link org.apache.juneau.rest.RestResponse#setNoTrace(Boolean)} methods.
</p>

<h5 class='topic'>Stacktrace hashing</h5>
<p>
	The {@link org.apache.juneau.rest.annotation.Logging#useStackTraceHashing() @Logging(useStackTraceHashing)} setting can be used to eliminate duplicate stacktraces
	in your log file by logging them once and then logging identifying hash IDs.
</p>
<p>
	In the example below, we're causing two exceptions but only logging the first one:
</p>
<p class='bpcode'>
	<ja>@Rest</ja>(
		logging=<ja>@Logging</ja>(
			useStackTraceHashing=<js>"true"</js>,
			rules={
				<ja>@LoggingRule</ja>(codes<js>">=500"</js>, level=<js>"warning"</js>, req=<js>"short"</js>, res=<js>"short"</js>)
			}
		)
	)
	<jk>public static class</jk> MyRestClass {

		<ja>@RestMethod</ja>(method=<js>"POST"</js>, path=<js>"foo"</js>)
		<jk>public</jk> String myRestMethod(RestRequest req, RestResponse res) <jk>throws</jk> Exception {
			res.setHeader(<js>"Foo"</js>, <js>"bar"</js>);
		
			// Equivalent to throwing an exception. 
			res.setStatus(500);
			res.setException(<jk>new</jk> StringIndexOutOfBoundsException());
			
			<jk>return</jk> req.getBody().asString();
		}
	}

	<jk>static</jk> MockRest <jsf>MY_REST</jsf> = MockRest.<jsm>build</jsm>(MyRestClass.<jk>class</jk>, <jk>null</jk>);

	<ja>@Test</ja>
	<jk>public void</jk> test() <jk>throws</jk> Exception {
		<jsf>MY_REST</jsf>.<jsm>post</jsm>(<js>"/foo?foo=bar"</js>, <js>"Foo"</js>).header(<js>"Foo"</js>, <js>"bar"</js>).execute().assertStatus(500);
		<jsf>MY_REST</jsf>.<jsm>post</jsm>(<js>"/foo?foo=bar"</js>, <js>"Foo"</js>).header(<js>"Foo"</js>, <js>"bar"</js>).execute().assertStatus(500);
	}
</p>
<p>
	The log file will show a 4 byte hash ID <js>"9b85cc96"</js> and count <js>".1"</js> as shown below:
</p>
<p class='bpcode'>
	Jul 11, 2019 3:38:48 PM org.apache.juneau.rest.BasicRestCallLogger log
	WARNING: [500,9b85cc96.1] HTTP POST /foo
	java.lang.StringIndexOutOfBoundsException
		at org.apache.juneau.rest.annotation.RestResourceLoggingTest$MyRestClass.myRestMethod(RestResourceLoggingTest.java:671)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		...
	
	WARNING: [500,9b85cc96.2] HTTP POST /foo
</p>
<p>
	The {@link org.apache.juneau.rest.annotation.Logging#stackTraceHashingTimeout() @Logging(stackTraceHashingTimeout)} setting can be used to periodically log the stacktrace
	to the log file again.
</p>
</div><!-- END: 6.33 - juneau-rest-server.LoggingAndDebugging -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HttpStatusCodes' id='juneau-rest-server.HttpStatusCodes'>6.34 - HTTP Status Codes</a></h3>
<div class='topic'><!-- START: 6.34 - juneau-rest-server.HttpStatusCodes -->
<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 w800'>
	<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><!-- END: 6.34 - juneau-rest-server.HttpStatusCodes -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.OverloadingHttpMethods' id='juneau-rest-server.OverloadingHttpMethods'>6.35 - Overloading HTTP Methods</a></h3>
<div class='topic'><!-- START: 6.35 - juneau-rest-server.OverloadingHttpMethods -->
<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='bpcode w800'>
	<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.Rest#allowedMethodParams() @Rest(allowedMethodParams)} 
	setting must be enabled on your servlet.
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		<jc>// Allow &amp;method parameter on BAR requests</jc>
		allowedMethodParams=<js>"BAR"</js>
	)
</p>
</div><!-- END: 6.35 - juneau-rest-server.OverloadingHttpMethods -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.BuiltInParameters' id='juneau-rest-server.BuiltInParameters'>6.36 - Built-in Parameters</a></h3>
<div class='topic'><!-- START: 6.36 - juneau-rest-server.BuiltInParameters -->
<p>
	The following URL parameters have special meaning and can be passed in through the URL of the request:
</p>
<table class='styled w800'>
	<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.WriterSerializer#WSERIALIZER_useWhitespace WSERIALIZER_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.Rest#allowedMethodParams() @Rest(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.Rest#allowedHeaderParams() @Rest(allowedHeaderParams)} 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.Rest#allowBodyParam() @Rest(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><!-- END: 6.36 - juneau-rest-server.BuiltInParameters -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.CustomSerializersAndParsers' id='juneau-rest-server.CustomSerializersAndParsers'>6.37 - Custom Serializers and Parsers</a></h3>
<div class='topic'><!-- START: 6.37 - juneau-rest-server.CustomSerializersAndParsers -->
<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='bpcode w800'>
	<jd>/**
	 * Sample resource that allows images to be uploaded and retrieved.
	 */</jd>
	<ja>@Rest</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> BasicRestServlet {
	
		<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>(<js>"id"</js>) 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>(<js>"id"</js>) <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>(<js>"id"</js>) <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><!-- END: 6.37 - juneau-rest-server.CustomSerializersAndParsers -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.UsingWithOsgi' id='juneau-rest-server.UsingWithOsgi'>6.38 - Using with OSGi</a></h3>
<div class='topic'><!-- START: 6.38 - juneau-rest-server.UsingWithOsgi -->
<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='bpcode w800'>
	<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><!-- END: 6.38 - juneau-rest-server.UsingWithOsgi -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.Injection' id='juneau-rest-server.Injection'>6.39 - Using with Spring and Injection frameworks</a></h3>
<div class='topic'><!-- START: 6.39 - juneau-rest-server.Injection -->
<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.Rest#children() @Rest(children)} instances.
</p>
<p>
	The general approach starts with defining a resolver that uses the Spring application context for resolution:
</p>
<p class='bpcode w800'>
	<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='bpcode w800'>
	<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 <c>Root</c> resource with a constructor that takes in our rest resource resolver and
	sets it on the config object during initialization.
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		children={
			...
		}
	)
	<jk>public class</jk> Root <jk>extends</jk> BasicRestServletGroup {
		
		<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='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/child"</js>
	)
	<jk>public class</jk> MyChildResource <jk>extends</jk> BasicRestServlet {
	
		<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><!-- END: 6.39 - juneau-rest-server.Injection -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.HTTP2' id='juneau-rest-server.HTTP2'>6.40 - Using HTTP/2 features</a></h3>
<div class='topic'><!-- START: 6.40 - juneau-rest-server.HTTP2 -->
<p>
	Juneau is built as a veneer on top of the Servlet API, allowing you to use low-level Servlet APIs
	whenever needed.
	This allows you to take advantage of the newest HTTP/2 features implemented in the new Servlet 4.0 
	specification.
</p>
</div><!-- END: 6.40 - juneau-rest-server.HTTP2 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server.OtherNotes' id='juneau-rest-server.OtherNotes'>6.41 - Other Notes</a></h3>
<div class='topic'><!-- START: 6.41 - juneau-rest-server.OtherNotes -->
<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><!-- END: 6.41 - juneau-rest-server.OtherNotes -->
</div><!-- END: 6 - juneau-rest-server -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server-jaxrs' id='juneau-rest-server-jaxrs'>7 - juneau-rest-server-jaxrs</a></h2>
<div class='topic'><!-- START: 7 - juneau-rest-server-jaxrs -->
<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<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>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	

<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-rest-server-jaxrs-{@property juneauVersion}.jar 
</p>	

<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.rest.server_{@property juneauVersion}.jar 
</p>	

<p>
	The <c>juneau-rest-server-jaxrs</c> library provides an implementation of a <c>MessageBodyReader</c>
	and <c>MessageBodyWriter</c> to allow any of the Juneau serializers and parsers to be used in a 
	JAX/RS environment. 
</p>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server-jaxrs.BaseProvider' id='juneau-rest-server-jaxrs.BaseProvider'>7.1 - Juneau JAX-RS Provider</a></h3>
<div class='topic'><!-- START: 7.1 - juneau-rest-server-jaxrs.BaseProvider -->
<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='javatree'>
	<li class='jc'>
		{@link org.apache.juneau.rest.jaxrs.BaseProvider} - The base provider class that implements the JAX-RS 
		<c>MessageBodyReader</c> and <c>MessageBodyWriter</c> interfaces.
	<li class='jc'>
		{@link org.apache.juneau.rest.jaxrs.JuneauProvider} - Annotation that is applied to subclasses of <c>BaseProvider</c>
		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.BasicProvider} - A default provider that provides the same level
		of media type support as the {@link org.apache.juneau.rest.BasicRestServlet} class.
</ul>
<p>
	For the most part, when using these components, you'll either use the existing <l>BasicProvider</l>, 
	or define your own by subclassing <l>BaseProvider</l>.
</p>
</div><!-- END: 7.1 - juneau-rest-server-jaxrs.BaseProvider -->
</div><!-- END: 7 - juneau-rest-server-jaxrs -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server-springboot' id='juneau-rest-server-springboot'>8 - juneau-rest-server-springboot</a><span class='update'>8.0.0-new</span></h2>
<div class='topic'><!-- START: 8 - juneau-rest-server-springboot -->
<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<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-springboot<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	

<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-rest-server-springboot-{@property juneauVersion}.jar 
</p>	

<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.rest.server.springboot_{@property juneauVersion}.jar 
</p>	

<p>
	The <c>juneau-rest-server-springboot</c> library provides classes to make it easy to integrate
	Juneau REST resources with Spring and Spring Boot.
</p>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server-springboot.Overview' id='juneau-rest-server-springboot.Overview'>8.1 - Overview</a><span class='update'>8.0.0-new</span></h3>
<div class='topic'><!-- START: 8.1 - juneau-rest-server-springboot.Overview -->
<p>
	The Juneau integration component for Spring Boot consists of the following classes:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.rest.springboot.annotation.JuneauRestRoot}
	<li class='jc'>{@link org.apache.juneau.rest.springboot.JuneauRestInitializer}
	<li class='jc'>{@link org.apache.juneau.rest.springboot.SpringRestResourceResolver}
</ul>
<p>
	A typical Spring Boot application can use the {@link org.apache.juneau.rest.springboot.JuneauRestInitializer} to find
	and register Juneau REST servlets via the {@link org.apache.juneau.rest.springboot.annotation.JuneauRestRoot} annotation.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@SpringBootApplication</ja>
	<ja>@Controller</ja>
	<jk>public class</jk> App {
	
		<jk>public static void</jk> main(String[] args) {
			<jk>new</jk> SpringApplicationBuilder(App.<jk>class</jk>)
				.initializers(<jk>new</jk> JuneauRestInitializer(App.<jk>class</jk>))
				.run(args);
		}
	
		<jd>/** Our root resource */</jd>
		<ja>@Bean @JuneauRestRoot</ja>
		<jk>public</jk> RootResource getRootResource() {
			<jk>return new</jk> RootResource();  <jc>// A subclass of RestServlet.</jc>
		}
	}
</p>
<p>
	The initializer will search for Spring beans annotated with the <ja>@JuneauRestRoot</ja> annotation identifying it
	as a top-level servlet to be deployed in the Spring Boot web container.
</p>
<p>
	Another option is to use the <ja>@JuneauRestRoot</ja> annotation on your Spring Boot source class like so:  
</p>
<p class='bpcode w800'>
	<ja>@SpringBootApplication</ja>
	<ja>@Controller</ja>
	<ja>@JuneauRestRoot</ja>(servlets=RootResource.<jk>class</jk>)
	<jk>public class</jk> App {
	
		<jk>public static void</jk> main(String[] args) {
			<jk>new</jk> SpringApplicationBuilder(App.<jk>class</jk>)
				.initializers(<jk>new</jk> JuneauRestInitializer(App.<jk>class</jk>))
				.run(args);
		}
	}
</p>
<p>
	The root servlets are given an instance of {@link org.apache.juneau.rest.springboot.SpringRestResourceResolver} which allows
	for child resources to be defined as injectable Spring beans.  
</p>
<p>
	 The {@doc juneau-examples-rest-springboot} section describes how the Examples REST application is deployed
	 using Spring Boot and quickly deployable as an online application using Heroku.
</p>
</div><!-- END: 8.1 - juneau-rest-server-springboot.Overview -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-server-springboot.ChildResources' id='juneau-rest-server-springboot.ChildResources'>8.2 - Child Resources</a><span class='update'>8.1.0-new</span></h3>
<div class='topic'><!-- START: 8.2 - juneau-rest-server-springboot.ChildResources -->
<p>
	When using the <ja>@JuneauRestRoot</ja> annotation, servlet are given an instance of {@link org.apache.juneau.rest.springboot.SpringRestResourceResolver}.  
	The resource resolver gets passed down through the children hierarchy, allowing child resources to be defined as injectable Spring beans.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Configuration</ja>
	<jk>public class</jk> AppConfiguration {
	
		<ja>@Bean @JuneauRestRoot</ja>
		<jk>public</jk> RootResource getRootResource() {
			<jk>return new</jk> RootResource();
		}

		<ja>@Bean</ja>
		<jk>public</jk> ChildResource getChildResource() {
			<jk>return new</jk> ChildResource();
		}

		<ja>@Bean</ja>
		<jk>public</jk> GrandChildResource getGrandChildResource() {
			<jk>return new</jk> GrandChildResource(); 
		}
	}
</p>
<p>
	The root resource class must extend from <c>HttpServlet</c> so that it can be registered as a normal
	servlet using the Spring Boot architecture.  The {@link org.apache.juneau.rest.BasicRestServletGroup} class is our router class
	that extends from <c>HttpServlet</c>:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/root"</js>,
		children={
			ChildResource.<jk>class</jk>
		}
	)
	<jk>public class</jk> RootResource <jk>extends</jk> BasicRestServletGroup {
		<jc>// No code needed.</jc>
	}
</p>
<p>
	Because Spring Boot will automatically register any beans that extend from <c>HttpServlet</c>, we
	DON'T want the child classes to extend from <c>HttpServlet</c>.  Instead, we extend from
	{@link org.apache.juneau.rest.BasicRestGroup} and {@link org.apache.juneau.rest.BasicRest} instead:
</p>

<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/child"</js>,
		children={
			GrandChildResource.<jk>class</jk>
		}
	)
	<jk>public class</jk> ChildResource <jk>extends</jk> BasicRestGroup {
		<jc>// No code needed.</jc>
	}
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/grandchild"</js>
	)
	<jk>public class</jk> GrandChildResource <jk>extends</jk> BasicRest {
		<jc>// Injectable bean</jc>
	}
</p>
</div><!-- END: 8.2 - juneau-rest-server-springboot.ChildResources -->
</div><!-- END: 8 - juneau-rest-server-springboot -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client' id='juneau-rest-client'>9 - juneau-rest-client</a></h2>
<div class='topic'><!-- START: 9 - juneau-rest-client -->
<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<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>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	

<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-rest-client-{@property juneauVersion}.jar 
</p>	

<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.rest.client_{@property juneauVersion}.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 Apache HttpClient 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='bpcode w800'>
	<jc>// Create a reusable JSON client.</jc>
	<jk>try</jk> (RestClient client = RestClient.<jsm>create</jsm>().json().build()) {
	
		<jc>// The address of the root resource.</jc>
		String url = <js>"http://localhost:10000/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>
 		Serializes and parses HTTP request and response parts (query/form-data parameters, headers, path variables) 
 		using OpenAPI marshalling and validation.
	<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.
</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><c>httpclient-4.5.jar</c>
	<li><c>httpcore-4.4.1.jar</c>
	<li><c>httpmime-4.5.jar</c>
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<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>().json().build()) {
	
		<jc>// GET request, ignoring output</jc>
		<jk>try</jk> {
			<jk>int</jk> rc = client.doGet(<js>"http://localhost:10000/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:10000/addressBook"</js>)
			.getResponseAsString();
				
		<jc>// GET request, getting output as a Reader</jc>
		Reader r = client.doGet(<js>"http://localhost:10000/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:10000/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:10000/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:10000/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:10000/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:10000/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:10000/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:10000/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:10000/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(TemporalCalendarSwap.IsoInstant.<jk>class</jk>).build()) {
		Calendar birthDate = client.doGet(<js>"http://localhost:10000/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:10000/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:10000/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:10000/addressBook/0/addresses"</js>, newAddress).run();	
	}
</p>

<ul class='notes'>
	<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>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies' id='juneau-rest-client.RestProxies'>9.1 - REST Proxies</a></h3>
<div class='topic'><!-- START: 9.1 - juneau-rest-client.RestProxies -->
<p>
	The <c>juneau-rest-client</c> library can also be used to define interface proxies against 3rd-party REST interfaces.
	This is an extremely powerful feature that allows you to quickly define easy-to-use interfaces against 
	virtually any REST interface.
</p>
<p>
	Remote resources are instantiated using one of the following methods:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.rest.client.RestClient}
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.client.RestClient#getRemote(Class) getRemote(Class)}
		<li class='jm'>{@link org.apache.juneau.rest.client.RestClient#getRemote(Class,Object) getRemote(Class,Object)}
		<li class='jm'>{@link org.apache.juneau.rest.client.RestClient#getRemote(Class,Object,Serializer,Parser) getRemote(Class,Object,Serializer,Parser)}
	</ul>
</ul>
<p>
	Annotations are used on the interface and interface methods to specify how to convert input and output to HTTP headers, query parameters, form 
	post parameters, or request/response bodies.
</p>
<ul class='javatree'>
	<li class='jp'>{@link org.apache.juneau.http.remote}
	<ul>
		<li class='ja'>{@link org.apache.juneau.http.remote.Remote}
		<li class='ja'>{@link org.apache.juneau.http.remote.RemoteMethod}
	</ul>
	<li class='jp'>{@link org.apache.juneau.http.annotation}
	<ul>
		<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
		<li class='ja'>{@link org.apache.juneau.http.annotation.Header}
		<li class='ja'>{@link org.apache.juneau.http.annotation.FormData}
		<li class='ja'>{@link org.apache.juneau.http.annotation.Query}
		<li class='ja'>{@link org.apache.juneau.http.annotation.Path}
		<li class='ja'>{@link org.apache.juneau.http.annotation.Request}
		<li class='ja'>{@link org.apache.juneau.http.annotation.Response}
	</ul>
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>	
	<ja>@Remote</ja>(path=<js>"/petstore"</js>)
	<jk>public interface</jk> PetStore {
		
		<ja>@RemoteMethod</ja>(httpMethod=<jsf>POST</jsf>, path=<js>"/pets"</js>)
		String addPet(
			<ja>@Body</ja> CreatePet pet, 
			<ja>@Header</ja>(<js>"E-Tag"</js>) UUID etag, 
			<ja>@Query</ja>(<js>"debug"</js>) <jk>boolean</jk> debug
		);
	}
</p>
<p class='bpcode w800'>	
	<jc>// Use a RestClient with default Simple JSON support.</jc>
	<jk>try</jk> (RestClient client = RestClient.<jsm>create</jsm>().simpleJson().build()) {
		PetStore store = client.getRemote(PetStore.<jk>class</jk>, <js>"http://localhost:10000"</js>);
		CreatePet pet = <jk>new</jk> CreatePet(<js>"Fluffy"</js>, 9.99);
		String response = store.createPet(pet, UUID.<jsm>randomUUID</jsm>(), <jk>true</jk>);
	}
</p>
<p>
	The call above translates to the following REST call:
</p>
<p class='bpcode w800'>
	POST http://localhost:10000/petstore/pets?debug=true HTTP/1.1
	Accept: application/json
	Content-Type: application/json
	E-Tag: 475588d4-0b27-4f56-9296-cc683251d314
	
	{
		name: 'Fluffy',
		price: 9.99 
	}
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.Remote' id='juneau-rest-client.RestProxies.Remote'>9.1.1 - @Remote</a><span class='update'>8.1.2-updated</span></h4>
<div class='topic'><!-- START: 9.1.1 - juneau-rest-client.RestProxies.Remote -->
<p>
	The {@link org.apache.juneau.http.remote.Remote @Remote} annotation is used on your interface class
	to identify it as a REST proxy interface.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.remote.Remote}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.remote.Remote#path path}
	</ul>
</ul>
<p>
	The <ja>@Remote</ja> annotation is optional, but often included for code readability.
</p>

<h5 class='topic'>@Remote(path)</h5>
<p>
	The {@link org.apache.juneau.http.remote.Remote#path @Remote(path)} annotation is used to define the
	HTTP path of the REST service.
</p>
<p>
	The path can be an absolute path to your REST service.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>	
	<ja>@Remote</ja>(path=<js>"http://localhost:10000/petstore"</js>)
	<jk>public interface</jk> PetStore {...}
</p>
<p class='bpcode w800'>	
	PetStore p = client.getRemote(PetStore.<jk>class</jk>);
</p>
<p>
	When a relative path is specified, it's relative to the root-url defined on the <c>RestClient</c> used to instantiate the interface.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>	
	<ja>@Remote</ja>(path=<js>"/petstore"</js>)
	<jk>public interface</jk> PetStore {...}
</p>
<p class='bpcode w800'>
	RestClient client = RestClient.<jsm>create</jsm>().json().rootUrl(<js>"http://localhost:10000"</js>).build();	
	PetStore p = client.getRemote(PetStore.<jk>class</jk>);
</p>
<p>
	When no path is specified, the root-url defined on the <c>RestClient</c> is used.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>	
	<ja>@Remote</ja>
	<jk>public interface</jk> PetStore {...}
</p>
<p class='bpcode w800'>
	RestClient client = RestClient.<jsm>create</jsm>().json().rootUrl(<js>"http://localhost:10000/petstore"</js>).build();	
	PetStore p = client.getRemote(PetStore.<jk>class</jk>);
</p>
</div><!-- END: 9.1.1 - juneau-rest-client.RestProxies.Remote -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.RemoteMethod' id='juneau-rest-client.RestProxies.RemoteMethod'>9.1.2 - @RemoteMethod</a></h4>
<div class='topic'><!-- START: 9.1.2 - juneau-rest-client.RestProxies.RemoteMethod -->
<p>
	The {@link org.apache.juneau.http.remote.RemoteMethod @RemoteMethod} annotation is applied to methods
	of <ja>@Remote</ja>-annotated interfaces to identify REST endpoints.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.remote.RemoteMethod}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.remote.RemoteMethod#method method}
		<li class='jf'>{@link org.apache.juneau.http.remote.RemoteMethod#path path}
		<li class='jf'>{@link org.apache.juneau.http.remote.RemoteMethod#returns returns}
	</ul>
</ul>
<h5 class='topic'>@RemoteMethod(method/path)</h5>
<p>
	The HTTP method and path are mapped to a Java method using the <c>method</c> and <c>path</c> annotations.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>	
	<ja>@Remote</ja>
	<jk>public interface</jk> PetStore {
		
		<jc>// GET /pets/{petId}</jc>
		<ja>@RemoteMethod</ja>(method=<js>"GET"</js>, path=<js>"/pets/{petId}"</js>)
		Pet getPet(<ja>@Path</ja>(<js>"petId"</js>) <jk>int</jk> id);
	}
</p>
<p>
	The Java method name can be anything.  
</p>

<h5 class='topic'>Inferred method/path</h5>
<p>
	In such cases, <c>method</c> and <c>path</c> annotations are optional if you follow certain naming
	conventions on your method that identify the method and path.
</p>
<p>
	For example, the <c>getPet</c> method below defaults to <c>GET /pet</c>:
</p>
<p class='bpcode w800'>	
	<ja>@Remote</ja>
	<jk>public interface</jk> PetStore {
		
		<jc>// GET /pet</jc>
		<ja>@RemoteMethod</ja>
		Pet getPet(...);
	}
</p>
<p>
	In such cases, the <ja>@RemoteMethod</ja> annotation is optional.
</p>
<p>
	Method names matching the following pattern are assumed to be implying the HTTP method name:
</p>
<p class='bpcode w800'>
	(get|put|post|delete|options|head|connect|trace|patch).*
</p>
<p class='bpcode w800'>
	do(?i)(get|put|post|delete|options|head|connect|trace|patch)
</p>

<h5 class='figure'>Examples:</h5>
<table class='styled w500'>
	<tr>
		<th>Java method name</th>
		<th>Inferred HTTP method</th>
		<th>Inferred HTTP path</th>
	</tr>
	<tr>
		<td class='code'>getPet()</td>
		<td class='code'>GET</td>
		<td class='code'>/pet</td>
	</tr>
	<tr>
		<td class='code'>get()</td>
		<td class='code'>GET</td>
		<td class='code'>/</td>
	</tr>
	<tr>
		<td class='code'>postPet()</td>
		<td class='code'>POST</td>
		<td class='code'>/pet</td>
	</tr>
	<tr>
		<td class='code'>fooPet()</td>
		<td class='code'>[default]</td>
		<td class='code'>/fooPet</td>
	</tr>
	<tr>
		<td class='code'>doGet()</td>
		<td class='code'>GET</td>
		<td class='code'>/</td>
	</tr>
	<tr>
		<td class='code'>doGET()</td>
		<td class='code'>GET</td>
		<td class='code'>/</td>
	</tr>
	<tr>
		<td class='code'>doFoo()</td>
		<td class='code'>[default]</td>
		<td class='code'>/doFoo</td>
	</tr>
</table>

<h5 class='topic'>@RemoteMethod(returns)</h5>
<p>
	The return type of the Java methods of 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 {@doc PojoCategories parsable} POJO 
		- The body of the response will be converted to the POJO using the parser defined on the 
		<c>RestClient</c> based on the <c>Content-Type</c> of the response.
	<li>
		Any {@link org.apache.juneau.http.annotation.Response @Response}-annotated type. (described later)
	<li>
		<c>HttpResponse</c> 
		- Returns the raw <c>HttpResponse</c> returned by the inner <c>HttpClient</c>.
	<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>

<p>
	If you're only interested in the HTTP status code of the response, you can use the {@link org.apache.juneau.http.remote.RemoteMethod#returns() returns}
	annotation with a value of {@link org.apache.juneau.http.remote.RemoteReturn#STATUS STATUS}:
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>	
	<ja>@Remote</ja>
	<jk>public interface</jk> PetStore {
		
		<jc>// POST /pets</jc>
		<jc>// Returns HTTP status code.</jc>
		<ja>@RemoteMethod</ja>(returns=<jsf>STATUS</jsf>)
		<jk>int</jk> postPets(...);
	}
</p>
<p>
	If your <c>RestClient</c> does not have a parser associated with it, then the value is converted directly from a String using
	the rules defined in {@doc PojosConveribleToStrings}. 
</p>
</div><!-- END: 9.1.2 - juneau-rest-client.RestProxies.RemoteMethod -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.Body' id='juneau-rest-client.RestProxies.Body'>9.1.3 - @Body</a></h4>
<div class='topic'><!-- START: 9.1.3 - juneau-rest-client.RestProxies.Body -->
<p>
	The {@link org.apache.juneau.http.annotation.Body @Body} annotation can be applied to arguments of <ja>@RemoteMethod</ja>-annotated methods
	to denote that they are the HTTP body of the request.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#required() required} - Input validation.  Body must be present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Body#schema() schema} - Swagger schema.
	</ul>
</ul>

<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// Used on parameter</jc>
	<ja>@Remote</ja>(path=<js>"/petstore"</js>)
	<jk>public interface</jk> PetStore {

		<ja>@RemoteMethod</ja>(path=<js>"/pets"</js>)
		String addPet(<ja>@Body</ja> Pet pet);
	}
</p>
<p class='bpcode w800'>
	<jc>// Used on class</jc>
	<ja>@Remote</ja>(path=<js>"/petstore"</js>)
	<jk>public interface</jk> PetStore {

		<ja>@RemoteMethod</ja>(path=<js>"/pets"</js>)
		String addPet(Pet pet);
	}

	<ja>@Body</ja>
	<jk>public class</jk> Pet {...}
</p>

<p>
	The argument can be any of the following types:
</p>
<ul class='spaced-list'>
	<li>
		Any serializable POJO - Converted to output using the {@link org.apache.juneau.serializer.Serializer} registered with the <c>RestClient</c>.
		<br><c>Content-Type</c> is set to that of the <c>Serializer</c>.
	<li>
		{@link java.io.Reader} - Raw contents of {@code Reader} will be serialized to remote resource.
		<br><c>Content-Type</c> is set to <js>"text/plain"</js>.
	<li>
		{@link java.io.InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
		<br><c>Content-Type</c> is set to <js>"application/octet-stream"</js>.
	<li>
		<c>NameValuePairs</c> - Converted to a URL-encoded FORM post.
		<br><c>Content-Type</c> is set to <js>"aplication/x-www-form-urlencoded"</js>.
	<li>
		<c>HttpEntity</c> - Bypass Juneau serialization and pass HttpEntity directly to HttpClient.
</ul>
 
<p>
	OpenAPI schema based serialization can be used by using the {@link org.apache.juneau.oapi.OpenApiSerializer} class.
</p>

<p class='bpcode w800'>
	<ja>@RemoteMethod</ja>(path=<js>"/comma-delimited-pipe-delimited-ints"</js>)
	String addCommaDelimitedPipeDelimitedInts(
		<ja>@Body</ja>(
			serializer=OpenApiSerializer.<jk>class</jk>,
			schema=<ja>@Schema</ja>(
				type=<js>"array"</js>,
				collectionFormat=<js>"pipes"</js>,
				items=<ja>@Items</ja>(
					type=<js>"array"</js>
					items=<ja>@SubItems</ja>(
						type=<js>"int32"</js>,
					 	<jc>// Auto-validates on client side!</jc>
						minimum=<js>"0"</js>,
						maximum=<js>"64"</js>
					)
				)
			)
		)
		<jk>int</jk>[][] input
	);
</p>
<p>
	See {@doc juneau-marshall.OpenApiDetails.Serializers} for information about supported data types in OpenAPI serialization.
</p>

<p>
	If your <c>RestClient</c> class does not have a serializer associated with it, the body will automatically be serialized to a 
	string using the rules defined in {@doc PojosConveribleToStrings}.
</p>
</div><!-- END: 9.1.3 - juneau-rest-client.RestProxies.Body -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.FormData' id='juneau-rest-client.RestProxies.FormData'>9.1.4 - @FormData</a></h4>
<div class='topic'><!-- START: 9.1.4 - juneau-rest-client.RestProxies.FormData -->
<p>
	The {@link org.apache.juneau.http.annotation.FormData @FormData} annotation can be applied to arguments of <ja>@RemoteMethod</ja>-annotated methods
	to denote that they are form-data parameters on the request.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_default() _default} - Default value if not present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#_enum() _enum} - Input validation.  Must match one of the values.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#allowEmptyValue() allowEmptyValue} - Input validation.  Allow empty value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#collectionFormat() collectionFormat} - How collections of items are formatted.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMaximum() exclusiveMaximum} - Input validation.  Whether maximum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#exclusiveMinimum() exclusiveMinimum} - Input validation.  Whether minimum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#format() format} - The schema type format. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#items() items} - The schema of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maximum() maximum} - Input validation.  Maximum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxItems() maxItems} - Input validation.  Maximum number of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#maxLength() maxLength} - Input validation.  Maximum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minimum() minimum} - Input validation.  Minimum numeric value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minItems() minItems} - Input validation.  Minimum number of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#minLength() minLength} - Input validation.  Minimum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#multipleOf() multipleOf} - Input validation.  Number must be a multiple of.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#name() name} - Form data entry name.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#pattern() pattern}- Input validation.  Must match regular expression.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#required() required}- Input validation.  Form data entry must be present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#serializer() serializer}- Override the part serializer.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#skipIfEmpty() skipIfEmpty}- Don't add if value is null or empty.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#type() type} - The schema type.
		<li class='jf'>{@link org.apache.juneau.http.annotation.FormData#uniqueItems() uniqueItems} - Input validation. Collections must contain unique items only.
	</ul>
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Remote</ja>(path=<js>"/myproxy"</js>)
	<jk>public interface</jk> MyProxy {

		<jc>// Explicit names specified for form data parameters.</jc>
		<ja>@RemoteMethod</ja>
		String postParameters(
			<ja>@FormData</ja>(<js>"foo"</js>)</ja> String foo,
			<ja>@FormData</ja>(<js>"bar"</js>)</ja> MyPojo pojo
		);

		<jc>// Multiple values pulled from a NameValuePairs object.</jc>
		<jc>// Name "*" is inferred.</jc>
		<ja>@RemoteMethod</ja>
		String postNameValuePairs(<ja>@FormData</ja> NameValuePairs nameValuePairs);

		<jc>// Multiple values pulled from a Map.</jc>
		<ja>@RemoteMethod</ja>
		String postMap(<ja>@FormData</ja> Map&lt;String,Object&gt; map);

		<jc>// Multiple values pulled from a bean.</jc>
		<ja>@RemoteMethod</ja>
		String postBean(<ja>@FormData</ja> MyBean bean);

		<jc>// An entire form-data HTTP body as a String.</jc>
		<ja>@RemoteMethod</ja>
		String postString(<ja>@FormData</ja> String string);

		<jc>// An entire form-data HTTP body as a Reader.</jc>
		<ja>@RemoteMethod</ja>
		String postReader(<ja>@FormData</ja> Reader reader);
	}
</p>

<p>
	Single-part arguments (i.e. those with name != <js>"*"</js>) can be any of the following types:
</p>
<ul class='spaced-list'>
	<li>
		Any serializable POJO - Converted to a string using the {@link org.apache.juneau.httppart.HttpPartSerializer} registered with the
		<c>RestClient</c> ({@link org.apache.juneau.oapi.OpenApiSerializer} by default) or associated via the {@link org.apache.juneau.http.annotation.FormData#serializer() @FormData(serializer)} annotation.
</ul>
<p>
	Multi-part arguments (i.e. those with name == <js>"*"</js> or empty) can be any of the following types:
</p>
<ul class='spaced-list'>
	<li>
		{@link java.io.Reader} - Raw contents of {@code Reader} will be serialized to remote resource.
	<li>
		{@link java.io.InputStream} - Raw contents of {@code InputStream} will be serialized to remote resource.
	<li>
		<c>NameValuePairs</c> - Converted to a URL-encoded FORM post.
	<li>
		<c>Map</c> - Converted to key-value pairs.
			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
	<li>
		Bean - Converted to key-value pairs.
			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
	<li>
		<c>CharSequence</c> - Used directly as am <js>"application/x-www-form-urlencoded"</js> entity.
</ul>
<p>
	See the link below for information about supported data types in OpenAPI serialization.
</p>

<ul class='seealso'>
	<li class='link'>{@doc juneau-marshall.OpenApiDetails.Serializers}
</ul>
</div><!-- END: 9.1.4 - juneau-rest-client.RestProxies.FormData -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.Query' id='juneau-rest-client.RestProxies.Query'>9.1.5 - @Query</a></h4>
<div class='topic'><!-- START: 9.1.5 - juneau-rest-client.RestProxies.Query -->
<p>
	The {@link org.apache.juneau.http.annotation.Query @Query} annotation can be applied to arguments of <ja>@RemoteMethod</ja>-annotated methods
	to denote that they are query parameters on the request.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Query}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_default() _default} - Default value if not present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#_enum() _enum} - Input validation.  Must match one of the values.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#allowEmptyValue() allowEmptyValue} - Input validation.  Allow empty value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#collectionFormat() collectionFormat} - How collections of items are formatted.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMaximum() exclusiveMaximum} - Input validation.  Whether maximum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#exclusiveMinimum() exclusiveMinimum} - Input validation.  Whether minimum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#format() format} - The schema type format. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#items() items} - The schema of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maximum() maximum} - Input validation.  Maximum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxItems() maxItems} - Input validation.  Maximum number of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#maxLength() maxLength} - Input validation.  Maximum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minimum() minimum} - Input validation.  Minimum numeric value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minItems() minItems} - Input validation.  Minimum number of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#minLength() minLength} - Input validation.  Minimum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#multipleOf() multipleOf} - Input validation.  Number must be a multiple of.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#name() name} - Query parameter name.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#pattern() pattern} - Input validation.  Must match regular expression.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#required() required} - Input validation.  Query parameter must be present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#serializer() serializer} - Override the part serializer.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#skipIfEmpty() skipIfEmpty}- Don't add if value is null or empty.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#type() type} - The schema type.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Query#uniqueItems() uniqueItems} - Input validation. Collections must contain unique items only.
	</ul>
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Remote</ja>(path=<js>"/myproxy"</js>)
	<jk>public interface</jk> MyProxy {
 
		<jc>// Explicit names specified for query parameters.</jc>
		<ja>@RemoteMethod</ja>
		String parameters(
			<ja>@Query</ja>(<js>"foo"</js>)</ja> String foo,
			<ja>@Query</ja>(<js>"bar"</js>)</ja> MyPojo pojo);
 
		<jc>// Multiple values pulled from a NameValuePairs object.</jc>
		<jc>// Same as @Query("*").</jc>
		<ja>@RemoteMethod</ja>
		String nameValuePairs(<ja>@Query</ja> NameValuePairs nameValuePairs);
 
		<jc>// Multiple values pulled from a Map.</jc>
		<jc>// Same as @Query("*").</jc>
		<ja>@RemoteMethod</ja>
		String map(<ja>@Query</ja> Map&lt;String,Object&gt; map);

		<jc>// Multiple values pulled from a bean.</jc>
		<jc>// Same as @Query("*").</jc>
		<ja>@RemoteMethod</ja>
		String bean(<ja>@Query</ja> MyBean myBean);

		<jc>// An entire query string as a String.</jc>
		<jc>// Same as @Query("*").</jc>
		<ja>@RemoteMethod</ja>
		String string(<ja>@Query</ja> String string);

		<jc>// An entire query string as a Reader.</jc>
		<jc>// Same as @Query("*").</jc>
		<ja>@RemoteMethod</ja>
		String reader(<ja>@Query</ja> Reader reader);
	}
</p>

<p>
	Single-part arguments (i.e. those with name != <js>"*"</js>) can be any of the following types:
</p>
<ul class='spaced-list'>
	<li>
		Any serializable POJO - Converted to a string using the {@link org.apache.juneau.httppart.HttpPartSerializer} registered with the
		<c>RestClient</c> ({@link org.apache.juneau.oapi.OpenApiSerializer} by default) or associated via the {@link org.apache.juneau.http.annotation.Query#serializer() @Query(serializer)} annotation.
</ul>

<p>
	Multi-part arguments (i.e. those with name == <js>"*"</js> or empty) can be any of the following types:
</p>
<ul class='spaced-list'>
	<li>
		{@link java.io.Reader} - Raw contents of {@code Reader} will be serialized directly a query string.
	<li>
		<c>NameValuePairs</c> - Serialized as individual query parameters.
	<li>
		<c>Map</c> - Converted to key-value pairs.
			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
	<li>
		Bean - Converted to key-value pairs.
			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
	<li>
		<c>CharSequence</c> - Serialized directly a query string.
</ul>

<p>
	See the link below for information about supported data types in OpenAPI serialization.
</p>

<ul class='seealso'>
	<li class='link'>{@doc juneau-marshall.OpenApiDetails.Serializers}
</ul>
</div><!-- END: 9.1.5 - juneau-rest-client.RestProxies.Query -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.Header' id='juneau-rest-client.RestProxies.Header'>9.1.6 - @Header</a></h4>
<div class='topic'><!-- START: 9.1.6 - juneau-rest-client.RestProxies.Header -->
<p>
	The {@link org.apache.juneau.http.annotation.Header @Header} annotation can be applied to arguments of <ja>@RemoteMethod</ja>-annotated methods
	to denote that they are header parameters on the request.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Header}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_default() _default} - Default value if not present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#_enum() _enum} - Input validation.  Must match one of the values.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#allowEmptyValue() allowEmptyValue} - Input validation.  Allow empty value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#collectionFormat() collectionFormat} - How collections of items are formatted.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMaximum() exclusiveMaximum} - Input validation.  Whether maximum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#exclusiveMinimum() exclusiveMinimum} - Input validation.  Whether minimum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#format() format} - The schema type format. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#items() items} - The schema of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maximum() maximum} - Input validation.  Maximum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxItems() maxItems} - Input validation.  Maximum number of items in a collection. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#maxLength() maxLength} - Input validation.  Maximum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minimum() minimum} - Input validation.  Minimum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minItems() minItems} - Input validation.  Minimum number of items in a collection. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#minLength() minLength} - Input validation.  Minimum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#multipleOf() multipleOf} - Input validation.  Number must be a multiple of.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#name() name} - Header name.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#pattern() pattern} - Input validation.  Must match regular expression.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#required() required} - Input validation.  Header must be present.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#serializer() serializer} - Override the part serializer.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#skipIfEmpty() skipIfEmpty} - Don't add if value is null or empty.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#type() type} - The schema type.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Header#uniqueItems() uniqueItems} - Input validation. Collections must contain unique items only.
	</ul>
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Remote</ja>(path=<js>"/myproxy"</js>)
	<jk>public interface</jk> MyProxy {

		<jc>// Explicit names specified for HTTP headers.</jc>
		<jc>// pojo will be converted to UON notation (unless plain-text parts enabled).</jc>
		<ja>@RemoteMethod</ja>(path=<js>"/mymethod1"</js>)
		String myProxyMethod1(<ja>@Header</ja>(<js>"Foo"</js>)</ja> String foo,
			<ja>@Header</ja>(<js>"Bar"</js>)</ja> MyPojo pojo);

		<jc>// Multiple values pulled from a NameValuePairs object.</jc>
		<jc>// Same as @Header("*").</jc>
		<ja>@RemoteMethod</ja>(path=<js>"/mymethod2"</js>)
		String myProxyMethod2(<ja>@Header</ja> NameValuePairs nameValuePairs);

		<jc>// Multiple values pulled from a Map.</jc>
		<jc>// Same as @Header("*").</jc>
		<ja>@RemoteMethod</ja>(path=<js>"/mymethod3"</js>)
		String myProxyMethod3(<ja>@Header</ja> Map&lt;String,Object&gt; map);

		<jc>// Multiple values pulled from a bean.</jc>
		<jc>// Same as @Header("*").</jc>
		<ja>@RemoteMethod</ja>(path=<js>"/mymethod4"</js>)
		String myProxyMethod4(<ja>@Header</ja> MyBean myBean);
	}
</p>

<p>
	Single-part arguments (i.e. those with name != <js>"*"</js>) can be any of the following types:
</p>
<ul class='spaced-list'>
	<li>
		Any serializable POJO - Converted to a string using the {@link org.apache.juneau.httppart.HttpPartSerializer} registered with the
		<c>RestClient</c> ({@link org.apache.juneau.oapi.OpenApiSerializer} by default) or associated via the {@link org.apache.juneau.http.annotation.Header#serializer() @Header(serializer)} annotation.
</ul>

<p>
	Multi-part arguments (i.e. those with name == <js>"*"</js> or empty) can be any of the following types:
</p>
<ul class='spaced-list'>
	<li>
		<c>NameValuePairs</c> - Serialized as individual headers.
	<li>
		<c>Map</c> - Converted to key-value pairs.
			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
	<li>
		Bean - Converted to key-value pairs.
			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
</ul>

<p>
	See the link below for information about supported data types in OpenAPI serialization.
</p>

<ul class='seealso'>
	<li class='link'>{@doc juneau-marshall.OpenApiDetails.Serializers}
</ul>
</div><!-- END: 9.1.6 - juneau-rest-client.RestProxies.Header -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.Path' id='juneau-rest-client.RestProxies.Path'>9.1.7 - @Path</a></h4>
<div class='topic'><!-- START: 9.1.7 - juneau-rest-client.RestProxies.Path -->
<p>
	The {@link org.apache.juneau.http.annotation.Path @Path} annotation can be applied to arguments of <ja>@RemoteMethod</ja>-annotated methods
	to denote that they are path parameters on the request.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Path}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#_enum() _enum} - Input validation.  Must match one of the values.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#allowEmptyValue() allowEmptyValue} - Input validation.  Allow empty value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#collectionFormat() collectionFormat} - How collections of items are formatted.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMaximum() exclusiveMaximum} - Input validation.  Whether maximum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#exclusiveMinimum() exclusiveMinimum} - Input validation.  Whether minimum is exclusive.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#format() format} - The schema type format. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#items() items} - The schema of items in a collection.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maximum() maximum} - Input validation.  Maximum numeric value. 
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#maxLength() maxLength} - Input validation.  Maximum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minimum() minimum} - Input validation.  Minimum numeric value.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#minLength() minLength} - Input validation.  Minimum length of a string.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#multipleOf() multipleOf} - Input validation.  Number must be a multiple of.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#name() name} - Path variable name.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#pattern() pattern} - Input validation.  Must match regular expression.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#serializer() serializer} - Override the part serializer.
		<li class='jf'>{@link org.apache.juneau.http.annotation.Path#type() type} - The schema type.
	</ul>
</ul>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Remote</ja>(path=<js>"/myproxy"</js>)
	<jk>public interface</jk> MyProxy {

		<jc>// Explicit names specified for path parameters.</jc>
		<jc>// pojo will be converted to UON notation (unless plain-text parts enabled).</jc>
		<ja>@RemoteMethod</ja>(path=<js>"/mymethod1/{foo}/{bar}"</js>)
		String myProxyMethod1(<ja>@Path</ja>(<js>"foo"</js>)</ja> String foo, <ja>@Path</ja>(<js>"bar"</js>)</ja> MyPojo pojo);

		<jc>// Multiple values pulled from a NameValuePairs object.</jc>
		<jc>// Same as @Path("*").</jc>
		<ja>@RemoteMethod</ja>(path=<js>"/mymethod2/{foo}/{bar}/{baz}"</js>)
		String myProxyMethod2(<ja>@Path</ja> NameValuePairs nameValuePairs);

		<jc>// Multiple values pulled from a Map.</jc>
		<jc>// Same as @Path("*").</jc>
		<ja>@RemoteMethod</ja>(path=<js>"/mymethod3/{foo}/{bar}/{baz}"</js>)
		String myProxyMethod3(<ja>@Path</ja> Map&lt;String,Object&gt; map);

		<jc>// Multiple values pulled from a bean.</jc>
		<jc>// Same as @Path("*").</jc>
		<ja>@RemoteMethod</ja>(path=<js>"/mymethod4/{foo}/{bar}/{baz}"</js>)
		String myProxyMethod4(<ja>@Path</ja> MyBean myBean);
	}
</p>

<p>
	Single-part arguments (i.e. those with name != <js>"*"</js>) can be any of the following types:
</p>
<ul class='spaced-list'>
	<li>
		Any serializable POJO - Converted to a string using the {@link org.apache.juneau.httppart.HttpPartSerializer} registered with the
		<c>RestClient</c> ({@link org.apache.juneau.oapi.OpenApiSerializer} by default) or associated via the {@link org.apache.juneau.http.annotation.Path#serializer() @Path(serializer)} annotation.
</ul>

<p>
	Multi-part arguments (i.e. those with name == <js>"*"</js> or empty) can be any of the following types:
</p>
<ul class='spaced-list'>
	<li>
		<c>NameValuePairs</c> - Serialized as individual query parameters.
	<li>
		<c>Map</c> - Converted to key-value pairs.
			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
	<li>
		Bean - Converted to key-value pairs.
			<br>Values serialized using the registered {@link org.apache.juneau.httppart.HttpPartSerializer} ({@link org.apache.juneau.oapi.OpenApiSerializer} by default).
</ul>

<p>
	See the link below for information about supported data types in OpenAPI serialization.
</p>

<ul class='seealso'>
	<li class='link'>{@doc juneau-marshall.OpenApiDetails.Serializers}
</ul>
</div><!-- END: 9.1.7 - juneau-rest-client.RestProxies.Path -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.Request' id='juneau-rest-client.RestProxies.Request'>9.1.8 - @Request</a></h4>
<div class='topic'><!-- START: 9.1.8 - juneau-rest-client.RestProxies.Request -->
<p>
	The {@link org.apache.juneau.http.annotation.Request @Request} annotation can be applied to a type of a <ja>@RemoteMethod</ja>-annotated method 
	to identify it as a bean for setting HTTP parts through a bean-like interface.
</p>

<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Request}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Request#partSerializer() partSerializer} - Override the part serializer.
	</ul>
</ul>


<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<ja>@Remote</ja>(path=<js>"/petstore"</js>)
	<jk>public interface</jk> PetStore {

		<ja>@RemoteMethod</ja>
		String postPet(CreatePetRequest bean);
	}
</p>
<p class='bpcode w800'>
	<ja>@Request</ja> 
	<jk>public class</jk> CreatePetRequest {
	
		<jk>private</jk> CreatePet <jf>pet</jf>;
	
		<jk>public</jk> CreatePetRequest(String name, <jk>float</jk> price) {
			<jk>this</jk>.<jf>pet</jf> = <jk>new</jk> CreatePet(name, price);
		}
		
		<ja>@Body</ja>
		<jk>public</jk> CreatePet getBody() {
			<jk>return</jk> <jk>this</jk>.<jf>pet</jf>;
		}
	
		<ja>@Query</ja>
	 	<jk>public</jk> Map&lt;String,Object&gt; getQueryParams() {
	 		<jk>return new</jk> ObjectMap().append(<js>"debug"</js>, <jk>true</jk>);
	 	}
	 	
	 	<ja>@Header</ja>(<js>"E-Tag"</js>)
	 	<jk>public static</jk> UUID <jsm>getUUID</jsm>() {
	 		<jk>return</jk> UUID.<jsm>generatedUUID</jsm>();
	 	}
	}
</p>
<p class='bpcode w800'>
	PetStore store = restClient.getRemote(PetStore.<jk>class</jk>, <js>"http://localhost:10000"</js>);
	CreatePetRequest requestBean = <jk>new</jk> CreatePetRequest(<js>"Fluffy"</js>, 9.99);
	String response = store.postPet(requestBean);
</p>
<p>
	The <ja>@Request</ja> annotation can be applied to either the class or argument.
</p>
<p>
	The annotated methods must be no-arg and public.  
	They can be named anything.
</p>
<p>
	Any of the following annotations can be used on the methods:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Header}
	<li class='ja'>{@link org.apache.juneau.http.annotation.FormData}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Query}
	<li class='ja'>{@link org.apache.juneau.http.annotation.Path}
</ul>
<p>
	The behavior and functionality of all of the annotations are the same as if they were used on method arguments directly.
	This means full support for OpenAPI serialization and validation.
</p>
<p>
	Annotations on methods are inherited from parent classes and interfaces. 
	For example, the request bean above could have defined annotations in an interface to keep them clear from the implementation:
</p>
<p class='bpcode w800'>
	<ja>@Request</ja> 
	<jk>public interface</jk> CreatePetRequest {
	
		<ja>@Body</ja>
		CreatePet getBody();
	
		<ja>@Query</ja>
	 	Map&lt;String,Object&gt; getQueryParams();
	 	
	 	<ja>@Header</ja>(<js>"E-Tag"</js>)
	 	UUID getUUID();
	}
</p>
<p class='bpcode w800'>
	<jk>public class</jk> CreatePetRequestImpl <jk>implements</jk> CreatePetRequest {
	
		<jk>public</jk> CreatePetRequestImpl(String name, <jk>float</jk> price) {...}

		<ja>@Override</ja>
		<jk>public</jk> CreatePet getBody() {
			<jk>return</jk> <jk>this</jk>.<jf>pet</jf>;
		}
	
		<ja>@Override</ja>
	 	<jk>public</jk> Map&lt;String,Object&gt; getQueryParams() {
	 		<jk>return new</jk> ObjectMap().append(<js>"debug"</js>, <jk>true</jk>);
	 	}
	 	
		<ja>@Override</ja>
	 	<jk>public</jk> UUID getUUID() {
	 		<jk>return</jk> UUID.<jsm>generateUUID</jsm>();
	 	}
	}
</p>
</div><!-- END: 9.1.8 - juneau-rest-client.RestProxies.Request -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.Response' id='juneau-rest-client.RestProxies.Response'>9.1.9 - @Response</a></h4>
<div class='topic'><!-- START: 9.1.9 - juneau-rest-client.RestProxies.Response -->
<p>
	The {@link org.apache.juneau.http.annotation.Response @Response} annotation can be applied to types returned by <ja>@RemoteMethod</ja>-annotated methods.
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.Response}
	<ul>
		<li class='jf'>{@link org.apache.juneau.http.annotation.Response#partParser() partParser} - Override the part parser.
	</ul>
</ul>
<p>
	The <ja>@Response</ja> annotation can be used to define interfaces for retrieving response parts using a bean-like proxy.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>	
	<ja>@Remote</ja>
	<jk>public interface</jk> PetStore {
		
		<ja>@RemoteMethod</ja>
		CreatePetResponse postPet(...);
	}
</p>
<p class='bpcode w800'>
	<ja>@Response</ja> 
	<jk>public interface</jk> CreatePetResponse {
	
		<ja>@ResponseBody</ja>
		Pet getBody();
	
		<ja>@ResponseHeader</ja>(<js>"E-Tag"</js>)
		UUID getUUID();
		
		<ja>@ResponseStatus</ja>
		int getStatus();
	}
</p>
<p class='bpcode w800'>
	PetStore store = restClient.getRemote(PetStore.<jk>class</jk>, <js>"http://localhost:10000"</js>);
	CreatePetResponse response = store.postPet(...);
	Pet pet = response.getBody();
	UUID uuid = response.getUUID();
	<jk>int</jk> status = response.getStatus();
</p>
<p>
	The annotated methods must be no-arg.  
	They can be named anything.
</p>
<p>
	Any of the following annotations can be used on the methods:
</p>
<ul class='javatree'>
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseBody}
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseHeader}
	<li class='ja'>{@link org.apache.juneau.http.annotation.ResponseStatus}
</ul>
<p>
	The behavior and functionality of all of the annotations are the same as if they were used on method arguments directly. This means full support for OpenAPI serialization and validation.
</p>
</div><!-- END: 9.1.9 - juneau-rest-client.RestProxies.Response -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.RestProxies.DualPurposeInterfaces' id='juneau-rest-client.RestProxies.DualPurposeInterfaces'>9.1.10 - Dual-purpose (end-to-end) interfaces</a><span class='update'>8.0.0-new</span></h4>
<div class='topic'><!-- START: 9.1.10 - juneau-rest-client.RestProxies.DualPurposeInterfaces -->
<p>
	A common coding practice is to use the same Java interface to define both your server and client side REST interfaces.
	The advantage to this approach is that changes that you make to your REST interface can be reflected in both places
	at the same time, reducing the chances for compatibility mistakes.
</p>
<p>
	What makes this possible is that method-level annotations such as <ja>@RestMethod</ja> and parameter-level annotations
	such as <ja>@Query</ja> are inherited from parent classes.  
	This normally isn't possible, but the framework will spider up the parent hierarchy of classes to find method and parameter level
	annotations defined on overridden methods.
</p>
<p>
	The general approach is to define your {@link org.apache.juneau.http.remote.Remote @Remote}-annotated interface first.
	The following example is pulled from the PetStore app:
</p>
<p class='bpcode w800'>
	<ja>@Remote</ja>(path=<js>"/petstore"</js>)
	<jk>public interface</jk> PetStore {
	
		<ja>@RemoteMethod</ja>(method=<jsf>GET</jsf>, path=<js>"/pet"</js>)
		<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable;
	
		<ja>@RemoteMethod</ja>(method=<jsf>DELETE</jsf>, path=<js>"/pet/{petId}"</js>)
		<jk>public</jk> Ok deletePet(
			<ja>@Header</ja>(
				name=<js>"api_key"</js>,
				description=<js>"Security API key"</js>,
				required=<jk>true</jk>,
				example=<js>"foobar"</js>
			)
			String apiKey,
			<ja>@Path</ja>(
				name=<js>"petId"</js>,
				description=<js>"Pet id to delete"</js>,
				example=<js>"123"</js>
			)
			<jk>long</jk> petId
		) <jk>throws</jk> IdNotFound, NotAcceptable;
		
		...
</p>
<p>
	Next you define the implementation of your interface as a normal Juneau REST resource:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/petstore"</js>,
		title=<js>"Petstore application"</js>,
		...
	)
	<jk>public class</jk> PetStoreResource <jk>extends</jk> BasicRestJena <jk>implements</jk> PetStore {
	
		...
	
		<ja>@Override</ja> <jc>/* PetStore */</jc>
		<ja>@RestMethod</ja>(
			name=<jsm>GET</jsm>,
			path=<js>"/pet"</js>,
			summary=<js>"All pets in the store"</js>,
			...
		)
		<jk>public</jk> Collection&lt;Pet&gt; getPets() <jk>throws</jk> NotAcceptable {
			<jk>return</jk> <jsf>store</jsf>.getPets();
		}
	
		<ja>@Override</ja> <jc>/* PetStore */</jc>
		<ja>@RestMethod</ja>(
			name=<jsf>DELETE</jsf>,
			path=<js>"/pet/{petId}"</js>,
			summary=<js>"Deletes a pet"</js>,
			...
		)
		<jk>public</jk> Ok deletePet(String apiKey, long petId) <jk>throws</jk> IdNotFound, NotAcceptable {
			<jsf>store</jsf>.removePet(petId);
			<jk>return</jk> <jsf>OK</jsf>;
		}
</p>
<p>
	Then use the interface as a remote resource like so:
</p>
<p class='bpcode w800'>
	<jk>try</jk> (RestClient rc = RestClient.<jsm>create</jsm>().json().rootUrl(<js>"http://localhost:10000"</js>).build()) {
		PetStore ps = rc.getRemote(PetStore.<jk>class</jk>);

		<jk>for</jk> (Pet x : ps.getPets()) {
			ps.deletePet(<js>"my-special-key"</js>, x.getId());
			System.<jsf>err</jsf>.println(<js>"Deleted pet:  id="</js> + x.getId());
		}
	}
</p>	
<p>
	In the example above, we chose to add the <ja>@RestMethod</ja> annotation to the implementation class.  
	However, they could have been added to the interface instead.
</p>
<p>
	Note how we didn't need to use the <ja>@Header</ja> and <ja>@Path</ja> annotations in our implementation since
	the annotations were inherited from the interface.
</p>
</div><!-- END: 9.1.10 - juneau-rest-client.RestProxies.DualPurposeInterfaces -->
</div><!-- END: 9.1 - juneau-rest-client.RestProxies -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.SSL' id='juneau-rest-client.SSL'>9.2 - SSL Support</a></h3>
<div class='topic'><!-- START: 9.2 - juneau-rest-client.SSL -->
<p>
	The simplest way to enable SSL support in the client is to use the 
	{@link org.apache.juneau.rest.client.RestClientBuilder#enableLaxSSL()} method.
</p>

<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Create a client that ignores self-signed or otherwise invalid certificates.</jc>
	RestClient rc = RestClient.<jsm>create</jsm>().enableLaxSSL().build();
</p>
<p>
	A more typical scenario using default cert and hostname verification is shown here:
</p>
<p class='bpcode w800'>
	RestClient rc = RestClient.create().enableSSL().sslProtocols(<js>"TLSv1.2"</js>).build();
</p>
<p>
	The following convenience methods are provided in the builder class for specifying SSL parameters:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.rest.client.RestClientBuilder}
	<ul>
		<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#sslProtocols(String...) sslProtocols(String...)}
		<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#cipherSuites(String...) cipherSuites(String...)}
		<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#hostnameVerifier(HostnameVerifier) hostnameVerifier(HostnameVerifier)}
		<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#keyManagers(KeyManager...) keyManagers(KeyManager...)}
		<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#trustManagers(TrustManager...)}
		<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#secureRandom(SecureRandom)}
	</ul>
</ul>
<p>
	SSL support can also be enabled by passing in your own connection manager using {@link org.apache.juneau.rest.client.RestClientBuilder#httpClientConnectionManager(HttpClientConnectionManager)}.
</p>
</div><!-- END: 9.2 - juneau-rest-client.SSL -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.Authentication' id='juneau-rest-client.Authentication'>9.3 - Authentication</a></h3>
<div class='topic'><!-- START: 9.3 - juneau-rest-client.Authentication -->
<p>
	The Juneau REST client itself does not implement any support for authentication.  
	Instead, it delegates it to the underlying Apache HTTP Client interface.
</p>
<p>
	The following sections show how some common authentication mechanisms can be set up using HTTP Client APIs.
</p>

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.Authentication.BASIC' id='juneau-rest-client.Authentication.BASIC'>9.3.1 - BASIC Authentication</a></h4>
<div class='topic'><!-- START: 9.3.1 - juneau-rest-client.Authentication.BASIC -->
<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='bpcode w800'>
	<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='bpcode w800'>
	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><!-- END: 9.3.1 - juneau-rest-client.Authentication.BASIC -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.Authentication.FORM' id='juneau-rest-client.Authentication.FORM'>9.3.2 - FORM-based Authentication</a></h4>
<div class='topic'><!-- START: 9.3.2 - juneau-rest-client.Authentication.FORM -->
<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. 
	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 <c>JazzRestClient</c> class provides FORM-based 
	authentication support.
</p>
<p class='bpcode w800'>
	<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><!-- END: 9.3.2 - juneau-rest-client.Authentication.FORM -->

<!-- ==================================================================================================== -->

<h4 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.Authentication.OIDC' id='juneau-rest-client.Authentication.OIDC'>9.3.3 - OIDC Authentication</a></h4>
<div class='topic'><!-- START: 9.3.3 - juneau-rest-client.Authentication.OIDC -->
<p>
	The following example shows how the <c>JazzRestClient</c> class provides OIDC authentication 
	support.
</p>
<p class='bpcode w800'>
	<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><!-- END: 9.3.3 - juneau-rest-client.Authentication.OIDC -->
</div><!-- END: 9.3 - juneau-rest-client.Authentication -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.ResponsePatterns' id='juneau-rest-client.ResponsePatterns'>9.4 - Using Response Patterns</a></h3>
<div class='topic'><!-- START: 9.4 - juneau-rest-client.ResponsePatterns -->
<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.  
	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='bpcode w800'>
	<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='bpcode w800'>
	<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.
	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='bpcode w800'>
	<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)}.
	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><!-- END: 9.4 - juneau-rest-client.ResponsePatterns -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.PipingOutput' id='juneau-rest-client.PipingOutput'>9.5 - Piping Response Output</a></h3>
<div class='topic'><!-- START: 9.5 - juneau-rest-client.PipingOutput -->
<p>
	The {@link org.apache.juneau.rest.client.RestCall} class provides various convenience <c>pipeTo()</c> 
	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='bpcode w800'>
	<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><!-- END: 9.5 - juneau-rest-client.PipingOutput -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.Debugging' id='juneau-rest-client.Debugging'>9.6 - Debugging</a></h3>
<div class='topic'><!-- START: 9.6 - juneau-rest-client.Debugging -->
<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.  
	This causes the following output to be generated by the Java <c>org.apache.juneau.rest.client</c> 
	logger at <jsf>WARNING</jsf> level:
</p>
<p class='bpcode w800 console'>
	=== 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 <c>Debug: true</c> header value to trigger logging of the request on the 
	server side as well.
</p>
<p class='bpcode w800 console'>
	=== 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><!-- END: 9.6 - juneau-rest-client.Debugging -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.Logging' id='juneau-rest-client.Logging'>9.7 - Logging</a></h3>
<div class='topic'><!-- START: 9.7 - juneau-rest-client.Logging -->
<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.
	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='bpcode w800'>
	<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><!-- END: 9.7 - juneau-rest-client.Logging -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.Interceptors' id='juneau-rest-client.Interceptors'>9.8 - Interceptors</a></h3>
<div class='topic'><!-- START: 9.8 - juneau-rest-client.Interceptors -->
<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='bpcode w800'>
	<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><!-- END: 9.8 - juneau-rest-client.Interceptors -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-client.Other' id='juneau-rest-client.Other'>9.9 - Other Useful Methods</a></h3>
<div class='topic'><!-- START: 9.9 - juneau-rest-client.Other -->
<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='bpcode w800'>
	<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.
	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='bpcode w800'>
	<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.
	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='bpcode w800'>
	<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><!-- END: 9.9 - juneau-rest-client.Other -->
</div><!-- END: 9 - juneau-rest-client -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-rest-mock' id='juneau-rest-mock'>10 - juneau-rest-mock</a><span class='update'>8.1.0-new</span></h2>
<div class='topic'><!-- START: 10 - juneau-rest-mock -->
<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<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-mock<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	

<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-rest-mock-{@property juneauVersion}.jar 
</p>	

<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.rest.mock_{@property juneauVersion}.jar 
</p>	

<p>
	The <c>juneau-rest-mock</c> module contains convenience APIs for performing serverless unit
	testing of your REST APIs.
	Each of the APIs provide the ability to fully test your server and client REST interfaces without the
	need for a running servlet container.
</p>

<p>
	The API consists of the following classes:
</p>
<ul class='javatree'>
	<li class='jp'>{@link org.apache.juneau.rest.mock2}
	<ul>
		<li class='jc'>{@link org.apache.juneau.rest.mock2.MockRest} - API for unit testing {@link org.apache.juneau.rest.annotation.Rest @Rest}-annotated classes.
		<li class='jc'>{@link org.apache.juneau.rest.mock2.MockRemote} - API for unit testing {@link org.apache.juneau.http.remote.Remote @Remote}-annotated classes.
	</ul>
</ul>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-mock.MockRest' id='juneau-rest-mock.MockRest'>10.1 - MockRest</a><span class='update'>8.1.0-new</span></h3>
<div class='topic'><!-- START: 10.1 - juneau-rest-mock.MockRest -->
<p>
	The {@link org.apache.juneau.rest.mock2.MockRest} class is used for performing serverless unit testing of {@link org.apache.juneau.rest.annotation.Rest @Rest}-annotated
	classes.  These include both parent resource classes that extend from {@link org.apache.juneau.rest.RestServlet} and child resources that do not.
</p>
<p>
	The API consists of the following classes:
</p>	
<ul class='javatree'>
	<li class='jp'>{@link org.apache.juneau.rest.mock2}
	<ul>
		<li class='jc'>{@link org.apache.juneau.rest.mock2.MockRest}
			<br>The API for instantiating mocks of REST resource classes.
		<li class='jc'>{@link org.apache.juneau.rest.mock2.MockServletRequest}
			<br>An implementation of {@link javax.servlet.http.HttpServletRequest} with additional convenience methods for building requests.
		<li class='jc'>{@link org.apache.juneau.rest.mock2.MockServletResponse}
			<br>An implementation of {@link javax.servlet.http.HttpServletRequest} with additional convenience methods for testing responses.
	</ul>
</ul>
<p>
	The following shows a simple example of invoking a PUT method on a simple REST interface and asserting
	the correct status code and response body: 
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MockTest {
	
		<jc>// Our REST resource to test.</jc>
		<ja>@Rest</ja>(
			serializers=SimpleJsonSerializer.<jk>class</jk>, 
			parsers=JsonParser.<jk>class</jk>
		)
		<jk>public static class</jk> EchoRest {
	
			<ja>@RestMethod</ja>(
				name=<jsf>PUT</jsf>, 
				path=<js>"/echo"</js>
			)
			<jk>public</jk> String echo(<ja>@Body</ja> String body) {
				<jk>return</jk> body;
			}
		}
	
		<jc>// Our JUnit test.</jc>
		<ja>@Test</ja>
		<jk>public void</jk> testEcho() <jk>throws</jk> Exception {
		
			MockRest mr = MockRest.<jsm>build</jsm>(EchoRest.<jk>class</jk>);
			
			mr
				.put(<js>"/echo"</js>, <js>"'foo'"</js>)
				.execute()
				.assertStatus(200)
				.assertBody(<js>"'foo'"</js>);
		}
	}
</p>
<p>
	Breaking apart the fluent method call above will help you understand how this works.
</p>
<p class='bpcode w800'>
 	<ja>@Test</ja>
	<jk>public void</jk> testEcho() <jk>throws</jk> Exception {
      
		<jc>// Instantiate our mock.</jc>
		MockRest mr = MockRest.<jsm>build</jsm>(EchoRest.<jk>class</jk>);
      
		<jc>// Create a request.</jc>
		MockServletRequest req = mr.put(<js>"/echo"</js>, <js>"'foo'"</js>);
      
		<jc>// Execute it (by calling RestCallHandler.service(...) and then returning the response object).</jc>
		MockServletResponse res = req.execute();
      
		<jc>// Run assertion tests on the results.</jc>
		res.assertStatus(200);
		res.assertBody(<js>"'foo'"</js>);
	}
</p>
<p>
	The concept of the design is simple.  The {@link org.apache.juneau.rest.mock2.MockRest} class is used to create instances of {@link org.apache.juneau.rest.mock2.MockServletRequest}
	and {@link org.apache.juneau.rest.mock2.MockServletResponse} which are passed directly to the call handler on the resource class {@link org.apache.juneau.rest.RestCallHandler#service(HttpServletRequest,HttpServletResponse)}.
	In effect, you're fully testing your REST API as if it were running in a live servlet container, yet not
	actually having to run in a servlet container.
</p>
<p>
	The <c>create(Object)</c> method can take in either <c>Class</c> objects or pre-instantiated beans.
	The latter is particularly useful for testing Spring beans.
</p>
<hr>
<p>
	By default, the {@link org.apache.juneau.rest.mock2.MockRest} class specifies the following request headers:
</p>
<p class='bpcode w800'>
	Accept: application/json+simple
	Content-Type: application/json
</p>
<p>
	The reason for using <js>"application/json+simple"</js> as the default is that it significantly simplifies
	testing by allowing you to compare response content with simple Java strings without having to escape lots
	of quotes:
</p>
<p class='bpcode w800'>
	<jc>// Using Simple JSON</jc>
	mr.assertBody(<js>"{foo:'bar':baz:123}"</js>);
	
	<jc>// Using normal JSON</jc>
	mr.assertBody(<js>"{\"foo\":\"bar\",\"baz\":123}"</js>);
</p>
<p>
	Other media types headers can be specified via any of the following methods:
</p>
<ul class='javatree'>
	<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest#build(Object,Marshall) build(Object,Marshall)} - Use media types defined on a marshall.
	<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest#build(Object,Serializer,Parser) build(Object,Serializer,Parser)} - Use media types defined on a serializer and parser.
	<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest.Builder#accept(String) accept(String)} - Explicitly set the <c>Accept</c> header.
	<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest.Builder#contentType(String) contentType(String)} - Explicitly set the <c>Content-Type</c> header.
</ul>
<p>
	Various other convenience methods for common media types are also provided.
</p>
<p>
	The following examples are functionally equivalent for specifying XML serialization:
</p>
<p class='bpcode w800'>
	MockRest mr;

	mr = MockRest.<jsm>build</jsm>(EchoRest.<jk>class</jk>, Xml.<jsf>DEFAULT</jsf>);
	
	mr = MockRest.<jsm>build</jsm>(EchoRest.<jk>class</jk>, XmlSerializer.<jsf>DEFAULT</jsf>, XmlParser.<jsf>DEFAULT</jsf>);
	
	mr = MockRest.<jsm>create</jsm>(EchoRest.<jk>class</jk>).marshall(Xml.<jsf>DEFAULT</jsf>).build();
	
	mr = MockRest.<jsm>create</jsm>(EchoRest.<jk>class</jk>).serializer(XmlSerializer.<jsf>DEFAULT</jsf>).parser(XmlParser.<jsf>DEFAULT</jsf>).build();
	
	mr = MockRest.<jsm>create</jsm>(EchoRest.<jk>class</jk>).accept(<js>"text/xml"</js>).contentType(<js>"text/xml"</js>).build();
	
	mr = MockRest.<jsm>create</jsm>(EchoRest.<jk>class</jk>).xml().build();
</p>
<hr>
<p>
	The {@link org.apache.juneau.rest.mock2.MockRest} class provides the following methods for creating requests:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.rest.mock2.MockRest}
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest#request(String,String) request(String,String)} 
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest#request(String,String,Object) request(String,String,Object)} 
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest#get(String) get(String)} 
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest#put(String,Object) put(String,Object)} 
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest#post(String,Object) post(String,Object)} 
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest#delete(String) delete(String)} 
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest#patch(String,Object) patch(String,Object)} 
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRest#options(String) options(String)} 
	</ul>
</ul>
<p>
	For HTTP methods that pass a request body (i.e. <c>PUT</c>,<c>POST</c><c>PATCH</c>), the body object can be any of the following types:
</p>
<ul>
	<li><c><jk>byte</jk>[]</c>
	<li>{@link java.io.Reader}
	<li>{@link java.io.InputStream}
	<li>{@link java.lang.CharSequence}
</ul>
<p>
	All other body object types are converted to strings using the <c>toString()</c> method.
</p>
<p>
	A common tactic is to override a bean's <c>toString()</c> method to return Simple JSON so that
	instances can be passed to the methods above.
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyBean {
	
		...
		
		<ja>@Override</ja>
		<jk>public</jk> String toString() {
			SimpleJson.<jsf>DEFAULT</jsf>.toString(<jk>this</jk>);
		}
	}
</p>
<p>
	The {@link org.apache.juneau.rest.mock2.MockServletRequest} class provides default implementations for all the methods defined
	on the {@link javax.servlet.http.HttpServletRequest} in addition to many convenience methods.
</p>
<p>
	The following fluent convenience methods are provided for setting common <c>Accept</c> and <c>Content-Type</c> headers.
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.rest.mock2.MockServletRequest}
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#json() json()}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#xml() xml()}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#html() html()}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#plainText() plainText()}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#msgpack() msgpack()}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#uon() uon()}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#urlEnc() urlEnc()}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#yaml() yaml()}
	</ul>
</ul>
<p>
	The following fluent convenience methods are provided for building up your request.
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.rest.mock2.MockServletRequest}
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#header(String,Object) header(String,Object)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#query(String,Object) query(String,Object}}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#formData(String,Object) formData(String,Object)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#attribute(String,Object) attribute(String,Object)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#body(Object) body(Object)}
	</ul>
</ul>
<p>
	Fluent setters are provided for all common request headers:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.rest.mock2.MockServletRequest}
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#accept(Object) accept(Object)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#acceptCharset(Object) acceptCharset(Object)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#acceptEncoding(Object) acceptEncoding(Object)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletRequest#acceptLanguage(Object) acceptLanguage(Object)}
		<li class='jm'>...
	</ul>
</ul>
<p>
	The {@link org.apache.juneau.rest.mock2.MockServletResponse} class provides default implementations for all the methods defined
	on the {@link javax.servlet.http.HttpServletResponse} in addition to many convenience methods.
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.rest.mock2.MockServletResponse}
	<ul>
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletResponse#getBody() getBody()}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletResponse#getBodyAsString() getBodyAsString()}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletResponse#assertStatus(int) assertStatus(int)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletResponse#assertBody(String) assertBody(String)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletResponse#assertBodyContains(String...) assertBodyContains(String...)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletResponse#assertBodyMatches(String) assertBodyMatches(String)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletResponse#assertBodyMatchesRE(String) assertBodyMatchesRE(String)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletResponse#assertHeader(String,String) assertHeader(String,String)}
		<li class='jm'>{@link org.apache.juneau.rest.mock2.MockServletResponse#assertHeaderContains(String,String...) assertHeaderContains(String,String...)}
	</ul>
</ul>	
<hr>
<p>
	The {@link org.apache.juneau.rest.mock2.MockRest} class has a debug mode that will cause your HTTP requests and responses to
	be sent to the console:
</p>
<p class='bpcode w800'>
	MockRest mr = MockRest
		.<jsm>create</jsm>(MyRest.<jk>class</jk>)
		.debug()
		.simpleJson()
		.build();
</p>
</div><!-- END: 10.1 - juneau-rest-mock.MockRest -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-rest-mock.MockRemote' id='juneau-rest-mock.MockRemote'>10.2 - MockRemote</a><span class='update'>8.1.0-new, 8.1.2-updated</span></h3>
<div class='topic'><!-- START: 10.2 - juneau-rest-mock.MockRemote -->
<p>
	The {@link org.apache.juneau.rest.mock2.MockRemote} class is used for serverless unit testing of {@link org.apache.juneau.http.remote.Remote @Remote}-annotated
	classes.  
</p>
<p>
	The {@link org.apache.juneau.rest.mock2.MockRemote} API requires a {@link org.apache.juneau.rest.annotation.Rest @Rest}-annotated class to be used as
	an underlying mocked resource to process the request and return a response.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// Our remote resource to test.</jc>
	<ja>@Remote</ja>
	<jk>public interface</jk> MyRemoteInterface {
	
		<ja>@RemoteMethod</ja>(httpMethod=<js>"GET"</js>, path=<js>"/echoQuery"</js>)
		<jk>public int</jk> echoQuery(<ja>@Query</ja>(name=<js>"id"</js>) <jk>int</jk> id);
	}

	<jc>// Our mocked-up REST interface to test against.</jc>
	<ja>@Rest</ja>
	<jk>public class</jk> MyRest {
	
		<ja>@RestMethod</ja>(name=GET, path=<js>"/echoQuery"</js>)
		<jk>public int</jk> echoQuery(<ja>@Query</ja>(<js>"id"</js>) String id) {
			<jk>return</jk> id;
		}
	}

	<ja>@Test</ja>
	<jk>public void</jk> testProxy() {
		MyRemoteInterface mri = MockRemote.build(MyRemoteInterface.<jk>class</jk>, MyRest.<jk>class</jk>);
		<jsm>assertEquals</jsm>(123, mri.echoQuery(123));
	}
</p>
<p>
	It looks simple, but there's a lot going on here.   
</p>
<p>
	Remote resource interfaces are normally created through the {@link org.apache.juneau.rest.client.RestClient#getRemote(Class)} method.
	The {@link org.apache.juneau.rest.mock2.MockRemote} will create a {@link org.apache.juneau.rest.client.RestClient} using a specialized <c>HttpClientConnectionManager</c>
	designed to transform client-side <c>HttpRequest</c>/<c>HttpResponse</c> objects into server-side 
	{@link org.apache.juneau.rest.mock2.MockServletRequest}/{@link org.apache.juneau.rest.mock2.MockServletResponse} objects and then pass those to the {@link org.apache.juneau.rest.mock2.MockRest} 
	object described in the previous section.
</p>
<p>
	All aspects of the client and server side code are tested, yet no servlet container is required.  The actual
	over-the-wire serialization is the only aspect being bypassed.
</p>
<hr>
<p>
	By default, the {@link org.apache.juneau.rest.mock2.MockRemote} class uses JSON marshalling.
	This can be overridden via any of the following methods: 
</p>
<ul class='javatree'>
	<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRemote#build(Class,Object,Marshall)}
	<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRemote#build(Class,Object,Serializer,Parser)}
	<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRemote#create(Class,Object,Marshall)}
	<li class='jm'>{@link org.apache.juneau.rest.mock2.MockRemote#create(Class,Object,Serializer,Parser)}
</ul>
<hr>
<p>
	The {@link org.apache.juneau.rest.mock2.MockRemote} class has a debug mode that will cause your HTTP requests and responses to
	be sent to the console on both the client and server sides:
</p>
<p class='bpcode w800'>
	<ja>@Test</ja>
	<jk>public void</jk> testProxy() {
		MyRemoteInterface mri = MockRemote
			.create(MyRemoteInterface.<jk>class</jk>, MyRest.<jk>class</jk>)
			.debug()
			.build();
		<jsm>assertEquals</jsm>(123, mri.echoQuery(123));
	}
</p>
</div><!-- END: 10.2 - juneau-rest-mock.MockRemote -->
</div><!-- END: 10 - juneau-rest-mock -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-core' id='juneau-microservice-core'>11 - juneau-microservice-core</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h2>
<div class='topic'><!-- START: 11 - juneau-microservice-core -->
<div class='warn'>
	The Juneau Microservice libraries are likely to be removed in Juneau 9.0 due to the popularity of the Spring Boot
	framework for creating microservices and the ability for Juneau to be used within Spring Boot.
</div>

<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<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-core<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	

<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-microservice-core-{@property juneauVersion}.jar 
</p>	

<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.microservice.core_{@property juneauVersion}.jar 
</p>	

<p>
	Juneau Microservice is an API for creating stand-alone executable jars with automatic support for
	Juneau configurations and console commands.
</p>

<p>
	Features include:
</p>
<ul class='spaced-list'>
	<li>
		A builder-based API for defining and starting microservices.
	<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.
</ul>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-core.Overview' id='juneau-microservice-core.Overview'>11.1 - Microservice Overview</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 11.1 - juneau-microservice-core.Overview -->
<p>
	The Microservice API consists of a base class for defining executable microservices.
</p>
<p>
	Features include:
</p>
<ul class='spaced-list'>
	<li>
		A builder-based API for defining and starting microservices.
	<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.
</ul>
<p>
	The Microservice API consists of the following packages and classes:
</p>
<ul class='javatree'>
	<li class='jp'>{@link org.apache.juneau.microservice}
		<ul>
			<li class='jc'>{@link org.apache.juneau.microservice.Microservice} - The base microservice class.
			<li class='jc'>{@link org.apache.juneau.microservice.MicroserviceBuilder} - Builder for the microservice class.
			<li class='jic'>{@link org.apache.juneau.microservice.MicroserviceListener} - Interface for hooking into lifecyle events of the microservice.
			<ul>
				<li class='jc'>{@link org.apache.juneau.microservice.BasicMicroserviceListener} - Adapter for MicroserviceListener class.
			</ul>
		</ul>
	<li class='jp'>{@link org.apache.juneau.microservice.console}
		<ul>
			<li class='jac'>{@link org.apache.juneau.microservice.console.ConsoleCommand} - Abstract class for defining console commands.
		</ul>
</ul>
<p>
	By itself the Microservice API doesn't provided much functionality, but it does provide the basis for the {@doc juneau-microservice-jetty Jetty Microservice} described later.
</p> 
<p>
	The most-basic creation of a microservice from an entry-point method is shown below:
</p>	
<p class='bpcode w800'>
	<jk>public class</jk> App {
		<jk>public static void</jk> main(String[] args) {
			Microservice
				.<jsm>create</jsm>()   <jc>// Create builder.</jc>
				.args(args) <jc>// Pass in args.</jc>
				.build()    <jc>// Create microservice.</jc>
				.start()    <jc>// Start microservice.</jc>
			;
		}
	}
</p>
</div><!-- END: 11.1 - juneau-microservice-core.Overview -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-core.LifecycleMethods' id='juneau-microservice-core.LifecycleMethods'>11.2 - Lifecycle Methods</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 11.2 - juneau-microservice-core.LifecycleMethods -->
<p>
	The lifecycle methods of the {@link org.apache.juneau.microservice.Microservice} class consists of the following:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.microservice.Microservice}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#start() start()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#startConsole() startConsole()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#join() join()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#stop() stop()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#stopConsole() stopConsole()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#exit() exit()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#kill() kill()} 
	</ul>
</ul>
<p>
	A typical implementation of an app with lifecycle methods might look like the following:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> App {
	
		<jk>private static final</jk> Microservice <jsf>MICROSERVICE</jsf>;
	
		<jk>public static void</jk> main(String[] args) {
			<jsf>MICROSERVICE</jsf> = Microservice
				.<jsm>create</jsm>()          <jc>// Create builder.</jc>
				.args(args)        <jc>// Pass in args.</jc>
				.build()           <jc>// Create microservice.</jc>
				.start()           <jc>// Start microservice.</jc>
				.startConsole()    <jc>// Start console.</jc>
				.join()            <jc>// Join thread.</jc>
			;
		}
		
		<jk>public static void</jk> restart() {
			<jsf>MICROSERVICE</jsf>.stop().start();
		}
		
		<jk>public static void</jk> exit() {
			<jsf>MICROSERVICE</jsf>.exit();
		}
	}
</p>
<p>
	If your application consists of a single microservice, you can use the {@link org.apache.juneau.microservice.Microservice#getInstance()} method
	from anywhere in your code:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> App {
	
		<jk>public static void</jk> main(String[] args) {
			Microservice
				.<jsm>create</jsm>()          <jc>// Create builder.</jc>
				.args(args)        <jc>// Pass in args.</jc>
				.build()           <jc>// Create microservice.</jc>
				.start()           <jc>// Start microservice.</jc>
				.startConsole()    <jc>// Start console.</jc>
				.join()            <jc>// Join thread.</jc>
			;
		}
		
		<jk>public static void</jk> restart() {
			Microservice.<jsm>getInstance</jsm>().stop().start();
		}
		
		<jk>public static void</jk> exit() {
			Microservice.<jsm>getInstance</jsm>().exit();
		}
	}
</p>
<p>
	The {@link org.apache.juneau.microservice.Microservice#startConsole()} and {@link org.apache.juneau.microservice.Microservice#stopConsole()} control
	the lifecycle of the console commands.  
	Typically you'll want to control these separately from the app so that you can easily restart your application
	from the console without affecting the console itself.
</p>
<p>
	The lifecycle methods on the {@link org.apache.juneau.microservice.Microservice} class are purposely left non-final so that 
	subclasses can override them to provide customized behavior.  
</p>
</div><!-- END: 11.2 - juneau-microservice-core.LifecycleMethods -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-core.Args' id='juneau-microservice-core.Args'>11.3 - Args</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 11.3 - juneau-microservice-core.Args -->
<p>
	Command-line arguments can be associated with a microservice using the {@link org.apache.juneau.microservice.MicroserviceBuilder#args(String...)} method.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jk>public static void</jk> main(String[] args) {
		Microservice
			.<jsm>create</jsm>()          <jc>// Create builder.</jc>
			.args(args)        <jc>// Pass in args.</jc>
			.build()           <jc>// Create microservice.</jc>
			.start()           <jc>// Start microservice.</jc>
			.join()            <jc>// Join thread.</jc>
		;
	}
</p>
<p>
	When specified, the arguments can be retrieved using the {@link org.apache.juneau.microservice.Microservice#getArgs()} method which provides
	an API for easily accessing command-line arguments using common notation:
</p>
<p class='bpcode w800'>
	Args a = Microservice.<jsm>getInstance</jsm>().getArgs();
	
	<jc>// One main argument</jc>
	<jc>// a1</jc>
	String a1 = a.getArg(0); <jc>// "a1"</jc>
	String a2 = a.getArg(1); <jc>// null</jc>

	<jc>// Two main arguments</jc>
	<jc>// a1 a2</jc>
	String a1 = a.getArg(0); <jc>// "a1"</jc>
	String a2 = a.getArg(1); <jc>// "a2"</jc>

	<jc>// One main argument and one optional argument with no value</jc>
	<jc>// a1 -a2</jc>
	String a1 = a.getArg(0);
	<jk>boolean</jk> hasA2 = a.hasArg(<js>"a2"</js>); <jc>// true</jc>
	<jk>boolean</jk> hasA3 = a.hasArg(<js>"a3"</js>); <jc>// false</jc>

	<jc>// One main argument and one optional argument with one value</jc>
	<jc>// a1 -a2 v2</jc>
	String a1 = a.getArg(0);
	String a2 = a.getArg(<js>"a2"</js>); <jc>// "v2"</jc>
	String a3 = a.getArg(<js>"a3"</js>); <jc>// null</jc>

	<jc>// One main argument and one optional argument with two values</jc>
	<jc>// a1 -a2 v2a v2b</jc>
	String a1 = a.getArg(0);
	List&lt;String&gt; a2 = a.getArgs(<js>"a2"</js>); <jc>// Contains ["v2a","v2b"]</jc>
	List&lt;String&gt; a3 = a.getArgs(<js>"a3"</js>); <jc>// Empty list</jc>

	<jc>// Same as previous, except specify optional argument name multiple times</jc>
	<jc>// a1 -a2 v2a -a2 v2b</jc>
	String a1 = a.getArg(0);
	List&lt;String&gt; a2 = a.getArgs(<js>"a2"</js>); <jc>// Contains ["v2a","v2b"]</jc>
</p>
<p>
	Specifying the command-line arguments also makes them available through {@link org.apache.juneau.svl.vars.ArgsVar $A} SVL variables.
	These can be used in the configuration file and throughout various Juneau annotations.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jc>// $A used in variable resolver.</jc>
	VarResolver vr = Microservice.<jsm>getInstance</jsm>().getVarResolver();
 	System.<jsf>out</jsf>.println(vr.resolve(<js>"Arg #1 is set to $A{1}"</js>));
</p>
<p class='bpcode w800'>
	<jc>// $A used in annotation.</jc>
	<ja>@Rest</ja>(
		title=<js>"$A{title}"</js>,
		...
	)
</p>
</div><!-- END: 11.3 - juneau-microservice-core.Args -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-core.Manifest' id='juneau-microservice-core.Manifest'>11.4 - Manifest</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 11.4 - juneau-microservice-core.Manifest -->
<p>
	The {@link org.apache.juneau.microservice.MicroserviceBuilder#manifest(Object)} method can be used to specify the contents or location of of the main 
	manifest file of the executable jar.
</p>
<p>
	If you do not specify the location/contents of the manifest file, the microservice will attempt to resolve it through the following methods:
</p>
<ol class='spaced-list'>
	<li>
		Looking on the file system for a file at <js>"META-INF/MANIFEST.MF"</js>.
		This is primarily to allow for running microservices from within eclipse workspaces where the manifest file
		is located in the project root.
	<li>
		Using the class loader for this class to find the file at the URL <js>"META-INF/MANIFEST.MF"</js>.
</ol>
<p>
	If you do manually specify the manifest file, you can pass in any of the following types:
</p>		
<ul>
	<li>{@link org.apache.juneau.utils.ManifestFile} - A pre-parsed manifest file.
	<li>{@link java.util.jar.Manifest} - A pre-parsed manifest file.
	<li>{@link java.io.Reader} - Containing the raw contents of the manifest. 
	<li>{@link java.io.InputStream} - Containing the raw contents of the manifest.
	<li>{@link java.io.File} - File containing the raw contents of the manifest.
	<li>{@link java.lang.String} - Path to file containing the raw contents of the manifest.
	<li>{@link java.lang.Class} - Finds and loads the manifest file of the jar file that the specified class is contained within.
</ul>
<p>
	The manifest file can be retrieved using the the {@link org.apache.juneau.microservice.Microservice#getManifest()} method which 
	provides an API for accessing manifest file entries.
	This method returns an instance of {@link org.apache.juneau.utils.ManifestFile} which extends from {@link org.apache.juneau.ObjectMap} allowing
	you to retrieve entries as any data types supported by that class.
</p>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	ManifestFile mf = Microservice.<jsm>getInstance</jsm>().getManifest();
	
	String mainClass = mf.getString(<js>"Main-Class"</js>);
	<jk>int</jk> myInt = mf.getInt(<js>"My-Int"</js>, 123);
	<jk>boolean</jk> myBoolean = mf.getBoolean(<js>"My-Boolean"</js>);
</p>
<p>
	The manifest is also used for the {@link org.apache.juneau.svl.vars.ManifestFileVar $MF} SVL variable.
</p>
<h5 class='figure'>Examples:</h5>
<p class='bpcode w800'>
	<jc>// $MF used in variable resolver.</jc>
	VarResolver vr = Microservice.<jsm>getInstance</jsm>().getVarResolver();
 	System.<jsf>out</jsf>.println(vr.resolve(<js>"The main class is $MF{Main-Class}"</js>));
</p>
<p class='bpcode w800'>
	<jc>// $MF used in annotation.</jc>
	<ja>@Rest</ja>(
		title=<js>"$MF{Application-Title}"</js>,
		...
	)
</p>
</div><!-- END: 11.4 - juneau-microservice-core.Manifest -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-core.Config' id='juneau-microservice-core.Config'>11.5 - Config</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 11.5 - juneau-microservice-core.Config -->
<p>
	The following methods can be used to define the configuration for your microservice using the powerful Config API:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.microservice.MicroserviceBuilder}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#config(Config) config(Config)} 
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#configName(String) configName(String)} 
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#configStore(ConfigStore) configStore(ConfigStore)} 
	</ul>
</ul>
<p>
	If you do not specify any of this information, we attempt to resolve it through the following methods:
</p>
<ol class='spaced-list'>
	<li>
		Resolve file first in working directory, then in classpath, using the following names:
		<ol>
			<li>
				The <js>"configFile"</js> argument in the command line arguments passed in through the constructor.
			<li>
				The value of the <c>Main-Config</c> entry in the manifest file.
			<li>
				A config file in the same location and with the same name as the executable jar file.
				(e.g. <js>"java -jar myjar.jar"</js> will look for <js>"myjar.cfg"</js>).
		</ol>
	<li>
		Resolve any <js>"*.cfg"</js> file that can be found in the working directory.
	<li>
		Resolve any of the following files in the classpath:
		<ol>
			<li><c>juneau.cfg</c>
			<li><c>default.cfg</c>
			<li><c>application.cfg</c>
			<li><c>app.cfg</c>
			<li><c>settings.cfg</c>
		</ol>
</ol>
<p>
	If no configuration file is found, and empty in-memory configuration is used.
</p>
<p>
	The {@link org.apache.juneau.microservice.MicroserviceBuilder#configName(String) configName(String)} method allows you to explicitly specify the name
	of the external configuration file location for your microservice.
</p>
<p class='bpcode w800'>
	Microservice
		.<jsm>create</jsm>()     
		.config(<js>"my-files/MyMicroservice.cfg"</js>) 
		.build()
		.start()
	;
</p>
<p>
	By default, we try to find the file on the file system and then the classpath.
	If located on the file system, then the configuration is writeable and the microservice can automatically 
	listen for and react to changes in the configuration file on the file system.
	If located on the classpath, then the configuration can still react to modifications made to it through
	the Config API, but the changes cannot be persisted since the location prevents the file from being modified.
</p>

<p>
	The {@link org.apache.juneau.microservice.MicroserviceBuilder#configStore(ConfigStore) configStore(ConfigStore)} method can be used to explicitly
	specify a configuration store.
	This can include your own custom configuration store, such as one that's implemented in a relational database.
</p>
<p class='bpcode w800'>
	Microservice
		.<jsm>create</jsm>()     
		.configStore(<jk>new</jk> MyConfigSqlStore()) 
		.configName(<js>"MyConfig"</js>) 
		.build()
		.start()
	;
</p>
<p>
	The {@link org.apache.juneau.microservice.MicroserviceBuilder#config(Config) config(Config)} method can be used to explicitly specify a {@link org.apache.juneau.config.Config} 
	file as the microservice configuration.  When this method is used, the above two methods are bypassed entirely.
</p>
<p class='bpcode w800'>
	Config config = <jsm>getMyOwnConfig</jsm>();

	Microservice
		.<jsm>create</jsm>()     
		.config(config) 
		.build()
		.start()
	;
</p>
<p>
	Once the configuration is resolved, it is made as the system default configuration available through the {@link org.apache.juneau.config.Config#getSystemDefault()}.
	This in turn allows it to be used by REST resources that reference the system default configuration via the <js>"SYSTEM_DEFAULT"</js> such as those
	implementing the {@link org.apache.juneau.rest.BasicRestConfig} interface.
<p>
<h5 class='figure'>BasicRestConfig.java</h5>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		config=<js>"$S{juneau.configFile,SYSTEM_DEFAULT}"</js>
		...
	)
</p>
<p>
	The {@link org.apache.juneau.microservice.Microservice#getConfig()} method can be used to get access to the configuration.
</p>
<p class='bpcode w800'>
	Config c = Microservice.<jsm>getInstance</jsm>().getConfig();
	
	File logDir = c.getObject(<js>"Logging/logDir"</js>, File.<jk>class</jk>);
	boolean append = c.getBoolean(<js>"Logging/append"</js>);
	String format = c.getString(<js>"Logging/format"</js>, <js>"[{date} {level}] {msg}%n"</js>);
	long limit = c.getLong(<js>"Logging/limit"</js>);
	Map&lt;String,Level&gt; levels = c.getObject(<js>"Logging/levels"</js>, Map.<jk>class</jk>, String.<jk>class</jk>, Level.<jk>class</jk>);
</p>	
<p>
	Changes to the configuration file can trigger notifications that can be used to restart your microservice or make various other
	on-the-fly changes.  
	This can be accomplished by either overriding the {@link org.apache.juneau.microservice.Microservice#onConfigChange(ConfigEvents)} or implementing
	a listener and using the {@link org.apache.juneau.microservice.MicroserviceListener#onConfigChange(Microservice,ConfigEvents)} methods.
	These will be described in detail later.
</p>

<ul class='seealso'>
	<li class='link'>{@doc juneau-config}
</ul>
</div><!-- END: 11.5 - juneau-microservice-core.Config -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-core.SystemProperties' id='juneau-microservice-core.SystemProperties'>11.6 - System properties</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 11.6 - juneau-microservice-core.SystemProperties -->
<p>
	As a convenience, the <c>SystemProperties</c> section of your configuration file can be used to define system
	properties to set during initialization of your microservice:
</p>
<p class='bpcode w800'>
	<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.jetty.JettyLogger</cv>
	
	<cc># Jetty logging level
	# Possible values:  ALL, DEBUG, INFO, WARN, OFF</cc>
	<ck>org.eclipse.jetty.LEVEL</ck> = <cv>WARN</cv>
	
	<ck>derby.stream.error.file</ck> = <cv>$C{Logging/logDir}/derby-errors.log</cv>
</p>
</div><!-- END: 11.6 - juneau-microservice-core.SystemProperties -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-core.VarResolver' id='juneau-microservice-core.VarResolver'>11.7 - VarResolver</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 11.7 - juneau-microservice-core.VarResolver -->
<p>
	The Microservice API incorporates the {@doc juneau-marshall.SimpleVariableLanguage Simple Variable Language} API.
</p>
<p>
	The variable resolver can be augmented through the following methods:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.microservice.MicroserviceBuilder}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#vars(Class...) vars(Class...)} 
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#varContext(String, Object) varContext(String,Object)} 
	</ul>
</ul>
<p>
	A typical usage pattern is shown below:
</p>
<p class='bpcode w800'>
	<jc>// $A used in variable resolver.</jc>
	VarResolver vr = Microservice.<jsm>getInstance</jsm>().getVarResolver();
 	System.<jsf>out</jsf>.println(vr.resolve(<js>"Main class is set to $MF{Main-Class, unknown}"</js>));
</p>
<p>
	The variable resolver becomes much more powerful when used in REST resource annotations which will be
	described latter in {@doc juneau-microservice-jetty}
</p>
<p>
	By default, support for the following variables are provided:
</p>
<ul>
	<li><c>$S{key[,default]}</c> - {@link org.apache.juneau.svl.vars.SystemPropertiesVar}
	<li><c>$E{key[,default]}</c> - {@link org.apache.juneau.svl.vars.EnvVariablesVar}
	<li><c>$A{key[,default]}</c> - {@link org.apache.juneau.svl.vars.ArgsVar}
	<li><c>$C{key[,default]}</c> - {@link org.apache.juneau.config.vars.ConfigVar}
	<li><c>$MF{key[,default]}</c> - {@link org.apache.juneau.svl.vars.ManifestFileVar}
	<li><c>$IF{arg,then[,else]}</c> - {@link org.apache.juneau.svl.vars.IfVar}
	<li><c>$SW{arg,pattern1:then1[,pattern2:then2...]}</c> - {@link org.apache.juneau.svl.vars.SwitchVar}
	<li><c>$CO{arg[,arg2...]}</c> - {@link org.apache.juneau.svl.vars.CoalesceVar}
	<li><c>$PM{arg,pattern}</c> - {@link org.apache.juneau.svl.vars.PatternMatchVar}
	<li><c>$UC{arg}</c> - {@link org.apache.juneau.svl.vars.UpperCaseVar}
	<li><c>$LC{arg}</c> - {@link org.apache.juneau.svl.vars.LowerCaseVar}
	<li><c>$NE{arg}</c> - {@link org.apache.juneau.svl.vars.NotEmptyVar}
</ul>
</div><!-- END: 11.7 - juneau-microservice-core.VarResolver -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-core.ConsoleCommands' id='juneau-microservice-core.ConsoleCommands'>11.8 - Console Commands</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 11.8 - juneau-microservice-core.ConsoleCommands -->
<p>
	The Microservice API provides support for simple console commands.
</p>
<p class='bpcode w800'>
	<jk>public static void</jk> main(String[] args) {
		Microservice
			.<jsm>create</jsm>() 
			.args(args)
			.build()
			.start()
			.startConsole()    <jc>// Start console.</jc>
			.join()
		;
	}
</p>
<p>
	When started, the console renders the following output:
</p>
<p class='bpcode w800 console'>
	Running class 'Microservice' using config file 'my-microservice.cfg'.
	
	List of available commands:
		exit -- Shut down service
		restart -- Restarts service
		help -- Commands help
	
	> 			
</p>
<p>
	The builder methods for controlling the console are as follows:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.microservice.MicroserviceBuilder}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#consoleEnabled(boolean) consoleEnabled(boolean)} 
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#consoleCommands(ConsoleCommand...) consoleCommands(ConsoleCommand...)} 
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#consoleCommands(Class...) consoleCommands(Class...)} 
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#console(Scanner,PrintWriter) console(Scanner,PrintWriter)} 
	</ul>
</ul>
<p>
	By default, the supported commands are pulled from the configuration file:
</p>
<p class='bpcode w800'>
	<cc>#=======================================================================================================================
	# Console settings
	#=======================================================================================================================</cc>
	<cs>[Console]</cs>
	
	<ck>enabled = <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>
<p>
	New commands can be added by adding them to the configuration file, or programmatically using the {@link org.apache.juneau.microservice.MicroserviceBuilder#consoleCommands(ConsoleCommand...) consoleCommands(ConsoleCommand...)} 
	builder method.
</p>
<p>
	The API for defining console commands is shown below: 
</p>
<ul class='javatree'>
	<li class='jac'>{@link org.apache.juneau.microservice.console.ConsoleCommand}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.console.ConsoleCommand#execute(Scanner,PrintWriter,Args) execute(Scanner,PrintWriter,Args)} 
		<li class='jm'>{@link org.apache.juneau.microservice.console.ConsoleCommand#getDescription() getDescription()} 
		<li class='jm'>{@link org.apache.juneau.microservice.console.ConsoleCommand#getExamples() getExamples()} 
		<li class='jm'>{@link org.apache.juneau.microservice.console.ConsoleCommand#getInfo() getInfo()} 
		<li class='jm'>{@link org.apache.juneau.microservice.console.ConsoleCommand#getName() getName()} 
		<li class='jm'>{@link org.apache.juneau.microservice.console.ConsoleCommand#getSynopsis() getSynopsis()} 
	</ul>
</ul>
<p>
	By default, the console input and output are taken from {@link java.lang.System.in} and {@link java.lang.System.out}.
	These can be overridden using the {@link org.apache.juneau.microservice.MicroserviceBuilder#console(Scanner,PrintWriter) console(Scanner,PrintWriter)} method.
</p>
</div><!-- END: 11.8 - juneau-microservice-core.ConsoleCommands -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-core.Logging' id='juneau-microservice-core.Logging'>11.9 - Logging</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 11.9 - juneau-microservice-core.Logging -->
<p>
	The Microservice API provides build-in but configurable and overridable support for logging.
</p>
<p>
	The method for configuring logging is as follows:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.microservice.MicroserviceBuilder}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#logConfig(LogConfig) logConfig(LogConfig)} 
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#logger(Logger) logger(Logger)} 
	</ul>
</ul>
<p>
	If not specified, the logging configuration is pulled in from the configuration file:
</p>
<p class='bpcode w800'>
	<jc>#=======================================================================================================================
	# Logger settings
	#-----------------------------------------------------------------------------------------------------------------------
	# See FileHandler Java class for details.
	#=======================================================================================================================</jc>
	<cs>[Logging]</cs>
	
	<jc># The directory where to create the log file.
	# Default is "."</jc>
	<ck>logDir</ck> = <cv>logs</cv>
	
	<jc># The name of the log file to create for the main logger.
	# The logDir and logFile make up the pattern that's passed to the FileHandler
	# constructor.
	# If value is not specified, then logging to a file will not be set up.</jc>
	<ck>logFile</ck> = <cv>microservice.%g.log</cv>
	
	<jc># Whether to append to the existing log file or create a new one.</jc>
	<ck>append</ck> = <cv>false</cv>
	
	<jc># The SimpleDateFormat format to use for dates.</jc>
	<ck>dateFormat</ck> = <cv>yyyy.MM.dd hh:mm:ss</cv>
	
	<jc># The log message format.
	# The value can contain any of the following variables:
	# 	{date} - The date, formatted per dateFormat.
	#	{class} - The class name.
	#	{method} - The method name.
	#	{logger} - The logger name.
	#	{level} - The log level name.
	#	{msg} - The log message.
	#	{threadid} - The thread ID.
	#	{exception} - The localized exception message.</jc>
	<ck>format</ck> = <cv>[{date} {level}] {msg}%n</cv>
	
	<jc># The maximum log file size.
	# Suffixes available for numbers.
	# See Config.getInt(String,int) for details.</jc>
	<ck>limit</ck> = <cv>1M</cv>
	
	<jc># Max number of log files.</jc>
	<ck>count</ck> = <cv>5</cv>
	
	<jc># Default log levels.
	# Format is lax-JSON.
	# Keys are logger names.
	# Values are serialized Level POJOs (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST)</jc>
	<ck>levels</ck> = 
		<cv>{ 
			'': 'WARNING', 
			org.apache.juneau: 'WARNING', 
			org.eclipse.jetty: 'WARNING' 
		}</cv>
	
	<jc># Only print unique stack traces once and then refer to them by a simple 8 character hash identifier.
	# Useful for preventing log files from filling up with duplicate stack traces.</jc>
	<ck>useStackTraceHashes</ck> = <cv>true</cv>
	
	<jc># The default level for the console logger.
	# Values are serialized Level POJOs (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST)</jc>
	<ck>consoleLevel</ck> = <cv>WARNING</cv>
	
	<jc># The default level for the file logger.
	# Values are serialized Level POJOs (SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST)</jc>
	<ck>fileLevel</ck> = <cv>INFO</cv>
</p>
<p>
	The logging configuration can also be defined programmatically through the following API:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.microservice.LogConfig}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.LogConfig#create() create()} 
		<li class='jm'>{@link org.apache.juneau.microservice.LogConfig#append() append()} 
		<li class='jm'>{@link org.apache.juneau.microservice.LogConfig#consoleLevel(Level) consoleLevel(Level)} 
		<li class='jm'>{@link org.apache.juneau.microservice.LogConfig#count(int) count(int)} 
		<li class='jm'>{@link org.apache.juneau.microservice.LogConfig#fileLevel(Level) fileLevel(Level)} 
		<li class='jm'>{@link org.apache.juneau.microservice.LogConfig#formatter(Formatter) formatter(Formatter)} 
		<li class='jm'>{@link org.apache.juneau.microservice.LogConfig#level(String,Level) level(String,Level)} 
		<li class='jm'>{@link org.apache.juneau.microservice.LogConfig#levels(Map) levels(Map)} 
		<li class='jm'>{@link org.apache.juneau.microservice.LogConfig#limit(int) limit(int)} 
		<li class='jm'>{@link org.apache.juneau.microservice.LogConfig#logDir(String) logDir(String)} 
		<li class='jm'>{@link org.apache.juneau.microservice.LogConfig#logFile(String) logFile(String)} 
	</ul>
</ul>
<h5 class='figure'>Example:</h5>
<p class='bpcode w800'>
	<jk>public static void</jk> main(String[] args) {
		
		LogConfig logConfig = LogConfig
			.<jsm>create</jsm>()
			.append(<jk>true</jk>)
			.consoleLevel(<jsf>FINE</jsf>)
			.level(<js>"org.mylogger"</js>, <jsf>FINER</jsf>)
			.logDir(<js>"my-log-files"</js>);
		
		Microservice
			.<jsm>create</jsm>() 
			.args(args)
			.logConfig(logConfig)
			.build()
			.start()
			.join()
		;
	}
</p>
<p>
	If you wish to bypass the default logging configuration entirely, you can pass in your own logger via
	the {@link org.apache.juneau.microservice.MicroserviceBuilder#logger(Logger)} method. 
</p>
<p>
	In addition to configuring the built-in Java logging framework, the following convenience methods are also
	provided on the {@link org.apache.juneau.microservice.Microservice} class for logging.
</p>

<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.microservice.Microservice}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#getLogger() getLogger()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#out(MessageBundle,String,Object...) out(MessageBundle,String,Object...)} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#err(MessageBundle,String,Object...) err(MessageBundle,String,Object...)} 
	</ul>
</ul>
</div><!-- END: 11.9 - juneau-microservice-core.Logging -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-core.Listeners' id='juneau-microservice-core.Listeners'>11.10 - Listeners</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 11.10 - juneau-microservice-core.Listeners -->
<p>
	As mentioned previously, the lifecycle methods for the {@link org.apache.juneau.microservice.Microservice} class are explicitly
	defined as non-final so that they can be overridden by subclasses.
</p>
<p>
	In addition to this support, an interface for defining event listeners for your microservice:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.microservice.MicroserviceBuilder}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceBuilder#listener(MicroserviceListener) listener(MicroserviceListener)} 
	</ul>
	<li class='jic'>{@link org.apache.juneau.microservice.MicroserviceListener}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceListener#onStart(Microservice) onStart(Microservice)} 
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceListener#onStop(Microservice) onStop(Microservice)} 
		<li class='jm'>{@link org.apache.juneau.microservice.MicroserviceListener#onConfigChange(Microservice,ConfigEvents) onConfigChange(Microservice,ConfigEvents)} 
	</ul>
	<li class='jac'>{@link org.apache.juneau.microservice.BasicMicroserviceListener}
</ul>
<p>
	This listener API can be used for listening for and reacting to configuration changes on the file system.
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyMicroserviceListener <jk>extends</jk> BasicMicroserviceListener {
	
		<ja>@Override</ja> <jc>/* MicroserviceListener */</jc>
		<jk>public void</jk> onConfigChange(Microservice microservice, ConfigEvents events) {
			
			<jc>// Restart the microservice if anything was modified in one of our sections</jc>
			<jk>if</jk> (events.isSectionChanged(<js>"MySection"</js>))
				microservice.stop().start();
		}
	}
</p>
<p>
	Note that the {@link org.apache.juneau.microservice.Microservice#onConfigChange(ConfigEvents)} method can also be overridden
	to react to configuration changes as well:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyMicroservice <jk>extends</jk> Microservice {
	
		<ja>@Override</ja> <jc>/* MicroserviceListener */</jc>
		<jk>public void</jk> onConfigChange(ConfigEvents events) {
			
			<jc>// Restart the microservice if anything was modified in one of our sections</jc>
			<jk>if</jk> (events.isSectionChanged(<js>"MySection"</js>))
				<jk>this</jk>.stop().start();
		}
	}
</p>
</div><!-- END: 11.10 - juneau-microservice-core.Listeners -->
</div><!-- END: 11 - juneau-microservice-core -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-jetty' id='juneau-microservice-jetty'>12 - juneau-microservice-jetty</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h2>
<div class='topic'><!-- START: 12 - juneau-microservice-jetty -->
<div class='warn'>
	The Juneau Microservice libraries are likely to be removed in Juneau 9.0 due to the popularity of the Spring Boot
	framework for creating microservices and the ability for Juneau to be used within Spring Boot.
</div>

<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<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-jetty<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	

<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-microservice-jetty-{@property juneauVersion}.jar 
</p>	

<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.microservice.jetty_{@property juneauVersion}.jar 
</p>	

<p>
	Juneau Microservice Jetty 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>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-jetty.Overview' id='juneau-microservice-jetty.Overview'>12.1 - Overview</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 12.1 - juneau-microservice-jetty.Overview -->
<p>
	The Jetty Microservice API consists of a combination of the Juneau Core, Server, and Client APIs and an embedded
	Eclipse Jetty Servlet Container.  
</p>
<p>
	The API builds upon the {@doc juneau-microservice-core Core Microservice} classes to produce easy-to-create and
	easy-to-use microservices in a standard Java 1.8+ environment.
</p>
<p>
	The <c>juneau-microservice-jetty</c> library consists of the following classes:
</p>
<ul class='javatree'>
	<li class='jp'>{@link org.apache.juneau.microservice.jetty}
	<ul>
		<li class='jc'>{@link org.apache.juneau.microservice.jetty.JettyMicroservice} - The Jetty microservice class.
		<li class='jc'>{@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder} - Builder for the microservice class.
		<li class='jic'>{@link org.apache.juneau.microservice.jetty.JettyMicroserviceListener} - Interface for hooking into lifecyle events of the microservice.
		<ul>
			<li class='jc'>{@link org.apache.juneau.microservice.jetty.BasicJettyMicroserviceListener} - Adapter for JettyMicroserviceListener class.
		</ul>
		<li class='jic'>{@link org.apache.juneau.microservice.jetty.JettyServerFactory} - Interface for defining custom Jetty servers.
		<ul>
			<li class='jc'>{@link org.apache.juneau.microservice.jetty.BasicJettyServerFactory} - Adapter for JettyServerFactory class.
		</ul>
		 
	</ul>
</ul>

<p>
	The most-basic creation of a Jetty microservice from an entry-point method is shown below:
</p>	
<p class='bpcode w800'>
	<jk>public class</jk> App {
		<jk>public static void</jk> main(String[] args) {
			JettyMicroservice
				.<jsm>create</jsm>()                     <jc>// Create builder.</jc>
				.args(args)                   <jc>// Pass in args.</jc>
				.servlets(RootResource.<jk>class</jk>) <jc>// A Juneau RestServlet class.</jc>
				.build()                      <jc>// Create microservice.</jc>
				.start()                      <jc>// Start microservice.</jc>
			;
		}
	}
</p>
</div><!-- END: 12.1 - juneau-microservice-jetty.Overview -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-jetty.LifecycleMethods' id='juneau-microservice-jetty.LifecycleMethods'>12.2 - Lifecycle Methods</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 12.2 - juneau-microservice-jetty.LifecycleMethods -->
<p>
	To review, the {@link org.apache.juneau.microservice.Microservice} class contains the following lifecycle methods:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.microservice.Microservice}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#start() start()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#startConsole() startConsole()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#join() join()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#stop() stop()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#stopConsole() stopConsole()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#exit() exit()} 
		<li class='jm'>{@link org.apache.juneau.microservice.Microservice#kill() kill()} 
	</ul>
</ul>
<p>
	The {@link org.apache.juneau.microservice.jetty.JettyMicroservice} class which extends from {@link org.apache.juneau.microservice.Microservice} 
	provides the following additional lifecycle methods:
</p>
<ul class='javatree'>
	<li class='jc'>{@link org.apache.juneau.microservice.jetty.JettyMicroservice}
	<ul>
		<li class='jm'>{@link org.apache.juneau.microservice.jetty.JettyMicroservice#createServer() createServer()} 
		<li class='jm'>{@link org.apache.juneau.microservice.jetty.JettyMicroservice#startServer() startServer()} 
		<li class='jm'>{@link org.apache.juneau.microservice.jetty.JettyMicroservice#destroyServer() destroyServer()} 
	</ul>
</ul>
<p>
	The additional lifecycle methods are typically not called directly, but are exposed to allow subclasses to
	provide customized behavior for these events.  
	For this reason, these methods are left as non-final so that they can be overridden.
</p>
<p>
	A typical implementation of an app with lifecycle methods might look like the following:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> App {
	
		<jk>private static final</jk> JettyMicroservice <jsf>MICROSERVICE</jsf>;
	
		<jk>public static void</jk> main(String[] args) {
			<jsf>MICROSERVICE</jsf> = JettyMicroservice
				.<jsm>create</jsm>()                     <jc>// Create builder.</jc>
				.args(args)                   <jc>// Pass in args.</jc>
				.servlets(RootResource.<jk>class</jk>) <jc>// A Juneau RestServlet class.</jc>
				.build()                      <jc>// Create microservice.</jc>
				.start()                      <jc>// Start microservice.</jc>
				.startConsole()               <jc>// Start console.</jc>
				.join()                       <jc>// Join thread.</jc>
			;
		}
		
		<jk>public static void</jk> restart() {
			<jsf>MICROSERVICE</jsf>.stop().start();
		}
		
		<jk>public static void</jk> exit() {
			<jsf>MICROSERVICE</jsf>.exit();
		}
	}
</p>
<p>
	Similar to {@link org.apache.juneau.microservice.Microservice#getInstance()}, the {@link org.apache.juneau.microservice.jetty.JettyMicroservice#getInstance()}
	also allows easy access to the microservice:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> App {
	
		<jk>public static void</jk> main(String[] args) {
			JettyMicroservice
				.<jsm>create</jsm>()                     <jc>// Create builder.</jc>
				.args(args)                   <jc>// Pass in args.</jc>
				.servlets(RootResource.<jk>class</jk>) <jc>// A Juneau RestServlet class.</jc>
				.build()                      <jc>// Create microservice.</jc>
				.start()                      <jc>// Start microservice.</jc>
				.startConsole()               <jc>// Start console.</jc>
				.join()                       <jc>// Join thread.</jc>
			;
		}
		
		<jk>public static void</jk> restart() {
			JettyMicroservice.<jsm>getInstance</jsm>().stop().start();
		}
		
		<jk>public static void</jk> exit() {
			JettyMicroservice.<jsm>getInstance</jsm>().exit();
		}
	}
</p>
</div><!-- END: 12.2 - juneau-microservice-jetty.LifecycleMethods -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-jetty.ResourceClasses' id='juneau-microservice-jetty.ResourceClasses'>12.3 - Resource Classes</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 12.3 - juneau-microservice-jetty.ResourceClasses -->
<p>
	This section describes how to define a top-level REST resource page and deploy it in our microservice.
	The example is a router page that serves as a jumping off page to child resources.
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/*"</js>,
		title=<js>"My Microservice"</js>,
		description=<js>"Top-level resources page"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			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> BasicRestServletJenaGroup {
		<jc>// No code! </jc>
	}
</p>
<p>
	When deployed, it looks like this in a browser:
</p>
<p class='bpcode w800'>
	http://localhost:10000
</p>			
<img class='bordered w800' src='doc-files/juneau-microservice-jetty.Running.1.png'>
<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.rest.BasicRestServlet} 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>
<p class='bpcode w800'>
	http://localhost:10000/helloWorld
</p>			
<img class='bordered w800' src='doc-files/juneau-microservice-jetty.ResourceClasses.1.png'>
<p>
	...which is generated by this class...
</p>
<p class='bpcode w800'>
	<ja>@Rest</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> BasicRestServlet {
	
		<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 most-common case for deploying the top-level resource is to use the {@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder#servlet(Class)} method:
</p>	
<p class='bpcode w800'>
	<jk>public class</jk> App {
		<jk>public static void</jk> main(String[] args) {
			JettyMicroservice
				.<jsm>create</jsm>() 
				.args(args)
				.servlet(RootResources.<jk>class</jk>) <jc>// Our root resource.</jc>
				.build() 
				.start()
			;
		}
	}
</p>
<p>
	However, there are multiple ways of deploying top-level resources:
</p>
<ul class='spaced-list'>
	<li>
		{@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder#servlet(Class)} - Using the builder.  Several methods provided.
	<li>
		{@link org.apache.juneau.microservice.jetty.JettyMicroservice#addServlet(Servlet,String)} - After the Jetty container has been started.
	<li>
		As a configuration variable <js>"Jetty/servlets"</js>.
		<p class='bcode w800'>
	<cc>#=======================================================================================================================
	# Jetty settings
	#=======================================================================================================================</cc>
	<cs>[Jetty]</cs>

	<cc># Subclasses of RestServlet</cc>	
	<ck>servlets</ck> = <cv>org.apache.juneau.examples.rest.RootResources</cv>	
		</p>
	<li>
		As a configuration variable <js>"Jetty/servletMap"</js>.
		<p class='bcode w800'>
	<cc>#=======================================================================================================================
	# Jetty settings
	#=======================================================================================================================</cc>
	<cs>[Jetty]</cs>

	<cc># Any servlets and their path specs</cc>	
	<ck>servletMap</ck> = 
		<cv>{
			'/*': 'org.apache.juneau.examples.rest.RootResources'
		}</cv>
	</cv>	
	<li>
		Directly in the <c>jetty.xml</c> file.
		<p class='bcode w800'>
	<xt>&lt;Configure</xt> <xa>id</xa>=<xs>"ExampleServer"</xs> <xa>class</xa>=<xs>"org.eclipse.jetty.server.Server"</xs><xt>&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.rest.test.Root<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>
		...
		</p>
</ul>
</div><!-- END: 12.3 - juneau-microservice-jetty.ResourceClasses -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-jetty.PredefinedResourceClasses' id='juneau-microservice-jetty.PredefinedResourceClasses'>12.4 - Predefined Resource Classes</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 12.4 - juneau-microservice-jetty.PredefinedResourceClasses -->
<p>
	The following predefined resource classes are also provided for easy inclusion into your microservice:
</p>
<ul class='javatree'>
	<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><!-- END: 12.4 - juneau-microservice-jetty.PredefinedResourceClasses -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-jetty.Config' id='juneau-microservice-jetty.Config'>12.5 - Config</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 12.5 - juneau-microservice-jetty.Config -->
<p>
	In {@doc juneau-microservice-core.Config}, we described how to associate a configuration file with your
	microservice.
	In this section we describe how that configuration can be used to customize the behavior or your REST resource
	classes.
</p>	
<p>
	The most common usage for the configuration file is to reference values using the {@link org.apache.juneau.config.vars.ConfigVar $C} variable in annotations.
	For example, the {@link org.apache.juneau.rest.BasicRestConfig} interface that defines the annotations that control the look-and-feel of
	classes that extend from {@link org.apache.juneau.rest.BasicRestServlet} use several <c>$C</c> variables to externalize values:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		...
			
		<jc>// HTML-page specific settings</jc>
		htmldoc=<ja>@HtmlDoc</ja>(
	
			<jc>// Default page header contents.</jc>
			header={
				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,  <jc>// Use @Rest(title)</jc>
				<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>, <jc>// Use either @RestMethod(summary) or @Rest(description)</jc>
				<js>"$C{REST/header}"</js>  <jc>// Extra header HTML defined in external config file.</jc>
			},
	
			<jc>// Default stylesheet to use for the page.
			// Can be overridden from external config file.
			// Default is DevOps look-and-feel (aka Depression look-and-feel).</jc>
			stylesheet=<js>"$C{REST/theme,servlet:/htdocs/themes/devops.css}"</js>,
	
			<jc>// Default contents to add to the &lt;head&gt; section of the HTML page.
			// Use it to add a favicon link to the page.</jc>
			head={
				<js>"&lt;link rel='icon' href='$U{$C{REST/favicon}}'/&gt;"</js>
			},
	
			<jc>// No default page footer contents.
			// Can be overridden from external config file.</jc>
			footer=<js>"$C{REST/footer}"</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"
		// By default, we define static files through the external configuration file.</jc>
		staticFiles=<js>"$C{REST/staticFiles}"</js>
	)
	<jk>public interface</jk> BasicRestConfig {}
</p>
<p>
	These values in turn are pulled from the external configuration file shown below.
	Note that the configuration file can also contain <c>$C</c> variables.
</p>
<p class='bpcode w800'>
	<cc>#=======================================================================================================================
	# REST settings
	#=======================================================================================================================</cc>
	<cs>[REST]</cs>
	
	<cc># Mappings to folders containing static files.</cc>
	<cc># Can be in the working directory or in the classpath.</cc>
	<ck>staticFiles</ck> = <cv>htdocs:files/htdocs</cv>
	
	<cc># Stylesheet to use for HTML views.</cc>
	<ck>theme</ck> = <cv>servlet:/htdocs/themes/devops.css</cv>
	
	<ck>headerIcon</ck> = <cv>servlet:/htdocs/images/juneau.png</cv>
	<ck>headerLink</ck> = <cv>http://juneau.apache.org</cv>
	<ck>footerIcon</ck> = <cv>servlet:/htdocs/images/asf.png</cv>
	<ck>footerLink</ck> = <cv>http://www.apache.org</cv>
	
	<ck>favicon</ck> = <cv>$C{REST/headerIcon}</cv>
	<ck>header</ck> = 
		<cv>&lt;a href='$U{$C{REST/headerLink}}'&gt;</cv>
			<cv>&lt;img src='$U{$C{REST/headerIcon}}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;</cv>
		<cv>&lt;/a&gt;</cv>
	<ck>footer</ck> = 
		<cv>&lt;a href='$U{$C{REST/footerLink}}'&gt;</cv>
			<cv>&lt;img src='$U{$C{REST/footerIcon}}' style='float:right;padding-right:20px;height:32px'/&gt;</cv>
		<cv>&lt;/a&gt;</cv>
</p>

<p>
	Configuration files can also be accessed programmatically.
	There are 3 primary ways of getting access to the config file:
</p>
<ul class='javatree'>
	<li class='jm'>{@link org.apache.juneau.microservice.Microservice#getConfig()} 
		<p>Any {@doc DefaultRestSvlVariables initialization-time variables} can be used.</p>
	<li class='jm'>{@link org.apache.juneau.rest.RestContext#getConfig()} 
		<p>Any {@doc DefaultRestSvlVariables initialization-time variables} can be used.</p>
		<h5 class='figure'>Example usage:</h5>
		<p class='bcode w800'>
	<cc>#----------------------------------</cc>
	<cc># Configuration for MyHelloResource </cc>
	<cc>#----------------------------------</cc>
	<cs>[MyHelloResource]</cs>
	<ck>greeting</ck> = <cv>Hello world!</cv> 
				</p>
				<p class='bcode w800'>
	<cc>#---------------------------------</cc>
	<cc># Contents of MyHelloResource.java </cc>
	<cc>#---------------------------------</cc>
	<ja>@Rest</ja>(...)
	<jk>public class</jk> MyHelloResource <jk>extends</jk> BasicRestServlet {
		<jk>private</jk> String <jf>greeting</jf>; 
		
		<jc>// Or access config file in servlet init method.</jc>
		<ja>@Override</ja> <jc>/* Servlet */</jc>
		<jk>public void</jk> init() {
			Config c = getContext().getConfig();
			<jk>this</jk>.<jf>greeting</jf> = c.getString(<js>"MyHelloResource/greeting"</js>); 
		}
	}		
		</p>
		<p>
			Additional user-defined variables at the servlet level can be defined 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.
		<p>Any {@doc DefaultRestSvlVariables initialization-time or request-time variables} can be used.</p>
		
		<h5 class='figure'>Example usage:</h5>
		<p class='bcode w800'>
	<cc>#----------------------------------</cc>
	<cc># Configuration for MyHelloResource</cc>
	<cc>#----------------------------------</cc>
	<cs>[MyHelloResource]</cs>
	<ck>greeting</ck> = <cv>Hello $RP{person}!</cv> <cc>// $RP is RequestPathVar</cc>
	<ck>localizedGreeting</ck> = <cv>$L{HelloMessage,$RP{person}}</cv> <cc>// $L is LocalizationVar with args</cc>
				</p>
				<p class='bcode w800'>
	<cc>#---------------------------------</cc>
	<cc># Contents of MyHelloResource.java </cc>
	<cc>#---------------------------------</cc>
	<ja>@Rest</ja>(
		path=<js>"/hello"</js>,
		messages=<js>"nls/Messages"</js>,
		...
	)
	<jk>public class</jk> MyHelloResource <jk>extends</jk> BasicRestServlet {

		<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 w800'>
	<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.
	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>

<ul class='seealso'>
	<li class='link'>{@doc juneau-config}
</ul>
</div><!-- END: 12.5 - juneau-microservice-jetty.Config -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-jetty.JettyXml' id='juneau-microservice-jetty.JettyXml'>12.6 - Jetty.xml file</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 12.6 - juneau-microservice-jetty.JettyXml -->
<p>
	The Jetty microservice comes with a bare-bones <c>jetty.xml</c> file which can be modified to suite any needs. 
</p>	
<p>
	The <c>jetty.xml</c> can be located in either the <js>"."</js> or <js>"files"</js> working directory or classpath.
	It can also be specified in any of the following ways:
</p>
<ul class='spaced-list'>
	<li>
		Using the {@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder#jettyXml(Object,boolean)} method to specify the location or contents
		of the file.
	<li>
		Specifying the location using a <c>Jetty-Config</c> value in the <c>MANIFEST.MF</c> file.
		<p class='bcode w800'>
	<mk>Jetty-Config:</mk> <mv>files/jetty.xml</mv>
		</p>
	<li>
		Specifying the location using the <js>"Jetty/jettyXml"</js> configuration value.
		<p class='bcode w800'>
	<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>files/jetty.xml</cv>
		</p>
</ul>
<p>
	SVL variables in the <c>jetty.xml</c> file are automatically resolved by the microservice.
	This allows you to reference values in your configuration file from the <c>jetty.xml</c> file.
</p>
<p>
	The HTTP port used is controlled via the following:
</p>
<ul class='spaced-list'>
	<li>
		The {@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder#ports(int...)} method.
		<p class='bcode w800'>
	JettyMicroservice
		.<jsm>create</jsm>() 
		.args(args)  
		.servlets(RootResource.<jk>class</jk>)
		.port(1000,2000,0,0,0)  <jc>// Try port 1000, then 2000, then 3 random ports.</jc>
		.build()  
		.start()
		</p>
	<li>
		The <js>"Jetty/ports"</js> configuration property.
		<p class='bcode w800'>
	<cc>#=======================================================================================================================
	# Jetty settings
	#=======================================================================================================================</cc>
	<cs>[Jetty]</cs>
	
	<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.
	<ck>port</ck> = <cv>1000,2000,0,0,0</cv>
		</p>
</ul>
<p>
	The first available port is then made available through the system property <js>"availablePort"</js> so that it
	can be referenced in our <c>jetty.xml</c> file.
</p>
<p class='bpcode w800'>
	<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>
</p>
<p>
	The {@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder#jettyServerFactory(JettyServerFactory)} method is also provided
	to use your own customized Jetty server.
</p>
</div><!-- END: 12.6 - juneau-microservice-jetty.JettyXml -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-jetty.UiCustomization' id='juneau-microservice-jetty.UiCustomization'>12.7 - UI Customization</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 12.7 - juneau-microservice-jetty.UiCustomization -->
<p>
	The Microservice project contains a <c>files/htdocs</c> folder with predefined stylesheets and
	images.
</p>
<img style='width:200px' src='doc-files/juneau-microservice-jetty.UiCustomization.1.png'>
<p>
	These files can be used to tailor the look-and-feel of your microservice.
</p>
<p class='bpcode w800'>
	http://localhost:10000/helloWorld
</p>
<img class='bordered w800' src='doc-files/juneau-rest-server.UiCustomization.1.png'>
<p>
	The REST configuration section of your microservice configuration file can be used to tailor the header and footer on the pages:
</p>
<p class='bpcode w800'>
	<cc>#=======================================================================================================================
	# REST settings
	#=======================================================================================================================</cc>
	<cs>[REST]</cs>
	
	<ck>staticFiles</ck> = <cv>htdocs:files/htdocs</cv>
	
	<cc># Stylesheet to use for HTML views.</cc>
	<ck>theme</ck> = <cv>servlet:/htdocs/themes/devops.css</cv>
	
	<ck>headerIcon</ck> = <cv>servlet:/htdocs/images/juneau.png</cv>
	<ck>headerLink</ck> = <cv>http://juneau.apache.org</cv>
	<ck>footerIcon</ck> = <cv>servlet:/htdocs/images/asf.png</cv>
	<ck>footerLink</ck> = <cv>http://www.apache.org</cv>
	
	<ck>favicon</ck> = <cv>$C{REST/headerIcon}</cv>
	<ck>header</ck> = 
		<cv>&lt;a href='$U{$C{REST/headerLink}}'&gt;</cv>
			<cv>&lt;img src='$U{$C{REST/headerIcon}}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;</cv>
		<cv>&lt;/a&gt;</cv>
	<ck>footer</ck> = 
		<cv>&lt;a href='$U{$C{REST/footerLink}}'&gt;</cv>
			<cv>&lt;img src='$U{$C{REST/footerIcon}}' style='float:right;padding-right:20px;height:32px'/&gt;</cv>
		<cv>&lt;/a&gt;</cv>
</p>
<p>
	The {@link org.apache.juneau.rest.BasicRestConfig} interface (which defines the default settings for {@link org.apache.juneau.rest.BasicRestServlet} 
	pulls in this information using {@link org.apache.juneau.config.vars.ConfigVar $C} and {@link org.apache.juneau.rest.vars.UrlVar $U} variables:
</p>
<p class='bpcode w800'>
	<ja>@Rest</ja>(
		...
		<jc>// HTML-page specific settings</jc>
		htmldoc=<ja>@HtmlDoc</ja>(
	
			<jc>// Default page header contents.</jc>
			header={
				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,  <jc>// Use @Rest(title)</jc>
				<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>, <jc>// Use either @RestMethod(summary) or @Rest(description)</jc>
				<js>"$C{REST/header}"</js>  <jc>// Extra header HTML defined in external config file.</jc>
			},
	
			<jc>// Default stylesheet to use for the page.
			// Can be overridden from external config file.
			// Default is DevOps look-and-feel (aka Depression look-and-feel).</jc>
			stylesheet=<js>"$C{REST/theme,servlet:/htdocs/themes/devops.css}"</js>,
	
			<jc>// Default contents to add to the &lt;head&gt; section of the HTML page.
			// Use it to add a favicon link to the page.</jc>
			head={
				<js>"&lt;link rel='icon' href='$U{$C{REST/favicon}}'/&gt;"</js>
			},
	
			<jc>// No default page footer contents.
			// Can be overridden from external config file.</jc>
			footer=<js>"$C{REST/footer}"</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"
		// By default, we define static files through the external configuration file.</jc>
		staticFiles=<js>"$C{REST/staticFiles}"</js>
	)
	<jk>public interface</jk> BasicRestConfig {}
</p>
<p>
	Note that the <c>files/htdocs</c> directory is mapped to <js>"servlet:/htdocs"</js> using the <c>staticFiles</c>
	setting.  This allows those files to be served up through the servlet through the URL <js>"/[servlet-path]/htdocs"</js>
</p>
<p>
	The theme files are externally accessible and can be modified to produce any look-and-feel you desire.
	The microservice still works without the files directory.  An embedded <c>devops.css</c> is included in the jar as a default spreadsheet.
</p>
<p>
	If you're testing out changes in the theme stylesheets, you may want to set the following system property that prevents caching of those files so 
	that you don't need to restart the microservice each time a change is made:
</p>
<p class='bpcode w800'>
	<cc>#=======================================================================================================================
	# System properties
	#-----------------------------------------------------------------------------------------------------------------------
	# These are arbitrary system properties that are set during startup.
	#=======================================================================================================================</cc>
	<cs>[SystemProperties]</cs>
	
	<cc># Disable classpath resource caching.
	# Useful if you're attached using a debugger and you're modifying classpath resources while running.</cc>
	<ck>RestContext.useClasspathResourceCaching.b</ck> = <cv>false</cv>

</p>
</div><!-- END: 12.7 - juneau-microservice-jetty.UiCustomization -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-microservice-jetty.Extending' id='juneau-microservice-jetty.Extending'>12.8 - Extending JettyMicroservice</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 12.8 - juneau-microservice-jetty.Extending -->
<p>
	This example shows how the {@link org.apache.juneau.microservice.jetty.JettyMicroservice} class
	can be extended to implement lifecycle listener methods or override existing methods.
	We'll create a new class <l>com.foo.MyJettyMicroservice</l>.
</p>
<p class='bpcode w800'>
	<jd>/**
	 * Sample subclass of a JettyMicroservice that provides customized behavior.
	 */</jd>
	<jk>public class</jk> MyJettyMicroservice <jk>extends</jk> JettyMicroservice {
	
		<jk>public static void</jk> main(String[] args) <jk>throws</jk> Exception {
			JettyMicroserviceBuilder builder = JettyMicroservice.<jsm>create</jsm>();
			<jk>new</jk> MyJettyMicroservice(builder).start().join();
		}
	
		<jk>public</jk> MyJettyMicroservice(JettyMicroserviceBuilder builder) <jk>throws</jk> Exception {
			<jk>super</jk>(builder);
		}
		
		<jc>// Customized code here.</jc>
</p>
<p>
	Optionally, you can extend the {@link org.apache.juneau.microservice.jetty.JettyMicroserviceBuilder} class as well:
</p>
<p class='bpcode w800'>
	<jk>public class</jk> MyJettyMicroserviceBuilder <jk>extends</jk> JettyMicroserviceBuilder {
	
		<jk>int</jk> <jf>extraField</jf>;

		<jd>/**
		 * Constructor (required).
		 */</jd>
		<jk>protected</jk> MyJettyMicroserviceBuilder() {}
	
		<jd>/**
		 * Copy constructor (required).
		 *
		 * <ja>@param</ja> copyFrom The builder to copy settings from.
		 */</jd>
		<jk>protected</jk> MyJettyMicroserviceBuilder(MyJettyMicroserviceBuilder copyFrom) {
			<jk>super</jk>(copyFrom);
		}
	
		<jc>// Additional setters</jc>
	
		<jk>public</jk> MyJettyMicroserviceBuilder extraField(<jk>int</jk> extraField) {
			<jk>this</jk>.<jf>extraField</jf> = extraField;
			<jk>return this</jk>;
		}
	
		<jc>// Overridden methods</jc>
	
		<ja>@Override</ja> <jc>/* JettyMicroserviceBuilder */</jc>
		<jk>public</jk> MyJettyMicroserviceBuilder copy() {
			<jk>return new</jk> MyJettyMicroserviceBuilder(<jk>this</jk>);
		}
	
		<ja>@Override</ja> <jc>/* JettyMicroserviceBuilder */</jc>
		<jk>public</jk> MyJettyMicroserviceBuilder ports(<jk>int</jk>...ports) {
			<jk>super</jk>.ports(ports);
			<jk>return this</jk>;
		}
	
		<ja>@Override</ja> <jc>/* JettyMicroserviceBuilder */</jc>
		<jk>public</jk> MyJettyMicroserviceBuilder servlet(Class&lt;? <jk>extends</jk> RestServlet&gt; c) <jk>throws</jk> InstantiationException, IllegalAccessException {
			<jk>super</jk>.servlet(c);
			<jk>return this</jk>;
		}
	
		...
	}
</p>
</div><!-- END: 12.8 - juneau-microservice-jetty.Extending -->
</div><!-- END: 12 - juneau-microservice-jetty -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#my-jetty-microservice' id='my-jetty-microservice'>13 - my-jetty-microservice</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h2>
<div class='topic'><!-- START: 13 - my-jetty-microservice -->
<div class='warn'>
	The Juneau Microservice libraries are likely to be removed in Juneau 9.0 due to the popularity of the Spring Boot
	framework for creating microservices and the ability for Juneau to be used within Spring Boot.
</div>

<h5 class='figure'>Starter Project Zip</h5>
<p class='bpcode w500'>
	my-jetty-microservice-{@property juneauVersion}.zip 
</p>	

<p>
	The <l>my-jetty-microservice.zip</l> file is a predefined starter Eclipse project for developing
	REST microservices using the {@doc juneau-microservice-jetty juneau-microservice-jetty} package.
</p>
<p>
	It includes a combination of the Juneau Core, Server, and Client APIs and all libraries needed to execute in a Java 1.8+ environment.
</p>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#my-jetty-microservice.Installing' id='my-jetty-microservice.Installing'>13.1 - Installing in Eclipse</a><span class='update'>8.0.0-updated, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 13.1 - my-jetty-microservice.Installing -->
<p>
	Follow these instructions to create a new template project in Eclipse.
</p>		
<ol class='spaced-list'>
	<li>
		Download the <c>my-jetty-microservice-{@property juneauVersion}.zip</c> file from the downloads page
		(located in the binaries) and import it into your workspace as an existing project:
		<br><br>
		<img class='bordered' src='doc-files/my-jetty-microservice.Installing.1.png' style='width:524px'>
	<li>
		Select the archive file and import the project:
		<br><br>
		<img class='bordered' src='doc-files/my-jetty-microservice.Installing.2.png' style='width:549px'>
	<li>
		In your workspace, you should now see the following project:
		<br><br>
		<img class='bordered' src='doc-files/my-jetty-microservice.Installing.3.png' style='width:400px'>
</ol>
<p>
	The important elements in this project are:
</p>
<ul class='spaced-list'>
	<li>
		<l>App.java</l> - The entry point. 
		<br>This class creates and starts our microservice:
		<br><br>
		<p class='bcode w800'>
	<jk>public class</jk> App {
	
		<jk>public static void</jk> main(String[] args) <jk>throws</jk> Exception {
			JettyMicroservice
				.<jsm>create</jsm>()
				.args(args)
				.servlet(RootResources.<jk>class</jk>)
				.build()
				.start()
				.startConsole()
				.join();
		}
	}
		</p>
	<li>
		<l>RootResources.java</l> - The top-level REST resource. 
		<br>This class routes HTTP requests to child resources:
		<br><br>
		<p class='bcode w800'>
	<ja>@Rest</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> BasicRestServletJenaGroup {
		<jc>// No code</jc>
	}
		</p>
	<li>
		<l>my-jetty-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 w800'>
	<cc>#=======================================================================================================================
	# Basic configuration file for REST microservices
	# Subprojects can use this as a starting point.
	#=======================================================================================================================</cc>
	
	<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># Optionally specify your servlets here:
	#servlets = org.apache.juneau.microservice.sample.RootResources</cc>

	<cc>#=======================================================================================================================
	# REST settings
	#=======================================================================================================================</cc>
	<cs>[REST]</cs>
	
	<cc># Comma-delimited list of key-value pairs that represent locations of static files that can be served up by your @Rest-annotated
	# classes.  These are static files that are served up by the servlet under the specified sub-paths.
	# For example, given the following setting...
	# 	staticFiles = htdocs:my-docs,styles/my-styles
	# ...the URI "/servletPath/htdocs/javadoc.css" resolves to the path "/my-docs/javadoc.css".
	# This path can be relative to the working directory, classpath root, or package of your resource class.
	# Used by the BasicRestConfig interface that defines the following value:
	# 	staticFiles="$C{REST/staticFiles}"</cc>
	<ck>staticFiles</ck> = htdocs:htdocs
	
	<cc># Stylesheet to use for HTML views.
	# Used by the BasicRestConfig interface that defines the following value:
	# 	stylesheet="$C{REST/theme,servlet:/htdocs/themes/devops.css}"</cc>
	<ck>theme</ck> = <cv>servlet:/htdocs/themes/devops.css</cv>
	
	<cc># Various look-and-feel settings used in the BasicRestConfig interface.</cc>
	<ck>headerIcon</ck> = <cv>servlet:/htdocs/images/juneau.png</cv>
	<ck>headerLink</ck> = <cv>http://juneau.apache.org</cv>
	<ck>footerIcon</ck> = <cv>servlet:/htdocs/images/asf.png</cv>
	<ck>footerLink</ck> = <cv>http://www.apache.org</cv>
	<ck>favicon</ck> = <cv>$C{REST/headerIcon}</cv>
	<ck>header</ck> = 
		<cv>&lt;a href='$U{$C{REST/headerLink}}'&gt;
			&lt;img src='$U{$C{REST/headerIcon}}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;
		&lt;/a&gt;</cv>
	<ck>footer</ck> = 
		<cv>&lt;a href='$U{$C{REST/footerLink}}'&gt;
			&lt;img src='$U{$C{REST/footerIcon}}' style='float:right;padding-right:20px;height:32px'/&gt;
		&lt;/a&gt;</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,
		org.apache.juneau.microservice.console.ConfigCommand</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.jetty.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 w800'>
	<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>
			<xc>&lt;!-- Optionally specify your servlets here --&gt;
			&lt;!--Call name="addServlet"&gt;
				&lt;Arg&gt;org.apache.juneau.microservice.sample.RootResources&lt;/Arg&gt;
				&lt;Arg&gt;/*&lt;/Arg&gt;
			&lt;/Call--&gt;</xc>
			<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><!-- END: 13.1 - my-jetty-microservice.Installing -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#my-jetty-microservice.Running' id='my-jetty-microservice.Running'>13.2 - Running in Eclipse</a><span class='update'>8.0.0-updated, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 13.2 - my-jetty-microservice.Running -->
<p>
	The <l>my-jetty-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-jetty-microservice</b> and click <b>Run</b>.
	In your console view, you should see the following output:
</p>
<p class='bpcode w800 console'>
	Running class 'JettyMicroservice' using config file 'my-jetty-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>
<p class='bpcode w400'>
	http://localhost:10000
</p>			
<img class='bordered w400' src='doc-files/my-jetty-microservice.Running.1.png'>
<p>
	You can enter the command <c>exit</c> to shut it down.
</p>
</div><!-- END: 13.2 - my-jetty-microservice.Running -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#my-jetty-microservice.Building' id='my-jetty-microservice.Building'>13.3 - Building and Running from Command-Line</a><span class='update'>8.0.0-updated, 8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 13.3 - my-jetty-microservice.Building -->
<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='bpcode w800'>
	mvn clean install
</p>
<p>
	Your <c>target</c> directory should now contain the following files:
</p>
<ul>
	<li><c>my-jetty-microservice-1.0.jar</c>
	<li><c>my-jetty-microservice.cfg</c>
</ul>
<p>
	To start from a command line, run the following command from inside your <c>target</c> directory:
</p>
<p class='bpcode w800'>
	java -jar my-jetty-microservice-1.0.jar
</p>
<p>
	You should see the following console output:
</p>
<p class='bpcode w800 console'>
	Running class 'JettyMicroservice' using config file 'my-jetty-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><!-- END: 13.3 - my-jetty-microservice.Building -->
</div><!-- END: 13 - my-jetty-microservice -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#my-springboot-microservice' id='my-springboot-microservice'>14 - my-springboot-microservice</a><span class='update'>8.0.0-new</span></h2>
<div class='topic'><!-- START: 14 - my-springboot-microservice -->
<h5 class='figure'>Starter Project Zip</h5>
<p class='bpcode w500'>
	my-springboot-microservice-{@property juneauVersion}.zip 
</p>	

<p>
	The <l>my-springboot-microservice.zip</l> file is a predefined starter Eclipse project for developing
	REST microservices using the {@doc juneau-rest-server-springboot juneau-rest-server-springboot} package with Spring Boot.
</p>
<p>
	It includes a combination of the Juneau Core, Server, and Client APIs and all libraries needed to execute in a Java 1.8+ environment.
</p>
<p>
	One significant difference is that we are not using the Juneau {@link org.apache.juneau.microservice.Microservice} API for our
	application but instead using the existing Spring Boot API.
</p>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#my-springboot-microservice.Installing' id='my-springboot-microservice.Installing'>14.1 - Installing in Eclipse</a><span class='update'>8.0.0-new</span></h3>
<div class='topic'><!-- START: 14.1 - my-springboot-microservice.Installing -->
<p>
	Follow these instructions to create a new template project in Eclipse.
</p>		
<ol class='spaced-list'>
	<li>
		Download the <c>my-springboot-microservice-{@property juneauVersion}.zip</c> file from the downloads page
		(located in the binaries) and import it into your workspace as an existing project:
		<br><br>
		<img class='bordered' src='doc-files/my-springboot-microservice.Installing.1.png' style='width:524px'>
	<li>
		Select the archive file and import the project:
		<br><br>
		<img class='bordered' src='doc-files/my-springboot-microservice.Installing.2.png' style='width:549px'>
	<li>
		In your workspace, you should now see the following project:
		<br><br>
		<img class='bordered' src='doc-files/my-springboot-microservice.Installing.3.png' style='width:400px'>
</ol>
<p>
	The important elements in this project are:
</p>
<ul class='spaced-list'>
	<li>
		<l>App.java</l> - The entry point. 
		<br>This class creates and starts our microservice.
		<br>Note that we're using the existing Spring Boot application logic for the microservice and we're retrieving
		our root resource as a spring bean.
		<br>Only the top-level resource needs to be annotated with {@link org.apache.juneau.rest.springboot.annotation.JuneauRestRoot @JuneauRestRoot}
		<br><br>
		<p class='bcode w800'>
	<ja>@SpringBootApplication</ja>
	<ja>@Controller</ja>
	<jk>public class</jk> App {
	
		<jk>public static void</jk> main(String[] args) {
			<jk>new</jk> SpringApplicationBuilder(App.<jk>class</jk>)
				.initializers(<jk>new</jk> JuneauRestInitializer(App.<jk>class</jk>))
				.run(args);
		}
	
		<ja>@Bean @JuneauRestRoot</ja>
		<jk>public</jk> RootResources getRootResources() {
			<jk>return new</jk> RootResources();
		}
	}
		</p>
	<li>
		<l>RootResources.java</l> - The top-level REST resource. 
		<br>This class routes HTTP requests to child resources.
		<br>This is identical to the Jetty example.
		<br><br>
		<p class='bcode w800'>
	<ja>@Rest</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> BasicRestServletJenaGroup {
		<jc>// No code</jc>
	}
		</p>
	<li>
		<l>juneau.cfg</l> - The configuration file. 
		<br>Contains various useful settings.
		<br>Can be used for your own resource configurations.
		<br>Note that the Jetty configuration is not present.
		<br>Also it's located in the classpath so that our microservice can be built as a single executable jar. 
		<br><br>
		<p class='bcode w800'>
	<cc>#=======================================================================================================================
	# Basic configuration file for REST microservices
	# Subprojects can use this as a starting point.
	#=======================================================================================================================</cc>
	
	<cc>#=======================================================================================================================
	# REST settings
	#=======================================================================================================================</cc>
	<cs>[REST]</cs>
	
	<cc># Comma-delimited list of key-value pairs that represent locations of static files that can be served up by your @Rest-annotated
	# classes.  These are static files that are served up by the servlet under the specified sub-paths.
	# For example, given the following setting...
	# 	staticFiles = htdocs:my-docs,styles/my-styles
	# ...the URI "/servletPath/htdocs/javadoc.css" resolves to the path "/my-docs/javadoc.css".
	# This path can be relative to the working directory, classpath root, or package of your resource class.
	# Used by the BasicRestConfig interface that defines the following value:
	# 	staticFiles="$C{REST/staticFiles}"</cc>
	<ck>staticFiles</ck> = htdocs:htdocs
	
	<cc># Stylesheet to use for HTML views.
	# Used by the BasicRestConfig interface that defines the following value:
	# 	stylesheet="$C{REST/theme,servlet:/htdocs/themes/devops.css}"</cc>
	<ck>theme</ck> = <cv>servlet:/htdocs/themes/devops.css</cv>
	
	<cc># Various look-and-feel settings used in the BasicRestConfig interface.</cc>
	<ck>headerIcon</ck> = <cv>servlet:/htdocs/images/juneau.png</cv>
	<ck>headerLink</ck> = <cv>http://juneau.apache.org</cv>
	<ck>footerIcon</ck> = <cv>servlet:/htdocs/images/asf.png</cv>
	<ck>footerLink</ck> = <cv>http://www.apache.org</cv>
	<ck>favicon</ck> = <cv>$C{REST/headerIcon}</cv>
	<ck>header</ck> = 
		<cv>&lt;a href='$U{$C{REST/headerLink}}'&gt;
			&lt;img src='$U{$C{REST/headerIcon}}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;
		&lt;/a&gt;</cv>
	<ck>footer</ck> = 
		<cv>&lt;a href='$U{$C{REST/footerLink}}'&gt;
			&lt;img src='$U{$C{REST/footerIcon}}' style='float:right;padding-right:20px;height:32px'/&gt;
		&lt;/a&gt;</cv>
	</p>
</ul>
<p>
	At this point, you're ready to start the microservice from your workspace.
</p>
</div><!-- END: 14.1 - my-springboot-microservice.Installing -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#my-springboot-microservice.Running' id='my-springboot-microservice.Running'>14.2 - Running in Eclipse</a><span class='update'>8.0.0-new</span></h3>
<div class='topic'><!-- START: 14.2 - my-springboot-microservice.Running -->
<p>
	The <l>my-springboot-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-springboot-microservice</b> and click <b>Run</b>.
	In your console view, you should see the following output:
</p>
<p class='bpcode w800'>
	  .   ____          _            __ _ _
	 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
	( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
	 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
	  '  |____| .__|_| |_|_| |_\__, | / / / /
	 =========|_|==============|___/=/_/_/_/
	 :: Spring Boot ::        (v2.0.1.RELEASE)
	...
	INFO: Tomcat started on port(s): 8080 (http) with context path ''
	Dec 21, 2012 12:30:00 AM org.springframework.boot.StartupInfoLogger logStarted
	INFO: Started App in 1.999 seconds (JVM running for 2.999)
</p>
<p>
	Now open your browser and point to <l>http://localhost:5000</l>.  
	You should see the following:
</p>
<p class='bpcode w400'>
	http://localhost:5000
</p>			
<img class='bordered w400' src='doc-files/my-springboot-microservice.Running.1.png'>
</div><!-- END: 14.2 - my-springboot-microservice.Running -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#my-springboot-microservice.Building' id='my-springboot-microservice.Building'>14.3 - Building and Running from Command-Line</a><span class='update'>8.0.0-new</span></h3>
<div class='topic'><!-- START: 14.3 - my-springboot-microservice.Building -->
<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='bpcode w800'>
	mvn clean install
</p>
<p>
	Your <c>target</c> directory should now contain the following files:
</p>
<ul>
	<li><c>my-springboot-microservice-1.0.jar</c>
</ul>
<p>
	To start from a command line, run the following command from inside your <c>target</c> directory:
</p>
<p class='bpcode w800'>
	java -jar my-springboot-microservice-1.0.jar
</p>
<p>
	You should see the following console output:
</p>
<p class='bpcode w800 console'>
	  .   ____          _            __ _ _
	 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
	( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
	 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
	  '  |____| .__|_| |_|_| |_\__, | / / / /
	 =========|_|==============|___/=/_/_/_/
	 :: Spring Boot ::        (v2.0.1.RELEASE)
	...
	INFO: Tomcat started on port(s): 8080 (http) with context path ''
	Dec 21, 2012 12:30:00 AM org.springframework.boot.StartupInfoLogger logStarted
	INFO: Started App in 1.999 seconds (JVM running for 2.999)
</p>
</div><!-- END: 14.3 - my-springboot-microservice.Building -->
</div><!-- END: 14 - my-springboot-microservice -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-examples-core' id='juneau-examples-core'>15 - juneau-examples-core</a><span class='update'>8.0.0-updated</span></h2>
<div class='topic'><!-- START: 15 - juneau-examples-core -->
<h5 class='figure'>Archive File</h5>
<p class='bpcode w500'>
	juneau-examples-core-{@property juneauVersion}.zip 
</p>	

<p>
	The <c>juneau-examples-core</c> project contains various code examples for using the core APIs. 
</p>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-core.Installing' id='juneau-examples-core.Installing'>15.1 - Installing in Eclipse</a><span class='update'>8.0.0-new</span></h3>
<div class='topic'><!-- START: 15.1 - juneau-examples-core.Installing -->
<p>
	Follow these instructions to import the Juneau project into Eclipse.
</p>		
<ol class='spaced-list'>
	<li>
		Download the <c>juneau-examples-core-{@property juneauVersion}.zip</c> file from the downloads page
		(located in the binaries) and import it into your workspace as an existing project:
		<br><br>
		<img class='bordered' src='doc-files/juneau-examples-core.Installing.1.png' style='width:524px'>
	<li>
		Select the archive file and import the project:
		<br><br>
		<img class='bordered' src='doc-files/juneau-examples-core.Installing.2.png' style='width:549px'>
	<li>
		In your workspace, you should now see the following project:
		<br><br>
		<img class='bordered' src='doc-files/juneau-examples-core.Installing.3.png' style='width:400px'>
</ol>
</div><!-- END: 15.1 - juneau-examples-core.Installing -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-core.Examples' id='juneau-examples-core.Examples'>15.2 - Examples</a><span class='update'>8.0.0-new</span></h3>
<div class='topic'><!-- START: 15.2 - juneau-examples-core.Examples -->
<p>
	The following shows the core examples provided:
</p>
<ul class='javatree'>
	<li class='jp'>{@link org.apache.juneau.examples.core.json}
	<ul>
		<li class='jc'>{@link org.apache.juneau.examples.core.json.JsonSimpleExample} - JsonSerializer and JsonParser usage on serialize and deserialize simple Pojo bean.
		<li class='jc'>{@link org.apache.juneau.examples.core.json.JsonComplexExample} - JsonSerializer and JsonParser usage on serialize and deserialize complex Pojo bean.
		<li class='jc'>{@link org.apache.juneau.examples.core.json.JsonConfigurationExample} - Json Serializers configured using properties defined in JsonSerializer class.
	</ul>
	<li class='jp'>{@link org.apache.juneau.examples.core.xml}
	<ul>
		<li class='jc'>{@link org.apache.juneau.examples.core.xml.XmlSimpleExample} - XmlSerializer and XmlParser usage on serialize and deserialize simple Pojo bean.
		<li class='jc'>{@link org.apache.juneau.examples.core.xml.XmlComplexExample} - XmlSerializer and XmlParser usage on serialize and deserialize complex Pojo bean.
		<li class='jc'>{@link org.apache.juneau.examples.core.xml.XmlConfigurationExample} - XmlSerializers configured using properties defined in XmlSerializer class.
	</ul>
	<li class='jp'>{@link org.apache.juneau.examples.core.dto}
		<ul>
			<li class='jc'>{@link org.apache.juneau.examples.core.dto.DtoExample} - Usage of core dto module.
		</ul>
	<li class='jp'>{@link org.apache.juneau.examples.core.rdf}
	<ul>
		<li class='jc'>{@link org.apache.juneau.examples.core.rdf.RdfExample} - RdfXmlSerializer usage on serialize simple Pojo bean.
		<li class='jc'>{@link org.apache.juneau.examples.core.rdf.RdfComplexExample} - RdfXmlSerializer usage on serialize complex Pojo bean.
	</ul>
	<li class='jp'>{@link org.apache.juneau.examples.core.html}
		<ul>
			<li class='jc'>{@link org.apache.juneau.examples.core.html.HtmlSimpleExample} - HtmlSerializer usage on serialize and deserialize simple Pojo bean.
			<li class='jc'>{@link org.apache.juneau.examples.core.html.HtmlComplexExample} - HtmlSerializer usage on serialize and deserialize complex Pojo bean.
		</ul>
	<li class='jp'>{@link org.apache.juneau.examples.core.uon}
		<ul>
			<li class='jc'>{@link org.apache.juneau.examples.core.uon.UONExample} - UonSerializer usage on serialize and deserialize simple Pojo bean.
			<li class='jc'>{@link org.apache.juneau.examples.core.uon.UONComplexExample} - UonSerializer usage on serialize and deserialize complex Pojo bean.
		</ul>
	<li class='jp'>{@link org.apache.juneau.examples.core.svl}
		<ul>
			<li class='jc'>{@link org.apache.juneau.examples.core.svl.SvlExample} - Usage of Svl module in juneau.
		</ul>
</ul>
</div><!-- END: 15.2 - juneau-examples-core.Examples -->
</div><!-- END: 15 - juneau-examples-core -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest' id='juneau-examples-rest'>16 - juneau-examples-rest</a><span class='update'>8.0.0-updated</span></h2>
<div class='topic'><!-- START: 16 - juneau-examples-rest -->
<h5 class='figure'>Maven Dependency</h5>
<p class='bpcode w500'>
	<xt>&lt;dependency&gt;</xt>
		<xt>&lt;groupId&gt;</xt>org.apache.juneau<xt>&lt;/groupId&gt;</xt>
		<xt>&lt;artifactId&gt;</xt>juneau-examples-rest<xt>&lt;/artifactId&gt;</xt>
		<xt>&lt;version&gt;</xt>{@property juneauVersion}<xt>&lt;/version&gt;</xt>
	<xt>&lt;/dependency&gt;</xt>
</p>	

<h5 class='figure'>Java Library</h5>
<p class='bpcode w500'>
	juneau-examples-rest-{@property juneauVersion}.jar 
</p>	

<h5 class='figure'>OSGi Module</h5>
<p class='bpcode w500'>
	org.apache.juneau.examples.rest_{@property juneauVersion}.jar 
</p>	

<p>
	The <c>juneau-examples-rest</c> project includes various examples of REST resources written
	using Juneau.
</p>
<p>
	Note:  These examples can be deployed as buildable Eclipse projects using Jetty or Spring Boot using instructions
	in the following sections:
</p>
<ul class='spaced-list'>
	<li>{@doc juneau-examples-rest-jetty}
	<li>{@doc juneau-examples-rest-springboot}
</ul>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest.RootResources' id='juneau-examples-rest.RootResources'>16.1 - RootResources</a><span class='update'>8.0.0-updated, 8.1.0-updated</span></h3>
<div class='topic'><!-- START: 16.1 - juneau-examples-rest.RootResources -->
<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='javatree'>
	<li class='jac'>
		{@link org.apache.juneau.rest.RestServlet} - Contains all the REST servlet logic.
		<ul>
			<li class='jac'>
				{@link org.apache.juneau.rest.BasicRestServlet} - Defines default serializers and parsers, and OPTIONs page logic.
				<ul>
					<li class='jac'>
						{@link org.apache.juneau.rest.BasicRestServletGroup} - Specialized subclass for grouping other resources.
						<ul>
							<li class='jac'>
								{@link org.apache.juneau.rest.BasicRestServletJenaGroup} - Group resource with added RDF support.
								<ul>
									<li class='jc'>
										<c>RootResources</c>
								</ul>
							</li>
						</ul>
					</li>
				</ul>
			</li>
		</ul>
	</li>
</ul>
<p>
	Pointing a browser to the resource shows the following:
</p>
<p class='bpcode w800'>
	http://localhost:10000
</p>			
<img class='bordered w800' src='doc-files/juneau-examples-rest.RootResources.1.png'>
<p>
	The <l>RootResources</l> class can also be defined as a servlet in a <l>web.xml</l> file:
</p>
<p class='bpcode w800'>
	<xt>&lt;web-app</xt> <xa>version</xa>=<xs>'3.0'</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.examples.rest.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='bpcode w800'>
	<jd>/**
	 * Sample REST resource showing how to implement a "router" resource page.
	 */</jd>
	<ja>@Rest</ja>(
		path=<js>"/"</js>,
		title=<js>"Root resources"</js>,
		description=<js>"Example of a router resource page."</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			widgets={
				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>
			},
			aside={
				<js>"&lt;div style='max-width:400px' class='text'&gt;"</js>,
				<js>"	&lt;p&gt;This is an example of a 'router' page that serves as a jumping-off point to child resources.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Resources can be nested arbitrarily deep through router pages.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Note the &lt;span class='link'&gt;options&lt;/span&gt; link provided that lets you see the generated swagger doc for this page.&lt;/p&gt;"</js>,
				<js><js>"	&lt;p&gt;Also note the &lt;span class='link'&gt;sources&lt;/span&gt; link on these pages to view the source code for the page.&lt;/p&gt;"</js>,
				"	&lt;p&gt;All content on pages in the UI are serialized POJOs.  In this case, it's a serialized array of beans with 2 properties, 'name' and 'description'.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Other features (such as this aside) are added through annotations.&lt;/p&gt;"</js>,
				<js>"&lt;/div&gt;"</js>
			}
		),
		children={
			HelloWorldResource.<jk>class</jk>,
			PetStoreResource.<jk>class</jk>,
			DtoExamples.<jk>class</jk>,
			ConfigResource.<jk>class</jk>,
			LogsResource.<jk>class</jk>,
			DebugResource.<jk>class</jk>,
			ShutdownResource.<jk>class</jk>
		}
	)
	<ja>@SerializerConfig</ja>(
		<jc>// For testing purposes, we want to use single quotes in all the serializers so it's easier to do simple
		// String comparisons.</jc>
		quoteChar=<js>"'"</js>
	)
	<jk>public class</jk> RootResources <jk>extends</jk> BasicRestServletJenaGroup {
		<jc>// No code!</jc>
	}
</p>
<p>
	The <l>children</l> annotation defines the child resources of this router resource.
	These are resources whose paths are direct descendants to the parent resource.			
</p>
<p>
	Child resources must be annotated with the {@link org.apache.juneau.rest.annotation.Rest#path() @Rest(path)} annotation to 
	identify the subpath of the child.
	Children CAN extend from {@link org.apache.juneau.rest.BasicRestServlet} but it is not a requirement.
</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>
<p>
	Let's step back and describe what's going on here:
</p>
<p>
	During servlet initialization of the <l>RootResources</l> object, the toolkit looks for the 
	<l>@Rest(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>@Rest(path)</l> annotation on the child class.  
</p>
<p>
	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).
</p>
</div><!-- END: 16.1 - juneau-examples-rest.RootResources -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest.HelloWorldResource' id='juneau-examples-rest.HelloWorldResource'>16.2 - HelloWorldResource</a><span class='update'>8.0.0-updated</span></h3>
<div class='topic'><!-- START: 16.2 - juneau-examples-rest.HelloWorldResource -->
<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='bpcode w800'>
	<jd>/** 
	* Sample REST resource that prints out a simple "Hello world!" message. 
	*/</jd> 
	<ja>@Rest</ja>( 
		title=<js>"Hello World"</js>,
		description=<js>"An example of the simplest-possible resource"</js>,
		path=<js>"/helloWorld"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			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>implements</jk> BasicRestConfig { 
		
		<jd>/** GET request handler */</jd> 
		<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>
	Notice that in this case we're not extending from {@link org.apache.juneau.rest.RestServlet}.  
	We are however implementing {@link org.apache.juneau.rest.BasicRestConfig} which is a no-op
	interface that defines a default <ja>@Rest</ja> annotation with all the serializers, parsers, 
	and configuration defined on the {@link org.apache.juneau.rest.BasicRestServlet} class.
</p>
<p>
	The only difference between implementing <l>BasicRestConfig</l> and extending from <l>BasicRestServlet</l>
	is that the latter provides the following additional features:
</p>
<ul class='spaced-list'>
	<li>A default OPTIONS method.
	<li>It can be deployed like any servlet.
</ul>
<p>
	All other examples in this project extend from <l>BasicRestServlet</l> so that they provide automatic OPTIONS page support.
</p>
<p>
	Pointing a browser to the resource shows the following:
</p>
<p class='bpcode w800'>
	http://localhost:10000/helloWorld
</p>			
<img class='bordered w800' src='doc-files/juneau-examples-rest.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>		
<p class='bpcode w800'>
	http://localhost:10000/helloWorld?Accept=text/json&amp;plainText=true
</p>			
<img class='bordered w800' src='doc-files/juneau-examples-rest.HelloWorldResource.2.png'>
</div><!-- END: 16.2 - juneau-examples-rest.HelloWorldResource -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest.DtoExamples' id='juneau-examples-rest.DtoExamples'>16.3 - DtoExamples</a><span class='update'>8.0.0-new, 8.1.0-updated</span></h3>
<div class='topic'><!-- START: 16.3 - juneau-examples-rest.DtoExamples -->
<p>
	The <l>DtoExamples</l> resource is a resource group for demonstrating various DTO examples.
</p>
<p>	
	The <l>AtomFeedResource</l> class shows examples of the following:
</p>
<ul class='spaced-list'>
	<li>
		Using the {@doc org.apache.juneau.dto.atom#TOC ATOM Feed DTO} API.
</ul>
<p>
	Pointing a browser to the resource shows the following:
</p>
<p class='bpcode w800'>
	http://localhost:10000/atom
</p>			
<img class='bordered w800' src='doc-files/juneau-examples-rest.AtomFeedResource.1.png'>
<p>
	True ATOM feeds require using an <l>Accept:text/xml</l> header:
</p>
<p class='bpcode w800'>
	http://localhost:10000/atom?Accept=text/xml&amp;plainText=true
</p>			
<img class='bordered w800' src='doc-files/juneau-examples-rest.AtomFeedResource.2.png'>
<p>
	Other languages, such as JSON are also supported:
</p>
<p class='bpcode w800'>
	http://localhost:10000/atom?Accept=text/json&amp;plainText=true
</p>			
<img class='bordered w800' src='doc-files/juneau-examples-rest.AtomFeedResource.3.png'>

<h5 class='figure'>AtomFeedResource.java</h5>
<p class='bpcode w800'>
	<jd>/** 
	* Sample resource that shows how to generate ATOM feeds. 
	*/</jd> 
	<ja>@Rest</ja>( 
		path=<js>"/atom"</js>,
		title=<js>"Sample ATOM feed resource"</js>,
		description=<js>"Sample resource that shows how to render ATOM feeds"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			widgets={
				ContentTypeMenuItem.<jk>class</jk>,
				StyleMenuItem.<jk>class</jk>
			},
			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/$R{servletClassSimple}.java"</js>
			}
		),
		encoders=GzipEncoder.<jk>class</jk> 
	) 
	<ja>@SerializerConfig</ja>(quoteChar=<js>"'"</js>)
	<ja>@RdfConfig</ja>(rdfxml_tab=<js>"5"</js>, addRootProperty=<js>"true"</js>)
	<jk>public class</jk> AtomFeedResource <jk>extends</jk> BasicRestServletJena { 
	
		<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> =
					<jsm>feed</jsm>(<js>"tag:juneau.sample.com,2013:1"</js>, <js>"Juneau ATOM specification"</js>, <js>"2013-05-08T12:29:29Z"</js>)
					.subtitle(<jsm>text</jsm>(<js>"html"</js>).text(<js>"A &lt;em&gt;lot&lt;/em&gt; of effort went into making this effortless"</js>))
					.links(
						<jsm>link</jsm>(<js>"alternate"</js>, <js>"text/html"</js>, <js>"http://www.sample.com/"</js>).hreflang(<js>"en"</js>),
						<jsm>link</jsm>(<js>"self"</js>, <js>"application/atom+xml"</js>, <js>"http://www.sample.com/feed.atom"</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>"2013-05-08T12:29:29Z"</js>)
						.links(
							<jsm>link</jsm>(<js>"alternate"</js>, <js>"text/html"</js>, <js>"http://www.sample.com/2012/05/08/juneau.atom"</js>),
							<jsm>link</jsm>(<js>"enclosure"</js>, <js>"audio/mpeg"</js>, <js>"http://www.sample.com/audio/juneau_podcast.mp3"</js>).length(1337)
						)
						.published(<js>"2013-05-08T12:29:29Z"</js>)
						.authors(
							<jsm>person</jsm>(<js>"James Bognar"</js>).uri(<jk>new</jk> URI(<js>"http://www.sample.com/"</js>)).email(<js>"jamesbognar@apache.org"</js>)
						)
						.contributors(
							<jsm>person</jsm>(<js>"Barry M. Caceres"</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;[Update: Juneau supports ATOM.]&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>@Body</ja> Feed feed) <jk>throws</jk> Exception { 
			<jk>this</jk>.<jf>feed</jf> = feed; 
			<jk>return</jk> feed; 
		} 
	} 		
</p>
<p>	
	The <l>JsonSchemaResource</l> class shows examples of the following:
</p>
<ul class='spaced-list'>
	<li>
		Using the {@link org.apache.juneau.dto.jsonschema JSON Schema DTO} API.
</ul>
<p>
	The resource consists of a pre-initialized {@link org.apache.juneau.dto.jsonschema.JsonSchema} object.
	Pointing a browser to the resource shows the following:
</p>
<p class='bpcode w800'>
	http://localhost:10000/jsonSchema
</p>			
<img class='bordered w800' src='doc-files/juneau-examples-rest.JsonSchemaResource.1.png'>
<p>
	For true JSON-Schema, you need to specify the header <l>Accept: text/json</l>:
</p>
<p class='bpcode w800'>
	http://localhost:10000/jsonSchema?Accept=text/json&amp;plainText=true
</p>			
<img class='bordered w800' src='doc-files/juneau-examples-rest.JsonSchemaResource.2.png'>

<h5 class='figure'>JsonSchemaResource.java</h5>
<p class='bpcode w800'>
	<jd>/** 
	* Sample resource that shows how to serialize JSON-Schema documents. 
	*/</jd> 
	<ja>@Rest</ja>( 
		path=<js>"/jsonSchema"</js>,
		messages=<js>"nls/JsonSchemaResource"</js>,
		title=<js>"Sample JSON-Schema document"</js>,
		description=<js>"Sample resource that shows how to generate JSON-Schema documents"</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			widgets={
				ContentTypeMenuItem.<jk>class</jk>,
				StyleMenuItem.<jk>class</jk>
			},
			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/$R{servletClassSimple}.java"</js>
			},
			aside={
				<js>"&lt;div style='min-width:200px' class='text'&gt;"</js>,
				<js>"	&lt;p&gt;Shows how to produce JSON-Schema documents in a variety of languages using the JSON-Schema DTOs.&lt;/p&gt;"</js>,
				<js>"&lt;/div&gt;"</js>
			}
		)
	) 
	<jk>public class</jk> JsonSchemaResource <jk>extends</jk> BasicRestServletJena { 
		<jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; 
		
		<jk>private</jk> JsonSchema schema; <jc>// The schema document</jc> 
		
		<ja>@Override</ja> /* Servlet */ 
		<jk>public void</jk> init() { 
			
			<jk>try</jk> { 
				<jf>schema</jf> = <jk>new</jk> JsonSchema() 
					.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> JsonSchemaProperty(<js>"firstName"</js>, JsonType.<jsf>STRING</jsf>), 
						<jk>new</jk> JsonSchemaProperty(<js>"lastName"</js>, JsonType.<jsf>STRING</jsf>), 
						<jk>new</jk> JsonSchemaProperty(<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> JsonSchema 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> JsonSchema setSchema(<ja>@Body</ja> JsonSchema schema) <jk>throws</jk> Exception { 
			<jk>this</jk>.<jf>schema</jf> = schema; 
			<jk>return</jk> schema; 
		} 
	} 		
</p>
</div><!-- END: 16.3 - juneau-examples-rest.DtoExamples -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest.ConfigResource' id='juneau-examples-rest.ConfigResource'>16.4 - ConfigResource</a></h3>
<div class='topic'><!-- START: 16.4 - juneau-examples-rest.ConfigResource -->
<p>
	The {@link org.apache.juneau.microservice.resources.ConfigResource} class is a predefined reusable resource.
	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>
<p class='bpcode w800'>
	http://localhost:10000/config
</p>			
<img class='bordered w800' src='doc-files/juneau-examples-rest.ConfigResource.1.png'>
<p>
	An edit page is provided for altering the raw config file:
</p>
<p class='bpcode w800'>
	http://localhost:10000/config/edit
</p>			
<img class='bordered w800' src='doc-files/juneau-examples-rest.ConfigResource.2.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='bpcode w800'>
	<jd>/** 
	* Shows contents of the microservice configuration file. 
	*/</jd> 
	<ja>@Rest</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> BasicRestServlet { 
		
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>, description=<js>"Show contents of config file."</js>) 
		<jk>public</jk> ObjectMap getConfig() <jk>throws</jk> Exception {
			<jk>return</jk> getServletConfig().getConfig().asMap();
		}
		
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/edit"</js>, description=<js>"Edit config file."</js>)
		<jk>public</jk> Form getConfigEditForm(RestRequest req) <jk>throws</jk> Exception {
			<jk>return</jk> <jsm>form</jsm>().id(<js>"form"</js>).action(<js>"servlet:/"</js>).method(<js>"POST"</js>).enctype(<js>"application/x-www-form-urlencoded"</js>).children(
				<jsm>div</jsm>()._class(<js>"data"</js>).children(
					<jsm>table</jsm>(
						<jsm>tr</jsm>(<jsm>td</jsm>().style(<js>"text-align:right"</js>).children(<jsm>button</jsm>(<js>"submit"</js>,<js>"Submit"</js>),<jsm>button</jsm>(<js>"reset"</js>,<js>"Reset"</js>))),
						<jsm>tr</jsm>(<jsm>th</jsm>().child(<js>"Contents"</js>)),
						<jsm>tr</jsm>(<jsm>th</jsm>().child(
							<jsm>textarea</jsm>().name(<js>"contents"</js>).rows(40).cols(120).style(<js>"white-space:pre;word-wrap:normal;overflow-x:scroll;font-family:monospace;"</js>)
								.text(getServletConfig().getConfig().toString()))
						)
					)
				)
			);
		}
		
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{section}"</js>, 
			description=<js>"Show config file section."</js>, 
			swagger={
				<js>"parameters:["</js>,
					<js>"{name:'section',in:'path',description:'Section name.'}"</js>,
				<js>"]"</js>
			}
		) 
		<jk>public</jk> ObjectMap getConfigSection(<ja>@Path</ja>(<js>"section"</js>) String section) <jk>throws</jk> Exception { 
			<jk>return</jk> getSection(section); 
		} 
		
		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/{section}/{key}"</js>, 
			description=<js>"Show config file entry."</js>, 
			swagger={
				<js>"parameters:["</js>,
					<js>"{name:'section',in:'path',description:'Section name.'},"</js>,
					<js>"{name:'key',in:'path',description:'Entry name.'}"</js>,
				<js>"]"</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); 
		} 
		
		<ja>@RestMethod</ja>(name=<jsf>POST</jsf>, path=<js>"/"</js>, 
			description=<js>"Sets contents of config file from a FORM post."</js>, 
			swagger={
				<js>"parameters:["</js>,
					<js>"{name:'contents',in:'formData',description:'New contents in INI file format.'}"</js>,
				<js>"]"</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)); 
		} 
		
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/"</js>, 
			description=<js>"Sets contents of config file."</js>, 
			swagger={
				<js>"parameters:["</js>,
					<js>"{in:'body',description:'New contents in INI file format.'}"</js>,
				<js>"]"</js>
			}
		) 
		<jk>public</jk> Config setConfigContents(<ja>@Body</ja> Reader contents) <jk>throws</jk> Exception { 
			<jk>return</jk> getServletConfig().getConfig().load(contents, <jk>true</jk>).asMap();
		} 
		
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/{section}"</js>, 
			description=<js>"Add or overwrite a config file section."</js>, 
			swagger={
				<js>"parameters:["</js>,
					<js>"{name:'section',in:'path',description:'Section name.'}"</js>,
					<js>"{in:'body',description:'New contents for section as a simple map with string keys and values.'}"</js>,
				<js>"]"</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 { 
			getServletConfig().getConfig().setSection(section, contents); 
			<jk>return</jk> getSection(section); 
		} 
		
		<ja>@RestMethod</ja>(name=<jsf>PUT</jsf>, path=<js>"/{section}/{key}"</js>, 
			description=<js>"Add or overwrite a config file entry."</js>, 
			swagger={
				<js>"parameters:["</js>,
					<js>"{name:'section',in:'path',description:'Section name.'}"</js>,
					<js>"{name:'key',in:'path',description:'Entry name.'}"</js>,
					<js>"{in:'body',description:'New value as a string.'}"</js>,
				<js>"]"</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 { 
			getServletConfig().getConfig().put(section, key, value, <jk>false</jk>); 
			<jk>return</jk> getSection(section).getString(key); 
		} 
		
		<jk>private</jk> ObjectMap getSection(String name) { 
			ObjectMap m = getServletConfig().getConfig().getSectionMap(name); 
			<jk>if</jk> (m == <jk>null</jk>) 
				<jk>throw new</jk> RestException(<jsf>SC_NOT_FOUND</jsf>, <js>"Section not found."</js>); 
			<jk>return</jk> m; 
		} 
	} 		
</p>
</div><!-- END: 16.4 - juneau-examples-rest.ConfigResource -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest.LogsResource' id='juneau-examples-rest.LogsResource'>16.5 - LogsResource</a></h3>
<div class='topic'><!-- START: 16.5 - juneau-examples-rest.LogsResource -->
<p>
	The {@link org.apache.juneau.microservice.resources.LogsResource} class is a reusable predefined resource.
	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>
<p class='bpcode w800'>
	http://localhost:10000/logs
</p>			
<img class='bordered w800' src='doc-files/juneau-examples-rest.LogsResource.1.png'>
</div><!-- END: 16.5 - juneau-examples-rest.LogsResource -->
</div><!-- END: 16 - juneau-examples-rest -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest-jetty' id='juneau-examples-rest-jetty'>17 - juneau-examples-rest-jetty</a><span class='update'>8.0.0-new, 8.1.2-deprecated</span></h2>
<div class='topic'><!-- START: 17 - juneau-examples-rest-jetty -->
<div class='warn'>
	The Juneau Microservice libraries are likely to be removed in Juneau 9.0 due to the popularity of the Spring Boot
	framework for creating microservices and the ability for Juneau to be used within Spring Boot.
</div>

<h5 class='figure'>Starter Project Zip</h5>
<p class='bpcode w500'>
	juneau-examples-rest-jetty-{@property juneauVersion}.zip 
</p>	

<p>
	The <c>juneau-examples-rest-jetty</c> project includes everything you need create a Samples REST 
	microservice in an Eclipse workspace and build it as an executable jar.
</p>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest-jetty.Installing' id='juneau-examples-rest-jetty.Installing'>17.1 - Installing in Eclipse</a><span class='update'>8.0.0-new,8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 17.1 - juneau-examples-rest-jetty.Installing -->
<p>
	Follow these instructions to import the REST examples project using Jetty into Eclipse.
</p>		
<ol class='spaced-list'>
	<li>
		Download the <c>juneau-examples-rest-jetty-{@property juneauVersion}.zip</c> file from the downloads page
		(located in the binaries) and import it into your workspace as an existing project:
		<br><br>
		<img class='bordered' src='doc-files/juneau-examples-rest-jetty.Installing.1.png' style='width:524px'>
	<li>
		Select the archive file and import the project:
		<br><br>
		<img class='bordered' src='doc-files/juneau-examples-rest-jetty.Installing.2.png' style='width:549px'>
	<li>
		In your workspace, you should now see the following project:
		<br><br>
		<img class='bordered' src='doc-files/juneau-examples-rest-jetty.Installing.3.png' style='width:400px'>
</ol>
<p>
	The important elements in this project are:
</p>
<ul class='spaced-list'>
	<li>
		<l>App.java</l> - The entry point. 
		<br>This class creates and starts our microservice:
		<br><br>
		<p class='bcode w800'>
	<jk>public class</jk> App {
	
		<jk>public static void</jk> main(String[] args) <jk>throws</jk> Exception {
			JettyMicroservice
				.<jsm>create</jsm>()
				.args(args)
				.servlet(RootResources.<jk>class</jk>)
				.build()
				.start()
				.startConsole()
				.join();
		}
	}
		</p>
	<li>
		<l>RootResources.java</l> - The top-level REST resource. 
		<br>This class routes HTTP requests to child resources:
		<br><br>
		<p class='bcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/*"</js>,
		title=<js>"Root resources"</js>,
		description=<js>"Example of a router resource page."</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			widgets={
				ContentTypeMenuItem.<jk>class</jk>,
				ThemeMenuItem.<jk>class</jk>
			},
			navlinks={
				<js>"options: ?method=OPTIONS"</js>,
				<js>"$W{ContentTypeMenuItem}"</js>,
				<js>"$W{ThemeMenuItem}"</js>,
				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"</js>
			},
			aside={
				<js>"&lt;div style='max-width:400px' class='text'&gt;"</js>,
				<js>"	&lt;p&gt;This is an example of a 'router' page that serves as a jumping-off point to child resources.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Resources can be nested arbitrarily deep through router pages.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Note the &lt;span class='link'&gt;options&lt;/span&gt; link provided that lets you see the generated swagger doc for this page.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Also note the &lt;span class='link'&gt;sources&lt;/span&gt; link on these pages to view the source code for the page.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;All content on pages in the UI are serialized POJOs.  In this case, it's a serialized array of beans with 2 properties, 'name' and 'description'.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Other features (such as this aside) are added through annotations.&lt;/p&gt;"</js>,
				<js>"&lt;/div&gt;"</js>
			}
		),
		children={
			HelloWorldResource.<jk>class</jk>,
			PetStoreResource.<jk>class</jk>,
			DtoExamples.<jk>class</jk>,
			ConfigResource.<jk>class</jk>,
			LogsResource.<jk>class</jk>,
			ShutdownResource.<jk>class</jk>
		}
	)
	<ja>@SerializerConfig</ja>(
		<jc>// For testing purposes, we want to use single quotes in all the serializers so it's easier to do simple
		// String comparisons.</jc>
		quoteChar=<js>"'"</js>
	)
	<jk>public class</jk> RootResources <jk>extends</jk> BasicRestServletJenaGroup {
		<jc>// No code</jc>
	}
		</p>
	<li>
		<l>juneau-examples-rest-jetty.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 w800'>
	<cc>#=======================================================================================================================
	# Basic configuration file for REST microservices
	# Subprojects can use this as a starting point.
	#=======================================================================================================================</cc>
	
	<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># Optionally specify your servlets here:
	#servlets = org.apache.juneau.microservice.sample.RootResources</cc>

	<cc>#=======================================================================================================================
	# REST settings
	#=======================================================================================================================</cc>
	<cs>[REST]</cs>
	
	<cc># Comma-delimited list of key-value pairs that represent locations of static files that can be served up by your @Rest-annotated
	# classes.  These are static files that are served up by the servlet under the specified sub-paths.
	# For example, given the following setting...
	# 	staticFiles = htdocs:my-docs,styles/my-styles
	# ...the URI "/servletPath/htdocs/javadoc.css" resolves to the path "/my-docs/javadoc.css".
	# This path can be relative to the working directory, classpath root, or package of your resource class.
	# Used by the BasicRestConfig interface that defines the following value:
	# 	staticFiles="$C{REST/staticFiles}"</cc>
	<ck>staticFiles</ck> = htdocs:htdocs
	
	<cc># Stylesheet to use for HTML views.
	# Used by the BasicRestConfig interface that defines the following value:
	# 	stylesheet="$C{REST/theme,servlet:/htdocs/themes/devops.css}"</cc>
	<ck>theme</ck> = <cv>servlet:/htdocs/themes/devops.css</cv>
	
	<cc># Various look-and-feel settings used in the BasicRestConfig interface.</cc>
	<ck>headerIcon</ck> = <cv>servlet:/htdocs/images/juneau.png</cv>
	<ck>headerLink</ck> = <cv>http://juneau.apache.org</cv>
	<ck>footerIcon</ck> = <cv>servlet:/htdocs/images/asf.png</cv>
	<ck>footerLink</ck> = <cv>http://www.apache.org</cv>
	<ck>favicon</ck> = <cv>$C{REST/headerIcon}</cv>
	<ck>header</ck> = 
		<cv>&lt;a href='$U{$C{REST/headerLink}}'&gt;
			&lt;img src='$U{$C{REST/headerIcon}}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;
		&lt;/a&gt;</cv>
	<ck>footer</ck> = 
		<cv>&lt;a href='$U{$C{REST/footerLink}}'&gt;
			&lt;img src='$U{$C{REST/footerIcon}}' style='float:right;padding-right:20px;height:32px'/&gt;
		&lt;/a&gt;</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,
		org.apache.juneau.microservice.console.ConfigCommand</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.jetty.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 w800'>
	<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>
			<xc>&lt;!-- Optionally specify your servlets here --&gt;
			&lt;!--Call name="addServlet"&gt;
				&lt;Arg&gt;org.apache.juneau.microservice.sample.RootResources&lt;/Arg&gt;
				&lt;Arg&gt;/*&lt;/Arg&gt;
			&lt;/Call--&gt;</xc>
			<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><!-- END: 17.1 - juneau-examples-rest-jetty.Installing -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest-jetty.Running' id='juneau-examples-rest-jetty.Running'>17.2 - Running in Eclipse</a><span class='update'>8.0.0-new,8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 17.2 - juneau-examples-rest-jetty.Running -->
<p>
	The <l>juneau-examples-rest-jetty.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; juneau-examples-rest-jetty</b> and click <b>Run</b>.
	In your console view, you should see the following output:
</p>
<p class='bpcode w800 console'>
	Running class 'JettyMicroservice' using config file 'juneau-examples-rest-jetty.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>
<p class='bpcode w400'>
	http://localhost:10000
</p>			
<img class='bordered w400' src='doc-files/juneau-examples-rest-jetty.Running.1.png'>
<p>
	You can enter the command <c>exit</c> to shut it down.
</p>
</div><!-- END: 17.2 - juneau-examples-rest-jetty.Running -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest-jetty.Building' id='juneau-examples-rest-jetty.Building'>17.3 - Building and Running from Command-Line</a><span class='update'>8.0.0-new,8.1.2-deprecated</span></h3>
<div class='topic'><!-- START: 17.3 - juneau-examples-rest-jetty.Building -->
<p>
	The <l>pom.xml</l> file is a basic Maven build script for creating the examples microservice
	as an executable uber-jar.
</p>
<p>
	The easiest way to build the microservice is to run the following from the project root.
</p>
<p class='bpcode w800'>
	mvn clean install
</p>
<p>
	Your <c>target</c> directory should now contain the following files:
</p>
<ul>
	<li><c>juneau-examples-rest-jetty-1.0.jar</c>
	<li><c>juneau-examples-rest-jetty.cfg</c>
</ul>
<p>
	To start from a command line, run the following command from inside your <c>target</c> directory:
</p>
<p class='bpcode w800'>
	java -jar juneau-examples-rest-jetty-1.0.jar
</p>
<p>
	You should see the following console output:
</p>
<p class='bpcode w800 console'>
	Running class 'JettyMicroservice' using config file 'juneau-examples-rest-jetty.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><!-- END: 17.3 - juneau-examples-rest-jetty.Building -->
</div><!-- END: 17 - juneau-examples-rest-jetty -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest-springboot' id='juneau-examples-rest-springboot'>18 - juneau-examples-rest-springboot</a><span class='update'>8.0.0-new</span></h2>
<div class='topic'><!-- START: 18 - juneau-examples-rest-springboot -->
<h5 class='figure'>Starter Project Zip</h5>
<p class='bpcode w500'>
	juneau-examples-rest-springboot-{@property juneauVersion}.zip 
</p>	

<p>
	The <c>juneau-examples-rest-springboot</c> library contains the same examples as <c>juneau-examples-rest</c>
	but also includes the following:
</p>
<ul class='spaced-list'>
	<li>
		A starter class for invoking the examples using Spring Boot.
	<li>
		A resource resolver for resolving REST resources as injectable beans.
	<li>
		A POM that extends from <c>spring-boot-starter-parent</c> that allows you to build a fully-shaded executable jar.
	<li>
		Configuration files for deploying the microservice to Heroku.
</ul>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest-springboot.Installing' id='juneau-examples-rest-springboot.Installing'>18.1 - Installing in Eclipse</a><span class='update'>8.0.0-new</span></h3>
<div class='topic'><!-- START: 18.1 - juneau-examples-rest-springboot.Installing -->
<p>
	Follow these instructions to import the REST examples project using Spring Boot into Eclipse.
</p>		
<ol class='spaced-list'>
	<li>
		Download the <c>juneau-examples-rest-springboot-{@property juneauVersion}.zip</c> file from the downloads page
		(located in the binaries) and import it into your workspace as an existing project:
		<br><br>
		<img class='bordered' src='doc-files/juneau-examples-rest-springboot.Installing.1.png' style='width:524px'>
	<li>
		Select the archive file and import the project:
		<br><br>
		<img class='bordered' src='doc-files/juneau-examples-rest-springboot.Installing.2.png' style='width:549px'>
	<li>
		In your workspace, you should now see the following project:
		<br><br>
		<img class='bordered' src='doc-files/juneau-examples-rest-springboot.Installing.3.png' style='width:400px'>
</ol>
<p>
	The important elements in this project are:
</p>
<ul class='spaced-list'>
	<li>
		<l>App.java</l> - The entry point. 
		<br>This class creates and starts our microservice.
		<br>Note that we're using the existing Spring Boot application logic for the microservice and we're retrieving
		our root resource as a spring bean.
		<br>Only the top-level resource needs to be annotated with {@link org.apache.juneau.rest.springboot.annotation.JuneauRestRoot @JuneauRestRoot}
		<br><br>
		<p class='bcode w800'>
	<ja>@SpringBootApplication</ja>
	<ja>@Controller</ja>
	<jk>public class</jk> App {
	
		<jk>public static void</jk> main(String[] args) {
			<jk>new</jk> SpringApplicationBuilder(App.<jk>class</jk>)
				.initializers(<jk>new</jk> JuneauRestInitializer(App.<jk>class</jk>))
				.run(args);
		}
	
		<ja>@Bean @JuneauRestRoot</ja>
		<jk>public</jk> RootResources getRootResources() {
			<jk>return new</jk> RootResources();
		}
	}
		</p>
	<li>
		<l>RootResources.java</l> - The top-level REST resource. 
		<br>This class routes HTTP requests to child resources:
		<br><br>
		<p class='bcode w800'>
	<ja>@Rest</ja>(
		path=<js>"/*"</js>,
		title=<js>"Root resources"</js>,
		description=<js>"Example of a router resource page."</js>,
		htmldoc=<ja>@HtmlDoc</ja>(
			widgets={
				ContentTypeMenuItem.<jk>class</jk>,
				ThemeMenuItem.<jk>class</jk>
			},
			navlinks={
				<js>"options: ?method=OPTIONS"</js>,
				<js>"$W{ContentTypeMenuItem}"</js>,
				<js>"$W{ThemeMenuItem}"</js>,
				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"</js>
			},
			aside={
				<js>"&lt;div style='max-width:400px' class='text'&gt;"</js>,
				<js>"	&lt;p&gt;This is an example of a 'router' page that serves as a jumping-off point to child resources.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Resources can be nested arbitrarily deep through router pages.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Note the &lt;span class='link'&gt;options&lt;/span&gt; link provided that lets you see the generated swagger doc for this page.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Also note the &lt;span class='link'&gt;sources&lt;/span&gt; link on these pages to view the source code for the page.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;All content on pages in the UI are serialized POJOs.  In this case, it's a serialized array of beans with 2 properties, 'name' and 'description'.&lt;/p&gt;"</js>,
				<js>"	&lt;p&gt;Other features (such as this aside) are added through annotations.&lt;/p&gt;"</js>,
				<js>"&lt;/div&gt;"</js>
			}
		),
		children={
			HelloWorldResource.<jk>class</jk>,
			PetStoreResource.<jk>class</jk>,
			DtoExamples.<jk>class</jk>,
			ConfigResource.<jk>class</jk>,
			LogsResource.<jk>class</jk>,
			ShutdownResource.<jk>class</jk>
		}
	)
	<ja>@SerializerConfig</ja>(
		<jc>// For testing purposes, we want to use single quotes in all the serializers so it's easier to do simple
		// String comparisons.</jc>
		quoteChar=<js>"'"</js>
	)
	<jk>public class</jk> RootResources <jk>extends</jk> BasicRestServletJenaGroup {
		<jc>// No code</jc>
	}
		</p>
	<li>
		<l>juneau.cfg</l> - The configuration file. 
		<br>Contains various useful settings.
		<br>Can be used for your own resource configurations.
		<br>Note that the Jetty configuration is not present.
		<br>Also it's located in the classpath so that our microservice can be built as a single executable jar. 
		<br><br>
		<p class='bcode w800'>
	<cc>#=======================================================================================================================
	# Basic configuration file for REST microservices
	# Subprojects can use this as a starting point.
	#=======================================================================================================================</cc>
	
	<cc>#=======================================================================================================================
	# REST settings
	#=======================================================================================================================</cc>
	<cs>[REST]</cs>
	
	<cc># URL mappings to static files in the working directory or classpath.</cc>
	<ck>staticFiles</ck> = htdocs:files/htdocs
	
	<cc># Stylesheet to use for HTML views.</cc>
	<ck>theme</ck> = <cv>servlet:/htdocs/themes/devops.css</cv>
	
	<ck>headerIcon</ck> = <cv>servlet:/htdocs/images/juneau.png</cv>
	<ck>headerLink</ck> = <cv>http://juneau.apache.org</cv>
	<ck>footerIcon</ck> = <cv>servlet:/htdocs/images/asf.png</cv>
	<ck>footerLink</ck> = <cv>http://www.apache.org</cv>
	
	<ck>favicon</ck> = <cv>$C{REST/headerIcon}</cv>
	<ck>header</ck> = 
		<cv>&lt;a href='$U{$C{REST/headerLink}}'&gt;
			&lt;img src='$U{$C{REST/headerIcon}}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;
		&lt;/a&gt;</cv>
	<ck>footer</ck> = 
		<cv>&lt;a href='$U{$C{REST/footerLink}}'&gt;
			&lt;img src='$U{$C{REST/footerIcon}}' style='float:right;padding-right:20px;height:32px'/&gt;
		&lt;/a&gt;</cv>
	</p>
</ul>
<p>
	At this point, you're ready to start the microservice from your workspace.
</p>
</div><!-- END: 18.1 - juneau-examples-rest-springboot.Installing -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest-springboot.Running' id='juneau-examples-rest-springboot.Running'>18.2 - Running in Eclipse</a><span class='update'>8.0.0-new</span></h3>
<div class='topic'><!-- START: 18.2 - juneau-examples-rest-springboot.Running -->
<p>
	The <l>juneau-examples-rest-springboot.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; juneau-examples-rest-springboot</b> and click <b>Run</b>.
	In your console view, you should see the following output:
</p>
<p class='bpcode w800 console'>
	  .   ____          _            __ _ _
	 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
	( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
	 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
	  '  |____| .__|_| |_|_| |_\__, | / / / /
	 =========|_|==============|___/=/_/_/_/
	 :: Spring Boot ::        (v2.0.1.RELEASE)
	...
	INFO: Tomcat started on port(s): 8080 (http) with context path ''
	Dec 21, 2012 12:30:00 AM org.springframework.boot.StartupInfoLogger logStarted
	INFO: Started App in 1.999 seconds (JVM running for 2.999)
</p>
<p>
	Now open your browser and point to <l>http://localhost:5000</l>.  
	You should see the following:
</p>
<p class='bpcode w400'>
	http://localhost:5000
</p>			
<img class='bordered w400' src='doc-files/juneau-examples-rest-springboot.Running.1.png'>
</div><!-- END: 18.2 - juneau-examples-rest-springboot.Running -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest-springboot.Building' id='juneau-examples-rest-springboot.Building'>18.3 - Building and Running from Command-Line</a><span class='update'>8.0.0-new</span></h3>
<div class='topic'><!-- START: 18.3 - juneau-examples-rest-springboot.Building -->
<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='bpcode w800'>
	mvn clean install
</p>
<p>
	Your <c>target</c> directory should now contain the following files:
</p>
<ul>
	<li><c>juneau-examples-rest-springboot-1.0.jar</c>
</ul>
<p>
	To start from a command line, run the following command from inside your <c>target</c> directory:
</p>
<p class='bpcode w800'>
	java -jar juneau-examples-rest-springboot-1.0.jar
</p>
<p>
	You should see the following console output:
</p>
<p class='bpcode w800 console'>
	  .   ____          _            __ _ _
	 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
	( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
	 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
	  '  |____| .__|_| |_|_| |_\__, | / / / /
	 =========|_|==============|___/=/_/_/_/
	 :: Spring Boot ::        (v2.0.1.RELEASE)
	...
	INFO: Tomcat started on port(s): 8080 (http) with context path ''
	Dec 21, 2012 12:30:00 AM org.springframework.boot.StartupInfoLogger logStarted
	INFO: Started App in 1.999 seconds (JVM running for 2.999)
</p>
</div><!-- END: 18.3 - juneau-examples-rest-springboot.Building -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-examples-rest-springboot.DeployingToHeroku' id='juneau-examples-rest-springboot.DeployingToHeroku'>18.4 - Deploying to Heroku</a><span class='update'>8.0.0-new</span></h3>
<div class='topic'><!-- START: 18.4 - juneau-examples-rest-springboot.DeployingToHeroku -->
<p>
	<a href='https://www.heroku.com'>Heroku</a> is a platform-as-a-service that allows applications to be quickly hosted
	in the cloud.  
	The <l>juneau-examples-rest-springboot</l> project contains additional metadata files for quickly
	deploying and running the examples in Heroku using free services. 
</p>
<ul class='spaced-list'>
	<li>
		<l>app.json</l>
		<br><br>
			This class provides basic metadata information to Heroku about our application.
		<br><br>
		<p class='bcode w800'>
	{
	  <jok>"name"</jok>: <jov>"Start on Heroku: Juneau REST Examples"</jov>,
	  <jok>"description"</jok>: <jov>"Deployable REST examples to Heroku."</jov>
	}
		</p>
	<li>
		<l>Procfile</l>
		<br><br>
			This class tells Heroku how to deploy our application using the Web dyno.
		<br><br>
		<p class='bcode w800'>
	web: java -jar target/juneau-examples-rest-springboot-8.0.0-SNAPSHOT.jar
		</p>
	<li>
		<l>settings.xml</l>		
		<br><br>This is an optional Maven settings file that points to both the main Maven repo in
		addition to the Apache snapshots repo if you happen to be using a snapshot version of Juneau.
</ul>
<p>
	You'll need to sign up for an account on Heroku. 
	Afterwards, you can go to the apps page to create a new application:
</p>
<p class='bpcode w1000'>
	https://dashboard.heroku.com/apps
</p>
<img class='bordered w1000' src='doc-files/juneau-examples-rest-springboot.Heroku.1.png'>

<p>
	Click the <l>New</l> button to create a new app, give it a unique name:
</p>
<p class='bpcode w1000'>
	https://dashboard.heroku.com/new-app
</p>
<img class='bordered w1000' src='doc-files/juneau-examples-rest-springboot.Heroku.2.png'>

<p>
	After clicking the <l>Create app</l> button, you should see this page:
</p>
<p class='bpcode w1000'>
	https://dashboard.heroku.com/apps/juneau-examples-rest/deploy/heroku-git
</p>
<img class='bordered w1000' src='doc-files/juneau-examples-rest-springboot.Heroku.3.png'>

<p>
	For this example, we'll use the <l>Heroku Git</l> option for deploying our application.
	Follow the instructions for installing the Heroku CLI and logging into Heroku:
</p>
<p class='bpcode w1000'>
	https://dashboard.heroku.com/apps/juneau-examples-rest/deploy/heroku-git
</p>
<img class='bordered w1000' src='doc-files/juneau-examples-rest-springboot.Heroku.4.png'>

<p>
	Next, run the following commands to cd into our Eclipse project and initialize it as a local git repo:
</p>
<p class='bpcode w800'>
	$ cd juneau-examples-rest-springboot/
	$ git init
</p>
<h5 class='figure'>Output</h5>
<p class='bpcode w800 console'>
	$ cd juneau-examples-rest-springboot/
	$ git init
	Initialized empty Git repository in /.../juneau-examples-rest-springboot/.git/
</p>

<p>
	Next, run the following command to link our project to the Heroku app:
</p>
<p class='bpcode w800'>
	$ heroku git:remote -a juneau-examples-rest
</p>
<h5 class='figure'>Output</h5>
<p class='bpcode w800 console'>
	$ heroku git:remote -a juneau-examples-rest
	set git remote heroku to https://git.heroku.com/juneau-examples-rest.git
</p>

<p>
	Next, run the following commands to add our files to the git repo and push to the Heroku master branch:
</p>
<p class='bpcode w800'>
	$ git add .
	$ git commit -am "Initial deploy"
	$ git push heroku master
</p>
<h5 class='figure'>Output</h5>
<p class='bpcode w800 console'>
	$ git add .
	master (root-commit) 7c94cb9] Initial deploy
	 123 files changed, 11986 insertions(+)
	Counting objects: 127, done.
	$ git commit -am "Initial deploy"
	$ git push heroku master
	Delta compression using up to 8 threads.
	Compressing objects: 100% (113/113), done.
	Writing objects: 100% (127/127), 363.91 KiB | 21.41 MiB/s, done.
	...
	remote: -----> Compressing...
	remote:        Done: 85.9M
	remote: -----> Launching...
	remote:        Released v3
	remote:        https://juneau-examples-rest.herokuapp.com/ deployed to Heroku
	remote: 
	remote: Verifying deploy... done.
	To https://git.heroku.com/juneau-examples-rest.git
	 * [new branch]      master -> master
</p>
<p>
	If no errors were shown, then our application should now be live.
	You can click on the <l>Open app</l> button to open the examples application in a browser:
</p>
<img class='bordered w400' src='doc-files/juneau-examples-rest-springboot.Heroku.5.png'>

<p>
	If everything worked, your browser should now be loaded with our example REST app:
</p>
<p class='bpcode w1000'>
	https://juneau-examples-rest.herokuapp.com
</p>
<img class='bordered w1000' src='doc-files/juneau-examples-rest-springboot.Heroku.6.png'>
</div><!-- END: 18.4 - juneau-examples-rest-springboot.DeployingToHeroku -->
</div><!-- END: 18 - juneau-examples-rest-springboot -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#Glossaries' id='Glossaries'>19 - Glossaries</a><span class='update'><b>8.1.3-new</b></span></h2>
<div class='topic'><!-- START: 19 - Glossaries -->
<p>
</p>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#Glossaries.ConfigurablePropertiesGlossary' id='Glossaries.ConfigurablePropertiesGlossary'>19.1 - Configurable Properties Glossary</a><span class='update'><b>8.1.3-new</b></span></h3>
<div class='topic'><!-- START: 19.1 - Glossaries.ConfigurablePropertiesGlossary -->
<p>
	The following is a list of all properties defined throughout Juneau:
</p>
<table class='styled w1000'>
	<tr>
		<th>Context</th><th>ID</th><th style='min-width:250px'>Description</th><th>Data type</th>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.BeanContext}</td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_annotations BEAN_annotations}</td>
		<td>Annotations.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link java.lang.annotation.Annotation}&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beanClassVisibility BEAN_beanClassVisibility}</td>
		<td>Minimum bean class visibility.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.Visibility}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beanConstructorVisibility BEAN_beanConstructorVisibility}</td>
		<td>Minimum bean constructor visibility.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.Visibility}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beanDictionary BEAN_beanDictionary}</td>
		<td>Bean dictionary.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;Class&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beanFieldVisibility BEAN_beanFieldVisibility}</td>
		<td>Minimum bean field visibility.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.Visibility}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beanFilters BEAN_beanFilters}</td>
		<td>Bean filters.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;Class&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beanMapPutReturnsOldValue BEAN_beanMapPutReturnsOldValue}</td>
		<td>BeanMap.put() returns old property value.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beanMethodVisibility BEAN_beanMethodVisibility}</td>
		<td>Minimum bean method visibility.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.Visibility}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beanTypePropertyName BEAN_beanTypePropertyName}</td>
		<td>Bean type property name.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beansRequireDefaultConstructor BEAN_beansRequireDefaultConstructor}</td>
		<td>Beans require no-arg constructors.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beansRequireSerializable BEAN_beansRequireSerializable}</td>
		<td>Beans require Serializable interface.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beansRequireSettersForGetters BEAN_beansRequireSettersForGetters}</td>
		<td>Beans require setters for getters.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_beansRequireSomeProperties BEAN_beansRequireSomeProperties}</td>
		<td>Beans require at least one property.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_bpi BEAN_bpi}</td>
		<td>Bean property includes.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_bpro BEAN_bpro}</td>
		<td>Read-only bean properties.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_bpwo BEAN_bpwo}</td>
		<td>Write-only bean properties.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_bpx BEAN_bpx}</td>
		<td>Bean property excludes.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_debug BEAN_debug}</td>
		<td>Debug mode.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_examples BEAN_examples}</td>
		<td>POJO examples.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,Object&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_fluentSetters BEAN_fluentSetters}</td>
		<td>Find fluent setters.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_ignoreInvocationExceptionsOnGetters BEAN_ignoreInvocationExceptionsOnGetters}</td>
		<td>Ignore invocation errors on getters.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_ignoreInvocationExceptionsOnSetters BEAN_ignoreInvocationExceptionsOnSetters}</td>
		<td>Ignore invocation errors on setters.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_ignorePropertiesWithoutSetters BEAN_ignorePropertiesWithoutSetters}</td>
		<td>Ignore properties without setters.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_ignoreUnknownBeanProperties BEAN_ignoreUnknownBeanProperties}</td>
		<td>Ignore unknown properties.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_ignoreUnknownNullBeanProperties BEAN_ignoreUnknownNullBeanProperties}</td>
		<td>Ignore unknown properties with null values.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_implClasses BEAN_implClasses}</td>
		<td>Implementation classes.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,Class&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_locale BEAN_locale}</td>
		<td>Locale.</td>
		<td style='max-width:250px;overflow:hidden'>{@link java.util.Locale}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_mediaType BEAN_mediaType}</td>
		<td>Media type.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.http.MediaType}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_notBeanClasses BEAN_notBeanClasses}</td>
		<td>Bean class exclusions.</td>
		<td style='max-width:250px;overflow:hidden'><c>Set&lt;Class&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_notBeanPackages BEAN_notBeanPackages}</td>
		<td>Bean package exclusions.</td>
		<td style='max-width:250px;overflow:hidden'><c>Set&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_pojoSwaps BEAN_pojoSwaps}</td>
		<td>POJO swaps.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;Object&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_propertyNamer BEAN_propertyNamer}</td>
		<td>Bean property namer.</td>
		<td style='max-width:250px;overflow:hidden'><code>Class&lt;{@link org.apache.juneau.PropertyNamer}&gt;</code></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_sortProperties BEAN_sortProperties}</td>
		<td>Sort bean properties.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_timeZone BEAN_timeZone}</td>
		<td>Time zone.</td>
		<td style='max-width:250px;overflow:hidden'>{@link java.util.TimeZone}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_useEnumNames BEAN_useEnumNames}</td>
		<td>Use enum names.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_useInterfaceProxies BEAN_useInterfaceProxies}</td>
		<td>Use interface proxies.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanContext#BEAN_useJavaBeanIntrospector BEAN_useJavaBeanIntrospector}</td>
		<td>Use Java Introspector.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.BeanTraverseContext}</td>
		<td>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_detectRecursions BEANTRAVERSE_detectRecursions}</td>
		<td>Automatically detect POJO recursions.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_ignoreRecursions BEANTRAVERSE_ignoreRecursions}</td>
		<td>Ignore recursion errors.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_initialDepth BEANTRAVERSE_initialDepth}</td>
		<td>Initial depth.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.BeanTraverseContext#BEANTRAVERSE_maxDepth BEANTRAVERSE_maxDepth}</td>
		<td>Max traversal depth.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.config.Config}</td>
		<td>{@link org.apache.juneau.config.Config#CONFIG_binaryFormat CONFIG_binaryFormat}</td>
		<td>Binary value format.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.BinaryFormat}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.Config#CONFIG_binaryLineLength CONFIG_binaryLineLength}</td>
		<td>Binary value line length.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.Config#CONFIG_encoder CONFIG_encoder}</td>
		<td>Value encoder.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.config.encode.ConfigEncoder}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.Config#CONFIG_multiLineValuesOnSeparateLines CONFIG_multiLineValuesOnSeparateLines}</td>
		<td>Multi-line values should always be on separate lines.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.Config#CONFIG_name CONFIG_name}</td>
		<td>Configuration name.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.Config#CONFIG_parser CONFIG_parser}</td>
		<td>POJO parser.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.parser.ReaderParser}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.Config#CONFIG_readOnly CONFIG_readOnly}</td>
		<td>Read-only.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.Config#CONFIG_serializer CONFIG_serializer}</td>
		<td>POJO serializer.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.serializer.WriterSerializer}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.Config#CONFIG_store CONFIG_store}</td>
		<td>Configuration store.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.config.store.ConfigStore}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.Config#CONFIG_varResolver CONFIG_varResolver}</td>
		<td>SVL variable resolver.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.svl.VarResolver}</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.config.store.ConfigFileStore}</td>
		<td>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_charset FILESTORE_charset}</td>
		<td>Charset.</td>
		<td style='max-width:250px;overflow:hidden'>{@link java.nio.charset.Charset}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_directory FILESTORE_directory}</td>
		<td>Local file system directory.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_extensions FILESTORE_extensions}</td>
		<td>File extensions.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c> (comma-delimited)</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_updateOnWrite FILESTORE_updateOnWrite}</td>
		<td>Update-on-write.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_useWatcher FILESTORE_useWatcher}</td>
		<td>Use watcher.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_watcherSensitivity FILESTORE_watcherSensitivity}</td>
		<td>Watcher sensitivity.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.config.store.WatcherSensitivity}</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer}</td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_aside HTMLDOC_aside}</td>
		<td>Aside section contents.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_footer HTMLDOC_footer}</td>
		<td>Footer section contents.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_head HTMLDOC_head}</td>
		<td>Additional head section content.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_header HTMLDOC_header}</td>
		<td>Header section contents.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_nav HTMLDOC_nav}</td>
		<td>Nav section contents.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_navlinks HTMLDOC_navlinks}</td>
		<td>Page navigation links.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_noResultsMessage HTMLDOC_noResultsMessage}</td>
		<td>No-results message.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_nowrap HTMLDOC_nowrap}</td>
		<td>Prevent word wrap on page.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_script HTMLDOC_script}</td>
		<td>Javascript code.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_style HTMLDOC_style}</td>
		<td>CSS style code.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_stylesheet HTMLDOC_stylesheet}</td>
		<td>Stylesheet import URLs.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_template HTMLDOC_template}</td>
		<td>HTML document template.</td>
		<td style='max-width:250px;overflow:hidden'><code>Class&lt;{@link org.apache.juneau.html.HtmlDocTemplate}&gt;</code></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlDocSerializer#HTMLDOC_widgets HTMLDOC_widgets}</td>
		<td>HTML Widgets.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.html.HtmlWidget}|Class&lt;{@link org.apache.juneau.html.HtmlWidget}&gt;&gt;</c></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.html.HtmlSerializer}</td>
		<td>{@link org.apache.juneau.html.HtmlSerializer#HTML_addBeanTypes HTML_addBeanTypes}</td>
		<td>Add <js>"_type"</js> properties when needed.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlSerializer#HTML_addKeyValueTableHeaders HTML_addKeyValueTableHeaders}</td>
		<td>Add key/value headers on bean/map tables.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlSerializer#HTML_detectLabelParameters HTML_detectLabelParameters}</td>
		<td>Look for link labels in URIs.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlSerializer#HTML_detectLinksInStrings HTML_detectLinksInStrings}</td>
		<td>Look for URLs in {@link java.lang.String Strings}.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlSerializer#HTML_labelParameter HTML_labelParameter}</td>
		<td>Link label parameter name.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.html.HtmlSerializer#HTML_uriAnchorText HTML_uriAnchorText}</td>
		<td>Anchor text source.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.html.AnchorText}</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.parser.InputStreamParser}</td>
		<td>{@link org.apache.juneau.parser.InputStreamParser#ISPARSER_binaryFormat ISPARSER_binaryFormat}</td>
		<td>Binary input format.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.BinaryFormat}</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.json.JsonParser}</td>
		<td>{@link org.apache.juneau.json.JsonParser#JSON_validateEnd JSON_validateEnd}</td>
		<td>Validate end.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator}</td>
		<td>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_addDescriptionsTo JSONSCHEMA_addDescriptionsTo}</td>
		<td>Add descriptions to types.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_addExamplesTo JSONSCHEMA_addExamplesTo}</td>
		<td>Add examples.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_allowNestedDescriptions JSONSCHEMA_allowNestedDescriptions}</td>
		<td>Allow nested descriptions.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_allowNestedExamples JSONSCHEMA_allowNestedExamples}</td>
		<td>Allow nested examples.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_beanDefMapper JSONSCHEMA_beanDefMapper}</td>
		<td>Bean schema definition mapper.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.jsonschema.BeanDefMapper}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_defaultSchemas JSONSCHEMA_defaultSchemas}</td>
		<td>Default schemas.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,{@link org.apache.juneau.ObjectMap}&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_ignoreTypes JSONSCHEMA_ignoreTypes}</td>
		<td>Ignore types from schema definitions.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c> (comma-delimited)</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jsonschema.JsonSchemaGenerator#JSONSCHEMA_useBeanDefs JSONSCHEMA_useBeanDefs}</td>
		<td>Use bean definitions.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.json.JsonSerializer}</td>
		<td>{@link org.apache.juneau.json.JsonSerializer#JSON_addBeanTypes JSON_addBeanTypes}</td>
		<td>Add <js>"_type"</js> properties when needed.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.json.JsonSerializer#JSON_escapeSolidus JSON_escapeSolidus}</td>
		<td>Prefix solidus <js>'/'</js> characters with escapes.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.json.JsonSerializer#JSON_simpleMode JSON_simpleMode}</td>
		<td>Simple JSON mode.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.msgpack.MsgPackSerializer}</td>
		<td>{@link org.apache.juneau.msgpack.MsgPackSerializer#MSGPACK_addBeanTypes MSGPACK_addBeanTypes}</td>
		<td>Add <js>"_type"</js> properties when needed.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.serializer.OutputStreamSerializer}</td>
		<td>{@link org.apache.juneau.serializer.OutputStreamSerializer#OSSERIALIZER_binaryFormat OSSERIALIZER_binaryFormat}</td>
		<td>Binary output format.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.BinaryFormat}</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.parser.Parser}</td>
		<td>{@link org.apache.juneau.parser.Parser#PARSER_autoCloseStreams PARSER_autoCloseStreams}</td>
		<td>Auto-close streams.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.parser.Parser#PARSER_debugOutputLines PARSER_debugOutputLines}</td>
		<td>Debug output lines.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.parser.Parser#PARSER_listener PARSER_listener}</td>
		<td>Parser listener.</td>
		<td style='max-width:250px;overflow:hidden'><c>Class&lt;{@link org.apache.juneau.parser.ParserListener}&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.parser.Parser#PARSER_strict PARSER_strict}</td>
		<td>Strict mode.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.parser.Parser#PARSER_trimStrings PARSER_trimStrings}</td>
		<td>Trim parsed strings.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.parser.Parser#PARSER_unbuffered PARSER_unbuffered}</td>
		<td>Unbuffered.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.jena.RdfCommon}</td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_collectionFormat RDF_collectionFormat}</td>
		<td>RDF format for representing collections and arrays.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_abbrevBaseUri RDF_n3_abbrevBaseUri}</td>
		<td>N3/Turtle property: <c>abbrevBaseURI</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_indentProperty RDF_n3_indentProperty}</td>
		<td>N3/Turtle property: <c>indentProperty</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_minGap RDF_n3_minGap}</td>
		<td>N3/Turtle property: <c>minGap</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_objectLists RDF_n3_objectLists}</td>
		<td>N3/Turtle property: <c>objectLists</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_propertyColumn RDF_n3_propertyColumn}</td>
		<td>N3/Turtle property: <c>propertyColumn</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_subjectColumn RDF_n3_subjectColumn}</td>
		<td>N3/Turtle property: <c>subjectColumn</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_useDoubles RDF_n3_useDoubles}</td>
		<td>N3/Turtle property: <c>useDoubles</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_usePropertySymbols RDF_n3_usePropertySymbols}</td>
		<td>N3/Turtle property: <c>usePropertySymbols</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_useTripleQuotedStrings RDF_n3_useTripleQuotedStrings}</td>
		<td>N3/Turtle property: <c>useTripleQuotedStrings</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_n3_widePropertyLen RDF_n3_widePropertyLen}</td>
		<td>N3/Turtle property: <c>widePropertyLen</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_err_ RDF_arp_err_}</td>
		<td>RDF/XML ARP property: <c>ERR_xxx</c>.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_ign_ RDF_arp_ign_}</td>
		<td></td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_warn_ RDF_arp_warn_}</td>
		<td>RDF/XML ARP property: <c>WARN_xxx</c>.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_allowBadUris RDF_rdfxml_allowBadUris}</td>
		<td>RDF/XML property: <c>allowBadURIs</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_attributeQuoteChar RDF_rdfxml_attributeQuoteChar}</td>
		<td>RDF/XML property: <c>attributeQuoteChar</c>.</td>
		<td style='max-width:250px;overflow:hidden'><c>Character</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_blockRules RDF_rdfxml_blockRules}</td>
		<td>RDF/XML property: <c>blockRules</c>.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_embedding RDF_arp_embedding}</td>
		<td>RDF/XML ARP property: <c>embedding</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_errorMode RDF_arp_errorMode}</td>
		<td>RDF/XML ARP property: <c>error-mode</c>.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_arp_iriRules RDF_arp_iriRules}</td>
		<td>RDF/XML property: <c>iri_rules</c>.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_longId RDF_rdfxml_longId}</td>
		<td>RDF/XML property: <c>longId</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_relativeUris RDF_rdfxml_relativeUris}</td>
		<td>RDF/XML property: <c>relativeURIs</c>.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_showDoctypeDeclaration RDF_rdfxml_showDoctypeDeclaration}</td>
		<td>RDF/XML property: <c>showDoctypeDeclaration</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_showXmlDeclaration RDF_rdfxml_showXmlDeclaration}</td>
		<td>RDF/XML property: <c>showXmlDeclaration</c>.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_tab RDF_rdfxml_tab}</td>
		<td>RDF/XML property: <c>tab</c>.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_rdfxml_xmlBase RDF_rdfxml_xmlBase}</td>
		<td>RDF/XML property: <c>xmlbase</c>.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_juneauBpNs RDF_juneauBpNs}</td>
		<td>Default XML namespace for bean properties.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.xml.Namespace}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_juneauNs RDF_juneauNs}</td>
		<td>XML namespace for Juneau properties.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.xml.Namespace}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_language RDF_language}</td>
		<td>RDF language.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfCommon#RDF_looseCollections RDF_looseCollections}</td>
		<td>Collections should be serialized and parsed as loose collections.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.jena.RdfParser}</td>
		<td>{@link org.apache.juneau.jena.RdfParser#RDF_trimWhitespace RDF_trimWhitespace}</td>
		<td>Trim whitespace from text elements.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.jena.RdfSerializer}</td>
		<td>{@link org.apache.juneau.jena.RdfSerializer#RDF_useXmlNamespaces RDF_useXmlNamespaces}</td>
		<td>Reuse XML namespaces when RDF namespaces not specified.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfSerializer#RDF_addBeanTypes RDF_addBeanTypes}</td>
		<td>Add <js>"_type"</js> properties when needed.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfSerializer#RDF_addLiteralTypes RDF_addLiteralTypes}</td>
		<td>Add XSI data types to non-<c>String</c> literals.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfSerializer#RDF_addRootProperty RDF_addRootProperty}</td>
		<td>Add RDF root identifier property to root node.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfSerializer#RDF_autoDetectNamespaces RDF_autoDetectNamespaces}</td>
		<td>Auto-detect namespace usage.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.jena.RdfSerializer#RDF_namespaces RDF_namespaces}</td>
		<td>Default namespaces.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.xml.Namespace}&gt;</c></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.parser.ReaderParser}</td>
		<td>{@link org.apache.juneau.parser.ReaderParser#RPARSER_fileCharset RPARSER_fileCharset}</td>
		<td>File charset.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.parser.ReaderParser#RPARSER_streamCharset RPARSER_streamCharset}</td>
		<td>Input stream charset.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.rest.client.RestClient}</td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_debug RESTCLIENT_debug}</td>
		<td>Debug.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_executorService RESTCLIENT_executorService}</td>
		<td>Executor service.</td>
		<td style='max-width:250px;overflow:hidden'><ul><li><c>Class&lt;{@link java.util.concurrent.ExecutorService}&gt;</c><li>{@link java.util.concurrent.ExecutorService}</ul></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_executorServiceShutdownOnClose RESTCLIENT_executorServiceShutdownOnClose}</td>
		<td>Shut down executor service on close.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_interceptors RESTCLIENT_interceptors}</td>
		<td>Call interceptors.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;Class&lt;{@link org.apache.juneau.rest.client.RestCallInterceptor}&gt;|{@link org.apache.juneau.rest.client.RestCallInterceptor}&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_keepHttpClientOpen RESTCLIENT_keepHttpClientOpen}</td>
		<td>Keep HttpClient open.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_parser RESTCLIENT_parser}</td>
		<td>Parser.</td>
		<td style='max-width:250px;overflow:hidden'><ul><li><c>Class&lt;{@link org.apache.juneau.parser.Parser}&gt;</c><li>{@link org.apache.juneau.parser.Parser}</ul></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_partParser RESTCLIENT_partParser}</td>
		<td>Part parser.</td>
		<td style='max-width:250px;overflow:hidden'><ul><li><c>Class&lt;{@link org.apache.juneau.httppart.HttpPartParser}&gt;</c><li>{@link org.apache.juneau.httppart.HttpPartParser}</ul></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_partSerializer RESTCLIENT_partSerializer}</td>
		<td>Part serializer.</td>
		<td style='max-width:250px;overflow:hidden'><ul><li><c>Class&lt;{@link org.apache.juneau.httppart.HttpPartSerializer}&gt;</c><li>{@link org.apache.juneau.httppart.HttpPartSerializer}</ul></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_query RESTCLIENT_query}</td>
		<td>Request query parameters.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_headers RESTCLIENT_headers}</td>
		<td>Request headers.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_retries RESTCLIENT_retries}</td>
		<td>Number of retries to attempt.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_retryInterval RESTCLIENT_retryInterval}</td>
		<td>The time in milliseconds between retry attempts.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_retryOn RESTCLIENT_retryOn}</td>
		<td>Retry-on determination object.</td>
		<td style='max-width:250px;overflow:hidden'><ul><li><c>Class&lt;{@link org.apache.juneau.rest.client.RetryOn}&gt;</c><li>{@link org.apache.juneau.rest.client.RetryOn}</ul></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_rootUri RESTCLIENT_rootUri}</td>
		<td>Root URI.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.client.RestClient#RESTCLIENT_serializer RESTCLIENT_serializer}</td>
		<td>Serializer.</td>
		<td style='max-width:250px;overflow:hidden'><ul><li><c>Class&lt;{@link org.apache.juneau.serializer.Serializer}&gt;</c><li>{@link org.apache.juneau.serializer.Serializer}</ul></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.rest.RestContext}</td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_allowBodyParam REST_allowBodyParam}</td>
		<td>Allow body URL parameter.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_allowedHeaderParams REST_allowedHeaderParams}</td>
		<td>Allowed header URL parameters.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c> (comma-delimited)</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_allowedMethodHeaders REST_allowedMethodHeaders}</td>
		<td>Allowed method headers.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c> (comma-delimited)</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_allowedMethodParams REST_allowedMethodParams}</td>
		<td>Allowed method URL parameters.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c> (comma-delimited)</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_callHandler REST_callHandler}</td>
		<td>REST call handler.</td>
		<td style='max-width:250px;overflow:hidden'><ul><li>{@link org.apache.juneau.rest.RestCallHandler}<li><c>Class&lt;{@link org.apache.juneau.rest.RestCallHandler}&gt;</c></ul></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_callLogger REST_callLogger}</td>
		<td>REST call logger.</td>
		<td style='max-width:250px;overflow:hidden'><ul><li>{@link org.apache.juneau.rest.RestCallLogger}<li><c>Class&lt;{@link org.apache.juneau.rest.RestCallLogger}&gt;</c></ul></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_callLoggerConfig REST_callLoggerConfig}</td>
		<td>REST call logging rules.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.rest.RestCallLoggerConfig}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_children REST_children}</td>
		<td>Children.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;Class|Object|{@link org.apache.juneau.rest.RestChild}&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_classpathResourceFinder REST_classpathResourceFinder}</td>
		<td>Classpath resource finder.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.utils.ClasspathResourceFinder}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_clientVersionHeader REST_clientVersionHeader}</td>
		<td>Client version header.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_consumes REST_consumes}</td>
		<td>Supported content media types.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_converters REST_converters}</td>
		<td>Class-level response converters.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.rest.RestConverter}|Class&lt;{@link org.apache.juneau.rest.RestConverter}&gt;&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_debug REST_debug}</td>
		<td>Debug mode.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.rest.Enablement}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_defaultCharset REST_defaultCharset}</td>
		<td>Default character encoding.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_encoders REST_encoders}</td>
		<td>Compression encoders.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.encoders.Encoder}|Class&lt;{@link org.apache.juneau.encoders.Encoder}&gt;&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_guards REST_guards}</td>
		<td>Class-level guards.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.rest.RestGuard}|Class&lt;{@link org.apache.juneau.rest.RestGuard}&gt;&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_infoProvider REST_infoProvider}</td>
		<td>REST info provider.</td>
		<td style='max-width:250px;overflow:hidden'><ul><li>{@link org.apache.juneau.rest.RestInfoProvider}<li><c>Class&lt;{@link org.apache.juneau.rest.RestInfoProvider}&gt;</c></ul></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_maxInput REST_maxInput}</td>
		<td>The maximum allowed input size (in bytes) on HTTP requests.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_messages REST_messages}</td>
		<td>Messages.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.rest.MessageBundleLocation}&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_mimeTypes REST_mimeTypes}</td>
		<td>MIME types.</td>
		<td style='max-width:250px;overflow:hidden'><c>Set&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_paramResolvers REST_paramResolvers}</td>
		<td>Java method parameter resolvers.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.rest.RestMethodParam}|Class&lt;{@link org.apache.juneau.rest.RestMethodParam}&gt;&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_parsers REST_parsers}</td>
		<td>Parsers.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.parser.Parser}|Class&lt;{@link org.apache.juneau.parser.Parser}&gt;&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_partParser REST_partParser}</td>
		<td>HTTP part parser.</td>
		<td style='max-width:250px;overflow:hidden'><c>{@link org.apache.juneau.httppart.HttpPartParser}|Class&lt;{@link org.apache.juneau.httppart.HttpPartParser}&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_partSerializer REST_partSerializer}</td>
		<td>HTTP part serializer.</td>
		<td style='max-width:250px;overflow:hidden'><ul><li>{@link org.apache.juneau.httppart.HttpPartSerializer}<li><c>Class&lt;{@link org.apache.juneau.httppart.HttpPartSerializer}&gt;</c></ul></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_path REST_path}</td>
		<td>Resource path.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_produces REST_produces}</td>
		<td>Supported accept media types.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_properties REST_properties}</td>
		<td>Properties.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_renderResponseStackTraces REST_renderResponseStackTraces}</td>
		<td>Render response stack traces in responses.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_reqAttrs REST_reqAttrs}</td>
		<td>Default request attributes.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,Object&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_reqHeaders REST_reqHeaders}</td>
		<td>Default request headers.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_resHeaders REST_resHeaders}</td>
		<td>Default response headers.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_resourceResolver REST_resourceResolver}</td>
		<td>REST resource resolver.</td>
		<td style='max-width:250px;overflow:hidden'><ul><li>{@link org.apache.juneau.rest.RestResourceResolver}<li><c>Class&lt;{@link org.apache.juneau.rest.RestResourceResolver}&gt;</c></ul></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_responseHandlers REST_responseHandlers}</td>
		<td>Response handlers.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.rest.ResponseHandler}|Class&lt;{@link org.apache.juneau.rest.ResponseHandler}&gt;&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_roleGuard REST_roleGuard}</td>
		<td>Role guard.</td>
		<td style='max-width:250px;overflow:hidden'><c>Set&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_rolesDeclared REST_rolesDeclared}</td>
		<td>Declared roles.</td>
		<td style='max-width:250px;overflow:hidden'><c>Set&lt;String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_serializers REST_serializers}</td>
		<td>Serializers.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.serializer.Serializer}|Class&lt;{@link org.apache.juneau.serializer.Serializer}&gt;&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_staticFileResponseHeaders REST_staticFileResponseHeaders}</td>
		<td>Static file response headers.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,String&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_staticFiles REST_staticFiles}</td>
		<td>Static file mappings.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.rest.StaticFileMapping}&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_uriAuthority REST_uriAuthority}</td>
		<td>Resource URI authority path.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_uriContext REST_uriContext}</td>
		<td>Resource URI context path.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_uriRelativity REST_uriRelativity}</td>
		<td>URI resolution relativity.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_uriResolution REST_uriResolution}</td>
		<td>URI resolution.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestContext#REST_useClasspathResourceCaching REST_useClasspathResourceCaching}</td>
		<td>Use classpath resource caching.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.rest.RestMethodContext}</td>
		<td>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_callLoggerConfig RESTMETHOD_callLoggerConfig}</td>
		<td>Logging rules.</td>
		<td style='max-width:250px;overflow:hidden'><c>{@link org.apache.juneau.rest.RestCallLoggerConfig}</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_clientVersion RESTMETHOD_clientVersion}</td>
		<td>Client version pattern matcher.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_debug RESTMETHOD_debug}</td>
		<td>Debug mode.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.rest.Enablement}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_defaultFormData RESTMETHOD_defaultFormData}</td>
		<td>Default form data.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,Object&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_defaultQuery RESTMETHOD_defaultQuery}</td>
		<td>Default query parameters.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,Object&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_httpMethod RESTMETHOD_httpMethod}</td>
		<td>HTTP method name.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_matchers RESTMETHOD_matchers}</td>
		<td>Method-level matchers.</td>
		<td style='max-width:250px;overflow:hidden'><c>List&lt;{@link org.apache.juneau.rest.RestMatcher}|Class&lt;{@link org.apache.juneau.rest.RestMatcher}&gt;&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_path RESTMETHOD_path}</td>
		<td>Resource method path.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_priority RESTMETHOD_priority}</td>
		<td>Priority.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_reqAttrs RESTMETHOD_reqAttrs}</td>
		<td>Default request attributes.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,Object&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_reqHeaders RESTMETHOD_reqHeaders}</td>
		<td>Default request headers.</td>
		<td style='max-width:250px;overflow:hidden'><c>Map&lt;String,Object&gt;</c></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.serializer.Serializer}</td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes SERIALIZER_addBeanTypes}</td>
		<td>Add <js>"_type"</js> properties when needed.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType SERIALIZER_addRootType}</td>
		<td>Add type attribute to root nodes.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_listener SERIALIZER_listener}</td>
		<td>Serializer listener.</td>
		<td style='max-width:250px;overflow:hidden'><c>Class&lt;{@link org.apache.juneau.serializer.SerializerListener}&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortCollections SERIALIZER_sortCollections}</td>
		<td>Sort arrays and collections alphabetically.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_sortMaps SERIALIZER_sortMaps}</td>
		<td>Sort maps alphabetically.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyCollections SERIALIZER_trimEmptyCollections}</td>
		<td>Trim empty lists and arrays.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimEmptyMaps SERIALIZER_trimEmptyMaps}</td>
		<td>Trim empty maps.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimNullProperties SERIALIZER_trimNullProperties}</td>
		<td>Trim null bean property values.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_trimStrings SERIALIZER_trimStrings}</td>
		<td>Trim strings.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriContext SERIALIZER_uriContext}</td>
		<td>URI context bean.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.UriContext}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriRelativity SERIALIZER_uriRelativity}</td>
		<td>URI relativity.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.UriRelativity}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.Serializer#SERIALIZER_uriResolution SERIALIZER_uriResolution}</td>
		<td>URI resolution.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.UriResolution}</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.soap.SoapXmlSerializer}</td>
		<td>{@link org.apache.juneau.soap.SoapXmlSerializer#SOAPXML_SOAPAction SOAPXML_SOAPAction}</td>
		<td>The <c>SOAPAction</c> HTTP header value to set on responses.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.dto.swagger.ui.SwaggerUI}</td>
		<td>{@link org.apache.juneau.dto.swagger.ui.SwaggerUI#SWAGGERUI_resolveRefsMaxDepth SWAGGERUI_resolveRefsMaxDepth}</td>
		<td>Resolve <c>$ref</c> references in schema up to the specified depth.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.uon.UonParser}</td>
		<td>{@link org.apache.juneau.uon.UonParser#UON_decoding UON_decoding}</td>
		<td>Decode <js>"%xx"</js> sequences.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.uon.UonParser#UON_validateEnd UON_validateEnd}</td>
		<td>Validate end.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.uon.UonSerializer}</td>
		<td>{@link org.apache.juneau.uon.UonSerializer#UON_addBeanTypes UON_addBeanTypes}</td>
		<td>Add <js>"_type"</js> properties when needed.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.uon.UonSerializer#UON_encoding UON_encoding}</td>
		<td>Encode non-valid URI characters.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.uon.UonSerializer#UON_paramFormat UON_paramFormat}</td>
		<td>Format to use for query/form-data/header values.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.uon.ParamFormat}</td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.urlencoding.UrlEncodingParser}</td>
		<td>{@link org.apache.juneau.urlencoding.UrlEncodingParser#URLENC_expandedParams URLENC_expandedParams}</td>
		<td>Parser bean property collections/arrays as separate key/value pairs.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer}</td>
		<td>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer#URLENC_expandedParams URLENC_expandedParams}</td>
		<td>Serialize bean property collections/arrays as separate key/value pairs.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.serializer.WriterSerializer}</td>
		<td>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_fileCharset WSERIALIZER_fileCharset}</td>
		<td>File charset.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_maxIndent WSERIALIZER_maxIndent}</td>
		<td>Maximum indentation.</td>
		<td style='max-width:250px;overflow:hidden'><jk>int</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_quoteChar WSERIALIZER_quoteChar}</td>
		<td>Quote character.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_streamCharset WSERIALIZER_streamCharset}</td>
		<td>Output stream charset.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_useWhitespace WSERIALIZER_useWhitespace}</td>
		<td>Use whitespace.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.xml.XmlParser}</td>
		<td>{@link org.apache.juneau.xml.XmlParser#XML_eventAllocator XML_eventAllocator}</td>
		<td>XML event allocator.</td>
		<td style='max-width:250px;overflow:hidden'><code>Class&lt;{@link javax.xml.stream.util.XMLEventAllocator}&gt;</code></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.xml.XmlParser#XML_preserveRootElement XML_preserveRootElement}</td>
		<td>Preserve root element during generalized parsing.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.xml.XmlParser#XML_reporter XML_reporter}</td>
		<td>XML reporter.</td>
		<td style='max-width:250px;overflow:hidden'><code>Class&lt;{@link javax.xml.stream.XMLReporter}&gt;</code></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.xml.XmlParser#XML_resolver XML_resolver}</td>
		<td>XML resolver.</td>
		<td style='max-width:250px;overflow:hidden'><code>Class&lt;{@link javax.xml.stream.XMLResolver}&gt;</code></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.xml.XmlParser#XML_validating XML_validating}</td>
		<td>Enable validation.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td>{@link org.apache.juneau.xml.XmlSerializer}</td>
		<td>{@link org.apache.juneau.xml.XmlSerializer#XML_addBeanTypes XML_addBeanTypes}</td>
		<td>Add <js>"_type"</js> properties when needed.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.xml.XmlSerializer#XML_addNamespaceUrisToRoot XML_addNamespaceUrisToRoot}</td>
		<td>Add namespace URLs to the root element.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.xml.XmlSerializer#XML_autoDetectNamespaces XML_autoDetectNamespaces}</td>
		<td>Auto-detect namespace usage.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.xml.XmlSerializer#XML_defaultNamespace XML_defaultNamespace}</td>
		<td>Default namespace.</td>
		<td style='max-width:250px;overflow:hidden'>{@link org.apache.juneau.xml.Namespace}</td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.xml.XmlSerializer#XML_enableNamespaces XML_enableNamespaces}</td>
		<td>Enable support for XML namespaces.</td>
		<td style='max-width:250px;overflow:hidden'><jk>boolean</jk></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.xml.XmlSerializer#XML_namespaces XML_namespaces}</td>
		<td>Default namespaces.</td>
		<td style='max-width:250px;overflow:hidden'><c>Set&lt;{@link org.apache.juneau.xml.Namespace}&gt;</c></td>
	</tr>
	<tr>
		<td></td>
		<td>{@link org.apache.juneau.xml.XmlSerializer#XML_xsNamespace XML_xsNamespace}</td>
		<td>XMLSchema namespace.</td>
		<td style='max-width:250px;overflow:hidden'><c>String</c> ({@link org.apache.juneau.xml.Namespace})</td>
	</tr>
</table>

</div><!-- END: 19.1 - Glossaries.ConfigurablePropertiesGlossary -->
</div><!-- END: 19 - Glossaries -->

<!-- ==================================================================================================== -->

<h2 class='topic' onclick='toggle(this)'><a href='#Security' id='Security'>20 - Security Best-Practices</a></h2>
<div class='topic'><!-- START: 20 - Security -->
<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'>{@doc http://www.apache.org/security SECURITY}
</ul>

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#Security.juneau-marshall' id='Security.juneau-marshall'>20.1 - juneau-marshall</a></h3>
<div class='topic'><!-- START: 20.1 - Security.juneau-marshall -->
<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. <c>JsonParser.<jsf>DEFAULT</jsf>.parse(input, MyBean.<jk>class</jk>)</c>).
	As long as the <c>Class</c> 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='bpcode w800'>
	<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.
	i.e. instead of <js>"class='com.foo.MyBean'"</js>, we instead serialize <js>"type='MyBeanIdentifier'"</js>.
	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='bpcode w800'>
	<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 
	<c>application/x-java-serialized-object</c> 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 <c>7.0.1</c>, no known security vulnerabilities exist that affect Juneau at this time.
</ul>
</div><!-- END: 20.1 - Security.juneau-marshall -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#Security.juneau-svl' id='Security.juneau-svl'>20.2 - juneau-svl</a></h3>
<div class='topic'><!-- START: 20.2 - Security.juneau-svl -->
<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='bpcode w800'>
	<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 <c>foo</c> 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 <c>$F</c> 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 <c>RestRequest</c> 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>
		<c>Vars</c> 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 <c>$R</c> variable, so the <c>$F</c>
		variable in the result will never get processed and instead be treated as plain text. 
	<li>
		The <c>$F</c> 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><!-- END: 20.2 - Security.juneau-svl -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#Security.juneau-rest-server' id='Security.juneau-rest-server'>20.3 - juneau-rest-server</a></h3>
<div class='topic'><!-- START: 20.3 - Security.juneau-rest-server -->
<p>
	Denial of service attacks can be alleviated through the {@link org.apache.juneau.rest.annotation.Rest#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><!-- END: 20.3 - Security.juneau-rest-server -->
</div><!-- END: 20 - Security -->


<h2 class='topic' onclick='toggle(this)'><a href='#ReleaseNotes' id='ReleaseNotes'>Release Notes</a></h2>
<div class='topic'>
	
	<h5 class='toc'>Release Notes</h5>
	<ul class='toc'>
<li><p><a class='doclink' href='#5.0.0.0'>5.0.0.0 (Jun 11, 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.2'>5.0.0.2 (Sept 28, 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.4'>5.0.0.4 (Oct 7, 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.6'>5.0.0.6 (Oct 30, 2012)</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.8'>5.0.0.8 (Jan 30, 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.10'>5.0.0.10 (Mar 7, 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.12'>5.0.0.12 (Mar 10, 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.14'>5.0.0.14 (Mar 23, 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.16'>5.0.0.16 (Mar 25, 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.18'>5.0.0.18 (Mar 27, 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.20'>5.0.0.20 (Apr 7, 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.22'>5.0.0.22 (Apr 12, 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.24'>5.0.0.24 (May 9, 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.26'>5.0.0.26 (Jun 5, 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.28'>5.0.0.28 (July 9, 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.30'>5.0.0.30 (Aug 8, 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.32'>5.0.0.32 (Oct 5, 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.34'>5.0.0.34 (Nov 10, 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.36'>5.0.0.36 (Dec 18, 2013)</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.1.0.1'>5.1.0.1 (Jan 25, 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.3'>5.1.0.3 (Jun 28, 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.5'>5.1.0.5 (Sept 1, 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.7'>5.1.0.7 (Oct 5, 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.9'>5.1.0.9 (Dec 1, 2014)</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.11'>5.1.0.11 (Feb 14, 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.13'>5.1.0.13 (Apr 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.15'>5.1.0.15 (May 24, 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.17'>5.1.0.17 (Aug 3, 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.19'>5.1.0.19 (Aug 15, 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.2.0.0'>5.2.0.0 (Dec 30, 2015)</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='#6.0.0'>6.0.0 (Oct 3, 2016)</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.1.0'>6.1.0 (Feb 25, 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.3.0'>6.3.0 (Jun 30, 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.4.0'>6.4.0 (Oct 5, 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='#7.0.1'>7.0.1 (Dec 24, 2017)</a></p>
<li><p><a class='doclink' href='#7.1.0'>7.1.0 (Mar 08, 2018)</a></p>
<li><p><a class='doclink' href='#7.2.0'>7.2.0 (Sept 25, 2018)</a></p>
<li><p><a class='doclink' href='#7.2.1'>7.2.1 (Oct 23, 2018)</a></p>
<li><p><a class='doclink' href='#7.2.2'>7.2.2 (Nov 7, 2018)</a></p>
<li><p><a class='doclink' href='#8.0.0'>8.0.0 (Jan 01, 2019)</a></p>
<li><p><a class='doclink' href='#8.1.0'>8.1.0 (Aug 21, 2019)</a></p>
<li><p><a class='doclink' href='#8.1.1'>8.1.1 (Sept 20, 2019)</a></p>
<li><p><a class='doclink' href='#8.1.2'>8.1.2 (Dec 01, 2019)</a></p>
<li><p><a class='doclink' href='#8.1.3'>8.1.3 (TBD)</a></p>
</ul>

	
<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.0' id='5.0.0.0'>5.0.0.0 (Jun 11, 2012)</a></h3>
<div class='topic'><!-- START: 5.0.0.0 -->
<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 <dc>Transform</dc> class, which is associated with the <c>BeanContext</c> class (and thus the Serializer and Parser classes too) through the <c>BeanContext.addTransforms(Class[])</c> method.<br>
		Two new subclasses of <dc>Transform</dc>:
		<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 <c>Cast</c> and <c>BeanFilter</c> APIs which were considerably more complicated and puts them under a common API. 
	</li>
	<li>
		Elimination of <c>_class</c> 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 <c>BeanMap</c> API.<br>
				The number of reflection calls have been significantly reduced in the <c>BeanMap</c> 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 <c>RestServlets</c>.<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 (<c>Accept-Encoding: gzip</c>) and charsets (e.g <c>Accept-Charset: SJIS</c>) 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 <c>OPTIONS</c> pages for resources.
			</li>
		</ul>
	</li>
	<li>
		Automatic support for SOAP XML output on <js>"text/soap+xml"</js> requests against <c>RestServlet</c>.
	</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 <c>Enum</c>.
	</li>
		<li>
		Significant improved support for various flavors of parameterized types, such as subclasses of parameterized types (e.g. <c>MyBeanList <jk>extends</jk> LinkedList&lt;MyBean&gt;</c>).
		</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><!-- END: 5.0.0.0 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.1' id='5.0.0.1'>5.0.0.1 (Jun 14, 2012)</a></h3>
<div class='topic'><!-- START: 5.0.0.1 -->
<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><!-- END: 5.0.0.1 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.2' id='5.0.0.2'>5.0.0.2 (Sept 28, 2012)</a></h3>
<div class='topic'><!-- START: 5.0.0.2 -->
<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 <c>org.apache.juneau.json</c>).
	</li>
	<li>
		Automatic support for parsing maps with <c>Enum</c> keys, and parsing <c>Enum</c> strings.<br>
		This was previously possible using filters, but now it's built-in for all the parsers.
	</li>
	<li> 
		Replaced the <c>ObjectList.toXArray()</c> methods with a new <c>elements(Class&lt;T&gt; type)</c> method that's more efficient and avoids creating an unnecessary array.
	</li>
	<li> 
		Support for parsing into beans with read-only properties.<br>
		New <dc>@BeanConstructor</dc> 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><!-- END: 5.0.0.2 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.3' id='5.0.0.3'>5.0.0.3 (Oct 3, 2012)</a></h3>
<div class='topic'><!-- START: 5.0.0.3 -->
<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 <dc>@BeanConstructor</dc> 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><!-- END: 5.0.0.3 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.4' id='5.0.0.4'>5.0.0.4 (Oct 7, 2012)</a></h3>
<div class='topic'><!-- START: 5.0.0.4 -->
<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} annotation 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 <dc>BeanContext.convertToType(Object,Class)</dc> to be able to convert <c>Strings</c> to classes with 
		<c>fromString(String)</c>/<c>valueOf(String)</c> static methods or <c>T(String)</c> constructors.
	</li>	
</ul>
</div><!-- END: 5.0.0.4 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.5' id='5.0.0.5'>5.0.0.5 (Oct 29, 2012)</a></h3>
<div class='topic'><!-- START: 5.0.0.5 -->
<p>
	Juno 5.0.0.5 is a major update.
</p>
<ul class='spaced-list'>
	<li>New <c><ja>@RestChild</ja></c> annotation for identifying child resources.</li>
	<li>
		New <c>traversable</c> and <c>filterable</c> attributes added to {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod} annotation.<br>
		Eliminates the need for <dc>PojoResource</dc> and <dc>FilteredRestResource</dc> 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 <c>resourceUri</c> 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 <c>RdfXmlSerializer</c>.</li>
		</ul>
	</li>	
</ul>
</div><!-- END: 5.0.0.5 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.6' id='5.0.0.6'>5.0.0.6 (Oct 30, 2012)</a></h3>
<div class='topic'><!-- START: 5.0.0.6 -->
<p>
	Juno 5.0.0.6 is a minor update that fixes a small bug in 5.0.0.5.
</p>
</div><!-- END: 5.0.0.6 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.7' id='5.0.0.7'>5.0.0.7 (Jan 20, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.7 -->
<p>
	Juno 5.0.0.7 is a major update.
</p>
<h5 class='topic w800'>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 <c>@Xml.namespaces</c> annotation.<br>
				Namespaces can be defined at package, class, method, or field levels.
			</li>
			<li>
				New <c>@Xml.nsUri</c> annotation.<br>
				Shortcut for specifying namespace URIs.
			</li>
			<li>
				New <c>@Xml.valAttr</c> 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><dc>SerializerContext</dc></li>
			<li><dc>ParserContext</dc></li>
		</ul>		
	</li>
	<li>
		Enhancements to {@link org.apache.juneau.BeanContext}:
		<ul>
			<li>
				Ability to mark bean properties as hidden using <dc>@BeanProperty(hidden)</dc> so that they don't get serialized.
			</li>
			<li>
				Simplified <c>ClassType</c> {@link org.apache.juneau.ClassMeta} API.<br>
				Combined 4 classes into a single class.
			</li>
			<li>
				New <dc>@Bean.filter</dc> and <dc>@BeanProperty.filter</dc> annotations.<br>
				Used for defining filters on bean classes and bean properties instead of just globally through <c>BeanContext.addTransforms(Class[])</c>.
			</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 <dc>@BeanProperty.beanUri</dc> and <dc>@BeanProperty.id</dc> 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 <c>rdf:resource</c> attributes.
			</li>
			<li>
				New <dc>BeanProperty.properties()</dc> 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 w800'>REST client updates</h5>
<ul class='spaced-list'>
	<li>GZIP compression support.</li>
	<li>Bug fixes.</li>
</ul>
<h5 class='topic w800'>REST server updates</h5>
<ul class='spaced-list'>
		<li>
		Support for overriding bean context and serializer properties in a REST method call through new <dc>RestResponse.setProperty(String,Object)</dc> 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><dc>@RestResource(filters)</cc> - Associate post-formatting filters on a resource level.</li>
			<li><dc>@RestResource.guards</dc> - Associate resource-level guards.</li>
			<li><dc>@RestResource.messages</dc> - Associate a resource bundle with a REST servlet.  Comes with several convenience methods for looking up messages for the client locale.</li>
			<li><dc>@RestResource.properties</dc> - Override default bean context, serializer, and parser properties though an annotation.</li>
		</ul> 
	</li>
	<li>
		Several new annotations on REST methods:
		<ul>
			<li><c>@RestMethod(filters)</c> - 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><dc>@Attr</dc> - A parameter or URL variable value as a parsed POJO.</li>
			<li><dc>@Param</dc> - A query parameter value as a parsed POJO.</li>
			<li><dc>@PathRemainder</dc>- The remainder after a URL pattern match as a String.</li>
			<li><dc>@Header</dc> - An HTTP header value as a parsed POJO.</li>
			<li><dc>@Content</dc> - 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><!-- END: 5.0.0.7 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.8' id='5.0.0.8'>5.0.0.8 (Jan 30, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.8 -->
<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><!-- END: 5.0.0.8 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.9' id='5.0.0.9'>5.0.0.9 (Feb 26, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.9 -->
<p>
	Juno 5.0.0.9 is a moderate update.
</p>
<h5 class='topic w800'>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 <c>ObjectMaps</c> directly to beans.</li>
</ul>
<h5 class='topic w800'>REST server API changes</h5>
<ul class='spaced-list'>
	<li>Build-in default <c>OPTIONS</c> pages.</li>
	<li>New <dc>@RestResource.defaultRequestHeaders</dc> and <dc>@RestResource.defaultResponseHeaders</dc> 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 <dc>@RestMethod(defaultRequestHeaders)</dc> 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><c>Readers</c> and <c>InputStreams</c> can be specified on <dc>@Content</dc> annotated parameters.</li>
	<li>New <dc>@HasParam</dc> annotation.</li>
	<li>Full RFC2616 support for matching <c>Accept</c> headers to serializers.</li>		
</ul>
<h5 class='topic w800'>Other notes</h5>
<ul class='spaced-list'>
	<li>Smaller library size (460kB).</li>
</ul>
</div><!-- END: 5.0.0.9 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.10' id='5.0.0.10'>5.0.0.10 (Mar 7, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.10 -->
<p>
	Juno 5.0.0.10 is a minor update.
</p>
<h5 class='topic w800'>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 w800'>REST server API changes</h5>
<ul class='spaced-list'>
	<li>New <c>RestServletProperties</c> class that defines all the class-level properties that can be set on the servlet.</li>
	<li>Properties can be set through <dc>@RestResource.propertie</dc> annotation, or new <dc>RestServlet.setProperty(String,Object)</dc> 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 <c>RestServletProperties.REST_useStackTraceHashes</c> property to prevent the same stack trace from being logged multiple times.</li>
	<li>New <c>RestServletProperties.REST_renderResponseStackTraces</c> property for preventing stack traces in responses for security reasons.</li>
	<li>New overridable <c>RestServlet.onError(HttpServletRequest,HttpServletResponse,RestException,boolean)</c> and <dc>RestServlet.onSuccess(RestRequest,RestResponse,long)</dc> methods for plugging in your own logging and peformance monitoring.</li>
	<li>Eliminated <c>RestServlet.getInitParams()</c> method, since it's now redundant with <dc>RestServlet.getProperties()</dc>.</li>
	<li>Header parameters passed as URL parameters are now case-insensitive.</li>			
</ul>
</div><!-- END: 5.0.0.10 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.11' id='5.0.0.11'>5.0.0.11 (Mar 8, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.11 -->
<p>
	Juno 5.0.0.11 is a moderate update.
</p>
<h5 class='topic w800'>REST server API changes</h5>
<ul class='spaced-list'>
	<li>	
		New <c>UrlEncodingRestSerializer</c> and <c>UrlEncodingRestParser</c> classes.<br>
		Allows parsing form posts directly to POJOs.
	</li>
	<li>
		Support for <c>Accept</c> and <c>Content-Type</c> <js>"application/x-www-form-urlencoded"</js> added by default on {@link org.apache.juneau.rest.BasicRestServlet}.
	</li>
	<li>
		New <dc>RestServlet.renderError(HttpServletRequest,HttpServletResponse,RestException)</dc> method to allow customized handling of response errors.
	</li>
</ul>
</div><!-- END: 5.0.0.11 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.12' id='5.0.0.12'>5.0.0.12 (Mar 10, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.12 -->
<p>
	Juno 5.0.0.12 is a minor update.
</p>
<h5 class='topic w800'>Core API changes</h5>
<ul class='spaced-list'>
	<li>
		Relaxed method naming conventions when using <dc>@BeanProperty</dc> annotation.<br>
		Methods with zero parameters are interpreted as getters, and methods with one parameter are interpreted as setters.<br>
		Eliminated the <c>BeanProperty.method</c> annotation, since it's now unnecessary.
			</li>
</ul>		
<h5 class='topic w800'>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 <c>PlainTextRestSerializer</c> class for serializing <js>"plain/text"</js> requests.<br>
		Useful for debugging purposes.
	</li>
   		<li>
		<c>Readers</c> and <c>InputStreams</c> can now be passed in as <dc>@Content</dc> 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 <c>?debug</c> parameter.<br>
		Dumps better information to the log file, such as all header parameters.
	</li>
</ul>
</div><!-- END: 5.0.0.12 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.13' id='5.0.0.13'>5.0.0.13 (Mar 14, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.13 -->
<p>
	Juno 5.0.0.13 is a minor update.
</p>
<h5 class='topic w800'>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 <c>SerializerContext.SERIALIZER_uriContext</c> and <c>SerializerContext.SERIALIZER_uriAuthority</c> 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 <c>java.net.URI</c> or <c>java.net.URL</c>.
	</li>
	<li>
		New {@link org.apache.juneau.html.HtmlSerializer#HTML_uriAnchorText} HTML serializer property for tailoring how anchor text is rendered.
	</li>
	<li>
		Renamed <c>BeanProperty#uri</c> annotation to <c>BeanProperty#beanUri</c> 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 <c>BeanProperty#id</c> annotation.
	</li>
</ul>
<h5 class='topic w800'>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><c>SerializerContext.SERIALIZER_uriContext</c> property set by default to web app context root.</li>
			<li><c>SerializerContext.SERIALIZER_uriAuthority</c> property set by default to the request scheme+hostname+port.</li>
       		</ul>
       	</li>
       	<li>
		Fixed bug involving <c>Accept-Charset</c> header in Chrome that prevented HTML output from rendering correctly in that browser.<br>
		<c>Accept-Charset</c> handling should now be fully W3C compliant.
	</li>
</ul>
</div><!-- END: 5.0.0.13 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.14' id='5.0.0.14'>5.0.0.14 (Mar 23, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.14 -->
<p>
	Juno 5.0.0.14 is a major update.
</p>
<p>
	The biggest change is that the <c>RestSerializer</c>, <c>RestParser</c>, <c>RestSerializerGroup</c>, and <c>RestParserGroup</c> 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 w800'>Core API changes</h5>
<ul class='spaced-list'>
	<li>
		New <c>org.apache.juneau.serializer</c> 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 <c>Accept-Content</c> headers.</li>
			<li>Improved cloning support on serializers and serializer groups.</li>
		</ul>
       	</li>
       	<li>
       		New <c>org.apache.juneau.parser</c> 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 <c>org.apache.juneau.transform</c> 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 <c>ObjectFilter</c>).</li>
       		</ul>
       	</li>
       	<li>
		New <c>org.apache.juneau.encoders</c> 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 <c>Accept-Encoding</c> header values.</li>
		</ul>
	</li>
	<li>
		New <c>org.apache.juneau.plaintext</c> 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 <c>org.apache.juneau.jso</c> package.
		<ul>
			<li>New {@link org.apache.juneau.jso.JsoSerializer} class for serializing <c>application/x-java-serialized-object</c> content.</li>
		</ul>
	</li>
	<li>
		New <c>org.apache.juneau.soap</c> package.
		<ul>
			<li>New {@link org.apache.juneau.soap.SoapXmlSerializer} class for serializing <c>text/xml+soap</c> 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>
		<c>JsonMap</c> and <c>JsonList</c> 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 <c>PojoSwap</c> to {@link org.apache.juneau.utils.PojoQuery} to not confuse it with the new Filter API.
	</li>
</ul>
<h5 class='topic w800'>REST server API changes</h5>
<ul class='spaced-list'>
	<li>
		Eliminated <c>org.apache.juneau.rest.serializers</c> and <c>org.apache.juneau.rest.parsers</c> packages.
		<ul>
			<li>All existing REST serializers and parsers merged into the core API.</li>
		</ul>
	</li>
</ul>
<h5 class='topic w800'>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 <c>RestCmdLine</c> (since it's essentially redundant with CURL).
	</li>
</ul>
</div><!-- END: 5.0.0.14 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.15' id='5.0.0.15'>5.0.0.15 (Mar 24, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.15 -->
<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 <dc>@Produces</dc> annotation in place of <c>ISerializer.getMediaTypes()</c> for specifying what media types a serializer produces.<br>
		Available when subclassing from {@link org.apache.juneau.serializer.Serializer}.
	</li>
	<li>
		New <dc>@Consumes</dc> annotation in place of <c>IParser.getMediaTypes()</c> for specifying what media types a parser consumes.<br>
		Available when subclassing from {@link org.apache.juneau.parser.Parser}.
	</li>
</ul>
</div><!-- END: 5.0.0.15 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.16' id='5.0.0.16'>5.0.0.16 (Mar 25, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.16 -->
<p>
	Juno 5.0.0.16 is a minor update.
</p>
<ul class='spaced-list'>
	<li>
		New <dc>@Properties</dc> 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><!-- END: 5.0.0.16 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.17' id='5.0.0.17'>5.0.0.17 (Mar 25, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.17 -->
<p>
	Juno 5.0.0.17 is a minor update.
</p>
<ul class='spaced-list'>
	<li>
		Charset now passed as a parameter to <c>IOutputStreamSerializer.serialize()</c> and <c>IInputStreamParser.parse()</c>. 
	</li>
</ul>
</div><!-- END: 5.0.0.17 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.18' id='5.0.0.18'>5.0.0.18 (Mar 27, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.18 -->
<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 <c>RdfParser</c> 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 <c>RdfXmlSerializer</c> 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 w800'>Other changes</h5>
<ul class='spaced-list'>
	<li>
		New {@link org.apache.juneau.jso.JsoParser} class.  
	</li>
</ul>
</div><!-- END: 5.0.0.18 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.19' id='5.0.0.19'>5.0.0.19 (Apr 1, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.19 -->
<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><dc>RestServlet.onPreCall(RestRequest)</dc></li>
			<li><dc>RestServlet.onPostCall(RestRequest,RestResponse)</dc></li>
		</ul>
	</li>
	<li>
		<jsf>TRIM_NULLS</jsf> setting changed to <dc>SerializerContext.SERIALIZER_trimNullProperties</dc>.<br>
		New property default is <jk>true</jk>. 
		Only applies to bean properties, not map or collection entries.
	</li>
</ul>
</div><!-- END: 5.0.0.19 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.20' id='5.0.0.20'>5.0.0.20 (Apr 7, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.20 -->
<p>
	Juno 5.0.0.20 is a major update.
</p>
<h5 class='topic w800'>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>
		<dc>XmlSerializerContext.XML_autoDetectNamespaces</dc> 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 <dc>XmlSerializerContext.XML_namespaces</dc> 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 w800'>REST server API changes</h5>
<ul class='spaced-list'>
	<li>
		Allow inheritance of <dc>@RestResource</dc> 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 <c>RestMethod.filters()</c> annotation for defining POJO filters at the method level.
			</li>
			<li>
				New <dc>RestMethod.serializersInherit()</dc> and <dc>RestMethod.parsersInherit()</dc> annotations for controlling how serializers and parsers (and associated filters and properties) are inherited from the class.<br>
				This replaces the previous <c>addSerializers</c> and <c>addParsers</c> annotations.
		</ul>
	</li>
	<li>
		New <dc>RestServletJenaDefault</dc> servlet that includes serialization/parsing support for all Jena-based serializers and parsers.
	</li>
	<li>
		New <dc>DefaultJenaProvider</dc> JAX-RS provider that includes serialization/parsing support for all Jena-based serializers and parsers.
	</li>
	<li>
		Eliminated <c>RestServletChild</c> class.<br>  
		It's redundant with the introduction of inheritable annotations.
	</li>
	<li>
		New methods on {@link org.apache.juneau.rest.RestServlet}:
		<ul>
			<li><c>RestServlet.createConfigFactory()</c></li>
			<li><c>RestServlet.createSerializers()</c></li>
			<li><c>RestServlet.createParsers()</c></li>
		</ul>
		These augment the existing <c>getBeanContext()</c> / <c>getSerializers()</c> / <c>getParsers()</c> methods.		
	</li>
</ul>
<h5 class='topic w800'>REST client API changes</h5>
<ul class='spaced-list'>
	<li>
		New <c>RestCall.setDateHeader(String,Object)</c> method for setting ISO8601 datetime headers.
	</li>
</ul>
</div><!-- END: 5.0.0.20 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.21' id='5.0.0.21'>5.0.0.21 (Apr 9, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.21 -->
<p>
	Juno 5.0.0.21 is a minor update.
</p>
<h5 class='topic w800'>Core API changes</h5>
<ul class='spaced-list'>
	<li>
		New <dc>HtmlDocSerializerContext.HTMLDOC_navlinks</dc> annotation for addint links to HTML page views.
	</li>
	<li>
		Renamed the properties in <dc>HtmlDocSerializerContext</dc> for clarity.
	</li>
</ul>		
<h5 class='topic w800'>Servlet API changes</h5>
<ul class='spaced-list'>
	<li>
		Added new <c>RestServlet.addDefaultProperties(ObjectMap,RestRequest)</c> 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 <c>SerializerContext.SERIALIZER_uriAuthority</c> and <c>SerializerContext.SERIALIZER_uriContext</c> properties were previously available.
		<ul>
			<li><c>RestServletProperties.REST_servletPath</c></li>
			<li><c>RestServletProperties.REST_pathInfo</c></li>
			<li><c>RestServletProperties.REST_method</c></li>
		</ul>
	</li>
	<li>
		Path variables annotated with <dc>@Attr</dc> are now automatically URL-decoded.
	</li>
</ul>
</div><!-- END: 5.0.0.21 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.22' id='5.0.0.22'>5.0.0.22 (Apr 12, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.22 -->
<p>
	Juno 5.0.0.22 is a minor update.
</p>
<h5 class='topic w800'>Core API changes</h5>
<ul class='spaced-list'>
	<li>
    	New <c><ja>@Property</ja>.nls()</c> 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 <c>AddressBookResource</c> class for an example.
    </li>
</ul>
<h5 class='topic w800'>REST Servlet API changes</h5>
<ul class='spaced-list'>
	<li>Fix a bug where the <c>&amp;Content</c> query parameter was not always parsed correctly.</li>
</ul>
</div><!-- END: 5.0.0.22 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.23' id='5.0.0.23'>5.0.0.23 (Apr 14, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.23 -->
<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 <c><ja>@Xml</ja></c> annotation was not being inherited by inner classes.
	</li>
	<li>
		Javadoc stylesheet improvements.
	</li>
</ul>
</div><!-- END: 5.0.0.23 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.24' id='5.0.0.24'>5.0.0.24 (May 9, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.24 -->
<p>
	Juno 5.0.0.24 is a major update.
</p>
<h5 class='topic w800'>Core API updates</h5>
<ul class='spaced-list'>
	<li>
		New support for {@link org.apache.juneau.dto.atom ATOM}.
		<ul>
			<li>New <c>AtomFeedResource</c> class added to sample war.
		</ul>
	</li>
	<li>
		New <dc>XmlFormat.CONTENT</dc> enum value.<br>
		Allows bean properties to be persisted as XML element text.
	</li>
	<li>
		New <dc>XmlContentHandler</dc> class and <dc>@Xml.contentHandler</dc> 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 <c><ja>@Xml</ja>.valAttr</c> annotation since it's now redundant with <c><ja>@Xml</ja>(format=<jsf>CONTENT</jsf>)</c>.
		</li>
		<li>
		Fixed timezone bug in {@link org.apache.juneau.transforms.CalendarSwap}.
	</li>
		<li>
		Simplified <c>Serializer.serialize(Object,Object,SerializerContext)</c> 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 w800'>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><!-- END: 5.0.0.24 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.25' id='5.0.0.25'>5.0.0.25 (May 11, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.25 -->
<p>
	Juno 5.0.0.25 is a minor update.
</p>
<h5 class='topic w800'>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 <c>SqlQueryResource</c> class in the sample war for demonstrating the <c>ResultSetList</c> DTO.
	</li>
</ul>
<h5 class='topic w800'>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 <c>Servlet.init()</c> so that <c>getProperties()</c> can be called during servlet initialization.
	</li>
   		<li>
  			New <c><ja>@Property</ja>.type</c> annotation with support for using system properties as resource properties.
  		</li>
</ul>
</div><!-- END: 5.0.0.25 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.26' id='5.0.0.26'>5.0.0.26 (Jun 5, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.26 -->
<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 <dc>@RestResource(children)</dc> defined on the resource class itself.<br>
		Child resource paths are specified through <dc>@RestResource(path)</dc>.
   		</li>
   		<li>
   			New <dc>ChildResourceDescriptions</dc> bean for automatically generating the contents of router resource pages.
   		</li>
   		<li>
		Changed <c><ja>@RestMethod</ja>.pattern()</c> to {@link org.apache.juneau.rest.annotation.RestMethod#path() @RestMethod(path)} for naming consistency.
	</li>
</ul>
</div><!-- END: 5.0.0.26 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.27' id='5.0.0.27'>5.0.0.27 (July 7, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.27 -->
<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.BasicRestServlet} 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 <c>OPTIONS</c> pages through new method <dc>ResourceOptions.getChildren()</dc>.
	</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><!-- END: 5.0.0.27 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.28' id='5.0.0.28'>5.0.0.28 (July 9, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.28 -->
<p>
	Juno 5.0.0.28 is a moderate update.
</p>
<ul class='spaced-list'>
	<li>
		Fixes an <c>OutOfMemoryError</c> and performance issue caused by incorrect caching of class metadata. 
	</li>
	<li>
		Added <c>WriterSerializer.serialize(Object,Writer)</c> convenience method for serializing directly to a writer.<br> 
		Applies to all serializers.
	</li>
</ul>
</div><!-- END: 5.0.0.28 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.29' id='5.0.0.29'>5.0.0.29 (Aug 2, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.29 -->
<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 <dc>Bean.subTypeProperty() subtypes</dc>. </li>
			<li>Replaced <c><ja>@Bean</ja>(filter=xxx)</c> with new <dc>@Transform</dc> 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><c>org.apache.juneau.transforms.DateSwap.ISO8601DTP</c></li>
			<li><c>org.apache.juneau.transforms.DateSwap.ISO8601DTZP</c></li>
		</ul>
	</li>
</ul>
</div><!-- END: 5.0.0.29 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.30' id='5.0.0.30'>5.0.0.30 (Aug 8, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.30 -->
<p>
	Juno 5.0.0.30 is a minor update.
</p>
<ul class='spaced-list'>
	<li> 
		Fixed bug involving beans using <dc>Bean.subTypes()</dc> annotation in addition to <c>subTypes</c> 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><!-- END: 5.0.0.30 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.31' id='5.0.0.31'>5.0.0.31 (Aug 9, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.31 -->
<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><!-- END: 5.0.0.31 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.32' id='5.0.0.32'>5.0.0.32 (Oct 5, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.32 -->
<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 <dc>org.apache.juneau.dto.jsonschema</dc> for information.
	</li>
	<li>
		New methods added to {@link org.apache.juneau.parser.Parser}:
		<ul>
			<li><c>org.apache.juneau.parser.Parser.parseMap(Object,int,Class,Class,Class)</c></li>
			<li><c>org.apache.juneau.parser.Parser.parseCollection(Object,int,Class,Class)</c></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 <c>Enums</c> through overriding <c>toString()</c> and <c>fromString()</c> on the enum class.<br>
		Previously used <c>Enum.valueOf()</c> to convert strings back into <c>Enums</c>.<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 <c>Object</c> when the type is erased.
		</li>
		<li>
			Bug fixes:
			<ul>
				<li>
				When duplicate fluent-style setters were defined with different parameter types (e.g. <c>setFoo(Foo f)</c>, <c>setFoo(Bar b)</c>), 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 <c>Accept</c> GET parameters with <js>'+'</js> (e.g. <c>&amp;Accept=text/json+simple</c>) wasn't working anymore.<br>
				The <c>Accept</c> parameter is supposed to interpret spaces as <js>'+'</js> to allow you to not have to write <c>&amp;Accept=text/json%2Bsimple</c>.
				</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><!-- END: 5.0.0.32 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.33' id='5.0.0.33'>5.0.0.33 (Oct 20, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.33 -->
<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>
				<c>WriterSerializer s = <jk>new</jk> JsonSerializer();</c><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 <c>addNotBeanClassPatterns(String...)</c> 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 <c>RestServletProperties</c>.
		<ul>
			<li><c>RestServletProperties.REST_trimTrailingUriSlashes</c><br>
				Also removed <c>RestRequest.getRequestURI(boolean trimTrailingSlashes)</c> method which is now redundant with this property.
			<li><c>RestServletProperties.REST_pathInfoBlankForNull</c><br>
				Also removed <c>RestRequest.getPathInfo(boolean returnBlankForNull)</c> method which is now redundant with this property.
		</ul>
	</li>
	<li>
		New JSON-Schema {@link org.apache.juneau.dto.jsonschema.JsonSchemaMap} class for supporting linked schemas.
	</li>
	<li>
		Serializers will no longer throw an exception when <c>maxDepth</c> 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:  <c>?x-response-headers={Refresh=1}</c>
	</li>
	<li>
		Removed <c>HtmlDocSerializerContext.<jsf>HTML_REFRESH</jsf></c> setting that added a Refresh meta tag to HTML documents, since this can now be controlled through <c>X-Response-Headers</c>.
	</li>
	<li>
		Small improvements to samples.
		<ul>
			<li><c>PhotosResource</c> now includes a default entry.
		</ul>
	</li>
</ul>
</div><!-- END: 5.0.0.33 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.34' id='5.0.0.34'>5.0.0.34 (Nov 10, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.34 -->
<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 w800'>
	<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 <c>RestServlet.createRequestVarResolver(RestRequest)</c> 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><dc>RestRequest.getVarResolver()</dc></li>
			<li><dc>RestRequest.getServletURI()</dc></li>
			<li><dc>RestRequest.getRequestParentURI()</dc></li>
		</ul>
	</li>
	<li>
		New methods on {@link org.apache.juneau.rest.RestResponse}:
		<ul>
			<li><c>RestResponse.sendRedirect(CharSequence)</c>
		</ul>
	</li>
	<li>
		New methods on {@link org.apache.juneau.rest.RestServlet} that allow easier customization by subclasses:
		<ul>
			<li><dc>RestServlet.createConfigFactory()</dc></li>
			<li><dc>RestServlet.createConverters()</dc></li>
			<li><dc>RestServlet.createDefaultRequestHeaders()</dc></li>
			<li><dc>RestServlet.createDefaultResponseHeaders()</dc></li>
			<li><dc>RestServlet.createEncoders()</dc></li>
			<li><dc>RestServlet.createFilters()</dc></li>
			<li><dc>RestServlet.createGuards()</dc></li>
			<li><dc>RestServlet.createMimetypesFileTypeMap()</dc></li>
			<li><dc>RestServlet.createParsers()</dc></li>
			<li><dc>RestServlet.createProperties()</dc></li>
			<li><dc>RestServlet.createRequestProperties(ObjectMap,RestRequest)</dc></li>
			<li><dc>RestServlet.createRequestVarResolver(RestRequest)</dc></li>
			<li><dc>RestServlet.createSerializers()</dc></li>
			<li><dc>RestServlet.createUrlEncodingParser()</dc></li>
		</ul>
	</li>
	<li>
		Changed <c>RestServletNls</c> to use <c>ResourceDescription/MethodDescription</c>
			instead of <c>RestResource/RestMethod</c>
	</li>
	<li>
		New property <c>RestServletProperties.REST_htDocsFolder</c>.<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 <dc>BeanFilter.setStopClass(Class)</dc> which is the program equivalent to the annotation above.
	</li>
	<li>
		New methods on {@link org.apache.juneau.dto.ResultSetList}:
		<ul>
			<li><c>ResultSetList.handleBlob(Blob)</c></li>
			<li><c>ResultSetList.handleClob(Clob)</c></li>
		</ul>
</ul>
</div><!-- END: 5.0.0.34 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.35' id='5.0.0.35'>5.0.0.35 (Nov 26, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.35 -->
<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><!-- END: 5.0.0.35 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.0.0.36' id='5.0.0.36'>5.0.0.36 (Dec 18, 2013)</a></h3>
<div class='topic'><!-- START: 5.0.0.36 -->
<p>
	Juno 5.0.0.36 is a minor update.
</p>
<ul class='spaced-list'>
	<li>Implemented <c>org.apache.juneau.urlencoding.UrlEncodingParser.parseArgs(Reader,int,ClassMeta[])</c>.
	<li><c>name</c> parameter of <dc>ResourceDescription#ResourceDescription(String,String,String)</dc>. 
		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 <dc>BeanContext.getClassMetaFromString(String)</dc>.
		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><!-- END: 5.0.0.36 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.0' id='5.1.0.0'>5.1.0.0 (Jan 18, 2014)</a></h3>
<div class='topic'><!-- START: 5.1.0.0 -->
<p>
	Juno 5.1.0.0 is a major update.
</p>
<h5 class='topic w800'>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 <c>HttpClient</c> 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 <c>org.apache.juneau.rest.client.jazz</c> package and <c>org.apache.juneau.rest.client.jazz.JazzRestClient</c> 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 <dc>org.apache.juneau.urlencoding</dc> package for details. 
	<li>Changes to Parser API.
	<ul>
		<li>Removal of <c>ExtendedReaderParser</c> abstract class and moved methods into 
			{@link org.apache.juneau.parser.ReaderParser} class.  
		<li>Removal of <c>DataFormat</c> class from API since it was no longer necessary
			due to API change above.
		<li>Removal of <c>ParserStringReader</c> class.<br>
			This was a reader optimized to work with <c>String</c> 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 <c>String</c> input, and tests show no significant performance differences.
		<li>New <c>org.apache.juneau.parser.Parser.parse(Object,int,ClassMeta)</c> convenience method added.
	</ul>
</ul>	
<h5 class='topic w800'>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 <dc>BeanContext.getClassMetaFromString(String)</dc>.<br>
		Now supports resolving <c>"long[]"</c>, and so forth.
	<li><dc>ResourceDescription</dc> 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. <c>http://host/contextRoot/foo%2Fbar</c>).
	<li>Removed lazy-initialization that required locking in {@link org.apache.juneau.ClassMeta}.  
	<li>New <c>BeanContext.setDefaultParser(ReaderParser)</c> method added for specifying 
		a default parser to use in a bean context (used when converting beans to <c>Strings</c> using 
		<dc>BeanContext.convertToType(Object,Class)</dc>.
		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 <dc>RestRequest#getParameter(String,Class)</dc>.
		<li>Added <c>RestRequest.getMapParameter(String,Class,Class,Class)</c> and 
			<c>RestRequest.getCollectionParameter(String,Class,Class)}</c> methods.
	</ul>
</ul>
</div><!-- END: 5.1.0.0 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.1' id='5.1.0.1'>5.1.0.1 (Jan 25, 2014)</a></h3>
<div class='topic'><!-- START: 5.1.0.1 -->
<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 <dc>@PathRemainder</dc>.
	<li>Fixed bug involving incorrect calculation of <c>pathInfo</c> on child resources.
</ul>
</div><!-- END: 5.1.0.1 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.2' id='5.1.0.2'>5.1.0.2 (Apr 27, 2014)</a></h3>
<div class='topic'><!-- START: 5.1.0.2 -->
<p>
	Juno 5.1.0.2 is a minor update.
</p>
<ul class='spaced-list'>
	<li>Fixed issue preventing <c>&amp;Accept-Language</c> 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 <c>RestServletProperties.REST_allowMethodParam</c> to be disabled by default.  
</ul>
</div><!-- END: 5.1.0.2 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.3' id='5.1.0.3'>5.1.0.3 (Jun 28, 2014)</a></h3>
<div class='topic'><!-- START: 5.1.0.3 -->
<p>
	Juno 5.1.0.3 is a moderate update.
</p>

<h5 class='topic w800'>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 <c>BeanContext.<jsf>INCLUDE_BEAN_FIELD_PROPERTIES</jsf></c> and <c>BeanContext.<jsf>INCLUDE_BEAN_METHOD_PROPERTIES</jsf></c> 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 <dc>@BeanProperty</dc> annotation can now be used on non-public fields/getters/setters to override
		the default behavior defined by the <c>VISIBILITY</c> 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 <c>Introspector</c>
		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 <dc>@BeanProperty(hidden=true)</dc> 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 <dc>Bean.subTypeProperty()</dc> 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 <c><xt>&lt;div</xt> <xa>id</xa>=<xs>'data'</xs><xt>&gt;</xt></c> element to make it easier to extract the data portion of the page in Javascript in browsers.
</ul>

<h5 class='topic w800'>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 <dc>$A{...}</dc> (request attributes) and <dc>$P{...}</dc> (request parameters) to <c>RestServlet.createRequestVarResolver(RestRequest)</c>.
</ul>
</div><!-- END: 5.1.0.3 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.4' id='5.1.0.4'>5.1.0.4 (Aug 25, 2014)</a></h3>
<div class='topic'><!-- START: 5.1.0.4 -->
<p>
	Juno 5.1.0.4 is a minor update.
</p>

<ul class='spaced-list'>
	<li>New <dc>RestServlet.getPath()</dc> method.
	<li>New <c>SerializerContext.getJavaMethod()</c> and <c>ParserContext.getJavaMethod()</c>
			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 <c>BeanContext.addTransforms(Class[])</c>.
		Previously, adding multiple conflicting filters resulted in random behavior.  
		Now filters are overridden when multiple matching filters are applied.
	<li>Allow <dc>HtmlDocSerializerContext</dc> properties to be set via <dc>Serializer.setProperty(String,Object)</dc>.
		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><!-- END: 5.1.0.4 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.5' id='5.1.0.5'>5.1.0.5 (Sept 1, 2014)</a></h3>
<div class='topic'><!-- START: 5.1.0.5 -->
<p>
	Juno 5.1.0.5 is a moderate update.
</p>
<ul class='spaced-list'>
	<li>New <dc>Redirect</dc> class that simplifies performing redirections in REST methods.
	<li>New pluggable {@link org.apache.juneau.rest.ResponseHandler} class and <dc>@RestResource(responseHandlers)</dc> annotation
		for defining customer response handlers for special kinds of POJOs.
	<li>New method <dc>UrlEncodingSerializer.serializeUrlPart(Object)</dc> method.
	<li>New method <dc>RestRequest.getServletURIBuilder()</dc> 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 <dc>CoreObject.setProperties(ObjectMap)</dc>
		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 <c>Content-Encoding</c> and<c>Character-Encoding</c> 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 <c>RestResponse.sendRedirect(...)</c> methods due to the introduction of the <dc>Redirect</dc> class.
</ul>
</div><!-- END: 5.1.0.5 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.6' id='5.1.0.6'>5.1.0.6 (Sept 21, 2014)</a></h3>
<div class='topic'><!-- START: 5.1.0.6 -->
<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 <c>beanContext</c> parameter was replaced with a <dc>PojoSwap#getBeanContext()</dc> 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, <dc>Img</dc> is an example of defining an XHTML element using Juno DTOs.
	<li>{@link org.apache.juneau.json.JsonParser} now ignores trailing <c>';'</c> characters in input so that it can 
		parse strings of the form <js>"var x = {'foo':'bar'};"</js>.
	<li>New <c>TumblrParserResource</c> 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><!-- END: 5.1.0.6 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.7' id='5.1.0.7'>5.1.0.7 (Oct 5, 2014)</a></h3>
<div class='topic'><!-- START: 5.1.0.7 -->
<p>
	Juno 5.1.0.7 is a moderate update.
</p>
<ul class='spaced-list'>
	<li>Improved error handling.  
	<li>New <dc>ParserContext.PARSER_debug</dc> and <dc>SerializerContext.SERIALIZER_debug</dc>.
		settings for logging additional information for debugging problems.
	<li>New <dc>SERIALIZER_ignoreRecursions</dc> setting for explicitly 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 <c>StackOverflowErrors</c>.  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 <c>SerializerContext.getProperties()</c> and
		<c>ParserContext.getProperties()</c>.		
	<li>Removed media-type and encoding attributes from <dc>SerializerContext</dc> and <dc>ParserContext</dc>	
		since these are now available through context properties, and are typically not used.
	<li>{@link org.apache.juneau.xml.XmlParser} now accepts <c>application/xml</c>.		
	<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><!-- END: 5.1.0.7 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.8' id='5.1.0.8'>5.1.0.8 (Oct 25, 2014)</a></h3>
<div class='topic'><!-- START: 5.1.0.8 -->
<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 <c>estimatedSize</c> 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 <c>BeanPropertyStore</c> class that handles creation of {@link org.apache.juneau.BeanContext} objects.
				This allows <c>BeanContext</c> 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 <dc>RestClient#createHttpClient()</dc> to allow customized subclasses to construct customized HTTP clients.
			<li>Removed the <c>DefaultRestClient</c> class since it's now fully redundant with <c>RestClient</c>.
			<li>Added <c>RestClient.shutdown()</c> method for cleaning up the internal HTTP client when you're done using a REST client.
		</ul>
	</li>
</ul>
</div><!-- END: 5.1.0.8 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.9' id='5.1.0.9'>5.1.0.9 (Dec 1, 2014)</a></h3>
<div class='topic'><!-- START: 5.1.0.9 -->
<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><c>org.apache.juneau</c> - Core serializers and parsers.
			<li><c>org.apache.juneau.rest</c> - REST server component.
			<li><c>org.apache.juneau.rest.client</c> - REST client component.
		</ul>
	<li>Code changes to facilitate breaking up bundles:
		<ul>
			<li><c>org.apache.juneau.rest.labels.Link</c> class moved to <dc>Link</dc>.
			<li>References to <c>org.apache.juneau.rest.RestException</c> in {@link org.apache.juneau.encoders.Encoder} class changed to <c>IOException</c>.
		</ul>
	<li>Changed configuration names for consistency with Jazz Framework.
	<li><dc>RestClient.execute(HttpUriRequest)</dc> method that allows subclasses to handle their own HTTP request execution.
	<li>Changes in <c>JazzRestClient</c> to handle introduction of SSO support in v6.
	<li><c>&amp;plainText</c> debug feature was broken.
	<li>Removed double-buffering in <c>RestRequest</c>.
	<li>Metadata cleanup, Find Bug fixes.
</ul>
</div><!-- END: 5.1.0.9 -->

<!-- ==================================================================================================== -->

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

<h5 class='topic w800'>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 <c>BeanRuntimeExceptions</c> weren't being thrown on subsequent calls to {@link org.apache.juneau.BeanContext#getClassMeta(Class)}.
	<li>Moved logic for <c>BeanContext.getPrimitiveDefault(Class)</c> to new {@link org.apache.juneau.ClassMeta#getPrimitiveDefault()} method for performance reasons.
	<li>Fixed bug in <dc>BeanContext.addTransforms(Class[])</dc> 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 <c>RuntimeExceptions</c> to make the serializer easier to use for debugging.
</ul>

<h5 class='topic w800'>Server</h5>		
<ul class='spaced-list'>
	<li>Fixed major issue that prevented parsing URL-Encoded form posts into POJOs.
		Calling <dc>HttpServlet.getParameter(String)</dc> was forcing the underlying servlet code to process the HTTP body itself, preventing the <c>UrlEncodingSerializer</c>
		class from being able to parse the content.  Updated code no longer inadvertantly calls this method.
	<li>New <dc>RestRequest.getQueryParameter(String)</dc>, <dc>RestRequest.hasQueryParameter(String)</dc>, and <dc>RestRequest.hasAnyQueryParameters(String[])</dc>
		methods that only look for parameters in the URL query string to prevent loading and parsing of URL-Encoded form posts.
	<li>New <dc>@QParam</dc> and <dc>@HasQParam</dc> annotations for accessing query parameters from the URL query string.
	<li><c>&amp;plainText</c> parameter can now specify a false value.
	<li>Removed properties parameters from <dc>RestServlet.onPreCall(RestRequest)</dc> and <dc>RestServlet#onPostCall(RestRequest,RestResponse)</dc> methods
		since the properties are already accessible through <c>RestRequest.getProperties()</c>.
	<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.BasicRestServlet} and <dc>RestServletJenaDefault</dc>.
</ul>

<h5 class='topic w800'>Client</h5>		
<ul class='spaced-list'>
	<li>Moved to Apache HttpClient 4.3 to match Jazz 6.0.
	<li>Renamed <c>RestResponseEntity</c> 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><dc>RestClient#setProperty(String,Object)</dc>			
			<li><dc>RestClient#setProperties(ObjectMap)</dc>	
			<li><dc>RestClient#addNotBeanClasses(Class[])</dc>		
			<li><dc>RestClient.addTransforms(Class[])</dc>		
			<li><dc>RestClient#addImplClass(Class,Class)</dc>	
		</ul>
	<li>Renamed <c>RestClient.shutdown()</c> to {@link org.apache.juneau.rest.client.RestClient#close()} to mirror change in Apache API.		
</ul>

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

<!-- ==================================================================================================== -->

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

<h5 class='topic w800'>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 <dc>UonParserContext.UON_whitespaceAware</dc> property for controlling whether whitespace is ignored.
			<li>New <dc>UrlEncodingContext.URLENC_expandedParams</dc> 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. <c>&amp;key=val1&amp;key=val2</c>).
		</ul>
	</li>
	<li>New <dc>JsonSerializerContext.JSON_escapeSolidus</dc> 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 <dc>BeanPropertyMeta.add(BeanMap,Object)</dc> method for adding values to Collection and array properties.
	<li>Config INI files now support keys with name <js>"*"</js>.
</ul>

<h5 class='topic w800'>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 <dc>@Param(multipart)</dc>
		and <dc>@Query(multipart)</dc> annotations
		for handling multi-part GET and POST parameters.	
	<li>GET parameters are now CASE-SENSITIVE per W3C standards.
		<ul>
			<li>
			<li><c>&amp;Content</c> must now be specified as <c>&amp;content</c>.
			<li><c>&amp;Method</c> must now be specified as <c>&amp;method</c>.
			<li><c>&amp;debug</c> must now be specified as <c>&amp;debug=true</c>.
			<li><c>&amp;plainText</c> must now be specified as <c>&amp;plainText=true</c>.
			<li><c>&amp;notrace</c> must now be specified as <c>&amp;noTrace=true</c>.
		</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><dc>RestRequest.getParameters(String,Class)</dc>
			<li><dc>RestRequest#getQueryParameters(String,Class)</dc>
		</ul>
	</li>
	<li>Fixed Jetty issue in {@link org.apache.juneau.rest.RestResponse#setHeader(String,String)} where setting 
		the <c>Content-Type</c> through this method was inconsistent with the behavior in WAS/Tomcat.
	<li><c>&amp;noTrace=true</c> now prevents any errors from being logged in log file.
	<li>Workaround for Jetty issue where <c>ServletContext.getContextPath()</c> always ends with <js>"null"</js>.
	<li><c>RestServletProperties.REST_allowMethodParam</c> is now <jk>true</jk> by default on all subclasses 
		of {@link org.apache.juneau.rest.BasicRestServlet} and <dc>RestServletJenaDefault</dc>.
</ul>
		
<h5 class='topic w800'>Client</h5>		
<ul class='spaced-list'>
	<li>New method {@link org.apache.juneau.rest.client.RestCall#allowRedirectsOnPosts(boolean)}.
	<li>New method <c>RestCall.peekInputStream()</c> 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 <c>HttpResponse</c> object for easier debugging.
	<li>New method <c>RestClient.addListener(RestClientListener)</c> for registering request/response listeners.
	<li>New <dc>RestClient.setClassLoader(ClassLoader)</dc> method.
	<li>TLS support in <c>JazzRestClient</c>.
</ul>

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

<!-- ==================================================================================================== -->

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

<h5 class='topic w800'>Core</h5>		
<ul class='spaced-list'>
	<li>Fixed <dc>ConfigFile.isEmpty()</dc> 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:  <c>( ) , $ = ~</c>.
</ul>

<h5 class='topic w800'>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 <c>RestClientListener</c> class.
	<li>Minor connection cleanup fixes.
</ul>
</div><!-- END: 5.1.0.12 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.13' id='5.1.0.13'>5.1.0.13 (Apr 24, 2015)</a></h3>
<div class='topic'><!-- START: 5.1.0.13 -->
<p>
	Juno 5.1.0.13 is a minor update.
</p>

<h5 class='topic w800'>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 <dc>Link</dc> are now serialized using {@link org.apache.juneau.urlencoding.UrlEncodingSerializer}, so arbitrary POJOs can now be passed as arguments.
	<li>New date filters:  <c>org.apache.juneau.transforms.Datefilter.ISO8601DTZP</c> and <c>org.apache.juneau.transforms.Datefilter.SimpleP</c>.
	<li>New <dc>HtmlDocSerializerContext.HTMLDOC_nowrap</dc> 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 <c>ClassCastException</c>.  
		New behavior creates an empty array or <c>Collection</c>.
	<li>Improved implementation of <dc>UrlEncodingSerializer.serializeUrlPart(Object)</dc> method.
</ul>

<h5 class='topic w800'>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><dc>@RestResource(messages)</dc> annotation can now be defined on super and subclasses so that NLS messages can be defined in multiple resource bundles.
	<li>Performance improvements in <c>RestServletNls</c> 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 w800'>Client</h5>		
<ul class='spaced-list'>	
	<li>New <dc>RestCall.setRedirectMaxAttempts(int)</dc> method to prevent endless redirection loops.
	<li>New <dc>RestCall#setRetryable(int,long,RetryOn)</dc> method to automatically retry on failed connection attempts.
	<li>New <c>RestCallInterceptor.onRetry(RestCall,int,HttpRequest,HttpResponse)</c> method for listening in on retry attempts.		
</ul>
</div><!-- END: 5.1.0.13 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.14' id='5.1.0.14'>5.1.0.14 (May 10, 2015)</a></h3>
<div class='topic'><!-- START: 5.1.0.14 -->
<p>
	Juno 5.1.0.14 is a moderate update.
</p>
<p>
	The major addition is support for <dc>Remoteable Services</dc>, the ability
		to invoke server-side POJO methods through client-side proxy interfaces.
</p>

<h5 class='topic w800'>Core</h5>		
<ul class='spaced-list'>
	<li>Simplified {@link org.apache.juneau.utils.PojoIntrospector} class.
	<li>New <dc>ClassUtils.getMethodSignature(Method)</dc> method.
</ul>

<h5 class='topic w800'>Client</h5>		
<ul class='spaced-list'>
	<li>New methods in {@link org.apache.juneau.rest.client.RestClient} for working with remoteable services:
	<ul>
		<li><dc>RestClient.setRemoteableServletUri(String)</dc>
		<li><dc>RestClient#getRemoteableProxy(Class)</dc>
	</ul>
</ul>

<h5 class='topic w800'>Server</h5>		
<ul class='spaced-list'>
	<li>Added a default OPTIONS page to {@link org.apache.juneau.rest.BasicRestServlet} and <dc>RestServletJenaDefault</dc>.
	<li><c>RestServletProperties.REST_allowMethodParam</c> has been enhanced to allow you to
		explicitly specify which HTTP methods can be used in the <c>&amp;method</c> parameter.
	<li>New methods added to {@link org.apache.juneau.rest.RestRequest}:
	<ul>
		<li><dc>RestRequest.getParser()</dc>
		<li><dc>RestRequest.getReaderParser()</dc>
	</ul>
</ul>
</div><!-- END: 5.1.0.14 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.15' id='5.1.0.15'>5.1.0.15 (May 24, 2015)</a></h3>
<div class='topic'><!-- START: 5.1.0.15 -->
<p>
	Juno 5.1.0.15 is a minor update.
</p>

<h5 class='topic w800'>Core</h5>
<ul class='spaced-list'>
	<li>New properties in <dc>SerializerContext</dc>:
		<ol>
			<li><dc>SerializerContext.SERIALIZER_relativeUriBase</dc>
			<li><dc>SerializerContext.SERIALIZER_absolutePathUriBase</dc>
		</ol>
		These replace the <c>SERIALIZER_uriAuthority</c> and <c>SERIALIZER_uriContext</c> properties.
	</li>
	<li>Improvements in {@link org.apache.juneau.csv.CsvSerializer}.
</ul>

<h5 class='topic w800'>Server</h5>
<ul class='spaced-list'>
	<li>New properties in <c>RestServletProperties</c>:
		<ol>
			<li><c>REST_defaultCharset</c>
			<li><c>REST_servletURI</c>
			<li><c>REST_relativeServletURI</c>
		</ol>
	<li>Improvements involving path calculations when servlets deployed outside of a war file with a context root.
</ul>

<h5 class='topic w800'>Client</h5>
<ul class='spaced-list'>
	<li>New methods in {@link org.apache.juneau.rest.client.RestCall}:
		<ol>
			<li><dc>RestRequest.getHeader(String,Class)</dc>
			<li><dc>RestRequest.getHeader(String,Object,Class)</dc>
			<li><dc>RestRequest.getHeader(String,Type,Type...)</dc>
			<li><dc>RestRequest.getQueryParameter(String,Class)</dc>
			<li><dc>RestRequest.getQueryParameter(String,Object,Class)</dc>
			<li><dc>RestRequest.getQueryParameter(String,Type,Type...)</dc>
			<li><dc>RestRequest.getQueryParameter(String,Object,Type,Type...)</dc>
			<li><dc>RestRequest.getQueryParameters(String,Class)</dc>
			<li><dc>RestRequest.getQueryParameters(String,Type,Type...)</dc>
			<li><dc>RestRequest.getFormDataParameter(String,Class)</dc>
			<li><dc>RestRequest.getFormDataParameter(String,Object,Class)</dc>
			<li><dc>RestRequest.getFormDataParameters(String,Class)</dc>
			<li><dc>RestRequest.getFormDataParameter(String,Type,Type...)</dc>
			<li><dc>RestRequest.getFormDataParameters(String,Type,Type...)</dc>
			<li><dc>RestRequest.getPathParameter(String,Class)</dc>
			<li><dc>RestRequest.getPathParameter(String,Type,Type...)</dc>
			<li><dc>RestRequest.getBody(Class)</dc>
			<li><dc>RestRequest.getBody(Type,Type...)</dc>
		</ol>
	</li>
</ul>
</div><!-- END: 5.1.0.15 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.16' id='5.1.0.16'>5.1.0.16 (June 28, 2015)</a></h3>
<div class='topic'><!-- START: 5.1.0.16 -->
<p>
	Juno 5.1.0.16 is a moderate update.
</p>

<h5 class='topic w800'>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><dc>ClassMeta.getXmlMeta()</dc>
			<li><dc>ClassMeta.getJsonMeta()</dc>
			<li><dc>ClassMeta.getHtmlMeta()</dc>
			<li><dc>ClassMeta.getUrlEncodingMeta()</dc>
			<li><dc>ClassMeta.getRdfMeta()</dc>
		</ul>
	<li>New {@link org.apache.juneau.dto.jsonschema.JsonType#ANY} enum.
	<li>New <dc>@Html(asPlainText)</dc> annotation.
	<li>New <dc>HtmlDocSerializerContext.HTMLDOC_cssImports</dc> 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 <dc>SerializerContext.SERIALIZER_sortCollections</dc> and 
		<dc>SerializerContext.SERIALIZER_sortMaps</dc> properties.
	<li>FindBug fixes.
</ul>

<h5 class='topic w800'>Server</h5>
<ul class='spaced-list'>
	<li>New <dc>RestRequest.getServletParentURI()</dc> method.
	<li>New <c>$R{servletParentURI}</c> variable.
	<li>Removed final modifier from <dc>ChildResourceDescriptions</dc>.
</ul>

<h5 class='topic w800'>Samples</h5>
<ul class='spaced-list'>
	<li>Added source code links to examples.
</ul>
</div><!-- END: 5.1.0.16 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.17' id='5.1.0.17'>5.1.0.17 (Aug 3, 2015)</a></h3>
<div class='topic'><!-- START: 5.1.0.17 -->
<p>
	Juno 5.1.0.17 is a major update.
</p>

<h5 class='topic w800'>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><c>BeanMap.getFiltered(String)</c>
					<li><c>BeanMap.putFiltered(String,Object)</c>
					<li><c>BeanMapEntry.getFiltered(String)</c>
					<li><c>BeanMapEntry.putFiltered(String,Object)</c>
					<li><c>BeanMapEntry.putFiltered(String,Object)</c>
					<li><c>BeanPropertyMeta.getFiltered()</c>
					<li><c>BeanPropertyMeta.setFiltered(Object)</c>
					<li><c>BeanPropertyMeta.getTransformedClassMeta()</c>
				</ul>
			<li>{@link org.apache.juneau.BeanPropertyMeta#getClassMeta()} now returns the filtered type of the property.
		</ul> 
	<li><dc>StringVarResolver</dc> now has support for chained resolvers.
	<li><dc>StringVarResolver</dc>  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 <dc>RestResource.filters()</dc> 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 <c>RdfProperties.RDF_useXmlNamespaces</c> property.			
	<li>New <dc>XmlParserContext.XML_preserveRootElement</dc> 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 w800'>Server</h5>
<ul class='spaced-list'>
	<li>New <dc>ZipFileListResponseHandler</dc> class.
	<li>Simplified labels in servlet resource bundles:
		<ul>
			<li><c>"[ClassName].ResourceDescription"</c> is now <c>"[ClassName].label"</c>.
			<li><c>"[ClassName].MethodDescription.[methodName]"</c> is now <c>"[ClassName].[methodName]"</c>.
		</ul>
	<li>Several changes to {@link org.apache.juneau.rest.RestRequest}:
		<ul>
			<li>Added new methods:
				<ul>
					<li><dc>RestRequest.getQueryParameterMap()</dc>
					<li><dc>RestRequest.getQueryParameterNames()</dc>
					<li><dc>RestRequest.getPathInfoUndecoded()</dc>
					<li><dc>RestRequest.getPathRemainderUndecoded()</dc>
					<li><dc>RestRequest.getTrimmedRequestURI()</dc>
					<li><dc>RestRequest.getTrimmedRequestURL()</dc>
					<li><dc>RestRequest.getServletTitle()</dc>
					<li><dc>RestRequest.getServletDescription()</dc>
					<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><dc>RestRequest.getPathRemainder()</dc> now automatically decodes the path remainder. 
				Use <dc>RestRequest.getPathRemainderUndecoded()</dc> to get the unencoded path remainder.
			<li>Bug fixes in <dc>RestRequest.getRequestParentURI()</dc> when servlet is mapped to <js>"/*"</js>.
			<li>Bug fixes in <dc>RestRequest.getServletURI()</dc> when servlet is mapped to <js>"/*"</js>.
		</ul>
	<li>New string replacement variables:
		<ul>
			<li><c>$R{contextPath}</c> - Returns value from {@link org.apache.juneau.rest.RestRequest#getContextPath()}
			<li><c>$R{methodDescription}</c> - Returns value from {@link org.apache.juneau.rest.RestRequest#getMethodDescription()}
			<li><c>$R{resourceTitle}</c> - Returns value from <dc>RestRequest.getServletTitle()</dc>
			<li><c>$R{resourceDescription}</c> - Returns value from <dc>RestRequest.getServletDescription()</dc>
			<li><c>$R{trimmedRequestURI}</c> - Returns value from <dc>RestRequest.getTrimmedRequestURI()</dc>
			<li><c>$E{var}</c> - Environment variables.
		</ul>
	<li>Added methods <dc>RestServlet.getDescription(RestRequest)</dc> and <dc>RestServlet.getLabel(RestRequest)</dc>.
	<li>{@link org.apache.juneau.rest.BasicRestServlet} and <dc>RestServletJenaDefault</dc> now provide default HTML titles
		and descriptions:
		<p class='bcode w800'>
	<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.BasicRestServlet} and <dc>RestServletJenaDefault</dc> now provide default descriptions and back links:
		and descriptions:
		<p class='bcode w800'>
	<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.BasicRestServletGroup} class.
	<li>Removed <c>RestServletProperties.REST_trimTrailingUriSlashes</c> and <c>RestServletProperties.REST_pathInfoBlankForNull</c>. 
	<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><dc>RestResource.label()</dc>
			<li><dc>@RestResource(description)</dc>
			<li>{@link org.apache.juneau.rest.annotation.RestMethod#description() @RestMethod(description)}
			<li><dc>RestMethod#responses()</dc>
			<li><dc>Attr.description()</dc>
			<li><dc>Content.description()</dc>
			<li><dc>HasParam.description()</dc>
			<li><dc>HasQParam.description()</dc>
			<li><dc>Header.description()</dc>
			<li><dc>Param.description()</dc>
			<li><dc>QParam.description()</dc>
		</ul>
	<li>Support for sorting resources by name in <dc>ChildResourceDescriptions</dc>.
</ul>

<h5 class='topic w800'>Samples</h5>
<ul class='spaced-list'>
	<li>Added <c>/tempDir/upload</c> showing how to use <c>ServletFileUpload</c> with multipart form posts.
</ul>
</div><!-- END: 5.1.0.17 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.18' id='5.1.0.18'>5.1.0.18 (Aug 5, 2015)</a></h3>
<div class='topic'><!-- START: 5.1.0.18 -->
<p>
	Juno 5.1.0.18 is a minor update affecting the server component only.
</p>

<h5 class='topic w800'>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 <dc>RestMethod.input()</dc> and <dc>RestMethod.responses()</dc>
		annotations.
		These replace the various <c>description</c> annotations added 2 days ago with a simpler design.
	<li>New methods on {@link org.apache.juneau.rest.RestServlet}:
		<ul>
			<li><dc>RestServlet.getMethodDescription(String,RestRequest)</dc> so that subclasses
				can override the method description in the OPTIONS page.
			<li><dc>RestServlet.createRequestVarResolver(RestRequest)</dc> so that subclasses
				can override and augment the variable resolver.
			<li><dc>RestServlet.resolveChild(Class)</dc> and <dc>RestServlet.replaceChild(RestServlet)</dc>
				classes that allows customized resolution of servlet instances (e.g. if services are defined in OSGi).
		</ul> 
	<li>Reverted the <dc>MethodDescription</dc> back to 5.1.0.16 since it was being used by someone.
</ul>
</div><!-- END: 5.1.0.18 -->

<!-- ==================================================================================================== -->

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

<h5 class='topic w800'>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 <dc>StringVarResolver</dc>.  <jk>null</jk> input now results in blank strings instead of <jk>null</jk>.
</ul>

<h5 class='topic w800'>Client</h5>
<ul class='spaced-list'>
	<li>New {@link org.apache.juneau.rest.client.RestClient#doCallback(String)} method.
</ul>

<h5 class='topic w800'>Server</h5>
<ul class='spaced-list'>
	<li>New {@link org.apache.juneau.rest.RestRequest#getHeaders()} method.
	<li>New <c>RestResponse.getUnbufferedWriter()</c> method.
	<li>Fixed bug that was preventing <c>x-response-headers</c> parameter from working correctly.
	<li>Added {@link org.apache.juneau.annotation.Bean#properties() @Bean.properties} annotations to the various 
		classes in <c>org.apache.juneau.rest.labels</c> 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 <dc>ResourceDescription.ResourceDescription(RestRequest,String,String)</dc> constructor.
</ul>
</div><!-- END: 5.1.0.19 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.1.0.20' id='5.1.0.20'>5.1.0.20 (Sept 5, 2015)</a></h3>
<div class='topic'><!-- START: 5.1.0.20 -->
<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 <dc>ConfigFile</dc> functionality.
</p>

<h5 class='topic w800'>Core</h5>
<ul class='spaced-list'>
	<li>Significant API changes to <c>org.apache.juneau.config</c> API.
		<ul>
			<li><dc>ConfigFile</dc> is now thread safe and can be shared across multiple threads.
			<li>New <dc>ConfigMgr</dc> 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 <dc>ObjectMap.remove(Class,String,Object)</dc> method.
	<li><js>"class='link'"</js> added to links generated by {@link org.apache.juneau.html.HtmlDocSerializer}.
	<li>New <dc>EncoderGroup#append(EncoderGroup)</dc> method.
	<li>New <c>HtmlDocSerializerContext.HTMLDOC_addLinks</c> configuration property.
	<li>Modified the <c>Parser.createContext(ObjectMap,Method,Object)</c> 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 <dc>ReflectionUtils.getResource(Class,String)</dc> 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 w800'>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>  
				<dc>RestServlet.getConfig()</dc><br>
				<dc>RestServlet.createConfigFile()</dc>
			<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>  
				<dc>RestServlet.getResource(String)</dc><br>
				<dc>RestServlet.getResourceAsString(String)</dc><br>
				<dc>RestServlet.getResource(Class,String,String)</dc>.
					Useful if you want to load predefined POJOs from JSON files in your classpath.
			<li>New <dc>RestServlet.handleNotFound(int,RestRequest,RestResponse)</dc> method for customized handling
				of when a resource or method was not found.  
		</ul>
	<li>{@link org.apache.juneau.rest.BasicRestServlet}  now automatically processes <js>"/favicon.ico"</js> requests by 
		overriding the new <dc>RestServlet.handleNotFound(int,RestRequest,RestResponse)</dc> method.
	<li>New {@link org.apache.juneau.rest.RestRequest} methods: 
		<ul>
			<li><dc>RestRequest.resolveVars(String)</dc>
			<li><c>RestRequest.getVarResource(String)</c>
			<li><dc>RestRequest.getConfig()</dc>
		</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()}.  
				<c>getWriter()</c> now returns an unnegotiated writer.  
				<c>getUnbufferedWriter()</c> has been removed.
		</ul>
	<li>New {@link org.apache.juneau.rest.annotation.RestMethod#encoders() @RestMethod(encoders)} and 
		<dc>RestMethod.inheritEncoders()</dc> annotations.  
		Allows encoders to be fine-tuned at the method level.
	<li>New <dc>@RestResource(config)</dc> annotation for associating external <dc>ConfigFile</dc> config files with servlets.
	<li><dc>ResourceLink</dc>.
	<li>New <c>org.apache.juneau.rest.matchers</c> 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 w800'>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><!-- END: 5.1.0.20 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#5.2.0.0' id='5.2.0.0'>5.2.0.0 (Dec 30, 2015)</a></h3>
<div class='topic'><!-- START: 5.2.0.0 -->
<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 w800'>Core</h5>
<ul class='spaced-list'>
	<li>Significant changes and enhancements to the <c>org.apache.juneau.config</c> API.
		<ul>
			<li>More consistent handling of comma-delimited lists of objects.
			<li>New methods in <dc>ConfigFile</dc>:
				<ul>
					<li><dc>ConfigFile.getStringArray(String)</dc>,<dc>ConfigFile.getStringArray(String,String[])</dc>
					<li><dc>ConfigFile.getSectionAsBean(String,Class)</dc> - Instantiate a new bean with property values in the specified section..
					<li><dc>ConfigFile.writeProperties(String,Object,boolean,Class[])</dc> - Copy the properties in a config file section into properties on an existing bean or POJO.
					<li><dc>ConfigFile.getSectionMap(String)</dc> - Get all the resolved values in a section.
					<li><dc>ConfigFile.containsNonEmptyValue(String)</dc> 
					<li><dc>ConfigFile.isEncoded(String)</dc> 
					<li><dc>ConfigFile.addListener(ConfigFileListener)</dc> - Listen for modification events on the config file.
					<li><dc>ConfigFile.merge(ConfigFile)</dc> - Merge the contents of another config file into this config file.
					<li><dc>ConfigFile.getResolving()</dc>, <dc>ConfigFile.getResolving(StringVarResolver)</dc> - 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><dc>ConfigFile.toWritable()</dc> - 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><dc>ConfigFile.getInt(String)</dc> - Now supports <js>"M"</js> and <js>"K"</js> to identify millions and thousands.
				</ul>
			<li>New methods in <dc>ConfigMgr</dc>:
				<ul>
					<li><dc>ConfigMgr.create()</dc>, <dc>ConfigMgr.create(Reader)</dc>, <dc>ConfigMgr.create(File)</dc>
					<li><dc>ConfigMgr.deleteAll()</dc>	
				</ul>
			<li>New methods in <dc>Section</dc>:
				<ul>
					<li><dc>Section.setParent(ConfigFileImpl)</dc> - Used by parsers to set the config file for this section.
					<li><dc>Section.setName(String)</dc> - Used by parsers to set the name for this section.
				</ul>
			<li>New interfaces:
				<ul>
					<li><dc>org.apache.juneau.config.ConfigFileListener</dc>
					<li><dc>org.apache.juneau.config.SectionListener</dc>
					<li><dc>org.apache.juneau.config.EntryListener</dc> 
				</ul>
			<li><dc>org.apache.juneau.config.Encoder</dc> 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><dc>org.apache.juneau.config.XorEncoder</dc> 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><c>fromString(String)</c>
			<li><c>valueOf(String)</c> (e.g. enums)
			<li><c>parse(String)</c> (e.g. logging <c>Level</c> class)
			<li><c>parseString(String)</c>
			<li><c>forName(String)</c> (e.g. <c>Class</c> and <c>Charset</c> classes)
		</ul>
	<li>Support for parsing into objects with unbound type variables.
		For example, if you have a class <c>Pair&lt;S,T&gt;</c> and you try to parse into this
		class (e.g. <c>parser.parse(in, Pair.<jk>class</jk>)</c>), the unbound type variables
		is interpreted as <c>Object</c> instead of throwing an exception.
	<li>Support for serializing/parsing the following new types:
		<ul>
			<li><c>AtomicInteger</c>
			<li><c>AtomicLong</c>
			<li><c>BigInteger</c>
			<li><c>BigDecimal</c>
		</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 <dc>Section</dc> class represents a section
		in a config file.  It needs to know it's own name and have a link to the <dc>ConfigFile</dc> 
		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><dc>StringObject</dc> class that can be used for delayed object serialization.
			<li><dc>ByteArrayCache</dc>
			<li>{@link org.apache.juneau.internal.ByteArrayInOutStream} 
			<li>{@link org.apache.juneau.internal.FileUtils}
			<li>{@link org.apache.juneau.internal.ThrowableUtils}
			<li><dc>StringVarMultipart</dc>
			<li><dc>StringVarWithDefault</dc>
		</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><dc>IOUtils.pipe(Reader,Writer)</dc>
			<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><dc>PojoRest.get(Class,String,Object)</dc>
			<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><dc>StringUtils.parseISO8601Date(String)</dc>
			<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 <dc>StringVar.doResolve(String)</dc> method.
	<li>New <dc>StringVarResolver.DEFAULT</dc> field.
	<li>Eliminated dependency on <c>javax.mail.internet.MimeUtility</c> 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 <c>/servletPath/style.css</c> instead of <c>/servletPath/htdocs/juneau.css</c>.  
		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. <c>&lt;div class='outerdata'&gt;&lt;div class='data' id='data'&gt;...&lt;/div&gt;&lt;/div&gt;</c>).
		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 <del>HtmlSchemaDocSerializer</del>.
	<li>RDF serializers and parsers now support <c>RdfProperties.RDF_looseCollection</c> 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 <c>NoClassDefFoundErrors</c>.
	<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 <dc>UrlEncodingSerializer.DEFAULT_SIMPLE_EXPANDED</dc> serializer.
	<li>Changes to {@link org.apache.juneau.utils.Args}:
		<ul>
			<li><c>getMainArg(int)</c> 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 <c>org.apache.juneau.utils.CharsetUtils</c> class.
	<li>Removed <c>org.apache.juneau.utils.ConcurrentIdentityList</c> 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 <c>ReaderParser</c>.
		Simplifies the API on the class.
	<li>{@link org.apache.juneau.utils.PojoRest} must now be instantiated with a <c>ReaderParser</c>.
		Simplifies the API on the class.
	<li>{@link org.apache.juneau.utils.MessageBundle} and <c>SafeResourceMultiBundle</c> moved from server component.
	<li>Several bug fixes and performance improvements in <dc>StringVarResolver</dc>.
	<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 <c>NoClassDefFoundErrors</c>
		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 w800'>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><dc>SSLOpts</dc>
		</ul>
	<li>Removed <c>org.apache.juneau.rest.client.LaxRedirectStrategy</c>.  Use HTTP Client equivalent.
	<li>New methods on {@link org.apache.juneau.rest.client.RestCall}:
		<ul>
			<li><dc>RestCall#addInterceptor(RestCallInterceptor)</dc>
			<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><dc>RestCall#addResponsePattern(ResponsePattern)</dc>
			<li>{@link org.apache.juneau.rest.client.RestCall#run()} - Renamed from <c>execute()</c>.
			<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><dc>RestClient.setBasicAuth(String,int,String,String)</dc>
			<li><dc>RestClient.logTo(Level,Logger)</dc>
			<li><dc>RestClient.setRootUrl(String)</dc>
			<li><dc>RestClient.enableSSL(SSLOpts)</dc>
			<li><dc>RestClient.enableLaxSSL()</dc>
			<li>{@link org.apache.juneau.rest.client.RestClient#doCall(HttpMethod,Object,Object)}
			<li><dc>RestClient.createHttpClientBuilder()</dc>
		</ul>
	<li>New passthrough methods on {@link org.apache.juneau.rest.client.RestClient} defined on <c>HttpClientBuilder</c>:
		<ul>
			<li><dc>RestClient.setRedirectStrategy(RedirectStrategy)</dc>
			<li><dc>RestClient.setDefaultCookieSpecRegistry(Lookup)</dc>
			<li><dc>RestClient.setRequestExecutor(HttpRequestExecutor)</dc>
			<li><dc>RestClient.setSSLHostnameVerifier(HostnameVerifier)</dc>
			<li><dc>RestClient.setPublicSuffixMatcher(PublicSuffixMatcher)</dc>
			<li><dc>RestClient.setSSLContext(SSLContext)</dc>
			<li><dc>RestClient.setSSLSocketFactory(LayeredConnectionSocketFactory)</dc>
			<li><dc>RestClient.setMaxConnTotal(int)</dc>
			<li><dc>RestClient.setMaxConnPerRoute(int)</dc>
			<li><dc>RestClient.setDefaultSocketConfig(SocketConfig)</dc>
			<li><dc>RestClient.setDefaultConnectionConfig(ConnectionConfig)</dc>
			<li><dc>RestClient.setConnectionTimeToLive(long,TimeUnit)</dc>
			<li><dc>RestClient.setConnectionManager(HttpClientConnectionManager)</dc>
			<li><dc>RestClient.setConnectionManagerShared(boolean)</dc>
			<li><dc>RestClient.setConnectionReuseStrategy(ConnectionReuseStrategy)</dc>
			<li><dc>RestClient.setKeepAliveStrategy(ConnectionKeepAliveStrategy)</dc>
			<li><dc>RestClient.setTargetAuthenticationStrategy(AuthenticationStrategy)</dc>
			<li><dc>RestClient.setProxyAuthenticationStrategy(AuthenticationStrategy)</dc>
			<li><dc>RestClient.setUserTokenHandler(UserTokenHandler)</dc>
			<li><dc>RestClient.disableConnectionState()</dc>
			<li><dc>RestClient.setSchemePortResolver(SchemePortResolver)</dc>
			<li><dc>RestClient.setUserAgent(String userAgent)</dc>
			<li><dc>RestClient.setDefaultHeaders(Collection)</dc>
			<li><dc>RestClient.addInterceptorFirst(HttpResponseInterceptor)</dc>
			<li><dc>RestClient.addInterceptorLast(HttpResponseInterceptor)</dc>
			<li><dc>RestClient.addInterceptorFirst(HttpRequestInterceptor)</dc>
			<li><dc>RestClient.addInterceptorLast(HttpRequestInterceptor)</dc>
			<li><dc>RestClient.disableCookieManagement()</dc>
			<li><dc>RestClient.disableContentCompression()</dc>
			<li><dc>RestClient.disableAuthCaching()</dc>
			<li><dc>RestClient.setHttpProcessor(HttpProcessor)</dc>
			<li><dc>RestClient.setRetryHandler(HttpRequestRetryHandler)</dc>
			<li><dc>RestClient.disableAutomaticRetries()</dc>
			<li><dc>RestClient.setProxy(HttpHost)</dc>
			<li><dc>RestClient.setRoutePlanner(HttpRoutePlanner)</dc>
			<li><dc>RestClient.disableRedirectHandling()</dc>
			<li><dc>RestClient.setConnectionBackoffStrategy(ConnectionBackoffStrategy)</dc>
			<li><dc>RestClient.setBackoffManager(BackoffManager)</dc>
			<li><dc>RestClient.setServiceUnavailableRetryStrategy(ServiceUnavailableRetryStrategy)</dc>
			<li><dc>RestClient.setDefaultCookieStore(CookieStore)</dc>
			<li><dc>RestClient.setDefaultCredentialsProvider(CredentialsProvider)</dc>
			<li><dc>RestClient.setDefaultAuthSchemeRegistry(Lookup)</dc>
			<li><dc>RestClient.setContentDecoderRegistry(Map)</dc>
			<li><dc>RestClient.setDefaultRequestConfig(RequestConfig)</dc>
			<li><dc>RestClient.useSystemProperties()</dc>
			<li><dc>RestClient.evictExpiredConnections()</dc>
			<li><dc>RestClient.evictIdleConnections(long,TimeUnit)</dc>
		</ul>
	<li><c>JazzRestClient</c> now supports OIDC authentication.
	<li>These classes are now deprecated and will be removed in a future release:
		<ul>
			<li><c>org.apache.juneau.rest.client.jazz.CertificateStore</c>
			<li><c>org.apache.juneau.rest.client.jazz.ICertificateValidator</c>
			<li><c>org.apache.juneau.rest.client.jazz.ITrustStoreProvider</c>
			<li><c>org.apache.juneau.rest.client.jazz.LenientCertificateValidator</c>
			<li><c>org.apache.juneau.rest.client.jazz.SharedTrustStoreProvider</c>
			<li><c>org.apache.juneau.rest.client.jazz.ValidatingX509TrustManager</c>
		</ul>
</ul>

<h5 class='topic w800'>Server</h5>
<ul class='spaced-list'>
	<li>New <dc>ReaderResource</dc> class.   
		Represents the contents of a text file with convenience methods for resolving
		<dc>StringVar</dc> variables and adding HTTP response headers.	
		REST Java methods can return instances of these to serialize <c>Readers</c>
			containing text with <dc>StringVarResolver</dc> variables in them.
	<li>New <dc>StreamResource</dc> class.   
		REST Java methods can return instances of these to serialize <c>OutputStreams</c>.
	<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><dc>RestRequest.getReaderResource(String)</dc> - Replaces <c>getVarResource(String)</c>.
			<li><dc>RestRequest.getReaderResource(String,boolean)</dc> 
			<li><dc>RestRequest.getReaderResource(String,boolean,String)</dc>
		</ul>
	<li>Changes in {@link org.apache.juneau.rest.RestResponse}:
		<ul>
			<li>Don't set <c>Content-Encoding: identity</c> 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><dc>RestServlet.getChildClasses()</dc>  - Programmatic equivalent to <dc>@RestResource(children)</dc> annotation.
			<li><dc>RestServlet.shouldLog(HttpServletRequest,HttpServletResponse,RestException)</dc> 
			<li><dc>RestServlet.shouldLogStackTrace(HttpServletRequest,HttpServletResponse,RestException)</dc> 
			<li><dc>RestServlet.logObjects(Level,String,Object[])</dc> 
			<li><dc>RestServlet.resolveStaticFile(String)</dc> 
			<li><dc>RestServlet.createStyleSheet()</dc> 
			<li><dc>RestServlet.createFavIcon()</dc> 
			<li><dc>RestServlet.createStaticFilesMap()</dc> 
			<li><dc>RestServlet.getConfigMgr()</dc>
		</ul>
	<li>Removed {@link org.apache.juneau.jso.JsoParser}
		from {@link org.apache.juneau.rest.BasicRestServlet} and <dc>RestServletJenaDefault</dc>.  
		These may represent a security risk if not handled correctly, so removed
		them as a precaution.
	<li>Removed <c>RestServletProperties.REST_htDocsFolder</c>.  Replaced with <dc>@RestResource(staticFiles)</dc>}.
	<li>New annotations on <dc>@RestResource</dc>.
		<ul>
			<li><dc>RestResource.stylesheet()</dc>
			<li><dc>RestResource.favicon()</dc>
			<li><dc>@RestResource(staticFiles)</dc>
		</ul>
	<li>Eliminated <c>org.apache.juneau.rest.jaxrs.JsonProvider</c> class.  
		Some JAX-RS implementations use code scanning to find providers, so if you were using <c>DefaultJenaProvider</c>, it would
		pick up <c>JsonProvider</c> as well.  It's easy enough to create your own implementation if needed.
	<li>OPTIONS pages now specify <c>consumes</c> and <c>produces</c> fields instead of <c>accept</c> and <c>contentType</c> which was confusing.  
	<li>Eliminated <c>properties</c> from OPTIONS pages. 
	<li>New <dc>ResourceLink.ResourceLink(String,RestRequest,String,Object[])</dc> constructor.
	<li>New response handlers:
		<ul>
			<li><dc>StreamableHandler</dc> - Allows REST Java methods to return instances of {@link org.apache.juneau.Streamable}.
			<li><dc>WritableHandler</dc> - 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 <dc>RestUtils.trimPathInfo(StringBuffer,String,String)</dc> method.
</ul>

<h5 class='topic w800'>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 <dc>RestMicroservice</dc> 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 <c>org.apache.juneau.microservice.Main</c> class.  This is replaced by
		the microservice classes defined above.
	<li><dc>Resource</dc> and <dc>ResourceGroup</dc>
		classes now support the following new string variables:
		<ul>
			<li><js>"$A{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 <dc>BasicRestServletJena</dc> class if you want your REST interface to support RDF.
	<li>Eliminated the following classes:
		<ul>
			<li><c>org.apache.juneau.microservice.RootResource</c>
			<li><c>org.apache.juneau.microservice.SampleResource</c>
		</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 w800'>Samples</h5>
<ul class='spaced-list'>
	<li>Converted to a REST microservice.
	<li>Look-and-feel changed to IBM DevOps.
</ul>

<h5 class='topic w800'>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><dc>StringVarResolver</dc> - New documentation.
	<li><del>org.apache.juneau.rest.client</del> - New package-level javadoc.
	<li><dc>Overview / Samples</dc> - New section.
	<li><del>org.apache.juneau.transform / Stop Classes</del> - New section.
	<li><del>org.apache.juneau.rest</del> - Extensive updates.
</ul>
</div><!-- END: 5.2.0.0 -->

<!-- ==================================================================================================== -->

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

<h5 class='topic w800'>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><dc>ObjectList.getAt(Class,String)</dc>
			<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><dc>ObjectMap.getAt(Class,String)</dc>
			<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><dc>@ThreadSafe</dc> annotation.
	<li>New <c>ClassFilter</c> class.
	<li><dc>ConfigFile.getResolving(StringVarResolver,boolean)</dc> method.
	<li><dc>ConfigFile.getStringVar()</dc> method.
	<li>New <dc>ParserContext.PARSER_trimStrings</dc> property.
	<li>New <dc>SerializerContext.SERIALIZER_trimStrings</dc> property.
	<li><dc>Args.getStringVar()}</dc> 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 <dc>StringMapVar</dc> class.
	<li>New <dc>StringVars</dc> class with reusable common <dc>StringVar</dc> instances.
	<li>New {@link org.apache.juneau.internal.JuneauLogger} class.
	<li>Default value for <dc>XmlParserContext.XML_trimWhitespace</dc> changed to <jk>true</jk>.			
</ul>

<h5 class='topic w800'>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 w800'>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><!-- END: 5.2.0.1 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#6.0.0' id='6.0.0'>6.0.0 (Oct 3, 2016)</a></h3>
<div class='topic'><!-- START: 6.0.0 -->
<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 w800'>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 - <c>org.apache.juneau.svl</c>.
		<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><dc>@BeanProperty(beanDictionary)</dc> - Define a type dictionary
				for a particular bean property value.  This overrides the value specified using {@link org.apache.juneau.BeanContext#BEAN_beanDictionary}.
			<li><dc>SerializerContext.SERIALIZER_addBeanTypeProperties</dc> - Controls whether type properties are serialized.
		</ul>
		In addition, the {@link org.apache.juneau.annotation.Bean#typeName() @Bean(typeName)} value replaces the <c>@Xml(name)</c> 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 <c>BeanFilter</c> 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. <c>java.util.Date</c>).
	<li>Renamed 'Filters' to 'BeanFilters' and 'PojoSwaps'.  Filters is just too overloaded a term.
	<li>Internal utility classes moved to a new <c>org.apache.juneau.internal</c> 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><c>org.apache.juneau.parser.Parser.createSession(ObjectMap,Method,Object)</c>
			<li><dc>Parser.getMediaRanges()</dc>
		</ul>
	</li>
	<li>New methods on {@link org.apache.juneau.serializer.Serializer}:
		<ul>
			<li><c>org.apache.juneau.serializer.Serializer.createSession(ObjectMap,Method)</c>
			<li><dc>Serializer.getMediaRanges()</dc>
		</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 <dc>ClassUtils.getReadableClassName(Class)</dc>.
	<li>Eliminated the <c>ClassFilter</c> 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 <dc>BeanContext.convertToType(Object,Class)</dc>.
	<li>New properties on {@link org.apache.juneau.html.HtmlSerializer}:
		<ul>
			<li><dc>HtmlSerializerContext.HTML_detectLinksInStrings</dc> - Automatically detect hyperlinks in strings.
			<li><dc>HtmlSerializerContext.HTML_lookForLabelParameters</dc> - Specify anchor text by appending <c>&amp;label=MyLabel</c> to URL.
			<li><dc>HtmlSerializerContext.HTML_labelParameter</dc> - Specify what URL parameter to use as the anchor text label.
			<li><dc>HtmlSerializerContext.URI_ANCHOR</dc> option for <dc>HtmlSerializerContext.HTML_uriAnchorText</dc>.				
		</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><dc>ClassMetaExtended</dc> / <dc>ClassMeta.getExtendedMeta(Class)</dc> 
			<li><dc>BeanMetaExtended</dc> /<dc>BeanMeta.getExtendedMeta(Class)</dc> 
			<li><dc>BeanPropertyMetaExtended</dc> / <dc>BeanPropertyMeta.getExtendedMeta(Class)</dc> 
		</ul>
	</li>
	<li>Renamed <c>@Transform</c> annotation to <dc>@Pojo</dc> 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 w800'>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 <c>ResourceOptions</c> and related code.
			<li>New annotations and related methods:
				<ul>
					<li><dc>@RestResource(title)</dc> / {@link org.apache.juneau.rest.RestInfoProvider#getTitle(RestRequest)}
					<li><dc>@RestResource(description)</dc> / {@link org.apache.juneau.rest.RestInfoProvider#getDescription(RestRequest)}
					<li><dc>@RestResource(termsOfService)</dc> / <dc>RestInfoProvider.getTermsOfService(RestRequest)</dc>
					<li><dc>@RestResource(contact)</dc> / <dc>RestInfoProvider.getContact(RestRequest)</dc>
					<li><dc>@RestResource(license)</dc> / <dc>RestInfoProvider.getLicense(RestRequest)</dc>
					<li><dc>@RestResource(version)</dc> / <dc>RestInfoProvider.getVersion(RestRequest)</dc>
					<li><dc>@RestResource(tags)</dc> / <dc>RestInfoProvider.getTags(RestRequest)</dc>
					<li><dc>@RestResource(externalDocs)</dc> / <dc>RestInfoProvidergetExternalDocs(RestRequest)</dc>
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#summary() @RestMethod(summary)} / <dc>RestInfoProvider.getMethodSummary(String,RestRequest)</dc>
					<li>{@link org.apache.juneau.rest.annotation.RestMethod#description() @RestMethod(description)} /<dc>RestInfoProvider.getMethodDescription(String,RestRequest)</dc>
					<li><dc>@RestMethod(externalDocs)</dc>
					<li><dc>@RestMethod(tags)</dc>
					<li><dc>@RestMethod(deprecated)</dc> 
					<li><dc>@RestMethod(parameters)</dc> 
					<li><dc>@RestMethod(responses)</dc>
				</ul>
			</li>					
		</ul>
	<li>New <dc>RestServletContext.paramFormat</dc> context property.
	<li>New/updated methods on {@link org.apache.juneau.rest.RestServlet}:
		<ul>
			<li><dc>RestServlet.createProperties()</dc>
			<li><dc>RestServlet.createBeanContext(ObjectMap,Class[],Class[])</dc>
			<li><dc>RestServlet.createBeanFilters()</dc>
			<li><dc>RestServlet.createPojoSwaps()</dc>
			<li><dc>RestServlet.createParsers(ObjectMap,Class[],Class[])</dc>
			<li><dc>RestServlet.createUrlEncodingSerializer(ObjectMap,Class[],Class[])</dc>
			<li><dc>RestServlet.createUrlEncodingParser(ObjectMap,Class[],Class[])</dc>
			<li><dc>RestServlet.createConverters(ObjectMap)</dc>
			<li><dc>RestServlet.createDefaultRequestHeaders(ObjectMap)</dc>
			<li><dc>RestServlet.createDefaultResponseHeaders(ObjectMap)</dc>
			<li><dc>RestServlet.createEncoders(ObjectMap)</dc>
			<li><dc>RestServlet.createGuards(ObjectMap)</dc>
			<li><dc>RestServlet.createMimetypesFileTypeMap(ObjectMap)</dc>
			<li><dc>RestServlet.createResponseHandlers(ObjectMap)</dc>
		</ul>
	</li>
	<li>New client-version annotations:
		<ul>
			<li><dc>RestResource.clientVersionHeader</dc>  - 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 w800'>org.apache.juneau.rest.client</h5>
<ul class='spaced-list'>
	<li>Removed the <c>JazzRestClient</c> class.
	<li>New method <dc>RestClient.setClientVersion(String)</dc>.
</ul>
</div><!-- END: 6.0.0 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#6.0.1' id='6.0.1'>6.0.1 (Jan 3, 2017)</a></h3>
<div class='topic'><!-- START: 6.0.1 -->
<p>
	Juneau 6.0.1 is a minor update.
</p>

<h5 class='topic w800'>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 <dc>ParserContext</dc>.
		<ul>
			<li><dc>ParserContext.PARSER_strict</dc>
			<li><dc>ParserContext.PARSER_inputStreamCharset</dc>
			<li><dc>ParserContext.PARSER_fileCharset</dc>
		</ul>
	<li>Removed <c>JsonParserContext.JSON_strictMode</c>.  Replaced by <c>PARSER_strict</c>.		
	<li><c><jk>byte[]</jk></c> arrays can now be passed to {@link org.apache.juneau.parser.Parser#parse(Object,Class)} for reader-based parsers.	
</ul>
</div><!-- END: 6.0.1 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#6.1.0' id='6.1.0'>6.1.0 (Feb 25, 2017)</a></h3>
<div class='topic'><!-- START: 6.1.0 -->
<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 w800'>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 <dc>org.apache.juneau.xml</dc> documentation.
			<li>Eliminated unnecessary <xt>&lt;string&gt;</xt> elements.
			<li>Eliminated <dc>XmlContentHandler</dc> 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 <c>addJsonTypeAttrs</c> and <c>addJsonStringTypeAttrs</c> settings.
			<li>Namespace support is now disabled by default.
		</ul>
	<li>Significant modifications and improvements to HTML serialization support.
		<ul>
			<li>Parser converted from <c>XMLEventReader</c>-based to <c>XMLStreamReader</c>.
			<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 <dc>org.apache.juneau.html</dc> documentation.
		</ul>
	<li>New HTML5 DTO support:  <dc>org.apache.juneau.dto.html5</dc>.
	<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><dc>SerializerContext</dc> and <dc>ParserContext</dc>
		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. <c>parseMap()</c>, <c>parseCollection()</c>)
		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 <c>ClassMeta</c> object.  
		<br>For example:
			<p class='bcode w800'>
	<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 <c>ClassMeta</c> objects.
		<li>No need for casting anymore if you were using the old <c>parseMap()</c> and <c>parseCollection()</c> methods!
		<li>Changes allow me to eliminate <c>BeanContext.normalizeClassMeta()</c> method.
		<li>Convenience methods added for setting parser properties:
			<p class='bcode w800'>
	<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 w800'>
	<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 <c>toObjectMap()</c> and <c>fromObjectMap()/T(ObjectMap)</c> methods with
			generalized <c>swap(BeanSession)</c>/<c>unswap(BeanSession,X)</c>/<c>T(BeanSession,X)</c> methods.<br>
			See new section <dc>Swap methods</dc> 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 <dc>@Bean(beanDictionary)</dc> annotation.
		</ul>
	<li>Removed restriction on getters and setters to be prefixed with "getX/setX/isX" if a <dc>@BeanProperty(name)</dc> 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 <dc>org.apache.juneau.dto.atom</dc> 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 <c>getMapClassMeta()</c>/<c>getCollectionClassMeta()</c> methods.  
	<li>New section added to this document:	<dc>Juneau Data Transfer Objects (org.apache.juneau.dto)</dc>
	<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 <c>UonParser.<jsf>DEFAULT_WS_AWARE</jsf></c> and <c>UrlEncodingParser.<jsf>DEFAULT_WS_AWARE</jsf></c> 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 <c>UonParserContext.<jsf>UON_whitespaceAware</jsf></c> configuration setting.
		<li>Eliminated the <c>UonSerializer.<jsf>DEFAULT_SIMPLE</jsf></c>, <c>UonSerializer.<jsf>DEFAULT_SIMPLE_ENCODING</jsf></c>
			and <c>UrlEncodingSerializer.<jsf>DEFAULT_SIMPLE</jsf></c>
			serializers since there is no separate simple mode anymore.
		<li>Eliminated the <c>UonParserContext.<jsf>UON_simpleMode</jsf></c> configuration setting.
	</ul>
	<li>Added new <dc>OutputStreamSerializer.serializeToHex(Object)</dc> 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 <c><ja>@Bean</ja>(subTypeProperty)</c> and <c><ja>@Bean</ja>(subTypes)</c> annotations
		and replaced them with the ability to define subtypes using the existing <dc>@Bean(beanDictionary)</dc>
		annotation on parent classes and interfaces.
		<br>This has the added benefit of simplifying the overall code.
	<li>The <dc>SerializerContext.SERIALIZER_addBeanTypeProperties</dc> setting is now enabled by default.
	<li>Combined the <c>SERIALIZER_addIndentation</c>/<c>JSON_addWhitespace</c>/<c>UON_addWhitespace</c>
		properties into a single <dc>SerializerContext.SERIALIZER_useWhitespace</dc> setting.
</ul>

<h5 class='topic w800'>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><dc>RestRequest.getTimeZone()</dc> method.
	<li>Standardized the following methods in {@link org.apache.juneau.rest.RestRequest} to remove dependency on <c>ClassMeta</c>
		objects and eliminate the need for casts:
		<ul>
			<li><dc>RestRequest.getHeader(String,Class)</dc>
			<li><dc>RestRequest.getHeader(String,Object,Class)</dc>
			<li><dc>RestRequest.getHeader(String,Type,Type...)</dc>
			<li><dc>RestRequest.getQueryParameter(String,Class)</dc>
			<li><dc>RestRequest.getQueryParameter(String,Object,Class)</dc>
			<li><dc>RestRequest.getQueryParameter(String,Type,Type...)</dc>
			<li><dc>RestRequest.getQueryParameter(String,Object,Type,Type...)</dc>
			<li><dc>RestRequest.getQueryParameters(String,Class)</dc>
			<li><dc>RestRequest.getQueryParameters(String,Type,Type...)</dc>
			<li><dc>RestRequest.getFormDataParameter(String,Class)</dc>
			<li><dc>RestRequest.getFormDataParameter(String,Object,Class)</dc>
			<li><dc>RestRequest.getFormDataParameters(String,Class)</dc>
			<li><dc>RestRequest.getFormDataParameter(String,Type,Type...)</dc>
			<li><dc>RestRequest.getFormDataParameters(String,Type,Type...)</dc>
			<li><dc>RestRequest.getPathParameter(String,Class)</dc>
			<li><dc>RestRequest.getPathParameter(String,Type,Type...)</dc>
			<li><dc>RestRequest.getBody(Class)</dc>
			<li><dc>RestRequest.getBody(Type,Type...)</dc>
		</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 <c>&amp;plainText=true</c> specified.
</ul>
</div><!-- END: 6.1.0 -->

<!-- ==================================================================================================== -->

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

<h5 class='topic w800'>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 w800'>
	<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 = SimpleJsonSerializer.<jsf>DEFAULT</jsf>
.clone().setUseWhitespace(<jk>true</jk>).pojoSwaps(BSwap.<jk>class</jk>).lock();

	<jc>// New way</jc>
	WriterSerializer s = SimpleJsonSerializer.<jsf>DEFAULT</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:  <dc>ConfigFileBuilder</dc>.
	<li>Removed the <dc>Lockable</dc> interface.
	<li>New <c>addBeanTypeProperties</c> setting added to serializers to override the 
		<dc>SerializerContext.SERIALIZER_addBeanTypeProperties</dc> setting
		for individual serializers in a serializer group:
		<ul>
			<li><dc>HtmlSerializerContext.HTML_addBeanTypeProperties</dc>
			<li><dc>JsonSerializerContext.JSON_addBeanTypeProperties</dc>
			<li><dc>MsgPackSerializerContext.MSGPACK_addBeanTypeProperties</dc>
			<li><dc>UonSerializerContext.UON_addBeanTypeProperties</dc>
			<li><dc>XmlSerializerContext.#XML_addBeanTypeProperties</dc>
			<li><dc>RdfSerializerContext.RDF_addBeanTypeProperties</dc>
		</ul>
	<li>UON notation serializers and parsers moved into the new <c>org.apache.juneau.uon</c> 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 <c>style()</c> 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 <dc>here</dc> 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><dc>$SWITCH</dc> 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: <dc>SerializerContext.SERIALIZER_abridged</dc>.
	<li>Support for defining interface proxies against 3rd-party REST interfaces.
		<br>New package <dc>org.apache.juneau.remoteable</dc> for all remoteable proxy interface annotations.
		<br><ja>@Remoteable</ja> annotation has been moved to this package.
	<li>Updated doc: <dc>6 - Remoteable Services</dc>
	<li>New doc: <dc>6.1 -  Interface proxies against 3rd-party REST interfaces</dc>
	<li>New URL-encoding serializer setting: <dc>UrlEncodingSerializerContext.URLENC_paramFormat</dc>.
	<li>New methods on {@link org.apache.juneau.urlencoding.UrlEncodingSerializerBuilder}:
	<ul>
		<li><dc>UrlEncodingSerializerBuilder.paramFormat(String)</dc>	
		<li><dc>UrlEncodingSerializerBuilder.plainTextParams()</dc>	
	</ul> 		
</ul>

<h5 class='topic w800'>org.apache.juneau.rest</h5>
<ul class='spaced-list'>
	<li><dc>@RestResource</dc> 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 <c>RestServlet</c>
		should have an equivalent for non-<c>RestServlet</c> classes.
		<br>The only restriction is that the top-level resource must subclass from <c>RestServlet</c>.
		Child resources do not.
		<br><br>
		The majority of code has been split up into two separate classes:
		<ul>
			<li><dc>RestConfig</dc> - 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><dc>RestServlet.init(RestConfig)</dc> - A modifiable configuration of a resource.
		</ul>
		Non-<c>RestServlet</c> classes must have one of the following to allow it to be instantiated:
		<ul>
			<li>A <c><jk>public</jk> T(RestConfig)</c> constructor.
			<li>A <c><jk>public</jk> T()</c> constructor.
			<li>The parent resource must have a customized {@link org.apache.juneau.rest.RestResourceResolver} for instantiating it.
		</ul>
		<br>
		Non-<c>RestServlet</c> classes can optionally include the following init methods to gain access to the config and context:
		<ul>
			<li><dc><jk>public</jk> init(RestConfig)</dc>
			<li><dc><jk>public</jk> init(RestContext)</dc>
		</ul>
	<li>New annotations added to <dc>@RestResource</dc> to allow non-<c>RestServlet</c>
		resources to do the same as subclassing directly from <c>RestServlet</c>:
		<ul>
			<li><dc>RestResource.resourceResolver()</dc> 
				- Specify a {@link org.apache.juneau.rest.RestResourceResolver} class for resolving child resources.
			<li><dc>RestResource.callHandler()</dc> 
				- Specify a {@link org.apache.juneau.rest.RestCallHandler} class for handling the lifecycle of a REST call.
			<li><dc>RestResource.infoProvider()</dc> 
				- Specify a {@link org.apache.juneau.rest.RestInfoProvider} class for customizing title/description/Swagger information on a REST resource.
			<li><dc>RestResource.logger()</dc> 
				- Specify a {@link org.apache.juneau.rest.RestLogger} class for handling logging.
		</ul>
	<li>New annotations added to <dc>@RestResource</dc> and {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod}
		to simplify defining page title, text, and links on HTML views:
		<ul>
			<li><dc>@RestResource(pageTitle)</dc>
			<li><dc>@RestMethod(pageTitle)</dc> 
			<li><dc>@RestResource(pageText)</dc> 
			<li><dc>@RestMethod(pageText)</dc> 
			<li><dc>@RestResource(pageLinks)</dc> 
			<li><dc>@RestMethod(pageLinks)</dc> 
		</ul>				
		<p class='bcode w800'>
	<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 <c>title</c> and <c>description</c> annotations
			which apply to both the page title/text and the swagger doc:		
		</p>
		<p class='bcode w800'>
	<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><dc>RestResource.stylesheet()</dc> can now take in a comma-delimited list of stylesheet paths.
	<li><dc>StreamResource</dc> can now contain multiple sources from a variety of source types (e.g. <c><jk>byte</jk>[]</c> arrays, <c>InputStreams</c>, <c>Files</c>, etc...)
		and is now immutable.  It also includes a new <dc>StreamResourceBuilder</dc> class.
	<li>Simplified remoteable proxies using the <c><ja>@RestMethod</ja>(name=<js>"PROXY"</js>)</c> annotation on REST methods.
		Used to expose interface proxies without the need for <dc>RemoteableServlet</dc>.
	<p class='bcode w800'>
	<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>{@link org.apache.juneau.rest.annotation.RestMethod#name() @RestMethod(name)} annotation is now optional.  Defaults to <js>"GET"</js>.
</ul>

<h5 class='topic w800'>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 <c>RestClient</c> class <c>doX(Object url)</c> methods now handle HttpClient <c>URIBuilder</c> instances.
	<li>New methods added/updated to {@link org.apache.juneau.rest.client.RestClient}:
	<ul>
		<li><dc>RestClient.getRemoteableProxy(Class,Object)</dc> - For interface proxies defined using <c><ja>@RestMethod</ja>(name=<js>"PROXY"</js>)</c>.
		<li><dc>RestClient.getRemoteableProxy(Class,Object,Serializer,Parser)</dc> - 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><dc>query(String,Object,boolean,PartSerializer)</dc>
			<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><dc>formData(String,Object,boolean,PartSerializer)</dc>
			<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><dc>header(String,Object,boolean,PartSerializer)</dc>
			<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><dc>RestClientBuilder.plainTextParams()</dc>
			<li>{@link org.apache.juneau.rest.client.RestClientBuilder#noTrace() noTrace()} - Adds a <c>No-Trace: true</c> 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 <c>Debug: true</c> 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><dc>input(Object)</dc> - 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 <c>HttpResponse</c> returned by the inner <c>HttpClient</c>.
					<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><dc>append(String,Object,PartSerializer)</dc>
		</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 w800'>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 <c>0</c>s to try a random port.
	<li>Methods added to <dc>RestMicroservice</dc> class:
	<ul>
		<li><dc>getPort()</dc>
		<li><dc>getURI()</dc>
		<li>Override methods added from {@link org.apache.juneau.microservice.Microservice} class for easier method chaining.
	</ul>
</ul>
</div><!-- END: 6.2.0 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#6.3.0' id='6.3.0'>6.3.0 (Jun 30, 2017)</a></h3>
<div class='topic'><!-- START: 6.3.0 -->
<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 w800'>org.apache.juneau</h5>
<ul class='spaced-list'>
	<li>
		New package:  {@link org.apache.juneau.http}.
	<li>
		Support for dynamic beans.  See <dc>@BeanProperty(name)</dc>.
	<li>
		New doc: <dc>2.8 - Virtual Beans</dc>
	<li>
		New doc: <dc>2.13 - Comparison with Jackson</dc>
	<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 w800'>
	<jc>// Example</jc>
	<jk>int</jk> i = JsonParser.<jsf>DEFAULT</jsf>.parse(<js>"123M"</js>);  <jc>// 123MB</jc>
		</p>
	<li>New/modified methods on <dc>ConfigFile</dc>:
		<ul>
			<li><dc>ConfigFile.put(String,String,String,boolean)</dc>
			<li><dc>ConfigFile.put(String,String,Object,Serializer,boolean,boolean)</dc>
			<li><dc>ConfigFile.getObject(String,Type,Type...)</dc>
			<li><dc>ConfigFile.getObject(String,Parser,Type,Type...)</dc>
			<li><dc>ConfigFile.getObject(String,Class)</dc>
			<li><dc>ConfigFile.getObject(String,Parser,Class)</dc>
			<li><dc>ConfigFile.getObject(String,String,Type,Type...)</dc>
			<li><dc>ConfigFile.getObject(String,String,Parser,Type,Type...)</dc>
			<li><dc>ConfigFile.getObject(String,String,Class)</dc>
			<li><dc>ConfigFile.getObject(String,String,Parser,Class)</dc>
			<li><dc>ConfigFile.getObjectWithDefault(String,Object,Type,Type...)</dc> 
			<li><dc>ConfigFile.getObjectWithDefault(String,Parser,Object,Type,Type...)</dc>
			<li><dc>ConfigFile.getObjectWithDefault(String,Object,Class)</dc>
			<li><dc>ConfigFile.getObjectWithDefault(String,Parser,Object,Class)</dc> 
		</ul>
	<li>New ability to interact with config file sections with proxy interfaces with new method <dc>ConfigFile.getSectionAsInterface(String,Class)</dc>.
	<li><dc>@BeanProperty</dc> 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><dc>Session.getProperty(String)</dc>
			<li><dc>Session.getProperty(String,String)</dc>
			<li><dc>Session.getProperty(Class,String)</dc>
			<li><dc>Session.getProperty(Class,String,Object)</dc>
		</ul>	
	<li>New <dc>org.apache.juneau.serializer.PartSerializer</dc> 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><dc>org.apache.juneau.rest.client.RestClientBuilder.partSerializer(Class)</dc> 
			<li><dc>org.apache.juneau.remoteable.Path.serializer</dc> 
			<li><dc>org.apache.juneau.remoteable.Query.serializer</dc> 
			<li><dc>org.apache.juneau.remoteable.QueryIfNE.serializer</dc> 
			<li><dc>org.apache.juneau.remoteable.FormData.serializer</dc> 
			<li><dc>org.apache.juneau.remoteable.FormDataIfNE.serializer</dc> 
			<li><dc>org.apache.juneau.remoteable.Header.serializer</dc> 
			<li><dc>org.apache.juneau.remoteable.HeaderIfNE.serializer</dc> 
		</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 w800'>
	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 w800'>
	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><dc>SerializerContext.SERIALIZER_uriContext</dc>
				<li><dc>SerializerContext.SERIALIZER_uriRelativity</dc>
				<li><dc>SerializerContext.SERIALIZER_uriResolution</dc>
				<li><dc>SerializerContext.SERIALIZER_maxIndent</dc>
		</ul>
	<li>New annotation property: <dc>@BeanProperty(value)</dc>.
		<br>The following two annotations are considered equivalent:
		<p class='bcode w800'>
	<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 <dc>UonSerializer.UON_paramFormat</dc>, 
		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><dc>@RestResource(serializerListener)</dc>
			<li><dc>RestConfig.serializerListener(Class)</dc>
			<li>{@link org.apache.juneau.parser.ParserListener}
			<li>{@link org.apache.juneau.parser.ParserBuilder#listener(Class)}
			<li><dc> @RestResource(parserListener)</dc>
			<li><dc>RestConfig.parserListener(Class)</dc>
			<li><dc>RestClientBuilder.listeners(Class,Class)</dc>
		</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 <dc>ParserSession.getInputAsString()</dc> 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><dc>HtmlDocSerializerContext.HTMLDOC_title</dc>
					<li><dc>HtmlDocSerializerContext.HTMLDOC_description</dc>
					<li><dc>HtmlDocSerializerContext.HTMLDOC_branding</dc>
					<li><dc>HtmlDocSerializerContext.HTMLDOC_header</dc>
					<li><dc>HtmlDocSerializerContext.HTMLDOC_nav</dc>
					<li><dc>HtmlDocSerializerContext.HTMLDOC_aside</dc>
					<li><dc>HtmlDocSerializerContext.HTMLDOC_footer</dc>
					<li><dc>HtmlDocSerializerContext.HTMLDOC_noResultsMessage</dc>
					<li><dc>HtmlDocSerializerContext.HTMLDOC_cssUrl</dc>
					<li><dc>HtmlDocSerializerContext.HTMLDOC_css</dc>
					<li><dc>HtmlDocSerializerContext.HTMLDOC_template</dc>
				</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><dc>BEAN_includeProperties</dc>
			<li><dc>BEAN_excludeProperties</dc>
		</ul>
	<li>New annotation property: <dc>@BeanProperty(format)</dc>.
</ul>

<h5 class='topic w800'>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.RequestPath}
		</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 <c>RestRequest</c>.
			<li>{@link org.apache.juneau.rest.RestResponse} - The response object.
			<li>{@link javax.servlet.http.HttpServletResponse} - The superclass of <c>RestResponse</c>.
		</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.RequestPath} - 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 <c><ja>@RestMethod</ja>(name=<js>"*"</js>)</c>)
			<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><dc>ConfigFile</dc> - The external config file for the resource.
		</ul>
		So, for example...
		<p class='bcode w800'>
	<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>(<js>"a1"</js>) String a1, 
		<ja>@Path</ja>(<js>"a2"</js>) <jk>int</jk> a2, 
		<ja>@Path</ja>(<js>"a3"</js>) 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 <dc>@RestResource(paramResolvers)</dc>}
		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><dc>bpIncludes()</dc>
			<li><dc>bpExcludes()</dc>
		</ul>
	<li>
		Default values on header, query, and form-data annotations:
		<ul>
			<li><dc>@Header(def)</dc> - Default header value.
			<li><dc>@Query(def)</dc> - Default query parameter value.
			<li><dc>@FormData(def)</dc> - Default form data parameter value.
		</ul>
	<li>
		New attributes on <dc>@RestResource</dc>:
		<ul>
			<li><dc>serializerListener()</dc>
			<li><dc>parserListener()</dc>
			<li><dc>widgets()</dc>
			<li><dc>swagger()</dc>
			<li><dc>htmldoc()</dc>
		</ul>
	<li>
		New attributes on {@link org.apache.juneau.rest.annotation.RestMethod @RestMethod}:
		<ul>
			<li><dc>widgets()</dc>
			<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 <dc>RestConfig</dc>:
		<ul>
			<li><dc>setHtmlTitle(String)</dc>
			<li><dc>setHtmlDescription(String)</dc>
			<li><dc>setHtmlBranding(String)</dc>
			<li><dc>setHtmlHeader(String)</dc>
			<li><dc>setHtmlLinks(String)</dc>
			<li><dc>setHtmlNav(String)</dc>
			<li><dc>setHtmlAside(String)</dc>
			<li><dc>setHtmlFooter(String)</dc>
			<li><dc>setHtmlCss(String)</dc>
			<li><dc>setHtmlCssUrl(String)</dc>
			<li><dc>setHtmlNoWrap(boolean)</dc>
			<li><dc>setHtmlNoResultsMessage(String)</dc>
			<li><dc>setHtmlTemplate(Class)</dc>
			<li><dc>setHtmlTemplate(HtmlDocTemplate)</dc>
			<li><dc>addWidget(Class)</dc>
		</ul>
	<li>
		New methods on {@link org.apache.juneau.rest.RestResponse}:
		<ul>
			<li><dc>setHtmlTitle(Object)</dc>
			<li><dc>setHtmlDescription(Object)</dc>
			<li><dc>setHtmlBranding(Object)</dc>
			<li><dc>setHtmlHeader(Object)</dc>
			<li><dc>setHtmlLinks(Object)</dc>
			<li><dc>setHtmlNav(Object)</dc>
			<li><dc>setHtmlAside(Object)</dc>
			<li><dc>setHtmlFooter(Object)</dc>
			<li><dc>setHtmlCss(Object)</dc>
			<li><dc>setHtmlCssUrl(Object)</dc>
			<li><dc>setHtmlNoWrap(boolean)</dc>
			<li><dc>setHtmlNoResultsMessage(Object)</dc>
			<li><dc>setHtmlTemplate(Class)</dc>
			<li><dc>setHtmlTemplate(HtmlDocTemplate)</dc>
		</ul>
	<li>
		<c>&amp;plainText=true</c> 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><dc>PoweredByJuneauWidget</dc>
			<li><dc>ContentTypeLinksColumnWidget</dc>
			<li><dc>ContentTypeLinksRowWidget</dc>
			<li><dc>QueryWidget</dc>
		</ul>
	<li>
		<c>devops.css</c> 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.http.annotation.Query#name() @Query(name)}
			<li>{@link org.apache.juneau.http.annotation.FormData#name() @FormData(name)}
			<li>{@link org.apache.juneau.http.annotation.Header#name() @Header(name)}
			<li>{@link org.apache.juneau.http.annotation.Path#name() @Path(name)}
			<li>{@link org.apache.juneau.http.annotation.HasQuery#name() @HasQuery(name)}
			<li>{@link org.apache.juneau.http.annotation.HasFormData#name() @HasFormData(name)}
		</ul>
	</li>
</ul>

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

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

<h5 class='topic w800'>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><!-- END: 6.3.0 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#6.3.1' id='6.3.1'>6.3.1 (Aug 1, 2017)</a></h3>
<div class='topic'><!-- START: 6.3.1 -->
<p>
	Juneau 6.3.1 is a minor release.
</p>

<h5 class='topic w800'>org.apache.juneau</h5>
<ul class='spaced-list'>
	<li>
		{@link org.apache.juneau.utils.PojoQuery} improvements.
	<li>
		New <dc>RemoteMethod.returns()</dc> annotation.
		<br>Allows you to specify whether the remote method returns the HTTP body or status code.
	<li>
		Fixed bugs with <dc>BEAN_includeProperties</dc> and <dc>BEAN_excludeProperties</dc> settings.
	<li>
		New/modified settings in <dc>HtmlDocSerializerContext</dc>:
		<ul>
			<li><dc>HTMLDOC_script</dc>
			<li><dc>HTMLDOC_style</dc> - Was <jsf>HTMLDOC_css</jsf>.
			<li><dc>HTMLDOC_stylesheet</dc> - Was <jsf>HTMLDOC_cssUrl</jsf>.  Now an array.
		</ul>
	<li>
		New <dc>ResourceFinder</dc> 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 <dc>HtmlDocSerializerContext</dc>:
		<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 w800'>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 w800'>
	<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><dc>Widget#getHtml(RestRequest)</dc>
					<li><dc>Widget#getScript(RestRequest)</dc>
					<li><dc>Widget#getStyle(RestRequest)</dc>
				</ul>
			</li>
			<li>
				Declaration of widgets moved to {@link org.apache.juneau.rest.annotation.HtmlDoc#widgets() @HtmlDoc(widgets)} 
				instead of separately on <dc>@RestResource</dc> 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><c>PoweredByApacheWidget</c> -&gt; <c>PoweredByApache</c>  
					<li><c>PoweredByJuneauWidget</c> -&gt; <c>PoweredByJuneau</c>  
				</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.ThemeMenuItem} 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 <c>css()</c>.
			<li>{@link org.apache.juneau.rest.annotation.HtmlDoc#stylesheet() stylesheet()} - Renamed from <c>cssUrl()</c>.
				<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><dc>@RestResource(siteName)</dc>
			<li><dc>@RestResource(flags)</dc>
			<li>{@link org.apache.juneau.rest.annotation.RestMethod#flags() @RestMethod(flags)}
		</ul>
	</li>
	<li>
		Eliminated the <dc>@RestResource(stylesheet)</dc> 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><c>title()</c>
			<li><c>description()</c>
			<li><c>branding()</c>
		</ul>
		Instead, the {@link org.apache.juneau.rest.BasicRestServlet} class defines the following default header
		that can be easily overridden: 
		<p class='bcode w800'>
	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 <c>DockerRegistryResource</c> 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 w800'>
	htmldoc=<ja>@HtmlDoc</ja>(
		<jc>// Pull in aside contents from file.</jc>
		aside=<js>"$F{resources/DockerRegistryResourceAside.html}"</js>
	)
		</p>
	<li>
		New <dc>ReaderResource.toCommentStrippedString()</dc> method.
	<li>
		The <c>bpIncludes()</c> and <c>bpExcludes()</c> 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 <c>$R</c> variable: <js>"$R{servletClass}"</js>, <js>"$R{servletClassSimple}"</js>
</ul>

<h5 class='topic w800'>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><!-- END: 6.3.1 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#6.4.0' id='6.4.0'>6.4.0 (Oct 5, 2017)</a></h3>
<div class='topic'><!-- START: 6.4.0 -->
<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 <c>"org.apache.juneau"</c>:
</p>
<table class='styled w800'>
	<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'><c>juneau-examples-core</c></td>
		<td>
			Core code examples
		</td>
		<td></td>
	</tr>
	<tr class='light bb'>
		<td class='code'><c>juneau-examples-rest</c></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'><c>juneau-all</c></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 w800'>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 <c>@Pojo</c> and <dc>@BeanProperty(swap)</dc> annotations.
			<li>Support for per-media-type swaps.
				<br>Programmatic example:
				<p class='bcode w800'>
	<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 w800'>
	<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 w800'>
	<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 w800'>
		<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 w800'>
	<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 <c>PojoSwaps</c>, this can be used to provide customized
		output for specific content types.
		<p class='bcode w800'>
	<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 = SimpleJsonSerializer.<jsf>DEFAULT</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 w800'>
	<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 <c>SerializeException</c>/<c>ParseException</c>.
	<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 <c>getClass()</c> to retrieve the annotation value could not be called before calling
		the <c><jk>super</jk>()</c> 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 w800'>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 <c>toString()</c> method.
		<br>For example, <c>Swagger.toString()</c> produces JSON and the HTML5 <c>Form.toString()</c>
		produces HTML.
</ul>


<h5 class='topic w800'>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><c>init(RestConfig)</c> 
						- Use {@link org.apache.juneau.rest.annotation.HookEvent#INIT} instead.
					<li><c>onSuccess(RestRequest, RestResponse, long)</c>
						- Use {@link org.apache.juneau.rest.annotation.HookEvent#END_CALL} instead.
					<li><c>onPreCall(RestRequest)</c>
						- Use {@link org.apache.juneau.rest.annotation.HookEvent#PRE_CALL} instead.
					<li><c>onPostCall(RestRequest, RestResponse)</c>
						- 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 <dc>getContent(RestRequest)</dc> 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 <dc>@RestResource</dc>:
		<ul>
			<li><dc>resourceResolver()</dc>
				<br>Allows you to specify a resource resolver on the servlet context to make it easier to work with
				dependency injection frameworks.
			<li><dc>contextPath()</dc> - 
				<br>Allows you to override the context path value inherited from the servlet container.
			<li><dc>allowHeaderParams()</dc> - 
				<br>Replaces the <c>RestContext.REST_allowHeaderParams</c> setting.
			<li><dc>allowMethodParam()</dc> - 
				<br>Replaces the <c>RestContext.REST_allowMethodParam</c> setting.
			<li><dc>allowBodyParam()</dc> - 
				<br>Replaces the <c>RestContext.REST_allowBodyParam</c> setting.
			<li><dc>renderResponseStackTraces()</dc> - 
				<br>Replaces the <c>RestContext.REST_xxx</c> setting.
			<li><dc>useStackTraceHashes()</dc> - 
				<br>Replaces the <c>RestContext.REST_useStackTraceHashes</c> setting.
			<li><dc>defaultCharset()</dc> - 
				<br>Replaces the <c>RestContext.REST_defaultCharset</c> setting.
			<li><dc>paramFormat()</dc> - 
				<br>Replaces the <c>RestContext.REST_paramFormat</c> 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 <c>RestContext.REST_defaultCharset</c> setting.
			<li><dc>RestMethod.paramFormat()</dc> - 
				<br>Replaces the <c>RestContext.REST_paramFormat</c> 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 <c>?stylesheet</c> query parameter.
	<li>
		New doc: <del>Lifecycle Hooks</del>
	<li>
		Eliminated the <c>RestServletJenaDefault</c> class to remove the Jena dependency class on 
		the <c>juneau-rest-server</c> artifact. 
		<br>It's simple enough to simply extend <c>BasicRestServlet</c> and add the RDF serializers and
		parsers.
</ul>

<h5 class='topic w800'>juneau-microservice</h5>
<ul class='spaced-list'>
	<li>
		The microservice has been significantly modified to be configured via a <c>jetty.xml</c> 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 <c>jetty.xml</c> file.
	<li>
		New methods on <dc>RestMicroservice</dc>:
		<ul>
			<li><dc>addServlet(Servlet,String)</dc>
			<li><dc>addServletAttribute(String,Object)</dc>
			<li><dc>getServer()</dc>
			<li><dc>getInstance()</dc>
			<li><dc>getPort()</dc>
			<li><dc>getContextPath()</dc>
			<li><dc>getProtocol()</dc>
			<li><dc>getHostName()</dc>
		</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 <dc>JettyLogger</dc> for directing Jetty logging to the
		java.util.logging framework.
	<li>
		New class <dc>DebugResource</dc> for viewing and generating
		Jetty thread dumps through REST calls.
</ul>

<h5 class='topic w800'>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><!-- END: 6.4.0 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#7.0.0' id='7.0.0'>7.0.0 (Oct 25, 2017)</a></h3>
<div class='topic'><!-- START: 7.0.0 -->
<p>
	This release ups the Java prerequisite to Java 7.
</p>

<h5 class='topic w800'>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 w800'>juneau-dto</h5>
<ul class='spaced-list'>
	<li>
		Class <c>org.apache.juneau.dto.Link</c> renamed to {@link org.apache.juneau.dto.LinkString}.
		Helps avoid confusion since there are other Link classes in the library.
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		Annotation <c><ja>@HtmlDoc</ja>(links)</c> 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 <c><ja>@HtmlDoc</ja>(favIcon)</c>.
		<br>This was a discouraged way of defining fav-icons anyway, and with the addition of 
		<c><ja>@HtmlDoc</ja>(head)</c>, you can define them using:
		<p class='bcode w800'>
	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 <c>RestResponse/RestConfig/RestContext</c>
		classes and moved it into the new {@link org.apache.juneau.rest.HtmlDocBuilder} class.
</ul>
</div><!-- END: 7.0.0 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#7.0.1' id='7.0.1'>7.0.1 (Dec 24, 2017)</a></h3>
<div class='topic'><!-- START: 7.0.1 -->
<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 w800'>juneau-marshall</h5>
<ul class='spaced-list'>
	<li>New static <c>create()</c> methods for builders on serializers and parsers.
		<br>This simplifies the syntax of creation of serializers and parsers by scratch.
		<p class='bcode w800'>
	<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><dc>ConfigFile.create()</dc>
		</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 w800'>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 w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		New <dc>@RestResource(maxInput)</dc> and 
		{@link org.apache.juneau.rest.annotation.RestMethod#maxInput() @RestMethod(maxInput)} for alleviating
		potential DoS attacks.
</ul>

<h5 class='topic w800'>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 w800'>
	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 w800'>
	<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><dc>createConsoleCommands()</dc>
					<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><!-- END: 7.0.1 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#7.1.0' id='7.1.0'>7.1.0 (Mar 08, 2018)</a></h3>
<div class='topic'><!-- START: 7.1.0 -->
<p>
	Version 7.1.0 is a major update with major implementation refactoring across all aspects of the product.
</p>

<h5 class='topic w800'>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 <c>Context</c> classes (e.g. <c>JsonSerializerContext</c>) have been folded into
				their respective serializer or parser classes (e.g. <c>JsonSerializer</c>).
				<br>Additionally, these classes are their own bean contexts.
				<br>For example, the class hierarchy of <c>JsonSerializer</c> 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 <c>Context</c> objects are thread-safe and read-only.
			<li>
				Session objects also now have a consistent class hierarchy.
				<br>For example, the class hierarchy of <c>JsonSerializerSession</c> 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 <c>JsonSerializerBuilder</c> 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 <c>Context</c> 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 <c>PropertyStore</c> 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 <c>PropertyStore</c> objects
				that can be used as hash keys.
		</ul>
	<li>
		Improvements to the HTTP-Part APIs.
		<br>The existing <c>PartSerializer</c>/<c>PartParser</c> classes
		have been replaced with the following all located in the new <c>org.apache.juneau.httppart</c> 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'><dc>UonPartSerializer</dc>
					<li class='jc'><dc>SimpleUonPartSerializer</dc>
					<li class='jc'>{@link org.apache.juneau.httppart.SimplePartSerializer}
				</ul>
				<li class='jic'>{@link org.apache.juneau.httppart.HttpPartParser}
				<ul>
					<li class='jc'><dc>UonPartParser</dc>
					<li class='jc'><dc>SimplePartParser</dc>
				</ul>
			</ul>
		</ul>
		Code for marshalling of parts have been removed from the URL-Encoding serializers and parsers.
	<li>	
		<c>ContextBuilder.property(String,Object)</c> renamed to {@link org.apache.juneau.ContextBuilder#set(String,Object)}.
	<li>
		<c>ResourceFinder</c> 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 {@doc juneau-marshall.Transforms.PojoBuilders POJO Builders}.	
</ul>

<h5 class='topic w800'>juneau-svl</h5>
<ul class='spaced-list'>
	<li>
		New variables:
		<ul>
			<li>{@link org.apache.juneau.svl.vars.CoalesceVar}
			<li>{@link org.apache.juneau.svl.vars.PatternMatchVar}
			<li>{@link org.apache.juneau.svl.vars.NotEmptyVar}
			<li>{@link org.apache.juneau.svl.vars.UpperCaseVar}
			<li>{@link org.apache.juneau.svl.vars.LowerCaseVar}
		</ul>
	<li>
		Variables moved from <l>juneau-microservice</l>:
		<ul>
			<li>{@link org.apache.juneau.svl.vars.ArgsVar}
			<li>{@link org.apache.juneau.svl.vars.ManifestFileVar}
		</ul>
</ul>

<h5 class='topic w800'>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 w800'>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 w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		<c>RestServletDefault</c> renamed to {@link org.apache.juneau.rest.BasicRestServlet}.
	<li>
		<c>RestServletGroupDefault</c> renamed to {@link org.apache.juneau.rest.BasicRestServletGroup}.
	<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 <c>HttpServletRequest.getAttribute(String)</c>.
			<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 <c>RestConfig</c> 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><dc>REST_defaultRequestHeaders</dc>
			<li><dc>REST_defaultResponseHeaders</dc>
			<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><dc>REST_contextPath</dc>
			<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 <dc>@RestResource(staticFiles)</dc> 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 <c>RestMatcherReflecting</c> 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>
		<dc>@RestResource.allowMethodParam</dc> renamed to <dc>RestResource.allowedMethodParams</dc>.
	<li>
		<c>@RestMethod.serializersInherit</c> and <c>@RestMethod.parsersInherit</c> replaced with
		simplified <dc>@RestMethod(inherit)</dc>. 
	<li>
		Changes to {@link org.apache.juneau.rest.RequestFormData}:
		<ul>
			<li>{@link org.apache.juneau.rest.RequestFormData#addDefault(Map) addDefault(Map)} takes in a 
				<c>Map&lt;String,Object&gt;</c> instead of <c>Map&lt;String,String&gt;</c>.
		</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 
				<c>Map&lt;String,Object&gt;</c> instead of <c>Map&lt;String,String&gt;</c>.
		</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 
				<c>Map&lt;String,Object&gt;</c> instead of <c>Map&lt;String,String&gt;</c>.
		</ul>
	<li>
		Changes to {@link org.apache.juneau.rest.RestContext}:
		<ul>
			<li><c>getResource(String,Locale)</c> renamed to {@link org.apache.juneau.rest.RestContext#getClasspathResource(String,Locale) getClasspathResource(String,Locale)}
			<li><c>getResourceAsString(String,Locale)</c> renamed to {@link org.apache.juneau.rest.RestContext#getClasspathResourceAsString(String,Locale) getClasspathResourceAsString(String,Locale)}
			<li><c>getResource(Class,MediaType,String,Locale)</c> 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><dc>RestContext.getDefaultRequestHeaders()</dc> returns a 
				<c>Map&lt;String,Object&gt;</c> instead of <c>Map&lt;String,String&gt;</c>.
			<li><dc>RestContext.getDefaultResponseHeaders()</dc> returns a 
				<c>Map&lt;String,Object&gt;</c> instead of <c>Map&lt;String,String&gt;</c>.
		</ul>
	<li>
		Changes to {@link org.apache.juneau.rest.RestRequest}:
		<ul>	
			<li><c>getSupportedMediaTypes()</c> replaced with
				{@link org.apache.juneau.rest.RestRequest#getConsumes() getConsumes()} and
				{@link org.apache.juneau.rest.RestRequest#getProduces() getProduces()}.
			<li><c>getReaderResource(String,boolean,MediaType)</c> renamed to 
				<dc>getClasspathReaderResource(String,boolean,MediaType)</dc>
			<li><c>getReaderResource(String,boolean)</c> renamed to 
				{@link org.apache.juneau.rest.RestRequest#getClasspathReaderResource(String,boolean) getClasspathReaderResource(String,boolean)}
			<li><c>getReaderResource(String)</c> renamed to 
				{@link org.apache.juneau.rest.RestRequest#getClasspathReaderResource(String) getClasspathReaderResource(String)}
		</ul>
	<li>
		Changes to <dc>@RestResource</dc>
		<ul>
			<li>New <dc>mimeTypes()</dc> 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>
		<c>RestCallHandler</c> split up into {@link org.apache.juneau.rest.RestCallHandler} and 
		{@link org.apache.juneau.rest.BasicRestCallHandler}
	<li>
		<c>RestInfoProvider</c> split up into {@link org.apache.juneau.rest.RestInfoProvider} and 
		{@link org.apache.juneau.rest.BasicRestInfoProvider}
	<li>
		<c>RestLogger</c> split up into {@link org.apache.juneau.rest.RestLogger}, 
		{@link org.apache.juneau.rest.BasicRestLogger} and {@link org.apache.juneau.rest.NoOpRestLogger}
	<li>
		<c>RestResourceResolverSimple</c> renamed to {@link org.apache.juneau.rest.BasicRestResourceResolver}
	<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 <c>@Messages</c> and <c>@Properties</c> REST java method parameter
		annotations.
		<br>These aren't needed anymore since you can just pass in <c>MessageBundle</c> and
		<c>RestRequestProperties</c> as unannotated parameters.
	<li>
		Revamped the {@link org.apache.juneau.rest.RestInfoProvider} class.
	<li>
		New builder classes:
		<ul>
			<li><dc>ReaderResourceBuilder</dc>
			<li><dc>StreamResourceBuilder</dc>
		</ul>
	<li>
		{@link org.apache.juneau.rest.RestResponse#getNegotiatedOutputStream()} now returns a 
		<dc>FinishableServletOutputStream</dc> and {@link org.apache.juneau.rest.RestResponse#getNegotiatedWriter()}
		now returns a <dc>FinishablePrintWriter</dc> that allows you to finish the output
		without closing the stream.
		<br>The {@link org.apache.juneau.rest.reshandlers.DefaultHandler} class now calls <c>finish()</c>
		instead of <c>close()</c> on the stream.
	<li>
		Added the following annotations to the {@link org.apache.juneau.rest.BasicRestServlet} class
		(which were previously defined on the <dc>Resource</dc> class):
		<p class='bcode w800'>
	<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 w800'>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 <c>PartSerializer</c> with {@link org.apache.juneau.httppart.HttpPartSerializer}.
		<br>The default value is now <dc>SimpleUonPartSerializer</dc> 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 <c>Closeable</c> interface.
</ul>

<h5 class='topic w800'>juneau-microservice</h5>
<ul class='spaced-list'>
	<li>
		<c>Resource</c> and <c>ResourceGroup</c> classes removed.
		<br>{@link org.apache.juneau.rest.BasicRestServlet} and {@link org.apache.juneau.rest.BasicRestServletGroup} can be used instead.
	<li>
		<c>ResourceJena</c> and <c>ResourceJenaGroup</c> classes renamed to
		<dc>BasicRestServletJena</dc> and <dc>BasicRestServletJenaGroup</dc>.
</ul>
</div><!-- END: 7.1.0 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#7.2.0' id='7.2.0'>7.2.0 (Sept 25, 2018)</a></h3>
<div class='topic'><!-- START: 7.2.0 -->
<p>
	7.2.0 is a major release that introduces several significant new features:
</p>
<ul class='spaced-list'>
	<li>OpenAPI part serializing and parsing with full support for OpenAPI validation of input and output in the REST servlet and client APIs.
	<li>Swagger UI.
	<li>New HTTP-Part annotations that are applicable to both the servlet and client APIs.
	<li>Serverless servlet and client unit testing.
	<li>Simplified UI customization.
	<li>Marshalls that combines serializers and parsers into a single API.
</ul>

<h5 class='topic w800'>juneau-marshall</h5>
<ul class='spaced-list'>
	<li>
		The REST client <ja>@Remoteable</ja> annotations and REST server <ja>@RemoteMethod</ja> annotations which used to be
		in separate packages in the client and server projects have been combined into a single set of annotations in 
		the {@link org.apache.juneau.http.annotation} package.
		<br>This fixes a long-standing problem where it was easy to mix up using client-side annotations in server-side code, and vis-versa.
		<br>Additionally, much work has been done on these annotations to add support for Swagger-style validations and documentation.
		<ul class='doctree'>
			<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
			<li class='ja'>{@link org.apache.juneau.http.annotation.FormData}
			<li class='ja'>{@link org.apache.juneau.http.annotation.Header}
			<li class='ja'>{@link org.apache.juneau.http.annotation.Path}
			<li class='ja'>{@link org.apache.juneau.http.annotation.Query}
			<li class='ja'>{@link org.apache.juneau.http.annotation.HasFormData}
			<li class='ja'>{@link org.apache.juneau.http.annotation.HasQuery}
			<li class='ja'>{@link org.apache.juneau.http.annotation.Request}
		</ul>
		<br>These are used with new Swagger schema/documentation annotations to produce schema-based serialization/parsing/validation 
			and auto-generated Swagger documentation:
		<ul class='doctree'>
			<li class='ja'>{@link org.apache.juneau.http.annotation.Contact}
			<li class='ja'><dc>ExternalDocs</dc>
			<li class='ja'><dc>Items</dc>
			<li class='ja'>{@link org.apache.juneau.http.annotation.License}
			<li class='ja'><dc>Schema</dc>
			<li class='ja'><dc>SubItems</dc>
			<li class='ja'>{@link org.apache.juneau.http.annotation.Tag}
		</ul>
		<br>Additionally, the <ja>@Remoteable</ja> annotation has been split into the following two annotations:
		<ul class='doctree'>
			<li class='ja'>{@link org.apache.juneau.remote.RemoteInterface} 
				- Used for remote proxy interfaces served up through 
				<dc>RemoteInterfaceServlet</dc> or REST <js>"PROXY"</js> methods.
				<br>Defaults to <js>"POST"</js> with method signatures as paths.
			<li class='ja'><dc>RemoteResource</dc> 
				- Used for 3rd-party REST interfaces.
				<br>Defaults to <js>"GET"</js> with standardized naming conventions for paths.
		</ul>
	<li>
		Support for multi-valued parameters as maps or beans on server-side annotations (it was previously supported on client-side):
		<c><ja>@Query</ja>(<js>"*"</js>)</c>, <c><ja>@FormData</ja>(<js>"*"</js>)</c>, <c><ja>@Header</ja>(<js>"*"</js>)</c>, <c><ja>@Path</ja>(<js>"*"</js>)</c>
	<li>
		Support for server-side use of <ja>@Request</ja> annotation on <ja>@RestMethod</ja> annotations and new {@link org.apache.juneau.rest.RestRequest#getRequest(RequestBeanMeta)} method.
	<li>
		Fixed bug where <c><ja>@Bean</ja>(typeName)</c> was not being detected on non-bean POJO classes.
	<li>
		Fixed bug where HTML-Schema was not being rendered correctly.
	<li>
		Support for POJO examples:
		<ul class='doctree'>
			<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_examples}
			<li class='ja'>{@link org.apache.juneau.annotation.Example}
		</ul>
	<li>
		Fixed bug where parsers could report the wrong line number when an error occurred.
	<li>
		A runtime exception is now thrown if you define a <dc>@BeanProperty(name)</dc> but forget to
		add it to your <c><ja>@Bean</ja>(properties)</c> annotation.
	<li>
		<c><ja>@Html</ja>(asXml)</c> and <c><ja>@Html</ja>(asPlainText)</c> replaced with
		{@link org.apache.juneau.html.annotation.Html#format() @Html(format)}.
	<li>
		HTML serializer will now serializers beans and maps as HTML even when those objects are embedded
		within an object with <c><ja>@Html</ja>(format=<jsf>XML</jsf>)</c>.
		<br>The previous behavior was to serialize it as XML.
	<li>
		New settings for binary-based serializers and parsers:
		<ul class='doctree'>
			<li class='jf'>{@link org.apache.juneau.serializer.OutputStreamSerializer#OSSERIALIZER_binaryFormat}
			<li class='jf'>{@link org.apache.juneau.parser.InputStreamParser#ISPARSER_binaryFormat}
		</ul>
	<li>
		Added support for auto-detection of fluent-style setters:
		<ul class='doctree'>
			<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_fluentSetters}
			<li class='ja'>{@link org.apache.juneau.annotation.Bean#fluentSetters()}
		</ul>
	<li>
		The <jsf>SERIALIZER_abridged</jsf> setting has been replaced with {@link org.apache.juneau.serializer.Serializer#SERIALIZER_addRootType SERIALIZER_addRootType}
	<li>
		The <jsf>SERIALIZER_addBeanTypeProperties</jsf> setting has been replaced with {@link org.apache.juneau.serializer.Serializer#SERIALIZER_addBeanTypes SERIALIZER_addBeanTypes}
		and is disabled by default.
	<li>
		Parse exception messages are now clearer and include code snippets of where a parse exception occurred:
		<p class='bcode w800' style='color:red'>
	org.apache.juneau.parser.ParseException: Expected '[' at beginning of JSON array.
		At line 80, column 20.
		While parsing into: 
			currentClass: List&lt;String&gt;
			currentProperty: required: java.util.List, field=[null], getter=[public java.util.List org.apache.juneau.dto.swagger.SchemaInfo.getRequired()], setter=[public org.apache.juneau.dto.swagger.SchemaInfo org.apache.juneau.dto.swagger.SchemaInfo.setRequired(java.util.Collection)]
	---start--
	0075: 						"name": "body",
	0076: 						"description": "Pet object that needs to be added to the store",
	0077: 						"required": true,
	0078: 						"schema": {
	0079: 							"required": true,
	0080: 						}
	0081: 					}
	0082: 				],
	0083: 				"responses": {
	0084: 					"405": {
	0085: 						"description": "Invalid input"
	---end---
		</p>
	<li>
		New property {@link org.apache.juneau.parser.Parser#PARSER_debugOutputLines} for controlling how many input lines are added to the exception message above.
	<li>
		New property {@link org.apache.juneau.BeanContext#BEAN_useEnumNames} for controlling whether enums are serialized
		using their name or the <c>toString()</c> method.
	<li>
		New property {@link org.apache.juneau.BeanContext#BEAN_examples} for defining examples of POJOs.
	<li>
		New {@link org.apache.juneau.annotation.Example @Example} annotation for defining examples of POJOs.
		<br>Used heavily in JSON-Schema support.
	<li>
		If a bean has both a <c>getX()</c> and <c>isX()</c> method, the <c>getX()</c> method takes precedence.
		<br>The previous behavior was arbitrary.
	<li>
		Significant improvements to JSON-Schema serialization support.
		<ul>
			<li>New <dc>@JsonSchema</dc> annotation.
		</ul>
	<li>
		Fixed <c>NullPointerException</c> when serializing beans with a dyna-property (i.e. <c><ja>@Bean</ja>(<js>"*"</js>)</c>)
		which returns a <jk>null</jk> value.
	<li>
		New option for dyna-property (i.e. <c><ja>@Bean</ja>(<js>"*"</js>)</c>) using a method that returns a collection of extra keys.
		<br>See new options #4 on {@link org.apache.juneau.annotation.BeanProperty#name()}
	<li>
		New formats for the {@link org.apache.juneau.html.annotation.Html#format() @Html(format)} annotation:
		<ul class='doctree'>
			<li class='jf'>{@link org.apache.juneau.html.annotation.HtmlFormat#HTML_CDC} - Format collections as comma-delimited lists.
			<li class='jf'>{@link org.apache.juneau.html.annotation.HtmlFormat#HTML_SDC} - Format collections as space-delimited lists.
		</ul> 
	<li>
		Serializers now allow for q-values on the media types they handle.
		<br>For example, the accept media type on <c>JsonSerializer.Simple</c> is <js>"application/json+simple,application/json;q=0.9"</js>.
		<br>This means the serializer CAN handle requests for <js>"application/json"</js> if no other serializers provide a better match.
	<li>
		New methods for creating unmodifiable {@link org.apache.juneau.ObjectMap ObjectMaps} and {@link org.apache.juneau.ObjectList ObjectLists}.
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.ObjectMap}
			<ul>
				<li class='jm'>{@link org.apache.juneau.ObjectMap#isUnmodifiable() isUnmodifable()}
				<li class='jm'>{@link org.apache.juneau.ObjectMap#unmodifiable() unmodifiable()}
				<li class='jm'>{@link org.apache.juneau.ObjectMap#modifiable() modifiable()}
			</ul>
			<li class='jp'>{@link org.apache.juneau.ObjectList}
			<ul>
				<li class='jm'>{@link org.apache.juneau.ObjectList#isUnmodifiable() isUnmodifable()}
				<li class='jm'>{@link org.apache.juneau.ObjectList#unmodifiable() unmodifiable()}
				<li class='jm'>{@link org.apache.juneau.ObjectList#modifiable() modifiable()}
			</ul>
		</ul>
	<li>
		The <c>JsonSerializer.Simple</c> class has been moved into the top-level {@link org.apache.juneau.json.SimpleJsonSerializer} class.
	<li>
		RDF serializer subclasses have been moved into top-level classes:
		<ul>
			<li><c>RdfSerializer.Xml</c> -&gt; {@link org.apache.juneau.jena.RdfXmlSerializer}
			<li><c>RdfSerializer.XmlAbbrev</c> -&gt; {@link org.apache.juneau.jena.RdfXmlAbbrevSerializer}
			<li><c>RdfSerializer.N3</c> -&gt; {@link org.apache.juneau.jena.N3Serializer}
			<li><c>RdfSerializer.NTriple</c> -&gt; {@link org.apache.juneau.jena.NTripleSerializer}
			<li><c>RdfSerializer.Turtle</c> -&gt; {@link org.apache.juneau.jena.TurtleSerializer}
			<li><c>RdfParser.Xml</c> -&gt; {@link org.apache.juneau.jena.RdfXmlParser}
			<li><c>RdfParser.N3</c> -&gt; {@link org.apache.juneau.jena.N3Parser}
			<li><c>RdfParser.NTriple</c> -&gt; {@link org.apache.juneau.jena.NTripleParser}
			<li><c>RdfParser.Turtle</c> -&gt; {@link org.apache.juneau.jena.TurtleParser}
		</ul>
	<li>
		New API for pairing serializers and parsers for simplified syntax:
		<h5 class='figure'>Examples:</h5>
		<p class='bcode w800'>
	<jc>// Using instance.</jc>
	Json json = <jk>new</jk> Json();
	MyPojo myPojo = json.read(string, MyPojo.<jk>class</jk>);
	String string = json.write(myPojo);
		</p>
		<p class='bcode w800'>
	<jc>// Using DEFAULT instance.</jc>
	MyPojo myPojo = Json.<jsf>DEFAULT</jsf>.read(string, MyPojo.<jk>class</jk>);
	String string = Json.<jsf>DEFAULT</jsf>.write(myPojo);
		</p>
		<ul class='doctree'>
			<li class='jac'>{@link org.apache.juneau.marshall.Marshall}
			<ul>
				<li class='jac'>{@link org.apache.juneau.marshall.CharMarshall}
				<ul>
					<li class='jc'>{@link org.apache.juneau.marshall.Html}
					<li class='jc'>{@link org.apache.juneau.marshall.Json}
					<li class='jc'>{@link org.apache.juneau.marshall.PlainText}
					<li class='jc'>{@link org.apache.juneau.marshall.SimpleJson}
					<li class='jc'>{@link org.apache.juneau.marshall.Uon}
					<li class='jc'>{@link org.apache.juneau.marshall.UrlEncoding}
					<li class='jc'>{@link org.apache.juneau.marshall.Xml}
					<li class='jc'>{@link org.apache.juneau.marshall.N3}
					<li class='jc'>{@link org.apache.juneau.marshall.NTriple}
					<li class='jc'>{@link org.apache.juneau.marshall.RdfXml}
					<li class='jc'>{@link org.apache.juneau.marshall.RdfXmlAbbrev}
					<li class='jc'>{@link org.apache.juneau.marshall.Turtle}	
				</ul>
				<li class='jac'>{@link org.apache.juneau.marshall.StreamMarshall}
				<ul>
					<li class='jc'>{@link org.apache.juneau.marshall.Jso}
					<li class='jc'>{@link org.apache.juneau.marshall.MsgPack}
				</ul>
			</ul>
		</ul>
	<li>
		New/updated documentation:
		<ul>
			<li><a href='#juneau-marshall.JsonDetails.SimplifiedJson'>2.15.3 - Simplified JSON</a>
		</ul>
</ul>

<h5 class='topic w800'>juneau-dto</h5>
<ul class='spaced-list'>
	<li>
		Fixed bug where Swagger {@link org.apache.juneau.dto.swagger.SchemaInfo#required(Object...)} was defined as a boolean
		instead of a list of strings.
	<li>
		Boolean attributes are now handled correctly for HTML5.
		<br>For example, calling <c><jk>new</jk> Select().disabled(<jk>true</jk>)</c> will produce <c>&lt;select disabled='disabled'&gt;</c>
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		Auto-generated {@doc juneau-rest-server.Swagger Swagger UI}.
	<li>
		Simplified <dc>@RestResource(swagger)</dc>
		and {@link org.apache.juneau.rest.annotation.RestMethod#swagger() @RestMethod(swagger)} annotations.
	<li>
		Fixed bug in <c>UriResolver</c> when request path info had special characters.
	<li>
		Fixed bug where incorrect media type was being set on responses (e.g. <c>text/html+schema</c> instead of <c>text/html</c> for schema documents).
	<li>
		The <c>RemoteableServlet</c> class has been moved and renamed to <dc>RemoteInterfaceServlet</dc>.
	<li>
		<dc>RemoteInterfaceServlet</dc> now provides a form page for invoking remote interface methods in a browser.
	<li>
		Newlines were being stripped from <c><ja>@HtmlDoc</ja>(script)</c> when serialized which could cause script lines to become commented out.
	<li>
		New {@link org.apache.juneau.http.annotation.Response @Response} annotation that can be applied to
		throwables thrown from REST methods and POJOs returned by REST methods to specify non-200 status return codes and descriptions in Swagger documentation.
	<li>
		Swagger fields added to the following annotations:
		<ul class='doctree'>
			<li class='ja'>{@link org.apache.juneau.http.annotation.Body}
			<li class='ja'>{@link org.apache.juneau.http.annotation.FormData}
			<li class='ja'>{@link org.apache.juneau.http.annotation.Header}
			<li class='ja'>{@link org.apache.juneau.http.annotation.Path}
			<li class='ja'>{@link org.apache.juneau.http.annotation.Query}
		</ul>
	<li>
		The <ja>@PathRemainder</ja> annotation has been removed entirely.  
		<br>Use <c><ja>@Path</ja>(<js>"/*"</js>)</c> to access the path remainder which includes all the new OpenAPI parsing support.
	<li>
		"Helper" classes (i.e. reusable beans that can be returned by REST methods) have been moved to the following package with some new additions:
		<ul class='doctree'>
			<li class='jp'>{@link org.apache.juneau.rest.helper}
			<ul>
				<li class='jc'>{@link org.apache.juneau.rest.helper.BeanDescription}
				<li class='jc'>{@link org.apache.juneau.rest.helper.ChildResourceDescriptions}
				<li class='jc'><dc>ReaderResource</dc>
				<li class='jc'><dc>ReaderResourceBuilder</dc>
				<li class='jc'>{@link org.apache.juneau.rest.helper.SeeOtherRoot}
				<li class='jc'>{@link org.apache.juneau.rest.helper.ResourceDescription}
				<li class='jc'><dc>StreamResource</dc>
				<li class='jc'><dc>StreamResourceBuilder</dc>
			</ul>
		</ul>
	<li>
		Predefined HTTP responses.
		<ul class='doctree'>
			<li class='jp'>{@link org.apache.juneau.rest.response}
			<ul>
				<li class='jc'>{@link org.apache.juneau.rest.response.Accepted}
				<li class='jc'>{@link org.apache.juneau.rest.response.AlreadyReported}
				<li class='jc'>{@link org.apache.juneau.rest.response.Continue}
				<li class='jc'>{@link org.apache.juneau.rest.response.Created}
				<li class='jc'>{@link org.apache.juneau.rest.response.EarlyHints}
				<li class='jc'>{@link org.apache.juneau.rest.response.Found}
				<li class='jc'>{@link org.apache.juneau.rest.response.IMUsed}
				<li class='jc'>{@link org.apache.juneau.rest.response.MovedPermanently}
				<li class='jc'>{@link org.apache.juneau.rest.response.MultipleChoices}
				<li class='jc'>{@link org.apache.juneau.rest.response.MultiStatus}
				<li class='jc'>{@link org.apache.juneau.rest.response.NoContent}
				<li class='jc'>{@link org.apache.juneau.rest.response.NonAuthoritiveInformation}
				<li class='jc'>{@link org.apache.juneau.rest.response.NotModified}
				<li class='jc'>{@link org.apache.juneau.rest.response.Ok}
				<li class='jc'>{@link org.apache.juneau.rest.response.PartialContent}
				<li class='jc'>{@link org.apache.juneau.rest.response.PermanentRedirect}
				<li class='jc'>{@link org.apache.juneau.rest.response.Processing}
				<li class='jc'>{@link org.apache.juneau.rest.response.ResetContent}
				<li class='jc'>{@link org.apache.juneau.rest.response.SeeOther}
				<li class='jc'>{@link org.apache.juneau.rest.response.SwitchingProtocols}
				<li class='jc'>{@link org.apache.juneau.rest.response.TemporaryRedirect}
				<li class='jc'>{@link org.apache.juneau.rest.response.UseProxy}			
			</ul>
		</ul>
	<li>
		Predefined HTTP error throwables.
		<br>When added to REST Java methods, reflected in generated Swagger documentation.
		<ul class='doctree'>
			<li class='jp'>{@link org.apache.juneau.rest.exception}
			<ul>
				<li class='jc'>{@link org.apache.juneau.rest.exception.BadRequest}
				<li class='jc'>{@link org.apache.juneau.rest.exception.Conflict}
				<li class='jc'>{@link org.apache.juneau.rest.exception.ExpectationFailed}
				<li class='jc'>{@link org.apache.juneau.rest.exception.FailedDependency}
				<li class='jc'>{@link org.apache.juneau.rest.exception.Forbidden}
				<li class='jc'>{@link org.apache.juneau.rest.exception.Gone}
				<li class='jc'>{@link org.apache.juneau.rest.exception.HttpVersionNotSupported}
				<li class='jc'>{@link org.apache.juneau.rest.exception.InsufficientStorage}
				<li class='jc'>{@link org.apache.juneau.rest.exception.InternalServerError}
				<li class='jc'>{@link org.apache.juneau.rest.exception.LengthRequired}
				<li class='jc'>{@link org.apache.juneau.rest.exception.Locked}
				<li class='jc'>{@link org.apache.juneau.rest.exception.LoopDetected}
				<li class='jc'>{@link org.apache.juneau.rest.exception.MethodNotAllowed}
				<li class='jc'>{@link org.apache.juneau.rest.exception.MisdirectedRequest}
				<li class='jc'>{@link org.apache.juneau.rest.exception.NetworkAuthenticationRequired}
				<li class='jc'>{@link org.apache.juneau.rest.exception.NotAcceptable}
				<li class='jc'>{@link org.apache.juneau.rest.exception.NotExtended}
				<li class='jc'>{@link org.apache.juneau.rest.exception.NotFound}
				<li class='jc'>{@link org.apache.juneau.rest.exception.NotImplemented}
				<li class='jc'>{@link org.apache.juneau.rest.exception.PayloadTooLarge}
				<li class='jc'>{@link org.apache.juneau.rest.exception.PreconditionFailed}
				<li class='jc'>{@link org.apache.juneau.rest.exception.PreconditionRequired}
				<li class='jc'>{@link org.apache.juneau.rest.exception.RangeNotSatisfiable}
				<li class='jc'>{@link org.apache.juneau.rest.exception.RequestHeaderFieldsTooLarge}
				<li class='jc'>{@link org.apache.juneau.rest.exception.ServiceUnavailable}
				<li class='jc'>{@link org.apache.juneau.rest.exception.TooManyRequests}
				<li class='jc'>{@link org.apache.juneau.rest.exception.Unauthorized}
				<li class='jc'>{@link org.apache.juneau.rest.exception.UnavailableForLegalReasons}
				<li class='jc'>{@link org.apache.juneau.rest.exception.UnprocessableEntity}
				<li class='jc'>{@link org.apache.juneau.rest.exception.UnsupportedMediaType}
				<li class='jc'>{@link org.apache.juneau.rest.exception.UpgradeRequired}
				<li class='jc'>{@link org.apache.juneau.rest.exception.UriTooLong}
				<li class='jc'>{@link org.apache.juneau.rest.exception.VariantAlsoNegotiates}
			</ul>
		</ul>	
	<li>
		The {@link org.apache.juneau.rest.annotation.HtmlDoc#nav() @HtmlDoc(nav)} and {@link org.apache.juneau.rest.annotation.HtmlDoc#navlinks() @HtmlDoc(navlinks)}
		can now both be used on the same annotation.
		<br>The contents of <c>nav()</c> are free-form HTML that gets rendered immediately after the navigation links.
	<li>
		The following new parameter types can be used on REST methods:
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.parser.ReaderParser} - The reader parser matching the request content type.
			<li class='jc'>{@link org.apache.juneau.parser.InputStreamParser} - The input stream parser matching the request content type.
		</ul>
	<li>
		The <c>$F</c> variable can now be used as a initialization time variable.
		<br>For example, the <c>AtomFeedResource</c> example pulls a bean example from a file on the classpath:
		<p class='bcode w800'>
	<ja>@RestResource</ja>(
		path=<js>"/atom"</js>,
		title=<js>"Sample ATOM feed resource"</js>,
		properties={
			<ja>@Property</ja>(name=<jsf>BEAN_examples</jsf>, value=<js>"{'org.apache.juneau.dto.atom.Feed': $F{AtomFeedResource_example.json}}"</js>)
		},
		...
	)
		</p>
		<br>It should be noted that you cannot use the <c>$F</c> variable to retrieve localized versions of files (since you're not within
		the scope of a client request.
	<li>
		The <dc>RestResource.nowrap()</dc> annotation has been changed to a string with a default value of <js>"true"</js>.
		<br>Having it as a string allows us to differentiate between a set and unset value so that it can be overridden in subclasses.
	<li>
		The {@link org.apache.juneau.http.annotation.Path#name()} annotation parameter is now required.
	<li>
		New class for mock unit testing of REST resources:
		<ul class='doctree'>
			<li class='jc'><dc>MockRest</dc>
		</ul>
	<li>
		<c><ja>@RestMethod</ja>(inherit)</c> annotation has been removed and replaced with the following classes:
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.rest.Inherit}
			<li class='jc'>{@link org.apache.juneau.rest.None}
		</ul>
		<br>These can be used in the following locations:
		<ul class='doctree'>
			<li class='ja'><dc>RestResource.serializers()</dc>
			<li class='ja'><dc>RestResource.parsers()</dc>
			<li class='ja'><dc>RestResource.beanFilters()</dc>
			<li class='ja'><dc>RestResource.pojoSwaps()</dc>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#serializers()}
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#parsers()}
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#beanFilters()}
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod#pojoSwaps()}
		</ul>
		<br>One advantage is that you now have control over the precedence of serializers and parsers by where you insert the <c>Inherit</c> class. 
	<li>
		<c>RequestPathMatch</c> class has been renamed to {@link org.apache.juneau.rest.RequestPath}.
	<li>
		{@link org.apache.juneau.http.annotation.Request @Request} objects can now be used as parameters in <ja>@RestMethod</ja> methods.
		<br>Includes new methods on {@link org.apache.juneau.rest.RestRequest}:
		<ul class='doctree'>
			<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getRequest(Class) getRequest(Class)}
			<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getRequest(RequestBeanMeta) getRequest(RequestBeanMeta)}
		</ul>
	<li>
		New methods added to {@link org.apache.juneau.rest.widget.MenuItemWidget} to allow population of menu item content using Javascript and Ajax calls:
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.rest.widget.MenuItemWidget}
			<ul>
				<li class='jm'><dc>getBeforeShowScript(RestRequest)</dc>
				<li class='jm'><dc>getAfterShowScript(RestRequest)</dc>
			</ul>
		</ul>
	<li>
		New methods added to {@link org.apache.juneau.rest.widget.Widget} to allow retrieving classpath resources with embedded SVL variables:
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.rest.widget.Widget}
			<ul>
				<li class='jm'><dc>loadHtmlWithVars(RestRequest,String)</dc>
				<li class='jm'><dc>loadScriptWithVars(RestRequest,String)</dc>
				<li class='jm'><dc>loadStyleWithVars(RestRequest,String)</dc>
			</ul>
		</ul>
	<li>
		New/updated documentation: 
		<br><dc>juneau-rest-server.UnitTesting</dc>
	<li>
		The behavior of the default values for {@link org.apache.juneau.rest.annotation.RestMethod#name()} and {@link org.apache.juneau.rest.annotation.RestMethod#path()}
		have changed.
		<br>If not specified, the values are inferred from the Java method name.
		<br>See Also: {@doc juneau-rest-server.RestMethod}
	<li>
		<c>RedirectToServletRoot</c> class has been renamed to {@link org.apache.juneau.rest.helper.SeeOtherRoot}.
	<li>
		New REST context settings:
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.rest.RestContext}
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_uriAuthority REST_uriAuthority}
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_uriContext REST_uriContext}
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_uriRelativity REST_uriRelativity}
				<li class='jf'>{@link org.apache.juneau.rest.RestContext#REST_uriResolution REST_uriResolution}
			</ul>
		</ul>
	<li>
		New convenience annotations for specifying default <c>Accept</c> and <c>Content-Type</c> headers:
		<ul class='doctree'>	
			<li class='jc'><dc>RestResource</dc>
			<ul>
				<li class='jf'><dc>defaultAccept</dc>
				<li class='jf'><dc>defaultContentType</dc>
			</ul>	
			<li class='jc'>{@link org.apache.juneau.rest.annotation.RestMethod}
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.annotation.RestMethod#defaultAccept defaultAccept}
				<li class='jf'>{@link org.apache.juneau.rest.annotation.RestMethod#defaultContentType defaultContentType}
			</ul>	
		</ul>
</ul>

<h5 class='topic w800'>juneau-rest-client</h5>
<ul class='spaced-list'>
	<li>
		Remote Resource interfaces support OpenAPI annotations.
	<li>
		Made improvements to the builder API for defining SSL support.
		<br>New methods added:
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.rest.client.RestClientBuilder}
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#sslProtocols(String...) sslProtocols(String...)}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#cipherSuites(String...) cipherSuites(String...)}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#hostnameVerifier(HostnameVerifier) hostnameVerifier(HostnameVerifier)}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#keyManagers(KeyManager...) keyManagers(KeyManager...)}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#trustManagers(TrustManager...)}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#secureRandom(SecureRandom)}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#httpClientConnectionManager(HttpClientConnectionManager)}
			</ul>
		</ul>
	<li>
		Clients no longer have JSON defined as the default serializer and parser.
		<br>Instead, the clients can now be used with no serializer/parser if you're working with InputStreams/Readers or
		POJOs that can be converted to Strings and converted from Strings/InputStreams/Readers.
	<li>
		Methods added to client builder to make it easy to define the transport language:
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.rest.client.RestClientBuilder}
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#json() json()}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#xml() xml()}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#html() html()}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#uon() uon()}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#urlEnc() urlEnc()}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#msgpack() msgpack()}
				<li class='jf'>{@link org.apache.juneau.rest.client.RestClientBuilder#plainText() plainText()}
			</ul>
		</ul>
	<li>
		New method added for allowing serverless client testing against REST interfaces.
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.rest.client.RestClientBuilder}
			<ul>
				<li class='jf'><dc>mockHttpConnection(MockHttpConnection)</dc>
			</ul>
		</ul>
	<li>
		Removed the deprecated <c>RestCall.execute()</c> method.
		<br>Use {@link org.apache.juneau.rest.client.RestCall#run()}.
	<li>
		<c>RestCall.input(Object)</c> method renamed to {@link org.apache.juneau.rest.client.RestCall#body(Object)} to match OpenAPI terminology.
	<li>
		Made constructors on <c>RestClient</c> and <c>RestClientBuilder</c> protected so that they can be subclassed.
	<li>
		The <c>RestClient.getRemoteableProxy()</c> methods have been split into separate methods for Remote Interfaces and Remote Resources:
		<ul class='doctree'>
			<li class='jc'>{@link org.apache.juneau.rest.client.RestClient}
			<ul>
				<li class='jm'><dc>RestClient.getRemoteInterface(Class)</dc>
				<li class='jm'><dc>RestClient.getRemoteInterface(Class,Object)</dc>
				<li class='jm'><dc>RestClient.getRemoteInterface(Class,Object,Serializer,Parser)</dc>
				<li class='jm'>{@link org.apache.juneau.rest.client.RestClient#getRemoteResource(Class)}
				<li class='jm'>{@link org.apache.juneau.rest.client.RestClient#getRemoteResource(Class,Object)}
				<li class='jm'>{@link org.apache.juneau.rest.client.RestClient#getRemoteResource(Class,Object,Serializer,Parser)}
			</ul>
		</ul>
</ul>

<h5 class='topic w800'>juneau-rest-microservice</h5>
<ul class='spaced-list'>
	<li>
		The look-and-feel of an application is now controlled through the external configuration file and access to
		CSS stylesheets in the working directory in a new folder called <c>files</c>:
		<br><img class='bordered' style='width:170px' src='doc-files/ReleaseNotes.711.1.png'>
		<br><br>
		The default configuration is this: 
		<p class='bcode w800'>
	<cc>#=======================================================================================================================
	# REST settings
	#=======================================================================================================================</cc>
	<cs>[REST]</cs>
	
	<ck>staticFiles</ck> = <cv>htdocs:files/htdocs</cv>
	
	<cc># Stylesheet to use for HTML views.</cc>
	<ck>theme</ck> = <cv>servlet:/htdocs/themes/devops.css</cv>
	
	<ck>headerIcon</ck> = <cv>servlet:/htdocs/images/juneau.png</cv>
	<ck>headerLink</ck> = <cv>http://juneau.apache.org</cv>
	<ck>footerIcon</ck> = <cv>servlet:/htdocs/images/asf.png</cv>
	<ck>footerLink</ck> = <cv>http://www.apache.org</cv>
	
	<ck>icon</ck> = <cv>$C{REST/headerIcon}</cv>
	<ck>header</ck> = <cv>&lt;a href='$U{$C{REST/headerLink}}'&gt;&lt;img src='$U{$C{REST/headerIcon}}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;&lt;/a&gt;</cv>
	<ck>footer</ck> = <cv>&lt;a href='$U{$C{REST/footerLink}}'&gt;&lt;img style='float:right;padding-right:20px;height:32px' src='$U{$C{REST/footerIcon}}'&gt;</cv>	
		</p>				
		<br><br>
		Note that static files can now be served up from the <c>files</c> directory in the working directory, 
		and you have access to modify the CSS theme files.
		<br>The <c>SwaggerUI.css</c> file controls the look-and-feel of the Swagger UI, so you can make
		modification there as well.
		<br><br>
		The <c>BasicRestConfig</c> interface (which defines the default settings for the <c>BasicRestServlet</c> class)
		now looks like this...
		<p class='bcode w800'>
	<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>"$C{REST/header}"</js>
			},
			navlinks={
				<js>"up: request:/.."</js>
			},
			stylesheet=<js>"$C{REST/theme,servlet:/htdocs/themes/devops.css}"</js>,
			head={
				<js>"&lt;link rel='icon' href='$U{$C{REST/icon}}'/&gt;"</js>
			},
			footer=<js>"$C{REST/footer}"</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>"$C{REST/staticFiles}"</js>}
	)
	<jk>public interface</jk> BasicRestConfig {}			
			</p>	
			<br><br>
			The <c>PoweredByApache</c> widget which used to serve as a page footer has been eliminated.
			<br><br>
			If you're testing out changes in the theme stylesheets, you may want to set the following system property
			that prevents caching of those files so that you don't need to restart the microservice each time a change is made:
			<p class='bcode w800'>
	<cc>#=======================================================================================================================
	# System properties
	#=======================================================================================================================</cc>
	<cs>[SystemProperties]</cs>
	
	<cc># Disable classpath resource caching.
	# Useful if you're attached using a debugger and you're modifying classpath resources while running.</cc>
	<ck>RestContext.useClasspathResourceCaching.b</ck> = <cv>false</cv>
			</p>
		<li>
			Upgraded to Jetty 9.4.12.
</ul>
</div><!-- END: 7.2.0 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#7.2.1' id='7.2.1'>7.2.1 (Oct 23, 2018)</a></h3>
<div class='topic'><!-- START: 7.2.1 -->
<p>
	This release contains mostly bug fixes.
	Code changes have been made to preserve binary backwards compatibility with 7.1.0.
</p>

<h5 class='topic w800'>juneau-marshall</h5>
<ul class='spaced-list'>
	<li>
		The <dc>@JsonSchema</dc> annotation has been merged with the {@link org.apache.juneau.jsonschema.annotation.Schema @Schema} annotation.
	<li>
		Annotations typically used on bean properties (getters/setters/public fields) can now be used on private fields.
		This is inline with behavior on JPA-annotated beans.
		These include:  <ja>@Swap</ja>, <ja>@Html</ja>, <ja>@Xml</ja>, <jd>@BeanProperty</jd>.
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		Method-level annotations (e.g. <ja>@RestMethod</ja>) and parameter-level annotations (e.g. <ja>@Query</ja>) are now inheritable
		from parent classes and interfaces. 
		<br>This allows you to define {@doc juneau-rest-client.RestProxies.DualPurposeInterfaces}.
	<li>
		The <c>ReaderResource</c> and <c>StreamResource</c> classes have been moved to the <c>org.apache.juneau.http</c>
		package in <c>juneau-marshall</c>.  This allows them to be used as return types in remote REST interfaces.
		<br>A new {@link org.apache.juneau.rest.helper.ResolvingReaderResource} class has been added that includes the variable-resolving support since
		this relies on the <c>juneau-svl</c> package.
	<li>
		The <c>RemoteInterfaceServlet</c> class has been renamed to {@link org.apache.juneau.rest.remote.RrpcServlet}.
	<li>
		<c><ja>@RestMethod</ja>(name=<js>"PROXY"</js>)</c> has been changed to <c><ja>@RestMethod</ja>(name=<js>"RRPC"</js>)</c>.
</ul>

<h5 class='topic w800'>juneau-rest-client</h5>
<ul class='spaced-list'>
	<li>
		The <c>RestClient.getRemoteInterface()</c> method has been renamed to {@link org.apache.juneau.rest.client.RestClient#getRrpcInterface(Class)}.
	<li>
		Fixed a bug where <c><ja>@RemoteMethod</ja>(path)</c> values containing '/' characters were erroneously being encoded.
</ul>
</div><!-- END: 7.2.1 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#7.2.2' id='7.2.2'>7.2.2 (Nov 7, 2018)</a></h3>
<div class='topic'><!-- START: 7.2.2 -->
<p>
	This release contains minor bug fixes and general improvements to the PetStore sample application.
</p>
</div><!-- END: 7.2.2 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#8.0.0' id='8.0.0'>8.0.0 (Jan 01, 2019)</a></h3>
<div class='topic'><!-- START: 8.0.0 -->
<p>
	This release cleans up deprecated APIs from the 7.2.0 release and makes significant modifications
	to the Microservice APIs.
</p>

<p>
	The project structures of the REST, Microservice, and Examples have been modified to fit new Spring Boot
	integration support.
	The structure is now as follows:
</p>
<ul>
	<li><c>juneau-rest</c>
	<ul>
		<li><c>juneau-rest-client</c>
		<li><c>juneau-rest-server</c>
		<li><c>juneau-rest-server-jaxrs</c>
		<li><c>juneau-rest-server-rdf</c>
		<li><b><c>juneau-rest-server-springboot</c></b> - New Spring Boot integration support classes. 
	</ul>
	<li><c>juneau-microservice</c>
	<ul>
		<li><b><c>juneau-microservice-core</c></b> - New.  Contains base {@link org.apache.juneau.microservice.Microservice} class.
		<li><b><c>juneau-microservice-jetty</c></b> - New.  Contains new {@link org.apache.juneau.microservice.jetty.JettyMicroservice} class.
		<li><b><c>juneau-my-jetty-microservice</c></b> - New.  Template starter project for Jetty-based microservices.
		<li><b><c>juneau-my-springboot-microservice</c></b> - New.  Template starter project for Spring-Boot-based microservices.
	</ul>
	<li><c>juneau-examples</c>
	<ul>
		<li><c>juneau-core</c>
		<li><b><c>juneau-microservice-rest</c></b> - Now contains only servlet example classes.  No Jetty configuration.
		<li><b><c>juneau-microservice-rest-jetty</c></b> - Servlet examples deployed using Jetty.
		<li><b><c>juneau-microservice-rest-springboot</c></b> - Servlet examples deployed using Spring Boot.
	</ul>
</ul>

<h5 class='topic w800'>juneau-svl</h5>
<ul class='spaced-list'>
	<li>
		New SVL variables:
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.svl.vars.SubstringVar}
			<li class='jc'>{@link org.apache.juneau.svl.vars.PatternExtractVar}
			<li class='jc'>{@link org.apache.juneau.svl.vars.PatternReplaceVar}
			<li class='jc'>{@link org.apache.juneau.svl.vars.LenVar}
		</ul>
</ul>

<h5 class='topic w800'>juneau-config</h5>
<ul class='spaced-list'>
	<li>
		New methods for setting a system default configuration:
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.config.Config}
			<ul>
				<li class='jm'>{@link org.apache.juneau.config.Config#getSystemDefault() getSystemDefault()}
				<li class='jm'>{@link org.apache.juneau.config.Config#setSystemDefault(Config) setSystemDefault(Config)}
			</ul>
		</ul>
	<li>
		New classpath store.
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.config.store.ConfigClasspathStore}
		</ul>
	<li>
		New API method:
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.config.store.ConfigStore}
			<ul>
				<li class='jm'>{@link org.apache.juneau.config.store.ConfigStore#exists(String) exists(String)}
			</ul>
		</ul>
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		New methods on {@link org.apache.juneau.rest.RestServlet}:
		<ul class='javatree'>
			<li class='jm'>{@link org.apache.juneau.rest.RestServlet#setRestResourceResolver(RestResourceResolver) setRestResourceResolver(RestResourceResolver)}
			<li class='jm'>{@link org.apache.juneau.rest.RestServlet#getPath() getPath()}
		</ul>
	<li>
		The registered resource resolver is now used to instantiate objects of classes defined via <dc>@RestResource</dc>.
		<br>This allows for any of those instance to be injectable beans.
</ul>

<h5 class='topic w800'>juneau-rest-server-springboot</h5>
<ul class='spaced-list'>
	<li>
		New project containing classes for making it easy to use Juneau with Spring Boot.
</ul>

<h5 class='topic w800'>juneau-microservice-core</h5>
<ul class='spaced-list'>
	<li>
		New project that consist of just the core {@link org.apache.juneau.microservice.Microservice} class and console support.
	<li>
		The Microservice API has been revamped to use a builder-based approach to creating microservices.
		<br>The new API is considerably more flexible in design and allows for the configuration and external
		files to be located in either the home directory or inside the jar classpath.
	<li>
		If the microservice cannot find a config file in the home directory with the same name as the jar and
		the <js>"juneau.configFile"</js> system property is not found, it will try to find any file in the home
		directory that ends with <js>".cfg"</js>.
	<li>
		New {@link org.apache.juneau.microservice.MicroserviceListener} API for defining lifecycle event listeners.
	<li>
		New {@link org.apache.juneau.microservice.console.ConfigCommand} class for performing config queries and updates through 
		the microservice console.
</ul>

<h5 class='topic w800'>juneau-microservice-jetty</h5>
<ul class='spaced-list'>
	<li>
		New {@link org.apache.juneau.microservice.jetty.JettyMicroservice} class replaces the previous <c>RestMicroservice</c>.
</ul>

<h5 class='topic w800'>juneau-my-jetty-microservice</h5>
<ul class='spaced-list'>
	<li>
		New template starter project for Jetty-based microservices.
</ul>

<h5 class='topic w800'>juneau-my-springboot-microservice</h5>
<ul class='spaced-list'>
	<li>
		Template starter project for Spring-Boot-based microservices.
	<li>
		<c>app.json</c> and <c>Procfile</c> files for deploying examples into Heroku.
		<br>Includes instructions.
</ul>
</div><!-- END: 8.0.0 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#8.1.0' id='8.1.0'>8.1.0 (Aug 21, 2019)</a></h3>
<div class='topic'><!-- START: 8.1.0 -->
<p>
	8.1.0 introduces some significant new features including:
</p>
<ul class='spaced-list'>
	<li>
		<a href='#juneau-marshall.ConfigurableAnnotations'>Configurable Annotations</a>
	<li>
		<a href='#juneau-marshall.Transforms.DefaultPojoSwaps'>Default PojoSwaps</a>
	<li>
		<a href='#juneau-config.Imports'>Config Imports</a>
	<li>
		<a href='#juneau-rest-server.Instantiation.BasicRest'>BasicRest</a>, <a href='#juneau-rest-server.Instantiation.BasicRestGroup'>BasicRestGroup</a> classes
	<li>
		<a href='#juneau-rest-server.Rest.RestPath'>Path variables on resource paths</a>
	<li>
		<a href='#juneau-rest-server.RestMethod.RequestAttributes'>Request Attributes API</a>
	<li>
		<a href='#juneau-rest-server.RoleGuards'>Role Guards</a>
	<li>
		<a href='#juneau-rest-server.LoggingAndDebugging'>Improved REST logging/debugging</a>
	<li>
		<a href='#juneau-rest-mock'>New MockRest API</a>
</ul>

<h5 class='topic w800'>juneau-marshall</h5>
<ul class='spaced-list'>
	<li>
		New utility class for diffing beans: 
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.utils.BeanDiff}
		</ul>
	<li>
		New annotation for defining bean property names: 
		<ul class='javatree'>
			<li class='ja'>{@link org.apache.juneau.annotation.Name}
		</ul>
	<li>
		New serializer properties:
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.serializer.WriterSerializer}
			<ul>
				<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_fileCharset WSERIALIZER_fileCharset}
				<li class='jf'>{@link org.apache.juneau.serializer.WriterSerializer#WSERIALIZER_streamCharset WSERIALIZER_streamCharset}
			</ul>
		</ul>
	<li>
		The following POJO methods can be used to convert a POJO to/from a Map before serialization and after parsing.
		<br>It's a convenient way of defining a POJO transform.
		<ul class='javatree'>
			<li class='jm'><c><jk>public</jk> Map toMap()</c> -  Can be any type of map with string keys and object vals. 
			<li class='jm'><c><jk>public</jk> ObjectMap toMap()</c>
			<li class='jm'><c><jk>public</jk> Map toMap(BeanSession bs)</c> -  Can be any type of map with string keys and object vals. 
			<li class='jm'><c><jk>public</jk> ObjectMap toMap(BeanSession bs)</c>
			<li class='jm'><c><jk>public static</jk> T fromMap(Map m)</c> -  Can be any type of map with string keys and object vals. 
			<li class='jm'><c><jk>public static</jk> T fromMap(ObjectMap m)</c>
			<li class='jm'><c><jk>public static</jk> T fromMap(BeanSession bs, Map m)</c> -  Can be any type of map with string keys and object vals. 
			<li class='jm'><c><jk>public static</jk> T fromMap(BeanSession bs, ObjectMap m)</c>
		</ul>
	<li>
		New convenience debugging methods on Marshall API:
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.marshall.Marshall}
			<ul>
				<li class='jm'>{@link org.apache.juneau.marshall.Marshall#format(String,Object...) format(String,Object...)} - <c>MessageFormat</c>-style formatter.
				<li class='jm'>{@link org.apache.juneau.marshall.Marshall#out(String,Object...) out(String,Object...)} - Prints <c>MessageFormat</c>-style messages to STDOUT.
				<li class='jm'>{@link org.apache.juneau.marshall.Marshall#err(String,Object...) err(String,Object...)} - Prints <c>MessageFormat</c>-style messages to STDERR.
			</ul>
		</ul>
	<li>
		Serializer and parser APIs now throw <c>IOExceptions</c> in addition to <c>SerializeException</c> and <c>ParseException</c> to make it
		easier to determine if problems are stream based or syntax based.
	<li>
		New Java 8 date-time transforms:
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.transforms.TemporalSwap} - For all Java 8 temporal types (e.g. {@link java.time.ZonedDateTime})
			<li class='jc'>{@link org.apache.juneau.transforms.TemporalDateSwap} - For {@link java.util.Date}
			<li class='jc'>{@link org.apache.juneau.transforms.TemporalCalendarSwap} - For {@link java.util.Calendar}
		</ul>
	<li>
		All serializers and parsers now have built-in default swaps for common class types:
		<ul class='javatree'>
			<li class='jc'>{@link java.util.Enumeration}
			<li class='jc'>{@link java.util.Iterator}
			<li class='jc'>{@link java.util.Locale}
			<li class='jc'>{@link java.util.Calendar} - ISO offset date-time.
			<li class='jc'>{@link java.util.Date} - Local date-time
			<li class='jc'>{@link java.time.Instant} - ISO instant.
			<li class='jc'>{@link java.time.ZonedDateTime} - ISO offset date-time.
			<li class='jc'>{@link java.time.LocalDate} - ISO local date.
			<li class='jc'>{@link java.time.LocalDateTime} - ISO local date-time.
			<li class='jc'>{@link java.time.LocalTime} - ISO local time.
			<li class='jc'>{@link java.time.OffsetDateTime} - ISO offset date-time.
			<li class='jc'>{@link java.time.OffsetTime} - ISO offset time.
			<li class='jc'>{@link java.time.Year} - ISO year.
			<li class='jc'>{@link java.time.YearMonth} - ISO year-month.
			<li class='jc'>{@link java.time.Temporal} - ISO instant.
			<li class='jc'>{@link java.util.TimeZone}
			<li class='jc'>{@link javax.xml.datatype.XMLGregorianCalendar}
			<li class='jc'>{@link java.time.ZoneId}
		</ul>
</ul>

<h5 class='topic w800'>juneau-config</h5>
<ul class='spaced-list'>
	<li>
		Support for import statements:
		<p class='bcode'>
	<cc># Import values from another configuration:</cc>
	<ci>&lt;ParentConfig1&gt;</ci>
	
	<cs>[Foo]</cs>
	<ck>bar</ck> = <cv>baz</cv>
		</p>
	<li>
		The {@link org.apache.juneau.config.store.ConfigFileStore} now automatically resolves file extensions.
		<br>New configuration property for specifying search paths for file extensions:
		<ul class='javatree'>
			<li class='jf'>{@link org.apache.juneau.config.store.ConfigFileStore#FILESTORE_extensions}
		</ul>
	<li>
		Fixed a bug where instances of {@link org.apache.juneau.config.store.ConfigMemoryStore} ended up resolving to the same object.
	<li>
		Uses <js>"application.properties"</js> file as a system default if present.
		<br>Useful when being used in a Spring Boot application.
	<li>
		New {@link org.apache.juneau.config.Config#setSystemProperties} method for quickly moving configuration settings into the 
		system properties.
	<li>
		Entries in the system config are automatically set as system properties.
		<br>This mean you can set any of the various serializer and parser settings (e.g. <js>"JsonSerializer.simpleMode.b"</js>)
		in the default configuration area or <c>application.properties</c>.
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		New annotations that can be applied to REST classes and methods to configure serializers and parsers.
		<p class='bcode w800'>
	<jc>// Old way using generic properties.</jc>
	<ja>@RestResource</ja>(
		path=<js>"/atom"</js>,
		title=<js>"Sample ATOM feed resource"</js>,
		properties={
			<ja>@Property</ja>(name=<jsf>WSERIALIZER_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>),
			<ja>@Property</ja>(name=<jsf>BEAN_examples</jsf>, value=<js>"{'org.apache.juneau.dto.atom.Feed': $F{AtomFeedResource_example.json}}"</js>)
		}
		...
	)
	<jk>public class</jk> AtomFeedResource <jk>extends</jk> BasicRestServletJena {
		...
	}
		</p>
		<p class='bcode w800'>
	<jc>// New way using specific annotations.</jc>
	<ja>@RestResource</ja>(
		path=<js>"/atom"</js>,
		title=<js>"Sample ATOM feed resource"</js>
		...
	)
	<ja>@SerializerConfig</ja>(quoteChar=<js>"'"</js>)
	<ja>@RdfConfig</ja>(rdfxml_tab=<js>"5"</js>, addRootProperty=<js>"true"</js>)
	<ja>@BeanConfig</ja>(examples=<js>"Feed: $F{AtomFeedResource_example.json}"</js>)
	<jk>public class</jk> AtomFeedResource <jk>extends</jk> BasicRestServletJena {
		...
	}
		</p>
		<p>
			Config annotations are provided for all serializers and parsers:
		</p>
		<ul class='javatree'>
			<li class='ja'>{@link org.apache.juneau.annotation.BeanConfig BeanConfig}
			<li class='ja'>{@link org.apache.juneau.csv.annotation.CsvConfig CsvConfig}
			<li class='ja'>{@link org.apache.juneau.html.annotation.HtmlConfig HtmlConfig}
			<li class='ja'>{@link org.apache.juneau.html.annotation.HtmlDocConfig HtmlDocConfig}
			<li class='ja'>{@link org.apache.juneau.jso.annotation.JsoConfig JsoConfig}
			<li class='ja'>{@link org.apache.juneau.json.annotation.JsonConfig JsonConfig}
			<li class='ja'>{@link org.apache.juneau.jsonschema.annotation.JsonSchemaConfig JsonSchemaConfig}
			<li class='ja'>{@link org.apache.juneau.msgpack.annotation.MsgPackConfig MsgPackConfig}
			<li class='ja'>{@link org.apache.juneau.oapi.annotation.OpenApiConfig OpenApiConfig}
			<li class='ja'>{@link org.apache.juneau.parser.annotation.ParserConfig ParserConfig}
			<li class='ja'>{@link org.apache.juneau.plaintext.annotation.PlainTextConfig PlainTextConfig}
			<li class='ja'>{@link org.apache.juneau.jena.annotation.RdfConfig RdfConfig}
			<li class='ja'>{@link org.apache.juneau.serializer.annotation.SerializerConfig SerializerConfig}
			<li class='ja'>{@link org.apache.juneau.soap.annotation.SoapXmlConfig SoapXmlConfig}
			<li class='ja'>{@link org.apache.juneau.uon.annotation.UonConfig UonConfig}
			<li class='ja'>{@link org.apache.juneau.urlencoding.annotation.UrlEncodingConfig UrlEncodingConfig}
			<li class='ja'>{@link org.apache.juneau.xml.annotation.XmlConfig XmlConfig}
		</ul>
	<li>
		New support for using Servlet request attributes.  
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.rest.RequestAttributes}
			<li class='jc'>{@link org.apache.juneau.rest.RestContext}
			<ul>
				<li class='jf'><dc>REST_attrs</dc>
			</ul>
			<li class='jc'>{@link org.apache.juneau.rest.RestContextBuilder}
			<ul>
				<li class='jm'><dc>attrs(String...)</dc>
				<li class='jm'><dc>attr(String,Object)</dc>
			</ul>
			<li class='jc'>{@link org.apache.juneau.rest.RestMethodContext}
			<ul>
				<li class='jf'>{@link org.apache.juneau.rest.RestMethodContext#RESTMETHOD_attrs RESTMETHOD_attrs}
			</ul>
			<li class='jc'>{@link org.apache.juneau.rest.RestRequest}
			<ul>
				<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getAttributes() getAttributes()}
			</ul>
			<li class='jc'>{@link org.apache.juneau.rest.RestResponse}
			<ul>
				<li class='jm'>{@link org.apache.juneau.rest.RestResponse#getAttributes() getAttributes()}
				<li class='jm'>{@link org.apache.juneau.rest.RestResponse#attr(String,Object) attr(String,Object)}
			</ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.Attr}
			<li class='ja'><dc>RestMethod#attrs()</dc>
			<li class='ja'><dc>RestResource.attrs()</dc>
		</ul>
		<br>This deprecates the following APIs:
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.rest.RequestProperties}
			<li class='jc'>{@link org.apache.juneau.rest.RestMethodProperties}
			<li class='jc'>{@link org.apache.juneau.rest.RestRequest}
			<ul>
				<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getProperties() getProperties()}
				<li class='jm'>{@link org.apache.juneau.rest.RestRequest#prop(String,Object) prop(String,Object)}
			</ul>
		</ul>
	<li>
		Added the following classes that provide the same support as the servlet classes but doesn't extend from <c>HttpServlet</c>.
		<br>This fixes an issue where instances of {@link org.apache.juneau.rest.BasicRestServlet} are registered as top-level servlets even though
		you don't want them to be.  
		<ul class='javatree'>
			<li class='jac'>{@link org.apache.juneau.rest.BasicRest} - Non-servlet equivalent to {@link org.apache.juneau.rest.BasicRestServlet}
			<li class='jac'>{@link org.apache.juneau.rest.BasicRestGroup} - Non-servlet equivalent to {@link org.apache.juneau.rest.BasicRestServletGroup}
			<li class='jac'>{@link org.apache.juneau.rest.BasicRestJena} - Non-servlet equivalent to {@link org.apache.juneau.rest.BasicRestServletJena}
			<li class='jac'>{@link org.apache.juneau.rest.BasicRestJenaGroup} - Non-servlet equivalent to {@link org.apache.juneau.rest.BasicRestServletJenaGroup}
		</ul>
	<li>
		HTML widgets now have access to the <c>RestResponse</c> object if they need access to the output bean.
	<li>
		New annotations for simplified role-based guards on classes and methods:
		<ul class='javatree'>
			<li class='ja'><dc>RestResource</dc> 
			<ul>
				<li class='jm'><dc>roleGuard()</dc>
				<li class='jm'><dc>rolesDeclared()</dc>
			</ul>
			<li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod} 
			<ul>
				<li class='jm'>{@link org.apache.juneau.rest.annotation.RestMethod#roleGuard roleGuard()}
				<li class='jm'>{@link org.apache.juneau.rest.annotation.RestMethod#rolesDeclared rolesDeclared()}
			</ul>
		</ul>
	<li>
		New annotations for fine-tuned handling of http-methods/http-headers as query parameters and others:
		<ul class='javatree'>
			<li class='ja'><dc>RestResource</dc> 
			<ul>
				<li class='jm'><dc>allowedHeaderParams()</dc>
				<li class='jm'><dc>allowedMethodHeaders()}</dc>
				<li class='jm'><dc>allowedMethodParams()</dc>
			</ul>
		</ul>
	<li>
		The <dc>@RestResource(path)</dc> annotation can now use variables:
		<p class='bcode'>
	<ja>@RestResource</ja>(
		path=<js>"/myResource/{foo}/{bar}"</js>
	)
	<jk>public class</jk> MyResource <jk>extends</jk> BasicRestServlet {...}
		</p>		
	<li>
		New methods:
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.rest.RestRequest}
			<ul>
				<li class='jm'>{@link org.apache.juneau.rest.RestRequest#getCharset() getCharset()}
			</ul>
			<li class='jc'>{@link org.apache.juneau.rest.RestResponse}
			<ul>
				<li class='jm'>{@link org.apache.juneau.rest.RestResponse#getCharset() getCharset()}
			</ul>
		</ul>
	<li>
		New interface method for catching arbitrary thrown objects and converting them to other throwables.
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.rest.RestCallHandler}
			<ul>
				<li class='jm'>{@link org.apache.juneau.rest.RestCallHandler#convertThrowable(Throwable) convertThrowable(Throwable)}
			</ul>
			<li class='jc'>{@link org.apache.juneau.rest.BasicRestCallHandler}
			<ul>
				<li class='jm'>{@link org.apache.juneau.rest.BasicRestCallHandler#convertThrowable(Throwable) convertThrowable(Throwable)}
			</ul>
		</ul>
	<li>
		Support for fine-tuned logging of HTTP requests and responses. 
		<p class='bcode'>
	<ja>@RestResource</ja>(
		debug=<js>"per-request"</js>,
		logging=<ja>@Logging</ja>(
			level=<js>"info"</js>,
			rules={
				<ja>@LoggingRule</ja>(codes<js>"400-499"</js>, level=<js>"warning"</js>, req=<js>"short"</js>, res=<js>"short"</js>)
				<ja>@LoggingRule</ja>(codes<js>"500-"</js>, level=<js>"severe"</js>, req=<js>"long"</js>, res=<js>"long"</js>)
			}
		)
	)
	<jk>public class</jk> MyRest {

		<ja>@RestMethod</ja>(
			method=<js>"POST"</js>, 
			path=<js>"foo"</js>
			logging=<ja>@Logging</ja>(
				level=<js>"info"</js>,
				rules={
					<ja>@LoggingRule</ja>(exceptions<js>"NotFound*"</js>, level=<js>"info"</js>)
					<ja>@LoggingRule</ja>(codes<js>"200"</js>, disabled=<js>"true"</js>)
				}
			)
		)
		<jk>public</jk> String myMethod() <jk>throws</jk> Exception {...}
		</p>		
		See {@doc juneau-rest-server.LoggingAndDebugging} for details.
	<li>
		Fixed a bug where the HTTP response was returning 405 (method not found) but should really be 404 (not found)
		when no path patterns match on any of the Java methods.
</ul>

<h5 class='topic w800'>juneau-rest-client</h5>
<ul class='spaced-list'>
	<li>
		PATCH support added.
</ul>
</div><!-- END: 8.1.0 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#8.1.1' id='8.1.1'>8.1.1 (Sept 20, 2019)</a></h3>
<div class='topic'><!-- START: 8.1.1 -->
<p>
	Juneau 8.1.1 is a minor release but introduces some new features/modifications.
</p>

<h5 class='topic w800'>juneau-marshall</h5>
<ul class='spaced-list'>
	<li>
		Support for serializing/parsing {@link java.util.Optional} objects and bean properties.
	<li>
		Fixed a bug in the parsers where the generic subtype of a complex bean property type involving both collections and arrays
		was not being found.  (e.g. <c>List&lt;Long&gt;[]</c>)
	<li>
		New packages of HTTP response/exceptions beans from <c>juneau-rest-server</c> bundle and REST proxy annotations from <c>juneau-rest-client</c> 
		so that they can be used when building REST proxy interfaces while only pulling in the marshall bundle.
		<ul>
			<li class='jp'>{@link org.apache.juneau.http.response}
			<li class='jp'>{@link org.apache.juneau.http.exception}
			<li class='jp'>{@link org.apache.juneau.http.remote}
		</ul>
		These replace the <c>org.apache.juneau.rest.response</c>, <c>org.apache.juneau.rest.exception</c>, and <c>org.apache.juneau.rest.client.remote</c> packages.
	<li>
		Defaulting SVL variables now won't ignore additional parameters.
		<br><js>"$S{Foo,bar,baz}"</js> used to default to <js>"bar"</js> but now will default to <js>"bar,baz"</js>.
	<li>
		Ranking support has been added to all <ja>@XConfig</ja> annotations.
		This allows you to override the normal precedence of application of config annotations on class and method hierarchies.
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		Support for {@link java.util.Optional} on method parameters annotated with {@link org.apache.juneau.http.annotation.Header}, {@link org.apache.juneau.http.annotation.FormData},  
		{@link org.apache.juneau.http.annotation.Query}, {@link org.apache.juneau.http.annotation.Path}.
	<li>
		Fixed issue where {@link org.apache.juneau.rest.annotation.RestMethod#debug() RestMethod.debug()} annotation wasn't resulting
		in the HTTP request being logged.
	<li>
		{@link org.apache.juneau.rest.RestException} has been deprecated and replaced by {@link org.apache.juneau.http.exception.HttpException}.
	<li>
		Resolved issue where parameterized types on <ja>@RestMethod</ja>-annotated method parameters of Spring beans.
		This is due to Spring relying on CGLIB for runtime-recompilation of beans that results in loss of parameterized-type
		information.  
		<br>In the following example, the <c>beans</c> parameter would resolve as an unparameterized <c>List</c>
		which would typically result in getting a <c>List&lt;ObjectMap&gt;<c> and subsequent <c>ClassCastExceptions</c>.   
		<p class='bcode w800'>
	<ja>@RestMethod</ja>
	<jk>public void</jk> doFoo(<ja>@Body</ja> List&lt;MyBean&gt; beans) {...}
		</p>
		The fix involves resolving the original bean class for resolving parameterized type while leaving
		method invocation on the proxy method so as not to bypass Spring features.
	<li>
		New methods on {@link org.apache.juneau.rest.BasicRest} to provide feature-parity with {@link org.apache.juneau.rest.RestServlet}:
		<ul class='javatree'>
			<li class='jc'>{@link org.apache.juneau.rest.BasicRest}
			<ul>
				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#getContext() getContext()}
				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#getRequest() getRequest()}
				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#getResponse() getResponse()}
				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#log(String) log(String)}
				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#log(String,Throwable) log(String,Throwable)}
				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#log(Level,String,Object[]) log(Level,String,Object[])}
				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#logObjects(Level,String,Object[]) logObjects(Level,String,Object[])}
				<li class='jm'>{@link org.apache.juneau.rest.BasicRest#log(Level,Throwable,String,Object[]) log(Level,Throwable,String,Object[])}
			</ul>
		</ul>
	<li>
		The <dc>@RestResource(staticFiles)</dc> annotation now supports absolute path locations and multiple mappings:
		<p class='bcode w800'>
	<jc>// Resolves static files in root package "htdocs" or working directory "htdocs", and then relative package "htdocs".</jc>
	<ja>@RestResource</ja>(staticFiles=<js>"htdocs:/htdocsfolder,htdocs:htdocs.package"</js>)
		</p>
	<li>
		Fixed a bug in <dc>@RestResource(staticFiles)</dc> where the order of lookup between parent and child resources
		was wrong.
</ul>

<h5 class='topic w800'>juneau-rest-client</h5>
<ul class='spaced-list'>
	<li>
		Removed the dependency on the <c>juneau-rest-server</c> module.  
		Allows the client API to be used without pulling in all the javax.servlet and server dependencies.
</ul>

<h5 class='topic w800'>juneau-examples</h5>
<ul class='spaced-list'>
	<li>
		The PetStore application has been moved to a separate Git repository.
		<ul>
			<li><a class='doclink' href='https://github.com/apache/juneau-petstore'>GitHub Repo</a>
			<li><a class='doclink' href='http://juneau.apache.org/index.html#petstore.html'>Documentation</a>
		</ul>
</ul>
</div><!-- END: 8.1.1 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#8.1.2' id='8.1.2'>8.1.2 (Dec 01, 2019)</a></h3>
<div class='topic'><!-- START: 8.1.2 -->
<p>
	Juneau 8.1.2 is a moderate release.
</p>

<h5 class='topic w800'>juneau-marshall</h5>
<ul class='spaced-list'>
	<li>
		Support for read-only and write-only properties.
		<ul>
			<li class='ja'>{@link org.apache.juneau.annotation.Bean#bpro()}
			<li class='ja'>{@link org.apache.juneau.annotation.Bean#bpwo()}
			<li class='ja'>{@link org.apache.juneau.annotation.Beanp#ro()}
			<li class='ja'>{@link org.apache.juneau.annotation.Beanp#wo()}
			<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_bpro}
			<li class='jf'>{@link org.apache.juneau.BeanContext#BEAN_bpwo}
			<li class='jm'>{@link org.apache.juneau.BeanContextBuilder#bpro(Map)}
			<li class='jm'>{@link org.apache.juneau.BeanContextBuilder#bpwo(Map)}
		</ul>
	<li>
		New convenience methods:
		<ul>	
			<li class='jm'>{@link org.apache.juneau.ObjectMap#parse(CharSequence)}
			<li class='jm'>{@link org.apache.juneau.ObjectList#parse(CharSequence)}
		</ul>
	<li>
		{@link org.apache.juneau.marshall.CharMarshall} and {@link org.apache.juneau.marshall.StreamMarshall} now have public constructors.
	<li>
		{@link org.apache.juneau.annotation.Beanp @Beanp} replaces {@link org.apache.juneau.annotation.BeanProperty @BeanProperty}.
	<li>
		{@link org.apache.juneau.annotation.Beanc @Beanc} replaces {@link org.apache.juneau.annotation.BeanConstructor @BeanConstructor}.
	<li>
		{@link org.apache.juneau.http.remote.Remote @Remote} replaces {@link org.apache.juneau.http.remote.RemoteResource @RemoteResource}.
	<li>
		Shortened names for {@link org.apache.juneau.annotation.Bean#dictionary @Bean(dictionary)} and {@link org.apache.juneau.BeanContextBuilder#dictionary(Class...)}.
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		{@link org.apache.juneau.rest.annotation.Rest @Rest} replaces {@link org.apache.juneau.rest.annotation.RestResource @RestResource} with shorter syntax.
	<li>
		New method {@link org.apache.juneau.rest.RestResponse#setHeaderSafe(String,String)} to strip invalid characters from header values.
	<li>
		Fixed issues related to invalid characters being set on HTTP header values.
</ul>

<h5 class='topic w800'>juneau-rest-client</h5>
<ul class='spaced-list'>
	<li>
		{@link org.apache.juneau.rest.client.RestClient} is now extendible.  The constructor has been made public and simplified to:
		{@link org.apache.juneau.rest.client.RestClient#RestClient(RestClientBuilder)}.
	<li>
		Duplicate methods between {@link org.apache.juneau.rest.client.RestClientBuilder} and {@link org.apache.http.impl.client.HttpClientBuilder}
		have been made deprecated on the former.  This eliminates the need to try to keep the two builder classes in
		sync.
</ul>
</div><!-- END: 8.1.2 -->

<!-- ==================================================================================================== -->

<h3 class='topic' onclick='toggle(this)'><a href='#8.1.3' id='8.1.3'>8.1.3 (TBD)</a></h3>
<div class='topic'><!-- START: 8.1.3 -->
<p>
	Juneau 8.1.3 is a moderate release.
</p>

<h5 class='topic w800'>juneau-marshall</h5>
<ul class='spaced-list'>
	<li>
		Dynamically applied annotations: {@doc juneau-marshall.DynamicallyAppliedAnnotations}
	<li>
		Better representation of nulls for XML and HTML content properties.
		<br>Old:  <js>"&lt;myBean&gt;&lt;null&gt;&lt;/myBean&gt;"</js>
		<br>New:  <js>"&lt;myBean nil='true'&gt;&lt;/myBean&gt;"</js>
	<li>
		Configurable properties such as {@link org.apache.juneau.BeanContext#BEAN_debug} can now be set globally by either
		system properties or environment variables.
		<br>For <jsf>BEAN_debug</jsf> you can use either the system
		property <js>"BeanContext.debug"</js> or environment variables <js>"BEANCONTEXT_DEBUG"</js>.
	<li>
		Fixed an initialization time race condition that can cause initial parse errors when concurrently parsing into
		array types like so: 
		<p class='bcode w800'>
	JsonParser.<jsf>DEFAULT</jsf>.parse(input, MyBean[].<jk>class</jk>);
		</p>
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li> 
		Fixed bug in {@link org.apache.juneau.rest.BasicRestCallHandler} where if you have the following REST methods...
		<p class='bcode w800'>
	<ja>@RestMethod</ja>(name=<js>"GET"</js>, path=<js>"/foo"</js>)
	<ja>@RestMethod</ja>(name=<js>"*"</js>, path=<js>"/bar"</js>)
		</p>
		...and you tried to make a GET request to /bar, you'd erroneously get a 404 error instead of matching the 2nd method.
	<li> 
		Fixed an issue involving using Juneau REST with Spring Security.  When Spring Security cannot authenticate a 
		request, it sets the URL on the request to <js>"/error"</js> with a 401 status.  When Juneau then processes
		this request, it cannot find that mapping and changes the status to 404 which messes with HTTP clients.
		<br>Solution was to add a default no-op error method to the {@link org.apache.juneau.rest.BasicRestConfig} (and implementers):
		<p class='bcode w800'>
	<ja>@RestMethod</ja>(name=<js>"*"</js>, path=<js>"/error"</js>)
	<jk>public void</jk> error() {}
		</p>
	<li>
		Fixed a bug where <c><ja>@RestResource</ja>(debug=<js>"true"</js>)</c> wouldn't log requests if a 
		<ja>@RestMethod</ja>-annotated method was not matched.
	<li>
		Renamed the following annotations:
		<ul>
			<li><ja>@Rest(attrs)</ja> --&gt; {@link org.apache.juneau.rest.annotation.Rest#reqAttrs() @Rest(reqAttrs)}
			<li><ja>@Rest(defaultRequestHeaders)</ja> --&gt; {@link org.apache.juneau.rest.annotation.Rest#reqHeaders() @Rest(reqHeaders)}
			<li><ja>@Rest(defaultResponseHeaders)</ja> --&gt; {@link org.apache.juneau.rest.annotation.Rest#resHeaders() @Rest(resHeaders)}
			<li><ja>@RestMethod(attrs)</ja> --&gt; {@link org.apache.juneau.rest.annotation.RestMethod#reqAttrs() @RestMethod(reqAttrs)}
			<li><ja>@RestMethod(defaultRequestHeaders)</ja> --&gt; {@link org.apache.juneau.rest.annotation.RestMethod#reqHeaders() @RestMethod(reqHeaders)}
		</ul>
	<li>
		New auto-generated REST method execution statistics: {@doc juneau-rest-server.ExecutionStatistics}
</ul>

<h5 class='topic w800'>juneau-rest-client</h5>
<ul class='spaced-list'>
	<li>
		Several convenience methods defined in {@link org.apache.juneau.rest.client.RestClientBuilder} that were deprecated in 8.1.2 have been
		undeprecated in this release due to user feedback.
</ul>

<h5 class='topic w800'>juneau-doc</h5>
<ul class='spaced-list'>
	<li>
		New auto-generated glossary of all configurable properties: {@doc Glossaries.ConfigurablePropertiesGlossary}
</ul>
</div><!-- END: 8.1.3 -->

</div>
</body>								
