5.1.0.11 (Feb 14, 2015)

Juno 5.1.0.11 is a moderate update.

##### Core

- Additions to {@link oaj.html.annotation.Html @Html} bean annotation.
  - New {@link oaj.html.annotation.Html#noTables() @Html(noTables)} annotation that prevents arrays/Collections from being serialized as tables.
  - New {@link oaj.html.annotation.Html#noTableHeaders() @Html(noTableHeaders)} annotation that prevents HTML tables from having header rows.
- Several improvements to URL-Encoding support.
  - Improved whitespace handling in {@link oaj.uon.UonParser}.
  - New `UonParserContext.UON_whitespaceAware` property for controlling whether whitespace is ignored.
  - New `UrlEncodingContext.URLENC_expandedParams` property for controlling whether arrays/Collections should be serialized/parsed as multi-part parameters.
  - New {@link oaj.urlencoding.annotation.UrlEncoding#expandedParams() @UrlEncoding(expandedParams)} annotation that specifies that bean properties of type array/Collection be serialized as multi-part parameters (e.g. `&key=val1&key=val2`).
- New `JsonSerializerContext.JSON_escapeSolidus` property for controlling whether slash characters should be escaped.
- New {@link oaj.internal.TeeOutputStream} and {@link oaj.internal.TeeWriter} classes.
- New {@link oaj.ClassMeta#isInstance(Object)} method.
- Performance improvements when using the {@link oaj.BeanMap#add(String,Object)} method. Array properties are stored in a temporary list cache until {@link oaj.BeanMap#getBean()} is called.
- New `BeanPropertyMeta.add(BeanMap,Object)` method for adding values to Collection and array properties.
- Config INI files now support keys with name "*".

##### Server

- REST method parameters can now be generic types (e.g. @Param("foo") Map<String,Integer> foo). This applies to headers, attributes, and parameters.
- New `@Param(multipart)` and `@Query(multipart)` annotations for handling multi-part GET and POST parameters.
- GET parameters are now CASE-SENSITIVE per W3C standards.
  - `&Content` must now be specified as `&content`.
  - `&Method` must now be specified as `&method`.
  - `&debug` must now be specified as `&debug=true`.
  - `&plainText` must now be specified as `&plainText=true`.
  - `&notrace` must now be specified as `&noTrace=true`.
- Performance improvements around query parameters.
- New methods on {@link oajr.RestRequest} for handling multi-part parameters:
  - `RestRequest.getParameters(String,Class)`
  - `RestRequest#getQueryParameters(String,Class)`
- Fixed Jetty issue in {@link oajr.RestResponse#setHeader(String,String)} where setting the `Content-Type` through this method was inconsistent with the behavior in WAS/Tomcat.
- `&noTrace=true` now prevents any errors from being logged in log file.
- Workaround for Jetty issue where `ServletContext.getContextPath()` always ends with "null".
- `RestServletProperties.REST_allowMethodParam` is now true by default on all subclasses of {@link oajr.BasicRestServlet} and `RestServletJenaDefault`.

##### Client

- New method {@link oajrc.RestCall#allowRedirectsOnPosts(boolean)}.
- New method `RestCall.peekInputStream()` allows you to read response bodies without interrupting execution flow.
- New method {@link oajrc.RestCall#toString()} now useful for debugging purposes. Shows all request/response headers and bodies.
- {@link oajrc.RestCallException} now includes `HttpResponse` object for easier debugging.
- New method `RestClient.addListener(RestClientListener)` for registering request/response listeners.
- New `RestClient.setClassLoader(ClassLoader)` method.
- TLS support in `JazzRestClient`.

##### Other changes

- `samples.ear` and `samples.war` projects have been replaced with an OSGi bundle with activated servlets in `juno.samples`.