
<!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'>Configurable Properties</a><span class='update'>8.1.3-updated</span></p>
		<li><p><a class='doclink' href='#juneau-marshall.ConfigurableAnnotations'>Configurable Annotations</a><span class='update'>8.1.0-new, 8.1.3-updated</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'>8.1.3-new</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'>8.1.3-new</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'>8.1.3-new</span></p>
	<ol>
		<li><p><a class='doclink' href='#Glossaries.LanguageSupport'>Language Support</a><span class='update'>8.1.3-new</span></p>
		<li><p><a class='doclink' href='#Glossaries.Annotations'>Annotations</a><span class='update'>8.1.3-new</span></p>
		<li><p><a class='doclink' href='#Glossaries.ConfigurableProperties'>Configurable Properties</a><span class='update'>8.1.3-new</span></p>
	</ol>
	<li><p class='toc2'><a class='doclink' href='#juneau-petstore'>juneau-pestore</a><span class='update'><b>8.1.4-new</b></span></p>
	<ol>
		<li><p><a class='doclink' href='#juneau-petstore.Installing'>Installing in Eclipse</a><span class='update'><b>8.1.4-new</b></span></p>
		<li><p><a class='doclink' href='#juneau-petstore.Running'>Running in Eclipse</a><span class='update'><b>8.1.4-new</b></span></p>
		<li><p><a class='doclink' href='#juneau-petstore.Building'>Building and Running from Command-Line</a><span class='update'><b>8.1.4-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>

<ul class='seealso'>
	<li class='doclink'>{@doc Glossaries.LanguageSupport link} - Glossary of all supported languages.
</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>

<ul class='seealso'>
	<li class='doclink'>{@doc Glossaries.LanguageSupport link} - Glossary of all supported languages.
</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>

<ul class='seealso'>
	<li class='doclink'>{@doc Glossaries.LanguageSupport link} - Glossary of all supported languages.
</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 - Configurable Properties</a><span class='update'>8.1.3-updated</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>

<ul class='seealso'>
	<li class='doclink'>{@doc Glossaries.ConfigurableProperties link} - Glossary of all configurable properties.
</ul>
</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, 8.1.3-updated</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>

<ul class='seealso'>
	<li class='doclink'>{@doc Glossaries.Annotations link} - Glossary of all annotations.
</ul>
</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'>8.1.3-new</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'>8.1.3-new</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'>8.1.3-new</span></h2>
<div class='topic'><!-- START: 19 - Glossaries -->
<p>
</p>

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

