5.1.0.17 (Aug 3, 2015)

Juno 5.1.0.17 is a major update.

##### Core

- {@link oaj.BeanMap#get(Object)} and {@link oaj.BeanMap#put(String,Object)} now automatically performs filtering if filters are defined on the bean property or bean property class.
  - Deleted the following methods which are now unnecessary:
    - `BeanMap.getFiltered(String)`
    - `BeanMap.putFiltered(String,Object)`
    - `BeanMapEntry.getFiltered(String)`
    - `BeanMapEntry.putFiltered(String,Object)`
    - `BeanMapEntry.putFiltered(String,Object)`
    - `BeanPropertyMeta.getFiltered()`
    - `BeanPropertyMeta.setFiltered(Object)`
    - `BeanPropertyMeta.getTransformedClassMeta()`
  - {@link oaj.BeanPropertyMeta#getClassMeta()} now returns the filtered type of the property.
- `StringVarResolver` now has support for chained resolvers.
- `StringVarResolver` now resolves variables inside resolved values. i.e. if a resolved variable value itself contains a variable, it now resolves that variable too.
- Fixed bug where inner interface classes being used in `RestResource.filters()` were being interpreted as surrogate classes because they have hidden 1-arg constructors due to being inner classes.
- Fixed bug in {@link oaj.internal.MultiSet} where exception was being thrown if last set was empty.
- New {@link oaj.utils.ZipFileList} class for providing efficiently zipped directories through the REST interface.
- New `RdfProperties.RDF_useXmlNamespaces` property.
- New `XmlParserContext.XML_preserveRootElement` property.
- Worked around bug in Sun VM on OS/X where XML parser was throwing an exception when trying to set a reporter.

##### Server

- New `ZipFileListResponseHandler` class.
- Simplified labels in servlet resource bundles:
  - `"[ClassName].ResourceDescription"` is now `"[ClassName].label"`.
  - `"[ClassName].MethodDescription.[methodName]"` is now `"[ClassName].[methodName]"`.
- Several changes to {@link oajr.RestRequest}:
  - Added new methods:
    - `RestRequest.getQueryParameterMap()`
    - `RestRequest.getQueryParameterNames()`
    - `RestRequest.getPathInfoUndecoded()`
    - `RestRequest.getPathRemainderUndecoded()`
    - `RestRequest.getTrimmedRequestURI()`
    - `RestRequest.getTrimmedRequestURL()`
    - `RestRequest.getServletTitle()`
    - `RestRequest.getServletDescription()`
    - {@link oajr.RestRequest#getMethodDescription()}
  - Behavior changes to {@link oajr.RestRequest#getPathInfo()} to follow Servlet specs. Returns null instead of blank for no path info.
  - `RestRequest.getPathRemainder()` now automatically decodes the path remainder. Use `RestRequest.getPathRemainderUndecoded()` to get the unencoded path remainder.
  - Bug fixes in `RestRequest.getRequestParentURI()` when servlet is mapped to "/*".
  - Bug fixes in `RestRequest.getServletURI()` when servlet is mapped to "/*".
- New string replacement variables:
  - `$R{contextPath}` - Returns value from {@link oajr.RestRequest#getContextPath()}
  - `$R{methodDescription}` - Returns value from {@link oajr.RestRequest#getMethodDescription()}
  - `$R{resourceTitle}` - Returns value from `RestRequest.getServletTitle()`
  - `$R{resourceDescription}` - Returns value from `RestRequest.getServletDescription()`
  - `$R{trimmedRequestURI}` - Returns value from `RestRequest.getTrimmedRequestURI()`
  - `$E{var}` - Environment variables.
- Added methods `RestServlet.getDescription(RestRequest)` and `RestServlet.getLabel(RestRequest)`.
- {@link oajr.BasicRestServlet} and `RestServletJenaDefault` now provide default HTML titles and descriptions:

  @Property(name=HTMLDOC_title, value="$R{resourceTitle}"), @Property(name=HTMLDOC_description, value="$R{resourceDescription}")

- Options pages on {@link oajr.BasicRestServlet} and `RestServletJenaDefault` now provide default descriptions and back links: and descriptions:

  @Property(name=HTMLDOC_navlinks, value="{back:'$R{servletURI}"), @Property(name=HTMLDOC_description, value="Resource options")

- New {@link oajr.BasicRestServletGroup} class.
- Removed `RestServletProperties.REST_trimTrailingUriSlashes` and `RestServletProperties.REST_pathInfoBlankForNull`.
- New annotations for providing labels and descriptions. Useful if you don't plan on having to support other languages, so you don't want to provide labels in resource bundles.
  - `RestResource.label()`
  - {@link oajr.annotation.RestResource#description() @RestResource(description)}
  - {@link oajr.annotation.RestMethod#description() @RestMethod(description)}
  - `RestMethod#responses()`
  - `Attr.description()`
  - `Content.description()`
  - `HasParam.description()`
  - `HasQParam.description()`
  - `Header.description()`
  - `Param.description()`
  - `QParam.description()`
- Support for sorting resources by name in `ChildResourceDescriptions`.

##### Samples

- Added `/tempDir/upload` showing how to use `ServletFileUpload` with multipart form posts.