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