| <!-- |
| /*************************************************************************************************************************** |
| * 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. |
| ***************************************************************************************************************************/ |
| --> |
| |
| 6.2.0 (Apr 28, 2017) |
| |
| <p> |
| Juneau 6.2.0 is a major update. |
| </p> |
| |
| <h5 class='topic w800'>org.apache.juneau</h5> |
| <ul class='spaced-list'> |
| <li> |
| Revamped the serializer, parser classes to use builders for creation. |
| Serializers and parsers are now unmodifiable objects once they are created. |
| This is a breaking code change that will require adoption. |
| <p class='bcode w800'> |
| <jc>/* Creating a new serializer or parser */ </jc> |
| |
| <jc>// Old way</jc> |
| WriterSerializer s = <jk>new</jk> JsonSerializer().setUseWhitespace(<jk>true</jk>).pojoSwaps(BSwap.<jk>class</jk>).lock(); |
| |
| <jc>// New way</jc> |
| WriterSerializer s = JsonSerializer.<jsm>create</jsm>().ws().pojoSwaps(BSwap.<jk>class</jk>).build(); |
| |
| <jc>/* Cloning an existing serializer or parser */ </jc> |
| |
| <jc>// Old way</jc> |
| WriterSerializer s = SimpleJsonSerializer.<jsf>DEFAULT</jsf> |
| .clone().setUseWhitespace(<jk>true</jk>).pojoSwaps(BSwap.<jk>class</jk>).lock(); |
| |
| <jc>// New way</jc> |
| WriterSerializer s = SimpleJsonSerializer.<jsf>DEFAULT</jsf> |
| .builder().ws().pojoSwaps(BSwap.<jk>class</jk>).build(); |
| </p> |
| <li>Also introduced the following builder classes and related architecture changes to make the built objects unmodifiable: |
| <ul> |
| <li>{@link oaj.serializer.SerializerGroupBuilder} |
| <li>{@link oaj.parser.ParserGroupBuilder} |
| <li>{@link oaj.encoders.EncoderGroupBuilder} |
| </ul> |
| <li>Revamped the config file API to use a build: <dc>ConfigFileBuilder</dc>. |
| <li>Removed the <dc>Lockable</dc> interface. |
| <li>New <c>addBeanTypeProperties</c> setting added to serializers to override the |
| <dc>SerializerContext.SERIALIZER_addBeanTypeProperties</dc> setting |
| for individual serializers in a serializer group: |
| <ul> |
| <li><dc>HtmlSerializerContext.HTML_addBeanTypeProperties</dc> |
| <li><dc>JsonSerializerContext.JSON_addBeanTypeProperties</dc> |
| <li><dc>MsgPackSerializerContext.MSGPACK_addBeanTypeProperties</dc> |
| <li><dc>UonSerializerContext.UON_addBeanTypeProperties</dc> |
| <li><dc>XmlSerializerContext.#XML_addBeanTypeProperties</dc> |
| <li><dc>RdfSerializerContext.RDF_addBeanTypeProperties</dc> |
| </ul> |
| <li>UON notation serializers and parsers moved into the new <c>org.apache.juneau.uon</c> package. |
| <li>New {@link oaj.xml.annotation.XmlFormat#VOID} format to identify HTML void elements. |
| <li>Tweaks to HTML5 support. |
| <ul> |
| <li>Fixed handling of empty non-void elements in HTML serializer. |
| <li>Added <c>style()</c> override methods to all elements. |
| </ul> |
| <li>Improvements to Swagger support. |
| <ul> |
| <li>New {@link oaj.dto.swagger.SwaggerBuilder} class. |
| <li>Fluent-style setters added to the Swagger beans. |
| <li>Added Swagger examples <dc>here</dc> and in the <del>org.apache.juneau.dto.swagger</del> javadocs. |
| </ul> |
| <li>Improvements to {@link oaj.svl.VarResolver}. |
| <ul> |
| <li>New {@link oaj.svl.vars.IfVar $IF} variable for if-else block logic. |
| <li><dc>$SWITCH</dc> variable for switch block logic. |
| <li>Whitespace wasn't being ignored in some cases. |
| </ul> |
| <li>{@link oaj.html.HtmlParser} can now parse full body contents generated by {@link oaj.html.HtmlDocSerializer}. |
| <li>Parse-args supported added to {@link oaj.msgpack.MsgPackParser} to allow it to be used in remoteable proxies. |
| <li>Added some convenience classes for constructing collections using a fluent interface: |
| <ul> |
| <li>{@link oaj.utils.AList} |
| <li>{@link oaj.utils.ASet} |
| <li>{@link oaj.utils.AMap} |
| </ul> |
| <li>New {@link oaj.annotation.Bean#typePropertyName @Bean(typePropertyName)} annotation allows you to |
| specify the name of the <js>"_type"</js> property at the class level. |
| <li>New methods added to HTML5 container beans: |
| <ul> |
| <li>{@link oaj.dto.html5.HtmlElementContainer#getChild(int...)} |
| <li>{@link oaj.dto.html5.HtmlElementMixed#getChild(int...)} |
| </ul> |
| <li>New common serializer setting: <dc>SerializerContext.SERIALIZER_abridged</dc>. |
| <li>Support for defining interface proxies against 3rd-party REST interfaces. |
| <br>New package <dc>org.apache.juneau.remoteable</dc> for all remoteable proxy interface annotations. |
| <br><ja>@Remoteable</ja> annotation has been moved to this package. |
| <li>Updated doc: <dc>6 - Remoteable Services</dc> |
| <li>New doc: <dc>6.1 - Interface proxies against 3rd-party REST interfaces</dc> |
| <li>New URL-encoding serializer setting: <dc>UrlEncodingSerializerContext.URLENC_paramFormat</dc>. |
| <li>New methods on {@link oaj.urlencoding.UrlEncodingSerializerBuilder}: |
| <ul> |
| <li><dc>UrlEncodingSerializerBuilder.paramFormat(String)</dc> |
| <li><dc>UrlEncodingSerializerBuilder.plainTextParams()</dc> |
| </ul> |
| </ul> |
| |
| <h5 class='topic w800'>org.apache.juneau.rest</h5> |
| <ul class='spaced-list'> |
| <li><dc>@RestResource</dc> annotation can now be applied to |
| any class! You're no longer restricted to subclassing your resources from {@link oajr.RestServlet}. |
| <br>This is a major enhancement in the API. Anything you could do by subclassing from <c>RestServlet</c> |
| should have an equivalent for non-<c>RestServlet</c> classes. |
| <br>The only restriction is that the top-level resource must subclass from <c>RestServlet</c>. |
| Child resources do not. |
| <br><br> |
| The majority of code has been split up into two separate classes: |
| <ul> |
| <li><dc>RestConfig</dc> - A modifiable configuration of a resource. Subclasses from {@link javax.servlet.ServletConfig}. |
| <li>{@link oajr.RestContext} - A read-only configuration that's the result of a snapshot of the config. |
| </ul> |
| <br><br> |
| The {@link oajr.RestServlet} class now has the following initialization method that allows you to override |
| the config settings define via annotations: |
| <ul> |
| <li><dc>RestServlet.init(RestConfig)</dc> - A modifiable configuration of a resource. |
| </ul> |
| Non-<c>RestServlet</c> classes must have one of the following to allow it to be instantiated: |
| <ul> |
| <li>A <c><jk>public</jk> T(RestConfig)</c> constructor. |
| <li>A <c><jk>public</jk> T()</c> constructor. |
| <li>The parent resource must have a customized {@link oajr.RestResourceResolver} for instantiating it. |
| </ul> |
| <br> |
| Non-<c>RestServlet</c> classes can optionally include the following init methods to gain access to the config and context: |
| <ul> |
| <li><dc><jk>public</jk> init(RestConfig)</dc> |
| <li><dc><jk>public</jk> init(RestContext)</dc> |
| </ul> |
| <li>New annotations added to <dc>@RestResource</dc> to allow non-<c>RestServlet</c> |
| resources to do the same as subclassing directly from <c>RestServlet</c>: |
| <ul> |
| <li><dc>RestResource.resourceResolver()</dc> |
| - Specify a {@link oajr.RestResourceResolver} class for resolving child resources. |
| <li><dc>RestResource.callHandler()</dc> |
| - Specify a {@link oajr.RestCallHandler} class for handling the lifecycle of a REST call. |
| <li><dc>RestResource.infoProvider()</dc> |
| - Specify a {@link oajr.RestInfoProvider} class for customizing title/description/Swagger information on a REST resource. |
| <li><dc>RestResource.logger()</dc> |
| - Specify a {@link oajr.RestLogger} class for handling logging. |
| </ul> |
| <li>New annotations added to <dc>@RestResource</dc> and {@link oajr.annotation.RestMethod @RestMethod} |
| to simplify defining page title, text, and links on HTML views: |
| <ul> |
| <li><dc>@RestResource(pageTitle)</dc> |
| <li><dc>@RestMethod(pageTitle)</dc> |
| <li><dc>@RestResource(pageText)</dc> |
| <li><dc>@RestMethod(pageText)</dc> |
| <li><dc>@RestResource(pageLinks)</dc> |
| <li><dc>@RestMethod(pageLinks)</dc> |
| </ul> |
| <p class='bcode w800'> |
| <jc>// Old method</jc> |
| <ja>@RestResource</ja>( |
| properties={ |
| <ja>@Property</ja>(name=<jsf>HTMLDOC_title</jsf>, value=<js>"System properties resource"</js>), |
| <ja>@Property</ja>(name=<jsf>HTMLDOC_description</jsf>, value=<js>"REST interface for performing CRUD operations on system properties."</js>), |
| <ja>@Property</ja>(name=<jsf>HTMLDOC_navlinks</jsf>, value=<js>"{up:'$R{requestParentURI}',options:'?method=OPTIONS'}"</js>) |
| } |
| ) |
| |
| <jc>// New method</jc> |
| <ja>@RestResource</ja>( |
| pageTitle=<js>"System properties resource"</js>, |
| pageDescription=<js>"REST interface for performing CRUD operations on system properties."</js>, |
| pageLinks=<js>"{up:'$R{requestParentURI}',options:'?method=OPTIONS'}"</js> |
| ) |
| </p> |
| <p> |
| Typically you're going to simply want to use the <c>title</c> and <c>description</c> annotations |
| which apply to both the page title/text and the swagger doc: |
| </p> |
| <p class='bcode w800'> |
| <ja>@RestResource</ja>( |
| title=<js>"System properties resource"</js>, |
| description=<js>"REST interface for performing CRUD operations on system properties."</js>, |
| pageLinks=<js>"{up:'$R{requestParentURI}',options:'?method=OPTIONS'}"</js> |
| ) |
| </p> |
| <li><dc>RestResource.stylesheet()</dc> can now take in a comma-delimited list of stylesheet paths. |
| <li><dc>StreamResource</dc> can now contain multiple sources from a variety of source types (e.g. <c><jk>byte</jk>[]</c> arrays, <c>InputStreams</c>, <c>Files</c>, etc...) |
| and is now immutable. It also includes a new <dc>StreamResourceBuilder</dc> class. |
| <li>Simplified remoteable proxies using the <c><ja>@RestMethod</ja>(name=<js>"PROXY"</js>)</c> annotation on REST methods. |
| Used to expose interface proxies without the need for <dc>RemoteableServlet</dc>. |
| <p class='bcode w800'> |
| <jc>// Server side</jc> |
| <ja>@RestMethod</ja>(name=<js>"PROXY"</js>, path=<js>"/myproxy/*"</js>) |
| <jk>public</jk> IAddressBook getProxy() { |
| <jk>return</jk> <jf>addressBook</jf>; |
| } |
| |
| <jc>// Client side</jc> |
| RestClient client = RestClient.<jsm>create</jsm>().rootUrl(<jf>samplesUrl</jf>).build(); |
| IAddressBook ab = client.getRemoteableProxy(IAddressBook.<jk>class</jk>, <js>"/addressBook/myproxy"</js>); |
| </p> |
| See {@link oajr.annotation.RestMethod#name() @RestMethod(name)} for more information. |
| <li>{@link oajr.RestRequest#toString()} can be called at any time to view the headers and content of the request |
| without affecting functionality. Very useful for debugging. |
| <li>{@link oajr.annotation.RestMethod#name() @RestMethod(name)} annotation is now optional. Defaults to <js>"GET"</js>. |
| </ul> |
| |
| <h5 class='topic w800'>org.apache.juneau.rest.client</h5> |
| <ul class='spaced-list'> |
| <li>Revamped the client API to use builders. |
| <li>New doc: <del>1.5 - Debugging</del> |
| <li>The <c>RestClient</c> class <c>doX(Object url)</c> methods now handle HttpClient <c>URIBuilder</c> instances. |
| <li>New methods added/updated to {@link oajrc.RestClient}: |
| <ul> |
| <li><dc>RestClient.getRemoteableProxy(Class,Object)</dc> - For interface proxies defined using <c><ja>@RestMethod</ja>(name=<js>"PROXY"</js>)</c>. |
| <li><dc>RestClient.getRemoteableProxy(Class,Object,Serializer,Parser)</dc> - Same as above, but overrides the serializer and parser defined on the client. |
| <li>{@link oajrc.RestClient#doPost(Object) doPost(Object)} |
| <li>{@link oajrc.RestClient#doCall(HttpMethod,Object,Object) doCall(HttpMethod,Object,Object)} - Can now pass in instances of {@link oajrc.NameValuePairs} for easy form posts. |
| <br>This extends to all methods that take in the input. |
| </ul> |
| <li>New methods on {@link oajrc.RestCall}: |
| <ul> |
| <li>{@link oajrc.RestCall#uri(Object) uri(Object)} |
| <li><dc>query(String,Object,boolean,PartSerializer)</dc> |
| <li>{@link oajrc.RestCall#query(String,Object) query(String,Object)} |
| <li>{@link oajrc.RestCall#queryIfNE(String,Object) queryIfNE(String,Object)} |
| <li>{@link oajrc.RestCall#query(Map) query(Map)} |
| <li>{@link oajrc.RestCall#queryIfNE(Map) queryIfNE(Map)} |
| <li>{@link oajrc.RestCall#query(String) query(String)} |
| <li><dc>formData(String,Object,boolean,PartSerializer)</dc> |
| <li>{@link oajrc.RestCall#formData(String,Object) formData(String,Object)} |
| <li>{@link oajrc.RestCall#formDataIfNE(String,Object) formDataIfNE(String,Object)} |
| <li>{@link oajrc.RestCall#formData(Map) formData(Map)} |
| <li>{@link oajrc.RestCall#formDataIfNE(Map) formDataIfNE(Map)} |
| <li><dc>header(String,Object,boolean,PartSerializer)</dc> |
| <li>{@link oajrc.RestCall#header(String,Object) header(String,Object)} |
| <li>{@link oajrc.RestCall#headerIfNE(String,Object) headerIfNE(String,Object)} |
| <li>{@link oajrc.RestCall#headers(Map) headers(Map)} |
| <li>{@link oajrc.RestCall#headersIfNE(Map) headersIfNE(Map)} |
| <li>{@link oajrc.RestCall#host(String) host(String)} |
| <li>{@link oajrc.RestCall#port(int) port(int)} |
| <li>{@link oajrc.RestCall#userInfo(String,String) userInfo(String,String)} |
| <li>{@link oajrc.RestCall#userInfo(String) userInfo(String)} |
| <li>{@link oajrc.RestCall#scheme(String) scheme(String)} |
| </ul> |
| <li>New methods added to {@link oajrc.RestClientBuilder}: |
| <ul> |
| <li>{@link oajrc.RestClientBuilder#executorService(ExecutorService,boolean) executorService(ExecutorService,boolean)} |
| <li>{@link oajrc.RestClientBuilder#paramFormat(String) paramFormat(ExecutorService,boolean)} |
| <li><dc>RestClientBuilder.plainTextParams()</dc> |
| <li>{@link oajrc.RestClientBuilder#noTrace() noTrace()} - Adds a <c>No-Trace: true</c> header on all requests to prevent |
| the servlet from logging errors. |
| <br>Useful for testing scenarios when you don't want the console to end up showing errors done on purpose. |
| <li>{@link oajrc.RestClientBuilder#debug() debug()} now adds a <c>Debug: true</c> header on all requests. |
| </ul> |
| <li>New methods added/updated to {@link oajrc.RestCall}: |
| <ul> |
| <li>{@link oajrc.RestCall#runFuture() runFuture()} |
| <li>{@link oajrc.RestCall#getResponseFuture(Class) getResponseFuture(Class)} |
| <li>{@link oajrc.RestCall#getResponseFuture(Type,Type...) getResponseFuture(Type,Type...)} |
| <li>{@link oajrc.RestCall#getResponseAsStringFuture() getResponseAsStringFuture()} |
| <li>{@link oajrc.RestCall#serializer(Serializer) serializer(Serializer)} - Override the serializer defined on the client for a single call. |
| <li>{@link oajrc.RestCall#parser(Parser) parser(Parser)} - Override the parser defined on the client for a single call. |
| <li><dc>input(Object)</dc> - Now accepts instances of {@link oajrc.NameValuePairs}. |
| <li>{@link oajrc.RestCall#getResponse(Class) getResponse(Class)} - Can now pass in any of the following: |
| <ul> |
| <li>{@link org.apache.http.HttpResponse} - Returns the raw <c>HttpResponse</c> returned by the inner <c>HttpClient</c>. |
| <li>{@link java.io.Reader} - Returns access to the raw reader of the response. |
| <li>{@link java.io.InputStream} - Returns access to the raw input stream of the response. |
| </ul> |
| </ul> |
| <li>New methods added to {@link oajrc.NameValuePairs}: |
| <ul> |
| <li>{@link oajrc.NameValuePairs#append(String,Object) append(String,Object)} |
| <li><dc>append(String,Object,PartSerializer)</dc> |
| </ul> |
| <li>{@link oajrc.RetryOn} is now an abstract class with an additional method: |
| <ul> |
| <li>{@link oajrc.RetryOn#onResponse(HttpResponse) onResponse(HttpResponse)} |
| </ul> |
| </ul> |
| |
| <h5 class='topic w800'>org.apache.juneau.microservice</h5> |
| <ul class='spaced-list'> |
| <li><js>"REST/port"</js> configuration setting can now be a comma-limited list of port numbers to try. |
| <br>You can also specify one or more <c>0</c>s to try a random port. |
| <li>Methods added to <dc>RestMicroservice</dc> class: |
| <ul> |
| <li><dc>getPort()</dc> |
| <li><dc>getURI()</dc> |
| <li>Override methods added from {@link oaj.microservice.Microservice} class for easier method chaining. |
| </ul> |
| </ul> |