<h3 class='topic' onclick='toggle(this)'><a href='#Glossaries.LanguageSupport' id='Glossaries.LanguageSupport'>19.1 - Language Support</a><span class='update'>8.1.3-new</span></h3>
<div class='topic'><!-- START: 19.1 - Glossaries.LanguageSupport -->
<h5 class='figure'>All serializers/parsers defined in Juneau</h5>
<table class='styled w1000'>
	<tr>
		<th>Language</th><th>Serializers</th><th>Parsers</th><th>Marshalls</th><th>Documentation</th>
	</tr>
	<tr>
		<td><c>text/csv</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.csv.CsvSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.csv.CsvParser}</ul></td>
		<td>&nbsp;</td>
		<td>&nbsp;</td>
	</tr>
	<tr>
		<td><c>text/html</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.html.HtmlSerializer}<li class='jc'>{@link org.apache.juneau.html.HtmlStrippedDocSerializer}<li class='jc'>{@link org.apache.juneau.html.HtmlDocSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.html.HtmlParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.Html}</ul></td>
		<td>{@doc juneau-marshall.HtmlDetails HTML Details}</td>
	</tr>
	<tr>
		<td><c>text/html+schema</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.html.HtmlSchemaSerializer}<li class='jc'>{@link org.apache.juneau.html.HtmlSchemaDocSerializer}</ul></td>
		<td>&nbsp;</td>
		<td>&nbsp;</td>
		<td>{@doc juneau-marshall.HtmlDetails HTML Details}</td>
	</tr>
	<tr>
		<td><c>application/x-java-serialized-object</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jso.JsoSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jso.JsoParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.Jso}</ul></td>
		<td>&nbsp;</td>
	</tr>
	<tr>
		<td><c>application/json</c><br><c>text/json</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.json.JsonSerializer}<li class='jc'>{@link org.apache.juneau.json.JsonSerializer.Readable}<li class='jc'>{@link org.apache.juneau.json.JsonSerializer.ReadableSafe}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.json.JsonParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.Json}</ul></td>
		<td>{@doc juneau-marshall.JsonDetails JSON Details}</td>
	</tr>
	<tr>
		<td><c>application/json+simple</c><br><c>text/json+simple</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.json.SimpleJsonSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.json.JsonParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.SimpleJson}</ul></td>
		<td>{@doc juneau-marshall.JsonDetails.SimplifiedJson Simplified JSON}</td>
	</tr>
	<tr>
		<td><c>application/json+schema</c><br><c>text/json+schema</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.json.JsonSchemaSerializer}</ul></td>
		<td>&nbsp;</td>
		<td>&nbsp;</td>
		<td>{@doc juneau-marshall.JsonDetails.JsonSchema JSON-Schema Support}</td>
	</tr>
	<tr>
		<td><c>octal/msgpack</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.msgpack.MsgPackSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.msgpack.MsgPackParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.MsgPack}</ul></td>
		<td>{@doc juneau-marshall.MsgPackDetails MessagePack Details}</td>
	</tr>
	<tr>
		<td><c>text/n3</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jena.N3Serializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jena.N3Parser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.N3}</ul></td>
		<td>{@doc juneau-marshall-rdf juneau-marshall-rdf}</td>
	</tr>
	<tr>
		<td><c>text/n-triple</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jena.NTripleSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jena.NTripleParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.NTriple}</ul></td>
		<td>{@doc juneau-marshall-rdf juneau-marshall-rdf}</td>
	</tr>
	<tr>
		<td><c>text/openapi</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.oapi.OpenApiSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.oapi.OpenApiParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.OpenApi}</ul></td>
		<td>{@doc juneau-marshall.OpenApiDetails OpenAPI Details}</td>
	</tr>
	<tr>
		<td><c>text/plain</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.plaintext.PlainTextSerializer}</ul></td>
		<td>&nbsp;</td>
		<td>&nbsp;</td>
		<td>&nbsp;</td>
	</tr>
	<tr>
		<td><c>text/xml+rdf<c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jena.RdfXmlSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jena.RdfXmlParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.RdfXml}</ul></td>
		<td>{@doc juneau-marshall-rdf juneau-marshall-rdf}</td>
	</tr>
	<tr>
		<td><c>text/xml+rdf+abbrev</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jena.RdfXmlAbbrevSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jena.RdfXmlParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.RdfXmlAbbrev}</ul></td>
		<td>{@doc juneau-marshall-rdf juneau-marshall-rdf}</td>
	</tr>
	<tr>
		<td><c>text/xml+soap</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.soap.SoapXmlSerializer}</ul></td>
		<td>&nbsp;</td>
		<td>&nbsp;</td>
		<td>&nbsp;</td>
	</tr>
	<tr>
		<td><c>text/turtle</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jena.TurtleSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jena.TurtleParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.Turtle}</ul></td>
		<td>{@doc juneau-marshall-rdf juneau-marshall-rdf}</td>
	</tr>
	<tr>
		<td><c>text/uon</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.uon.UonSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.uon.UonParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.Uon}</ul></td>
		<td>{@doc juneau-marshall.UonDetails UON Details}</td>
	</tr>
	<tr>
		<td><c>application/x-www-form-urlencoded</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.UrlEncoding}</ul></td>
		<td>{@doc juneau-marshall.UrlEncodingDetails URL-Encoding Details}</td>
	</tr>
	<tr>
		<td><c>text/xml</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.xml.XmlSerializer}<li class='jc'>{@link org.apache.juneau.xml.XmlDocSerializer}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.xml.XmlParser}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.marshall.Xml}</ul></td>
		<td>{@doc juneau-marshall.XmlDetails XML Details}</td>
	</tr>
	<tr>
		<td><c>text/xml+schema</c></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.xmlschema.XmlSchemaSerializer}<li class='jc'>{@link org.apache.juneau.xmlschema.XmlSchemaDocSerializer}</ul></td>
		<td>&nbsp;</td>
		<td>&nbsp;</td>
		<td>{@doc juneau-marshall.XmlDetails.XmlSchema XML-Schema Support}</td>
	</tr>
