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

9.0.0 (TBD)

<div class='topic'>
	<p>
		Juneau 9.0.0 is a major release.  Deprecated APIs that have been accumulating over time have been removed.
		
	</p>
	<p>
		Major changes include:
	</p>
	<ul class='spaced-list'>
		<li>
			The code has undergone significant refactoring to ease maintainability and improve overall performance.
			Configuration properties have been removed entirely.  They have been replaced with a standard builder-based
			architecture.  In addition to making the code more maintainable, it also improves performance when
			creating new serializers/parsers/rest clients (and others).
		<li>
			REST servlets now seemlessly integrate with Spring Boot.  
	</ul>
	
	<h5 class='topic w800'>juneau-marshall</h5>
	<ul class='spaced-list'>
		<li>
			Eliminated the various <c><ja>@XConfig</ja>(applyX={...})</c> annotations and replaced them with the ability
			to apply targeted annotations directly to configuration classes and methods (such as REST classes/methods).
			<p class='bcode'>
				|	<ja>@Rest</ja>(...)
				|	<ja>@Bean</ja>(on=<js>"MyBean1,MyBean2"</js>,sort=<jk>true</jk>)
				|	<ja>@UrlEncoding</ja>(onClass=MyList.<jk>class</jk>,expandedParams=<jk>true</jk>)
				|	<jk>public class</jk> MyRestClass {
				|		
				|		<ja>@RestOp</ja>(...)
				|		<ja>@Bean</ja>(on=<js>"MyBean1,MyBean2"</js>,sort=<jk>false</jk>)
				|		<ja>@UrlEncoding</ja>(onClass=MyList.<jk>class</jk>,expandedParams=<jk>false</jk>)
				|		<jk>public</jk> Object myRestMethod() { ... }
				|	}
			</p>
		<li>
			{@link oaj.marshaller.Json5 JSON 5} support.
		<li>
			New {@link oaj.annotation.Marshalled @Marshalled} annotation for non-bean classes.
		<li>
			New {@link oaj.annotation.BeanConfig#ignoreUnknownEnumValues() @BeanConfig(ignoreUnknownEnumValues)} annotation and support for ignoring
			unknown enum values during parsing.
		<li>
			Java Serialized Object marshalling support has been removed entirely due to security risks with usage (better safe than sorry).
	</ul>
	
	<h5 class='topic w800'>juneau-rest-common</h5>
	<p>
		New module containing the common REST classes/annotations uses by both the client and server APIs.
		These were previously contained within <c>juneau-marshall</c>.
	</p>
	<ul class='spaced-list'>
		<li>
			Significant refactoring of the classes in the {@link oaj.http} package and subpackages.  Attempts were made to make classes as natural
			extensions to the Apache HttpComponents APIs.  Significant new functionality here.
		<li>
			<c>@RemoteMethod</c> annotation has been replaced with the following:
			<ul class='javatreec'>
				<li class='ja'>{@link oaj.http.remote.RemoteOp}
				<li class='ja'>{@link oaj.http.remote.RemoteGet}
				<li class='ja'>{@link oaj.http.remote.RemotePut}
				<li class='ja'>{@link oaj.http.remote.RemotePatch}
				<li class='ja'>{@link oaj.http.remote.RemotePost}
				<li class='ja'>{@link oaj.http.remote.RemoteDelete}
			</ul>
		</li>
	</ul>

	<h5 class='topic w800'>juneau-rest-server</h5>
	<ul class='spaced-list'>
		<li>
			Significant refactoring done to allow for many extensible aspects of the API to be performed through injected beans
			in Spring.  These include logging, debugging, REST method arg types, static files, file finders, swagger creators, thrown stores, response
			processors, serializers/parsers, JSON schema generators, statistics gathering stores, and default request attributes/headers and response
			headers.
		<li>
			<c>@RestMethod</c> annotation has been replaced with the following:
			<ul class='javatreec'>
				<li class='ja'>{@link oaj.rest.annotation.RestOp}
				<li class='ja'>{@link oaj.rest.annotation.RestGet}
				<li class='ja'>{@link oaj.rest.annotation.RestPut}
				<li class='ja'>{@link oaj.rest.annotation.RestPatch}
				<li class='ja'>{@link oaj.rest.annotation.RestPost}
				<li class='ja'>{@link oaj.rest.annotation.RestDelete}
			</ul>
		</li>
		<li>
			Defining REST resources with predefined marshalling support is now much simpler.  You can now extend from a basic REST servlet/object.
			<p class='bcode'>
				|	<jc>// A root resource that supports JSON/HTML marshalling.</jc>
				|	<jk>public class</jk> MyRootResources <jk>extends</jk> BasicRestServletGroup  { ... }
				|	
				|	<jc>// A child resource that supports all available marshalling.</jc>
				|	<jk>public class</jk> MyChildResource <jk>extends</jk> BasicRestObject { ... }
			</p>
			<ul class='javatreec'>
				<li class='jc'>{@link oajr.servlet.BasicRestServlet}
				<li class='jc'>{@link oajr.servlet.BasicRestServletGroup}
				<li class='jc'>{@link oajr.servlet.BasicRestObject}
				<li class='jc'>{@link oajr.servlet.BasicRestObjectGroup}
			</ul>
		</li>
	</ul>
	
	<h5 class='topic w800'>juneau-dto</h5>
	<ul class='spaced-list'>
		<li>
			Addition of OpenAPI 3.0 ({@link oaj.dto.openapi3} package).
	</ul>
	
	<h5 class='topic w800'>juneau-rest-server-springboot</h5>
	<ul class='spaced-list'>
		<li>
			The requirement for using <c>JuneauRestInitializer</c> during App initialization to use bean injection has been eliminated.
			Instead, root resources should simply extend from {@link oajr.springboot.BasicSpringRestServlet} and {@link oajr.springboot.BasicSpringRestServletGroup}.
			These will automatically hook into the Spring Boot framework for resolution of REST children and various extension beans added
			to the REST API framework.
	</ul>
	
	<h5 class='topic w800'>juneau-rest-client</h5>
	<ul class='spaced-list'>
		<li>
			While the general usage pattern stays the same, the REST client code has undergone significant rewriting.  It is now more inline
			as an extension of the Apache HttpClient library.  Much new functionality such as support for fluent assertions has been added.
			<p class='bjava'>
				|	<jc>// Create a basic REST client with JSON support and download a bean.</jc>
				|	MyBean <jv>bean</jv> = RestClient.<jsm>create</jsm>()
				|		.json5()
				|		.build()
				|		.get(<jsf>URI</jsf>)
				|		.run()
				|		.assertStatus().asCode().is(200)
				|		.assertHeader(<js>"Content-Type"</js>).matchesSimple(<js>"application/json*"</js>)
				|		.getContent().as(MyBean.<jk>class</jk>);
			</p>
	</ul>
	
	<h5 class='topic w800'>juneau-rest-mock</h5>
	<ul class='spaced-list'>
		<li>
			Entirely rewritten.  Changes too many to list.
	</ul>
</div>