Skip to end of metadata
Go to start of metadata

 

Environment

Wicket 8.0 requires at least Java 8

Wicket 8.0 requires Servlet 3.1 (Jetty 9.2+, Apache Tomcat 8+, JBoss WildFly 10+)

API changes

Changes to org.apache.wicket.ajax.json.*  WICKET-6287 - Switch from json.org to open-json Resolved

Because of license issues all json.org classes in that package have been removed and open-json (https://github.com/tdunning/open-json) is used as new dependency. Basic functionalities can be reused by only changing the imports from org.apache.wicket.ajax.json.* to org.json.*, org.apache.wicket.ajax.json.JsonFunction has been renamed to org.apache.wicket.ajax.json.JSONFunction and some classes are deleted without any replacements (example: org.json.HTTP)

Deprecate org.apache.wicket.util.IProvider  WICKET-6060 - Deprecate org.apache.wicket.util.IProvider Closed

Replace it with standard Java 8 java.util.function.Supplier<T> which is virtually identical.

Deprecate org.apache.wicket.util.IContextProvider  WICKET-6118 - Deprecate org.apache.wicket.util.IContextProvider Resolved

Replace IContextProvider<T, C> with standard Java 8 java.util.function.Function<C, T> which is virtually identical.

As a consequence IPageManagerProvider, IPageRendererProvider and IRequestCycleProvider now override #apply() method instead of #get().

Deprecate org.apache.wicket.protocol.http.documentvalidation.HtmlDocumentValidator  WICKET-6119 - Deprecate HtmlDocumentValidator Resolved

Tests based on HtmlDocumentValidator are very fragile. They start to fail as soon as there is a single character change somewhere in the page markup.

We believe that there are very few users of this API. It is recommended to use TagTester and WicketTestCase#executeTest() instead.

Deprecate org.apache.wicket.model.AbstractReadOnlyModel

Use an anonymous instance of IModel instead. Since Wicket 8.0 IModel doesn't require providing implementation of #setObject(Object) method.

IGenericComponent's setter methods now return the current instance for method chaining

All specialization classes return their type.

AjaxButton, AjaxLink and AjaxFallbackButton event callback methods no longer get form as second argument  WICKET-6184 - Remove form argument from AjaxButton and AjaxLink callbacks Resolved
 

For consistency with other components and the new lambda support, the submitted form is no longer passed as argument to callback methods (e.g. #onSubmit(), #onClick()) of AjaxButton, AjaxLink and AjaxFallbackButton. You can call #getForm() instead.

 

RequestCycle#find(Class<T>) returns java.util.Optional  WICKET-6189 - Return Optional<T> from RequestCycle.find(Class<T>) Resolved

 

Code calling RequestCycle#find(Class<T>) has to check whether  a matching IRequestHandler is found. This is now enforced by returning an Optional<T>:

RequestCycle.find(Class<T>)  Expand source

Silent API break

During migration you should check your old code for places where the AjaxRequestCycle (now an Optional<AjaxRequestTarget>) is compared with null:

Pitfall when comparing with null  Expand source

AjaxFallback** components now use java.util.Optional   WICKET-6104 - Rework AjaxFallback** components to use java.util.Optional for their #onEvent methods Resolved

All AjaxFallback** components and the containers which use internally AjaxFallback** components, like AjaxTabbedPanel, RatingPanel and TableTree, have been reworked to pass Optional<AjaxRequestTarget> instead of just AjaxRequestTarget to their onXyz() callback methods. This way the application developer should not forget to check that the AjaxRequestTarget is not null. 

AbstractChoice#getChoices() is 'final' now   WICKET-6132 - AbstractChoice#getChoices() should be final Resolved

AbstractChoice#getChoices() has been made final. If the application needs to provide different choices for each render then it should override AbstractChoice#getChoicesModel() instead. The application code would be almost the same as before, it will just need to wrap the final List result in an IModel, most probably ListModel.

ListenerInterfaceRequestHandler simplification WICKET-6137 - ListenerInterfaceRequestHandler simplification Resolved

RequestListenerInterface was removed:

  • IResourceListener, IBehaviorListener, IOnChangeListener, ILinkListener are replaced by the generic method IRequestListener#onRequest()
  • ListenerInterfaceRequestHandler was renamed to ListenerRequestHandler
  • Component's and Behavior's #canCallListenerInterface() were renamed to #canCallListener()
  • PageSettings#getCallListenerInterfaceAfterExpiry() was renamed to #getCallListenerAfterExpiry.

A Component or Behavior can now implement IRequestListener once only, thus removing the need to include an identifier (e.g. "ILinkListener") in the URL.

wantOnSelectionChangedNotifications moved to FormComponentUpdatingBehavior  WICKET-6348 - New FormComponentUpdatingBehavior to replace wantOnSelectionChangedNotifications() Resolved

Change notification was moved from CheckBox, DropDownChoice, RadioChoice, CheckGroup/Check and RadioGroup/Radio into a new behavior FormComponentUpdatingBehavior.

Instead of subclasses the component, this behavior can now be added to the component:

FormComponentUpdatingBehavior

As with AjaxFormComponentUpdatingBehavior any error during processing of the form component can now be handled in #onError().

Renderers are IDetachable now  WICKET-6347 - IChoiceRenderer implements IDetachable Resolved

Renderers (IChoiceRendere, IOptionRenderer and IAutoCompleteRenderer now take part in detachment as other Wicket concepts like components and models. The owning component is responsible to detach it.

Behavior changes

FormComponentPanel delegates the call to #clearInput to its FormComponent children  WICKET-6114 - FormComponentPanel#clearInput() should delegate to its FormComponent children Resolved

FormComponent#clearInput() has been made non-final, so that now containers like FormComponentPanel could override this method and call #clearInput() on its children of type FormComponent.

Use DynamicJQueryResourceReference by default  WICKET-6188 - Use DynamicJQueryResourceReference by default Resolved

By using org.apache.wicket.resource.DynamicJQueryResourceReference Wicket will contribute jQuery ver. 2.x for modern browsers and ver. 1.x when the request is done by Internet Explorer older than ver. 9.

AuthenticatedWebSession#singOut() now is an alias of Session#invalidate()  WICKET-6228 - Hide AuthenticatedWebSession#signOut() from the public API Resolved

The old behavior of #signOut() didn't bring much value and caused confusion to some users. Now it is just an alias of Session#invalidate().

SecuritySettings#enforceMounts(true) now disables BookmarkableMapper   WICKET-6161 - SecuritySettings.setEnforceMounts() should be applicable for all kind of pages Resolved

If this setting is enabled then a page could not be requested via /wicket/bookmarkable/com.example.PageName. A page has to be explicitly mounted at MyApplication#init() to be able to request it.

WicketObjects#sizeof() and #cloneObject() should not use IObjectCheckers   WICKET-6334 - WicketObjects#sizeof() and #cloneObject() should not use IObjectCheckers Resolved

WicketObjects#cloneObject() and #sizeof() now create a new instance of JavaSerializer to clone or take the size of an object respectively.

If the configured ISerializer in the IFrameworkSettings is not an instance of JavaSerializer then it is used as is!

StatelessChecker throws StatelessCheckFailureException (a WicketRuntimeException) instead of IllegalStateException     WICKET-6343 - Add hook method for exception handling to StatelessChecker Resolved

StatelessChecker now provides an overrideable method named #fail() that accepts an instance of StatelessCheckFailureException. This method is being called

whenever the checker finds a problem. By default the exception is being thrown but the application may decide to do something else with it, e.g. to log it.


Removals

Drop Tomcat 7.x, Jetty 7.x and Jetty 9.0.x modules for Wicket Native WebSocket  WICKET-5990 - Upgrade Jetty usage in Wicket tests/quickstart to Jetty 9.3.x Resolved  
JIRA Issues Macro: Unable to locate JIRA server for this macro. It may be due to Application Link configuration.

Since Wicket 8.x requires Servlet 3.1 the modules for native websocket support for Jetty 7.x/9.0.x have been dropped.

Users are advised to use wicket-native-websocket-javax module with Jetty 9.2+, Apache Tomcat 7/8, JBoss WildFly.

Drop Atmosphere module 
JIRA Issues Macro: Unable to locate JIRA server for this macro. It may be due to Application Link configuration.

The experimental integration for Atmosphere has been removed because of stability issues.

Users are advised to use wicket-native-websocket-javax module with Jetty 9.2+, Apache Tomcat 7/8, JBoss WildFly.

Remove deprecated classes WICKET-6004 - Wicket 8 cleanup - TODOs and deprecated methods Resolved

Several deprecated classes where removed:

  • IMountedRequestMapper and implementation
  • ZeroPaddingIntegerConverter
  • WildcardCollectionModel, WildcardListModel, WildcardSetModel - use the corresponding classes without "Wildcard"-prefix instead
  • PropertyResolver.IClassCache is replaced by PropertyResolver.IPropertyLocator

Improvements

Casting helper Model#of(IModel<?> model)

The helper method for casting of models was moved from Model to IModel#of(IModel<?>).

IModel uses Java 8 default interface method for IDetachable#detach()   WICKET-6115 - Provide default implementation of IDetachable#detach() in IModel Resolved

For convenience IModel class provides a do-nothing implementation of IDetachable#detach() method, so custom implementations are not required to implement it when not needed.

IRequestHandler uses Java 8 default interface method for IRequestHandler#detach()   WICKET-6146 - Provide default implementation of IRequestHandler#detach() Resolved

For convenience IRequestHandler class provides a do-nothing implementation of its #detach() method, so custom implementations are not required to implement it when not needed.

ResourceStreamResource now receives Attributes as a parameter to its #getResourceStream() method  WICKET-6113 - Improve ResourceStreamResource API by passing Attributes to #getResourceStream() Resolved

For access to the response, the request and its parameters now ResourceStreamResource#getResourceStream() receives an instance of org.apache.wicket.request.resource.IResource.Attributes.

 

Provide serializable versions of java.util.function.(Supplier|Consumer|Function|BiConsumer)  WICKET-5991 - Introduce models which use Java 8 supplier/consumer Resolved

java.util.function.Consumer and other classes are not serializable and this makes them unusable in stateful Wicket pages. For this reason Wicket provides org.apache.wicket.model.lambda.WicketSupplier, org.apache.wicket.model.lambda.WicketConsumer, org.apache.wicket.model.lambda.WicketFunction and org.apache.wicket.model.lambda.WicketBiFunction. Those interfaces should be used in method signatures where Java 8 lambdas or method references could be used. At the call site there is nothing specific to be done, i.e. just use lambdas and method references without any casting.

 

Provide IModel implementations which make use of Java 8 lambdas and method references  WICKET-5991 - Introduce models which use Java 8 supplier/consumer Resolved

Wicket provides a new implementation of IModel which uses Java 8 consumers and suppliers, i.e. may be used with lambda or method references

  • org.apache.wicket.model.LambdaModel

    LambdaModel  Expand source
  • org.apache.wicket.model.LambdaModel with method references

    LambdaModel.of()  Expand source
  • org.apache.wicket.model.LambdaModel can be created with a target model too - note the upper-case 'P' for the function references:

    LambdaModel.of(target, ...)  Expand source

IGenericComponent is a mixin/trait interface  WICKET-6117 - Make IGenericComponent a mixin/trait so it could be easily reused in custom components Resolved

IGenericComponent uses Java 8 default methods to implement #setModel(IModel<T>), #getModel(), #setModelObject(T) and #getModelObject() by delegating to the respective get/setDefaultModel[Object] methods.

This way it could be easily used by any Component by just implementing it.

IModel is a @FunctionalInterface now

IModel provides default implementations of #detach() (do nothing) and #setObject(T) (throws UnsupportedOperationException), so it is possible to use it as a functional interface.

IModel as functional interface  Expand source

Provide LambdaColumn - IColumn implementation that uses java.util.function.Function  WICKET-6121 - use lambdas for columns Resolved

LambdaColumn  Expand source

IColumn uses Java 8 default interface method for IColumn#isSortable()  Git commit

For convenience IColumn class provides an implementation of #isSortable() method that uses #getSortProperty() to decide. Just like AbstractColumn did until Wicket 7.

IColumn provides methods for column's header rowspan/colspan  WICKET-6095 - Multiline headers in DataTable Resolved

New methods have been added to help manipulating the tables' headers: IColumn#getHeaderColspan() and IColumn#getHeaderRowSpan(). Both of them return 1, so the header cells do not span by default.

 

IRequestCycleListener notified of all IRequestHandlers  WICKET-6129 - IRequestCycleListener not notified of all executed handlers Resolved

IRequestCycleListeners are now notified of the execution of all IRequestHandlers, including those scheduled by other handlers, those replacing other handlers, and any handler executed due to an exception:

  • #onRequestHandlerResolved(RequestCycle, IRequestHandler) - any handler to be executed
  • #onRequestHandlerExecuted(RequestCycle, IRequestHandler) - any handler successfully executed without an exception

RequestHandlerStack is now renamed to RequestHandlerExecutor.

Add IPageManager#removePage(IManageablePage)  WICKET-6336 - Add #removePage(IManageablePage) to IPageManager Resolved

With this method now an application may explicitly expire pages selectively.

Dependency updates

All libraries on which Wicket modules depend are updated to their latest stable versions.
The most notable ones are:

  • Spring Framework 4.3.x
  • Jetty 9.4.x (used in the Quickstart application archetype and for internal Wicket testing)
  • Mockito 2.x (for internal testing)
  • Depend on com.github.openjson:openjson instead of using local copies of org.json/com.tdunning:open-json

 

  • No labels