</table>
</div><!-- END: 19.1 - Glossaries.LanguageSupport -->

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

<h3 class='topic' onclick='toggle(this)'><a href='#Glossaries.Annotations' id='Glossaries.Annotations'>19.2 - Annotations</a><span class='update'>8.1.3-new</span></h3>
<div class='topic'><!-- START: 19.2 - Glossaries.Annotations -->
<h5 class='figure'>Serialization Annotations (used to modify how artifacts are marshalled)</h5>
<table class='styled w1000'>
	<tr>
		<th>Annotation</th><th>Description</th><th>Used On</th><th>Used By</th>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.Bean}</ul></td>
		<td><ul><li>Classes</ul></td>
		<td>All serializers and parsers</td>
		<td>Tailors how beans get marshalled.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.Beanc}</ul></td>
		<td><ul><li>Bean constructors</ul></td>
		<td>All serializers and parsers</td>
		<td>Identifies bean constructors and property args.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.BeanIgnore}</ul></td>
		<td><ul><li>Classes<li>Fields<li>Methods</ul></td>
		<td>All serializers and parsers</td>
		<td>Prevents artifacts from being interpreted as beans/bean components.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.Beanp}</ul></td>
		<td><ul><li>Methods<li>Fields<li>Constructor args</ul></td>
		<td>All serializers and parsers</td>
		<td>Tailors how bean properties get marshalled.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.Builder}</ul></td>
		<td><ul><li>Classes</ul></td>
		<td>All parsers</td>
		<td>Identifies a class as a builder for a POJO class.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.csv.annotation.Csv}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.csv.CsvSerializer}<li class='jc'>{@link org.apache.juneau.csv.CsvParser}</ul></td>
		<td>CSV-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.Example}</ul></td>
		<td><ul><li>Static methods<li>Static fields<li>Classes</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.json.JsonSchemaSerializer}</ul></td>
		<td>Identifies examples for POJOs.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.html.annotation.Html}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.html.HtmlSerializer}<li class='jc'>{@link org.apache.juneau.html.HtmlParser}</ul></td>
		<td>HTML-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.html.annotation.HtmlLink}</ul></td>
		<td><ul><li>Classes</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.html.HtmlSerializer}</ul></td>
		<td>Defines how to construct hyperlinks on objects.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.jso.annotation.Jso}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jso.JsoSerializer}<li class='jc'>{@link org.apache.juneau.jso.JsoParser}</ul></td>
		<td>JSO-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.json.annotation.Json}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.json.JsonSerializer}<li class='jc'>{@link org.apache.juneau.json.JsonParser}</ul></td>
		<td>JSON-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.msgpack.annotation.MsgPack}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.msgpack.MsgPackSerializer}<li class='jc'>{@link org.apache.juneau.msgpack.MsgPackParser}</ul></td>
		<td>MessagePack-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.Name}</ul></td>
		<td><ul><li>Constructor args</ul></td>
		<td>All parsers</td>
		<td>Maps constructor args to property names.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.NameProperty}</ul></td>
		<td><ul><li>Methods<li>Fields</ul></td>
		<td>All parsers</td>
		<td>Identifies a 'name' property.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.oapi.annotation.OpenApi}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.oapi.OpenApiSerializer}<li class='jc'>{@link org.apache.juneau.oapi.OpenApiParser}</ul></td>
		<td>OpenAPI-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.ParentProperty}</ul></td>
		<td><ul><li>Methods<li>Fields</ul></td>
		<td>All parsers</td>
		<td>Identifies a 'parent' property.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.plaintext.annotation.PlainText}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.plaintext.PlainTextSerializer}<li class='jc'>{@link org.apache.juneau.plaintext.PlainTextParser}</ul></td>
		<td>PlainText-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.jena.annotation.Rdf}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td>All RDF serializers and parsers</td>
		<td>RDF-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.jena.annotation.RdfSchema}</ul></td>
		<td><ul><li>Packages</ul></td>
		<td>All RDF serializers and parsers</td>
		<td>Identifies the default RDF namespaces at the package level.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.soap.annotation.SoapXml}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.soap.SoapXmlSerializer}</ul></td>
		<td>SOAP/XML-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.Swap}</ul></td>
		<td><ul><li>Classes<li>Bean getters/setters<li>Fields</ul></td>
		<td>All serializers and parsers</td>
		<td>Associates swaps and surrogates with POJOs and bean properties.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.Swaps}</ul></td>
		<td><ul><li>Classes</ul></td>
		<td>All serializers and parsers</td>
		<td>Associates multiple swaps with the same POJO class.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.uon.annotation.Uon}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.uon.UonSerializer}<li class='jc'>{@link org.apache.juneau.uon.UonParser}</ul></td>
		<td>UON-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.URI}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td>HTML and XML serializers</td>
		<td>Identifies a class or bean property as a URI.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.urlencoding.annotation.UrlEncoding}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer}<li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingParser}</ul></td>
		<td>URL-Encoding-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.xml.annotation.Xml}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.xml.XmlSerializer}<li class='jc'>{@link org.apache.juneau.xml.XmlParser}</ul></td>
		<td>XML-specific tweaks.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.xml.annotation.XmlSchema}</ul></td>
		<td><ul><li>Packages</ul></td>
		<td>XML serializers and parsers</td>
		<td>Identifies the default XML namespaces at the package level.</td>
	</tr>
