Red Black Tree Visualization using HTML5 Canvas and GWT

I created a sample app that demonstrates HTML5 Canvas usage from Java through GWT. I think GWT is an excellent tool for migrating desktop apps into Web nowadays, especially for Java developers. So it’s worth giving it a try. Google has made significant progress on migrating desktop apps into Web during the last year. They propagated trend for HTML5 support and Javascript JIT compilers among modern browsers. So it’s possible to run Quake 2 or CAD software directly in browser at decent speed. Red Black Tree is a balanced BST tree. Details are described on Wikipedia. You can run this sample app directly on appspot (it works on iPhone too :-) ) Sample code can be found here: Browse on GitHub. Let’s start from initialization. First, we need to create Canvas element and add it to HTML. getContext2D is called to obtain drawing context. We register a timer to redraw frames frequently: So doUpdate is called every 50 ms and whenever redrawFrame is set to true, it redraws Canvas contents. In autoplay mode, we call processFrame in while loop. So whenever redraw procedure takes too long, we will process frames without redrawing them. This won’t slow down animation on low resources. Then, we need to draw a tree. We use drawTree procedure, which is recursive and draws nodes along with contents and connections between them: The best part is that we can do regular Java unit tests on Red Black tree to verify the correctness of implementation:

You May Also Like

Simple trick to DRY your Grails controller

Grails controllers are not very DRY. It's easy to find duplicated code fragments in default generated controller. Take a look at code sample below. It is duplicated four times in show, edit, update and delete actions:

class BookController {
def show() {
def bookInstance = Book.get(params.id)
if (!bookInstance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'book.label', default: 'Book'), params.id])
redirect(action: "list")
return
}
[bookInstance: bookInstance]
}
}

Why is it duplicated?

There is a reason for that duplication, though. If you move this snippet to a method, it can redirect to "list" action, but it can't prevent controller from further execution. After you call redirect, response status changes to 302, but after method exits, controller still runs subsequent code.

Solution

At TouK we've implemented a simple trick to resolve that situation:

  1. wrap everything with a simple withStoppingOnRender method,
  2. whenever you want to render or redirect AND stop controller execution - throw EndRenderingException.

We call it Big Return - return from a method and return from a controller at once. Here is how it works:

class BookController {
def show(Long id) {
withStoppingOnRender {
Book bookInstance = Book.get(id)
validateInstanceExists(bookInstance)
[bookInstance: bookInstance]
}
}

protected Object withStoppingOnRender(Closure closure) {
try {
return closure.call()
} catch (EndRenderingException e) {}
}

private void validateInstanceExists(Book instance) {
if (!instance) {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'book.label', default: 'Book'), params.id])
redirect(action: "list")
throw new EndRenderingException()
}
}
}

class EndRenderingException extends RuntimeException {}

Example usage

For simple CRUD controllers, you can use this solution and create some BaseController class for your controllers. We use withStoppingOnRender in every controller so code doesn't look like a spaghetti, we follow DRY principle and code is self-documented. Win-win-win! Here is a more complex example:

class DealerController {
@Transactional
def update() {
withStoppingOnRender {
Dealer dealerInstance = Dealer.get(params.id)
validateInstanceExists(dealerInstance)
validateAccountInExternalService(dealerInstance)
checkIfInstanceWasConcurrentlyModified(dealerInstance, params.version)
dealerInstance.properties = params
saveUpdatedInstance(dealerInstance)
redirectToAfterUpdate(dealerInstance)
}
}
}