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


Release Notes - Juneau - Version 7.2.2

** Bug
    * [JUNEAU-88] - AddressBookResourceTest fails with org.apache.juneau.rest.client.RestCallException: Software caused connection abort: recv failed
    * [JUNEAU-89] - errors in juneau-examples-rest
    * [JUNEAU-90] - Could not instantiate class  org.apache.juneau.svl.Var
    

Release Notes - Juneau - Version 7.2.1

** Bug
    * [JUNEAU-85] - Don't break compatibility with 7.1.0
    * [JUNEAU-86] - Avoid NPE stopping RestMicroservice
    * [JUNEAU-87] - Tests should not use hard-wired line-endings.


Release Notes - Juneau - Version 7.2.0

** Bug
    * [JUNEAU-83] - Cannot subclass RestClient and RestClientBuilder
    * [JUNEAU-82] - Config and Logs resource pages should have configurable look-and-feel.

** New Feature
    * [JUNEAU-60] - @RestMethod paramater annotation to populate a pojo using RequestBean format

** Improvement
    * [JUNEAU-81] - Update Jetty to 9.4.9
    * [JUNEAU-84] - Upgrade to Jetty 9.4.12


Release Notes - Juneau - Version 7.1.0

** Bug
    * [JUNEAU-75] - Documentation not clear on how to customize htdocs folder
    * [JUNEAU-78] - Is org.apache.juneau.dto.swagger.SchemaInfo missing a $ref field?
    * [JUNEAU-79] - org.apache.juneau.microservice.RestMicroservice.stop() should not dump stack traces on the console
    * [JUNEAU-80] - RestCallHandlerDefault service method calls handleResponse which seems to close output stream right before it runs res.flushbuffer which throws an IO exception because the stream is closed.

** Improvement
    * [JUNEAU-76] - Improvements to Context/Builder APIs
    * [JUNEAU-77] - Document how to customize the favicon


Release Notes - Juneau - Version 7.0.1

** Bug
    * [JUNEAU-68] - Add BoundedReader to REST input
    * [JUNEAU-69] - XML parser should ignore comments.
    * [JUNEAU-71] - No git tag for release 7.0.0

** Improvement
    * [JUNEAU-72] - Offer an option to disable console IO from org.apache.juneau.microservice.Microservice.start()
    * [JUNEAU-73] - Update Jetty from 9.4.7.v20170914 to 9.4.8.v20171121
    * [JUNEAU-74] - Update Apache HttpClient from 4.5.3 to 4.5.4


Release Notes - Juneau - Version 7.0.0

** Improvement

** New Feature


Release Notes - Juneau - Version 6.4.0

** Improvement
    * [JUNEAU-46] - Remove references to wink
    * [JUNEAU-64] - Support advanced annotated variables on methods implementing onPreCall and onPostCall

** New Feature
    * [JUNEAU-62] - Support complete customization of jetty runtime
    * [JUNEAU-65] - utility for merging two like POJOs
    
    
Release Notes - Juneau - Version 6.3.1

** Bug
    * [JUNEAU-59] - Fix "Copyright (c) 2016, Apache Foundation" year in documentation.

** Improvement
    * [JUNEAU-58] - Embed HTML in @HtmlDoc.description


Release Notes - Juneau - Version 6.3.0

** Bug
    * [JUNEAU-38] - Testcase failure in UK
    * [JUNEAU-45] - Rebrand web pages with new incubator logo.
    * [JUNEAU-47] - Fix RAT check failure with logs generated during build
    * [JUNEAU-51] - properties added to rest client, serializer, and parser are not available during pojo swap and unswap methods

** Improvement
    * [JUNEAU-57] - seamless serialization and parsing of string fields to/from enum


Release Notes - Juneau - Version 6.2.0

** Bug
    * [JUNEAU-37] - REST Testcases can fail with ports 10000. 10001 in use.
    * [JUNEAU-39] - Add "Incubator" to NOTICE file.

** Improvement
    * [JUNEAU-32] - Improvements to BeanMeta class
    * [JUNEAU-41] - Prerequisites usage is deprecated for non maven-plugin projects
    * [JUNEAU-42] - More powerful RetryOn interface
    * [JUNEAU-43] - Removed superfluous property encoding
    * [JUNEAU-44] - Simplify the configuration for apache-rat-plugin


Release Notes - Juneau - Version 6.1.0

** Bug
    * [JUNEAU-25] - Minor release issues in 6.0.1 RC3
    * [JUNEAU-28] - Separate out RDF-code into separate juneau.core.rdf project.

** Improvement
    * [JUNEAU-26] - Add support for date localization.
    * [JUNEAU-27] - Rename projects.
    * [JUNEAU-31] - Separate out JAX-RS support from server/rest component
    * [JUNEAU-34] - Remove <string> tags from HTML serialization.
    * [JUNEAU-35] - Add StringSwap and MapSwap convenience classes.
    * [JUNEAU-36] - Examples improvements

** New Feature
    * [JUNEAU-33] - HTML5 DOM objects.
    

Release Notes - Juneau - Version 6.0.1

** Bug
    * [JUNEAU-17] - Resolve various small issues pointed out during release of 6.0.0
    * [JUNEAU-19] - Fix various JSON parser edge cases
    * [JUNEAU-21] - Scrub references to IBM from code.
    * [JUNEAU-22] - Localization bugs in CalendarSwap JUnits
    * [JUNEAU-23] - Fix various maven build warnings.
    * [JUNEAU-24] - Fix release issues discovered by Stian

** Improvement
    * [JUNEAU-18] - Add HtmlDocSerializer.DEFAULT field.

** Task
    * [JUNEAU-20] - Remove references to ibm.com from website


Release Notes - Juneau - Version 6.0.0

** Bug
    * [JUNEAU-1] - Cannot run org.apache.juneau.samples unit tests.
    * [JUNEAU-2] - org.apache.juneau.jena.CT_Rdf.testLooseCollectionsOfBeans()
    * [JUNEAU-4] - Testcase failure: CT_Visibility.testClassDefault

** Improvement
    * [JUNEAU-13] - Rename PojoTransform to PojoSwap

** Task
    * [JUNEAU-5] - Update root README.md file.
    * [JUNEAU-6] - Complete work on Juneau website (http://juneau.incubator.apache.org/)
    * [JUNEAU-7] - Complete work on setting up Confluence workspace (https://cwiki.apache.org/confluence/display/JUNEAU/Juneau+Home)
    * [JUNEAU-8] - Update contents of incubator status page (http://incubator.apache.org/projects/juneau.html)
    * [JUNEAU-9] - Set up Jenkins builds for Juneau artifacts.
    * [JUNEAU-10] - Figure out hosting options for generated Javadocs.
    * [JUNEAU-11] - Create root pom.xml
    * [JUNEAU-12] - Add Maven instructions to Dev setup guide.
    * [JUNEAU-14] - Add SerializerGroup and ParserGroup info to web site about page.