</table>
<br><br>

<h5 class='figure'>Configuration Annotations (used to modify how serializers/parsers behave)</h5>
<table class='styled w800'>
	<tr>
		<th>Annotation</th><th>Configures</th>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.annotation.BeanConfig}</ul></td>
		<td>All serializers and parsers</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.csv.annotation.CsvConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.csv.CsvSerializer}<li class='jc'>{@link org.apache.juneau.csv.CsvParser}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.html.annotation.HtmlConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.html.HtmlSerializer}<li class='jc'>{@link org.apache.juneau.html.HtmlParser}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.html.annotation.HtmlDocConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.html.HtmlDocSerializer}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.jso.annotation.JsoConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.jso.JsoSerializer}<li class='jc'>{@link org.apache.juneau.jso.JsoParser}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.json.annotation.JsonConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.json.JsonSerializer}<li class='jc'>{@link org.apache.juneau.json.JsonParser}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.jsonschema.annotation.JsonSchemaConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.json.JsonSchemaSerializer}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.msgpack.annotation.MsgPackConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.msgpack.MsgPackSerializer}<li class='jc'>{@link org.apache.juneau.msgpack.MsgPackParser}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.oapi.annotation.OpenApiConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.oapi.OpenApiSerializer}<li class='jc'>{@link org.apache.juneau.oapi.OpenApiParser}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.parser.annotation.ParserConfig}</ul></td>
		<td>All parsers</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.plaintext.annotation.PlainTextConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.plaintext.PlainTextSerializer}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.jena.annotation.RdfConfig}</ul></td>
		<td>All RDF serializers and parsers</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.serializer.annotation.SerializerConfig}</ul></td>
		<td>All serializers</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.soap.annotation.SoapXmlConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.soap.SoapXmlSerializer}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.uon.annotation.UonConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.uon.UonSerializer}<li class='jc'>{@link org.apache.juneau.uon.UonParser}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.urlencoding.annotation.UrlEncodingConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingSerializer}<li class='jc'>{@link org.apache.juneau.urlencoding.UrlEncodingParser}</ul></td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.xml.annotation.XmlConfig}</ul></td>
		<td><ul><li class='jc'>{@link org.apache.juneau.xml.XmlSerializer}<li class='jc'>{@link org.apache.juneau.xml.XmlParser}</ul></td>
	</tr>
