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

5.1.0.16 (June 28, 2015)

<p>
	Juno 5.1.0.16 is a moderate update.
</p>

<h5 class='topic w800'>Core</h5>
<ul class='spaced-list'>
	<li>New methods on {@link oaj.ClassMeta} that eliminates language-specific code in 
		the general class metadata.
		<ul>
			<li><dc>ClassMeta.getXmlMeta()</dc>
			<li><dc>ClassMeta.getJsonMeta()</dc>
			<li><dc>ClassMeta.getHtmlMeta()</dc>
			<li><dc>ClassMeta.getUrlEncodingMeta()</dc>
			<li><dc>ClassMeta.getRdfMeta()</dc>
		</ul>
	<li>New {@link oaj.dto.jsonschema.JsonType#ANY} enum.
	<li>New <dc>@Html(asPlainText)</dc> annotation.
	<li>New <dc>HtmlDocSerializerContext.HTMLDOC_cssImports</dc> property.
	<li>Significant changes to RDF support.
		<ul>
			<li>New {@link oaj.jena.annotation.Rdf @Rdf} and {@link oaj.jena.annotation.RdfSchema @RdfSchema}
				annotations.  These replace the use of defining namespaced through the XML annotations, and allows XML and RDF to be
				serialized using different namespaces.
			<li>Support for serializing arrays/collections as RDF bags, RDF lists, and multi-valued properties.   
			<li>Fixed warning message about <js>"tab"</js> setting when using the N3/Turtle serializers.
		</ul>
	<li>New <dc>SerializerContext.SERIALIZER_sortCollections</dc> and 
		<dc>SerializerContext.SERIALIZER_sortMaps</dc> properties.
	<li>FindBug fixes.
</ul>

<h5 class='topic w800'>Server</h5>
<ul class='spaced-list'>
	<li>New <dc>RestRequest.getServletParentURI()</dc> method.
	<li>New <c>$R{servletParentURI}</c> variable.
	<li>Removed final modifier from <dc>ChildResourceDescriptions</dc>.
</ul>

<h5 class='topic w800'>Samples</h5>
<ul class='spaced-list'>
	<li>Added source code links to examples.
</ul>
