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

8.1.2 (TBD)

<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 oaj.annotation.Bean#bpro()}
			<li class='ja'>{@link oaj.annotation.Bean#bpwo()}
			<li class='ja'>{@link oaj.annotation.Beanp#ro()}
			<li class='ja'>{@link oaj.annotation.Beanp#wo()}
			<li class='jf'>{@link oaj.BeanContext#BEAN_bpro}
			<li class='jf'>{@link oaj.BeanContext#BEAN_bpwo}
			<li class='jm'>{@link oaj.BeanContextBuilder#bpro(Map)}
			<li class='jm'>{@link oaj.BeanContextBuilder#bpwo(Map)}
		</ul>
	<li>
		New convenience methods:
		<ul>	
			<li class='jm'>{@link oaj.ObjectMap#parse(CharSequence)}
			<li class='jm'>{@link oaj.ObjectList#parse(CharSequence)}
		</ul>
	<li>
		{@link oaj.marshall.CharMarshall} and {@link oaj.marshall.StreamMarshall} now have public constructors.
	<li>
		{@link oaj.annotation.Beanp @Beanp} replaces {@link oaj.annotation.BeanProperty @BeanProperty}.
	<li>
		{@link oaj.annotation.Beanc @Beanc} replaces {@link oaj.annotation.BeanConstructor @BeanConstructor}.
	<li>
		{@link oaj.http.remote.@Remote @Remote} replaces {@link oaj.http.remote.@RemoteResource}.
	<li>
		Shortened names for {@link oaj.annotation.Bean#dictionary @Bean(dictionary)} and {@link oaj.BeanContextBuilder#dictionary(Class...)}.
</ul>

<h5 class='topic w800'>juneau-rest-server</h5>
<ul class='spaced-list'>
	<li>
		{@link oajr.annotation.Rest @Rest} replaces {@link oajr.annotation.RestResource @RestResource} with shorter syntax.
	<li>
		New method {@link oajr.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 oajrc.RestClient} is now extendible.  The constructor has been made public and simplified to:
		{@link oajrc.RestClient#RestClient(RestClientBuilder)}.
	<li>
		Duplicate methods between {@link oajrc.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>