</table>
<br><br>

<h5 class='figure'>Common REST Annotations (used on both client-side and server-side)</h5>
<table class='styled w800'>
	<tr>
		<th>Annotation</th><th>Used On</th><th>Description</th>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.Body}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields<li>Parameters</ul></td>
		<td>HTTP request/response body.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.FormData}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields<li>Parameters</ul></td>
		<td>HTTP form data parameter.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.HasFormData}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields<li>Parameters</ul></td>
		<td>HTTP form data parameter is present.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.HasQuery}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields<li>Parameters</ul></td>
		<td>HTTP query parameter is present.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.Header}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields<li>Parameters</ul></td>
		<td>HTTP header.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.Path}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields<li>Parameters</ul></td>
		<td>HTTP path part.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.Query}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Fields<li>Parameters</ul></td>
		<td>HTTP query parameter.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.Request}</ul></td>
		<td><ul><li>Classes<li>Parameters</ul></td>
		<td>Identifies an interface to use to interact with HTTP parts of an HTTP request through a bean.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.Response}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Parameters</ul></td>
		<td>Identifies an interface to use to interact with HTTP parts of an HTTP response through a bean.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.ResponseBody}</ul></td>
		<td><ul><li>Methods</ul></td>
		<td>Denotes a method as an HTTP response body on a <ja>@Response</ja>-annotated bean.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.ResponseHeader}</ul></td>
		<td><ul><li>Classes<li>Methods<li>Parameters</ul></td>
		<td>Denotes a method as an HTTP response header on a <ja>@Response</ja>-annotated bean.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.http.annotation.ResponseStatus}</ul></td>
		<td><ul><li>Methods<li>Parameters</ul></td>
		<td>Denotes a method as an HTTP response status code on a <ja>@Response</ja>-annotated bean.</td>
	</tr>
</table>
<br><br>

<h5 class='figure'>REST Server-only Annotations</h5>
<table class='styled w800'>
	<tr>
		<th>Annotation</th><th>Used On</th><th>Description</th>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.rest.annotation.Attr}</ul></td>
		<td><ul><li>Parameters</ul></td>
		<td>Request attribute.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.rest.annotation.Rest}</ul></td>
		<td><ul><li>Classes</ul></td>
		<td>Identifies and configures REST resource classes.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.rest.annotation.RestHook}</ul></td>
		<td><ul><li>Methods</ul></td>
		<td>Identifies REST lifecycle hook methods.</td>
	</tr>
	<tr>
		<td><ul style='margin-left:20px'><li class='ja'>{@link org.apache.juneau.rest.annotation.RestMethod}</ul></td>
		<td><ul><li>Methods</ul></td>
		<td>Identifies and configures REST resource class methods.</td>
	</tr>
</table>
<br><br>
</div><!-- END: 19.2 - Glossaries.Annotations -->

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

<h3 class='topic' onclick='toggle(this)'><a href='#Glossaries.ConfigurableProperties' id='Glossaries.ConfigurableProperties'>19.3 - Configurable Properties</a><span class='update'>8.1.3-new</span></h3>
<div class='topic'><!-- START: 19.3 - Glossaries.ConfigurableProperties -->
<h5 class='figure'>All properties defined in Juneau</h5>
<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_callHandler RESTCLIENT_callHandler}</td>
		<td>REST call handler.</td>
		<td style='max-width:250px;overflow:hidden'>{@link RestCallHandler}</td>
	</tr>
	<tr>
		<td></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.3 - Glossaries.ConfigurableProperties -->
