There exist two independent predecessors of this framework that were used as inspiration:
- gengui: This was the first implementation that was done with Swing for the desktop and AjaxSwing as an addon for web transformation of the Swing code. It was the first one to define the idea of a naked objects framework like this. The core concepts about how the framework should behave and how the intelligent models should be coded originates from there.
- nocket (previously codenamed DMDWebGen): This implementation was based on Wicket and was using twitter-bootstrap 2.x.x and custom developed components. It was reusing the concepts of gengui, as well as code of its reflection API and applied it to a more web like development paradigm.
Something Resembling History
The following differences exist between this framework and the other two:
- This framework shares no code with those and is a complete rewrite. It shares only the core ideas and diverges in implementation details.
- The parts where intelligent models (domain objects called there) diverge most are in the use of different annotations and the handling of tabbed panels. Also the @BeanPathRedirect used here can rewrite complete bean paths (by changing the type of a property) instead of just being able to decorate bean path end points (which you can still do to add utility methods) as the gengui @Decorate annotation does. The solution here is thus more versatile.
- Complex custom validators that validate against other model fields have become more intelligent and do not require a @Eager workaround for the order of synchronization. Instead the validators get called once more after valid properties have been synchronized from the browser to the model to allow complex validators to produce a correct result the second time.
- The new implementation tries to fix a few bad design decisions and code smells of the previous implementation. Especially inside the GuiService by dividing the concerns of GuiTasks instead of implementing everything in one complicated class that is hard to debug. Also the reflection API was tried to be improved by introducing invesdwin-norva as an independent framework.
- The reflection part is based on invesdwin-norva which allows the bean path constants class generator to work as an annotation processor. This fixes a nasty productivity problem with refactorings of models: Previously the compiler and generator would lock out the developer when the constants generator failed, because the model cannot be compiled, because a bean path constant from the constants class is referenced for which the model element was renamed. It was quite tricky previously to work around cases like these during refactorings. With the new solution of switching to java source based processing using javax.lang.model instead of java reflection on bytecode, the generator still runs on model classes that do not compile completely, so the constants are already there when the model needs to be actually compiled or manually fixed.
- Instead of building most components from scratch, this framework reuses open source solutions like wicket-bootstrap. This results in higher quality and extensible components, better bootstrap integration and better maintainability. Also the paradigm how tables are bound is different here. Instead of using table templates in the HTML, a more generic table tag is used with the possibility to customize the table using a BindingInterceptor. This removes refactoring intensive code from the HTML file and reduces the overall code required to implement the table component. Filtering and ordering table columns is still possible using @Hide or the hideXyz utility method and via @ColumnOrder or the columnOrder utility method.
- Modal dialogs have been simplified by reusing the bootstrap-modal library and building on intelligent model based dialogs. The decision was made to stay away from a callbacks based alternative since it resulted in a switch of paradigm that is unnecessary.
- Instead of implementing a custom security layer, spring-security and apache shiro were integrated as more versatile providers in this regard.
- Paradigms that originated from desktop development were ignored to favor ones that feel more aligned with Wicket and web development.
- This implementation aims to be developer friendly by providing helpful error messages and warnings about common development problems where possible. Also this project aims to be easily accessible by providing a comprehensive documentation.
This framework would not exist without the work on the other ones and the people behind them. The other frameworks still have valid use cases today and a plethora of applications built with them. The reference on them here is made to praise them and to highlight the differences between these frameworks. This framework owes them a lot and is thankful that they got open sourced as well.