I’ve been hard at work finishing the Controller chapter for San Gria and wanted to come up with fun and practical encoders example.

Our main example app for hubbub is a twitter clone, and as I was working on the UI, and I was thinking “I wonder if we could add a TinyUrl facility? Actually, how about a TinyUrlCodec? Could probably do it in a one-liner, right?”

class TinyUrlCodec {
    static encode = { fullUrl ->
        new URL("http://tinyurl.com/api-create.php?url=${fullUrl.encodeAsURL()}").text
    }
}

Which makes the controller implementation a snack!

def tinyurl = {
    def tiny =  params.fullUrl.encodeAsTinyUrl()
    log.debug "Encoded ${params.fullUrl} to ${tiny}"
    render tiny
}

But you’re keen to see it in action, right?

A TinyUrl codec in action

But I’m going to need a little AJAX sauce to integrate the remoteForm with the dynamic adding to the textarea…

<g:form style="padding:1em; border: 1px dotted black; ">
 TinyUrl:
 <g:textField name="fullUrl"/>
 <g:submitToRemote action="tinyurl" onSuccess="addTinyUrl(e)" value="Make Tiny"/>
</g:form>

With some matching Javascript goodness to catch the XmlHttpRequest…

<g:javascript>

        function addTinyUrl(e) {
            var tinyUrl = e.responseText
            $("postContent").value += tinyUrl
            updateCounter()
        }	

</g:javascript>

Anyways, it could probably do with a little more robust error handling, but it’ll be fine for a Codec example. The controllers chapters is almost done, which leaves only the Views chapter to get done next week. Grails in Action MEAP subscribers will receive a bunch of chapters next week (I think there’s 6 going out, including stuff about JMS, Quartz, Plugins, Build Scripts, Maven and all that, developer lifecycle and other tidbits).

The final chapters for the book will be coming out in January. And it’s off to final edits in February before it heads off to the printer. If Sven and I can get a BOF off the ground, I’ll be giving away copies at JavaOne!