</div><!-- END: 19 - Glossaries -->

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

<h2 class='topic' onclick='toggle(this)'><a href='#juneau-petstore' id='juneau-petstore'>20 - juneau-pestore</a><span class='update'><b>8.1.4-new</b></span></h2>
<div class='topic'><!-- START: 20 - juneau-petstore -->
<p>
	TODO
</p>

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

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-petstore.Installing' id='juneau-petstore.Installing'>20.1 - Installing in Eclipse</a><span class='update'><b>8.1.4-new</b></span></h3>
<div class='topic'><!-- START: 20.1 - juneau-petstore.Installing -->
<p>
	TODO
</p>
</div><!-- END: 20.1 - juneau-petstore.Installing -->

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

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-petstore.Running' id='juneau-petstore.Running'>20.2 - Running in Eclipse</a><span class='update'><b>8.1.4-new</b></span></h3>
<div class='topic'><!-- START: 20.2 - juneau-petstore.Running -->
<p>
	TODO
</p>
</div><!-- END: 20.2 - juneau-petstore.Running -->

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

<h3 class='topic' onclick='toggle(this)'><a href='#juneau-petstore.Building' id='juneau-petstore.Building'>20.3 - Building and Running from Command-Line</a><span class='update'><b>8.1.4-new</b></span></h3>
<div class='topic'><!-- START: 20.3 - juneau-petstore.Building -->
<p>
	TODO
</p>
</div><!-- END: 20.3 - juneau-petstore.Building -->
</div><!-- END: 20 - juneau-petstore -->

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

<h2 class='topic' onclick='toggle(this)'><a href='#Security' id='Security'>21 - Security Best-Practices</a></h2>
<div class='topic'><!-- START: 21 - 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'>21.1 - juneau-marshall</a></h3>
<div class='topic'><!-- START: 21.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: 21.1 - Security.juneau-marshall -->

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

<h3 class='topic' onclick='toggle(this)'><a href='#Security.juneau-svl' id='Security.juneau-svl'>21.2 - juneau-svl</a></h3>
<div class='topic'><!-- START: 21.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: 21.2 - Security.juneau-svl -->

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

<h3 class='topic' onclick='toggle(this)'><a href='#Security.juneau-rest-server' id='Security.juneau-rest-server'>21.3 - juneau-rest-server</a></h3>
<div class='topic'><!-- START: 21.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: 21.3 - Security.juneau-rest-server -->
</div><!-- END: 21 - 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>
<li><p><a class='doclink' href='#8.1.4'>8.1.4 (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.ConfigurableProperties}
</ul>
</div><!-- END: 8.1.3 -->

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

<h3 class='topic' onclick='toggle(this)'><a href='#8.1.4' id='8.1.4'>8.1.4 (TBD)</a></h3>
<div class='topic'><!-- START: 8.1.4 -->
<p>
</p>

<h5 class='topic w800'>juneau-marshall</h5>
<ul class='spaced-list'>
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
</ul>

<h5 class='topic w800'>juneau-rest-server-springboot</h5>
<ul class='spaced-list'>
	<li>
		{@link org.apache.juneau.rest.springboot.JuneauRestInitializer} now provides a no-arg constructor so that it can be used in
		the <c><ja>@ConfigurationContext</ja>(initializers=JuneauRestInitializer.<jk>class</jk>)</c> when unit testing
		using <ja>@SpringBootTest</ja>.
</ul>

<h5 class='topic w800'>juneau-rest-client</h5>
<ul class='spaced-list'>
	<li>
		New {@link org.apache.juneau.rest.client.RestCallHandler} interface for custom handling of HTTP requests.
</ul>

<h5 class='topic w800'>juneau-doc</h5>
<ul class='spaced-list'>
</ul>
</div><!-- END: 8.1.4 -->

</div>
</body>								
