<!--
/***************************************************************************************************************************
 * 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.
 ***************************************************************************************************************************/
 -->

6.3.0 (Jun 30, 2017)

<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 oaj.http}.
	<li>
		Support for dynamic beans.  See {@link oaj.annotation.BeanProperty#name() @BeanProperty(name)}.
	<li>
		New doc: <code><del>2.8 - Virtual Beans</del></code>
	<li>
		New doc: <code><del>2.13 - Comparison with Jackson</del></code>
	<li>
		All parsers now allow for numeric types with <js>'K'</js>/<js>'M'</js>/<js>'G'</js> suffixes to represent
		kilobytes, megabytes, and gigabytes.
		<p class='bcode 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 <code><del>ConfigFile</del></code>:
		<ul>
			<li><code><del>ConfigFile.put(String,String,String,boolean)</del></code>
			<li><code><del>ConfigFile.put(String,String,Object,Serializer,boolean,boolean)</del></code>
			<li><code><del>ConfigFile.getObject(String,Type,Type...)</del></code>
			<li><code><del>ConfigFile.getObject(String,Parser,Type,Type...)</del></code>
			<li><code><del>ConfigFile.getObject(String,Class)</del></code>
			<li><code><del>ConfigFile.getObject(String,Parser,Class)</del></code>
			<li><code><del>ConfigFile.getObject(String,String,Type,Type...)</del></code>
			<li><code><del>ConfigFile.getObject(String,String,Parser,Type,Type...)</del></code>
			<li><code><del>ConfigFile.getObject(String,String,Class)</del></code>
			<li><code><del>ConfigFile.getObject(String,String,Parser,Class)</del></code>
			<li><code><del>ConfigFile.getObjectWithDefault(String,Object,Type,Type...)</del></code> 
			<li><code><del>ConfigFile.getObjectWithDefault(String,Parser,Object,Type,Type...)</del></code>
			<li><code><del>ConfigFile.getObjectWithDefault(String,Object,Class)</del></code>
			<li><code><del>ConfigFile.getObjectWithDefault(String,Parser,Object,Class)</del></code> 
		</ul>
	<li>New ability to interact with config file sections with proxy interfaces with new method <code><del>ConfigFile.getSectionAsInterface(String,Class)</del></code>.
	<li>{@link oaj.annotation.BeanProperty @BeanProperty} annotation can now be applied to getters
		and setters defined on interfaces.
	<li>New methods on {@link oaj.serializer.SerializerSession} and {@link oaj.parser.ParserSession}
		for retrieving context and runtime-override properties:
		<ul>
			<li><code><del>Session.getProperty(String)</del></code>
			<li><code><del>Session.getProperty(String,String)</del></code>
			<li><code><del>Session.getProperty(Class,String)</del></code>
			<li><code><del>Session.getProperty(Class,String,Object)</del></code>
		</ul>	
	<li>New <code><del>org.apache.juneau.serializer.PartSerializer</del></code> interface particularly tailored to HTTP
		headers, query parameters, form-data parameters, and path variables.  
		<br>Allows easy user-defined serialization of these objects.
		<br>The interface can be used in the following locations:
		<ul>
			<li><code><del>org.apache.juneau.rest.client.RestClientBuilder.partSerializer(Class)</del></code> 
			<li><code><del>org.apache.juneau.remoteable.Path.serializer</del></code> 
			<li><code><del>org.apache.juneau.remoteable.Query.serializer</del></code> 
			<li><code><del>org.apache.juneau.remoteable.QueryIfNE.serializer</del></code> 
			<li><code><del>org.apache.juneau.remoteable.FormData.serializer</del></code> 
			<li><code><del>org.apache.juneau.remoteable.FormDataIfNE.serializer</del></code> 
			<li><code><del>org.apache.juneau.remoteable.Header.serializer</del></code> 
			<li><code><del>org.apache.juneau.remoteable.HeaderIfNE.serializer</del></code> 
		</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 oaj.annotation.URI @URI}.
			<li>New classes:
				<ul>
					<li>{@link oaj.UriContext}
					<li>{@link oaj.UriRelativity}
					<li>{@link oaj.UriResolution}
					<li>{@link oaj.UriResolver}
				</ul>
			<li>New configuration properties:
				<li><code><del>SerializerContext.SERIALIZER_uriContext</del></code>
				<li><code><del>SerializerContext.SERIALIZER_uriRelativity</del></code>
				<li><code><del>SerializerContext.SERIALIZER_uriResolution</del></code>
				<li><code><del>SerializerContext.SERIALIZER_maxIndent</del></code>
		</ul>
	<li>New annotation property: {@link oaj.annotation.BeanProperty#value() @BeanProperty(value)}.
		<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 <code><del>UonSerializer.UON_paramFormat</del></code>, 
		and the UON/URL-Encoding serializers will now always serialize all values as plain text.
		<br>This means that arrays and maps are converted to simple comma-delimited lists.
	<li>Listener APIs added to serializers and parsers:
		<ul>
			<li>{@link oaj.serializer.SerializerListener}
			<li>{@link oaj.serializer.SerializerBuilder#listener(Class)}
			<li>{@link oajr.annotation.RestResource#serializerListener() @RestResource(serializerListener)}
			<li><code><del>RestConfig.serializerListener(Class)</del></code>
			<li>{@link oaj.parser.ParserListener}
			<li>{@link oaj.parser.ParserBuilder#listener(Class)}
			<li>{@link oajr.annotation.RestResource#parserListener() @RestResource(parserListener)}
			<li><code><del>RestConfig.parserListener(Class)</del></code>
			<li><code><del>RestClientBuilder.listeners(Class,Class)</del></code>
		</ul>juneau-examples-core.import1.pngjuneau-examples-core.import1.png
	<li>The {@link oaj.BeanContext#BEAN_debug} flag will now capture parser input and make it
		available through the <code><del>ParserSession.getInputAsString()</del></code> method so that it can be used
		in the listeners.
	<li>Significant new functionality introduced to the HTML serializer.  
		<br>Lots of new options for customizing the HTML output.
		<ul>
			<li>New {@link oaj.html.annotation.Html#render() @Html(render)} annotation and {@link oaj.html.HtmlRender} class that allows you
				to customize the HTML output and CSS style on bean properties:
				<br><img class='bordered' src='doc-files/ReleaseNotes.630.1.png'>
				<br>Annotation can be applied to POJO classes and bean properties.
			<li>Several new properties for customizing parts of the HTML page:
				<ul>
					<li><code><del>HtmlDocSerializerContext.HTMLDOC_title</del></code>
					<li><code><del>HtmlDocSerializerContext.HTMLDOC_description</del></code>
					<li><code><del>HtmlDocSerializerContext.HTMLDOC_branding</del></code>
					<li><code><del>HtmlDocSerializerContext.HTMLDOC_header</del></code>
					<li><code><del>HtmlDocSerializerContext.HTMLDOC_nav</del></code>
					<li><code><del>HtmlDocSerializerContext.HTMLDOC_aside</del></code>
					<li><code><del>HtmlDocSerializerContext.HTMLDOC_footer</del></code>
					<li><code><del>HtmlDocSerializerContext.HTMLDOC_noResultsMessage</del></code>
					<li><code><del>HtmlDocSerializerContext.HTMLDOC_cssUrl</del></code>
					<li><code><del>HtmlDocSerializerContext.HTMLDOC_css</del></code>
					<li><code><del>HtmlDocSerializerContext.HTMLDOC_template</del></code>
				</ul>
			<li>New interface {@link oaj.html.HtmlDocTemplate} that allows full control over rendering
				of HTML produced by {@link oaj.html.HtmlDocSerializer}.
			
		</ul>
	<li>{@link oaj.annotation.NameProperty @NameProperty} and {@link oaj.annotation.ParentProperty @ParentProperty}
		can now be applied to fields.  
	<li>New properties on {@link oaj.BeanContext}:
		<ul>
			<li>{@link oaj.BeanContext#BEAN_includeProperties BEAN_includeProperties}
			<li>{@link oaj.BeanContext#BEAN_excludeProperties BEAN_excludeProperties}
		</ul>
	<li>New annotation property: {@link oaj.annotation.BeanProperty#format() @BeanProperty(format)}.
</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 oajr.RestRequest} class functionality has been broken up into the following
		functional pieces to reduce its complexity:
		<ul>
			<li>{@link oajr.RestRequest#getBody()} - The request body.
			<li>{@link oajr.RestRequest#getHeaders()} - The request headers.
			<li>{@link oajr.RestRequest#getQuery()} - The request query parameters.
			<li>{@link oajr.RestRequest#getFormData()} - The request form data parameters.
			<li>{@link oajr.RestRequest#getPathMatch()} - The path variables and remainder.
		</ul>	
		The following classes have been introduced:
		<ul>
			<li>{@link oajr.RequestBody}
			<li>{@link oajr.RequestHeaders}
			<li>{@link oajr.RequestQuery}
			<li>{@link oajr.RequestFormData}
			<li>{@link oajr.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 oajr.RestRequest} - The request object.
			<li>{@link javax.servlet.http.HttpServletRequest} - The superclass of <code>RestRequest</code>.
			<li>{@link oajr.RestResponse} - The response object.
			<li>{@link javax.servlet.http.HttpServletResponse} - The superclass of <code>RestResponse</code>.
		</ul>
		The new supported types are:
		<ul>
			<li>{@link oaj.http.Accept}
			<li>{@link oaj.http.AcceptCharset}
			<li>{@link oaj.http.AcceptEncoding}
			<li>{@link oaj.http.AcceptLanguage}
			<li>{@link oaj.http.Authorization}
			<li>{@link oaj.http.CacheControl}
			<li>{@link oaj.http.Connection}
			<li>{@link oaj.http.ContentLength}
			<li>{@link oaj.http.ContentType}
			<li>{@link oaj.http.Date}
			<li>{@link oaj.http.Expect}
			<li>{@link oaj.http.From}
			<li>{@link oaj.http.Host}
			<li>{@link oaj.http.IfMatch}
			<li>{@link oaj.http.IfModifiedSince}
			<li>{@link oaj.http.IfNoneMatch}
			<li>{@link oaj.http.IfRange}
			<li>{@link oaj.http.IfUnmodifiedSince}
			<li>{@link oaj.http.MaxForwards}
			<li>{@link oaj.http.Pragma}
			<li>{@link oaj.http.ProxyAuthorization}
			<li>{@link oaj.http.Range}
			<li>{@link oaj.http.Referer}
			<li>{@link oaj.http.TE}
			<li>{@link oaj.http.UserAgent}
			<li>{@link oaj.http.Upgrade}
			<li>{@link oaj.http.Via}
			<li>{@link oaj.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 oaj.utils.MessageBundle} - A resource bundle with additional features.
			<li>{@link java.util.Locale} - Client locale.
			<li>{@link oajr.RequestHeaders} - API for accessing request headers.
			<li>{@link oajr.RequestQuery} - API for accessing request query parameters.
			<li>{@link oajr.RequestFormData} - API for accessing request form data.
			<li>{@link oajr.RequestPath} - API for accessing path variables.
			<li>{@link oajr.RequestBody} - API for accessing request body.
			<li>{@link oaj.http.HttpMethod} - The method name matched (when using <code><ja>@RestMethod</ja>(name=<js>"*"</js>)</code>)
			<li>{@link java.util.logging.Logger} - The logger to use for logging.
			<li>{@link oaj.internal.JuneauLogger} - Logger with additional features.
			<li>{@link oajr.RestContext} - The resource read-only context.
			<li>{@link oaj.parser.Parser} - The parser matching the request content type.
			<li>{@link oaj.dto.swagger.Swagger} - The auto-generated Swagger doc.
			<li><code><del>ConfigFile</del></code> - The external config file for the resource.
		</ul>
		So, for example...
		<p class='bcode 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 {@link oajr.annotation.RestResource#paramResolvers() @RestResource(paramResolvers)}
		that allows you to define your own custom Java method parameter resolvers.
	<li>
		Fixed bug where Writer returned by {@link oajr.RestResponse#getWriter()} was not being flushed automatically
		at the end of the HTTP call.
	<li>
		New annotations added to {@link oajr.annotation.RestMethod @RestMethod}:
		<ul>
			<li>{@link oajr.annotation.RestMethod#defaultQuery() defaultQuery()}
			<li>{@link oajr.annotation.RestMethod#defaultFormData() defaultFormData()}
			<li><code><del>bpIncludes()</del></code>
			<li><code><del>bpExcludes()</del></code>
		</ul>
	<li>
		Default values on header, query, and form-data annotations:
		<ul>
			<li><code><del>@Header(def)</del></code> - Default header value.
			<li><code><del>@Query(def)</del></code> - Default query parameter value.
			<li><code><del>@FormData(def)</del></code> - Default form data parameter value.
		</ul>
	<li>
		New attributes on {@link oajr.annotation.RestResource @RestResource}:
		<ul>
			<li>{@link oajr.annotation.RestResource#serializerListener() serializerListener()}
			<li>{@link oajr.annotation.RestResource#parserListener() parserListener()}
			<li><code><del>widgets()</del></code>
			<li>{@link oajr.annotation.RestResource#swagger() swagger()}
			<li>{@link oajr.annotation.RestResource#htmldoc() htmldoc()}
		</ul>
	<li>
		New attributes on {@link oajr.annotation.RestMethod @RestMethod}:
		<ul>
			<li><code><del>widgets()</del></code>
			<li>{@link oajr.annotation.RestMethod#swagger() swagger()}
			<li>{@link oajr.annotation.RestMethod#htmldoc() htmldoc()}
		</ul>
	<li>
		New string vars:
		<ul>
			<li>{@link oajr.vars.UrlVar} - Resolve <js>"$U{...}"</js> variables to URLs.
			<li>{@link oajr.vars.WidgetVar} - Resolve <js>"$W{...}"</js> variables to widget contents.
		</ul>
	<li>
		New methods on <code><del>RestConfig</del></code>:
		<ul>
			<li><code><del>setHtmlTitle(String)</del></code>
			<li><code><del>setHtmlDescription(String)</del></code>
			<li><code><del>setHtmlBranding(String)</del></code>
			<li><code><del>setHtmlHeader(String)</del></code>
			<li><code><del>setHtmlLinks(String)</del></code>
			<li><code><del>setHtmlNav(String)</del></code>
			<li><code><del>setHtmlAside(String)</del></code>
			<li><code><del>setHtmlFooter(String)</del></code>
			<li><code><del>setHtmlCss(String)</del></code>
			<li><code><del>setHtmlCssUrl(String)</del></code>
			<li><code><del>setHtmlNoWrap(boolean)</del></code>
			<li><code><del>setHtmlNoResultsMessage(String)</del></code>
			<li><code><del>setHtmlTemplate(Class)</del></code>
			<li><code><del>setHtmlTemplate(HtmlDocTemplate)</del></code>
			<li><code><del>addWidget(Class)</del></code>
		</ul>
	<li>
		New methods on {@link oajr.RestResponse}:
		<ul>
			<li><code><del>setHtmlTitle(Object)</del></code>
			<li><code><del>setHtmlDescription(Object)</del></code>
			<li><code><del>setHtmlBranding(Object)</del></code>
			<li><code><del>setHtmlHeader(Object)</del></code>
			<li><code><del>setHtmlLinks(Object)</del></code>
			<li><code><del>setHtmlNav(Object)</del></code>
			<li><code><del>setHtmlAside(Object)</del></code>
			<li><code><del>setHtmlFooter(Object)</del></code>
			<li><code><del>setHtmlCss(Object)</del></code>
			<li><code><del>setHtmlCssUrl(Object)</del></code>
			<li><code><del>setHtmlNoWrap(boolean)</del></code>
			<li><code><del>setHtmlNoResultsMessage(Object)</del></code>
			<li><code><del>setHtmlTemplate(Class)</del></code>
			<li><code><del>setHtmlTemplate(HtmlDocTemplate)</del></code>
		</ul>
	<li>
		<code>&amp;plainText=true</code> parameter now works on byte-based serializers by converting the output to hex.
	<li>
		New classes for widget support:
		<ul>
			<li>{@link oajr.widget.Widget}
			<li><code><del>PoweredByJuneauWidget</del></code>
			<li><code><del>ContentTypeLinksColumnWidget</del></code>
			<li><code><del>ContentTypeLinksRowWidget</del></code>
			<li><code><del>QueryWidget</del></code>
		</ul>
	<li>
		<code>devops.css</code> cleaned up.
	<li>
		Removed a bunch of URL-related methods from {@link oajr.RestRequest}.  
		These all have equivalents in {@link oajr.RestRequest#getUriContext()}.
	<li>
		New annotation attributes:
		<ul>
			<li>{@link oaj.http.annotation.Query#name() @Query(name)}
			<li>{@link oaj.http.annotation.FormData#name() @FormData(name)}
			<li>{@link oaj.http.annotation.Header#name() @Header(name)}
			<li>{@link oaj.http.annotation.Path#name() @Path(name)}
			<li>{@link oaj.http.annotation.HasQuery#name() @HasQuery(name)}
			<li>{@link oaj.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 <code><del>org.apache.juneau.remoteable.Path</del></code> annotation for specifying path variables on remoteable interfaces.
	<li>
		New <code><del>@RequestBean</del></code> annotation for specifying beans with remoteable annotations
		defined on properties.
	<li>
		The following annotations (and related methods on RestCall) can now take <code>NameValuePairs</code> and beans as input 
		when using <js>"*"</js> as the name.
		<br><code><del>org.apache.juneau.remoteable.FormData</del></code>,<code><del>org.apache.juneau.remoteable.FormDataIfNE</del></code>,
		<code><del>org.apache.juneau.remoteable.Query</del></code>,<code><del>org.apache.juneau.remoteable.QueryIfNE</del></code>,
		<code><del>org.apache.juneau.remoteable.Header</del></code>,<code><del>org.apache.juneau.remoteable.HeaderIfNE</del></code> 
</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>
