What should be kept from v1:
- Bytecode enhancement. This is a great stuff that enable framework and plugin developer to inject logic into Application code
- A full stack framework. This should like Play which runs on itself instead of inside a servlet container
- Support plugins. Though API might changed
- Handy utility libraries for application developer, like IO, Codec, Images etc.
- Built in simple Secure framework
- The DB layer enable plugin different implementations, JPA, EBean, Morphia etc.
- Built in validation
- Easy to use asynchronous handling API, like Promise and Controller.await
- Before, After, Final, Catch intecepters to plugin logic into request handling chain
- Render with different template based on request.format
- JavaExtension to template
- And most important is Simple, Simple and Simple to application developers
What needs to be improved or changed:
- Routing mechanism. Improve the routing performance for big routing table with more than 100 routes. This might involve code generator to generate routing source code dynamically
- Action invocation mechanism. Reduce the use of reflection, static methods and Exception. But needs to keep the API still simple though
- Plugin API. Support partitioned plugin API set instead of all-in-one big facade
- Replace python stuff with pure script plus Java
- CRUD
- Replace default Groovy template engine with Rythm
- Replace default JPA with Ebean ???
- JSON support
Proposed Controller API:
public class Orders extends Controller { // --- Parameters used in action handling methods @Bind(method = Bind.ByID) protected Order order; // will bind to http request params with Order.findById(params.get("orderId")) @Bind(method = Bind.ById) protected User user; // -- eof Parameters // this use new return style API @Required("orderId") public Result show() { return new Render(order); } // this use old style API @Required("orderId") public void saveUpdate() { notFoundIfNull(user); order.save(); render(order, user); } // this action method will be executed in a separate thread @Async public Result report() { order.save(); Listorders = ... return new RenderPDF(orders); } }
Sample route file:
GET /orders/{orderId} Orders.show POST /orders/{orderId} Orders.saveUpdate GET /orderReport Orders.report
What do you think?