A Cute TinyUrl Codec

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; ">
 <g:textField name="fullUrl"/>
 <g:submitToRemote action="tinyurl" onSuccess="addTinyUrl(e)" value="Make Tiny"/>

With some matching Javascript goodness to catch the XmlHttpRequest…


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


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!

4 thoughts on “A Cute TinyUrl Codec

  1. If you put together a BOF for JavaOne, I’d certainly put that on or near the top of my BOF list for 2009.

  2. You inspired me to do one for Bit.ly

    import grails.converters.*
    class BitlyCodec {
        // This probably should be in config
        static version = '2.0.1'
        static login = 'your_bit.ly_login'
        static apikey = 'R_your_bit.ly_api_key'
        static encode = { fullUrl ->
            def u = "http://api.bit.ly/shorten?version=${version}&longUrl=${fullUrl.encodeAsURL()}&login=${login}&apiKey=${apikey}"
            return JSON.parse( new URL( u ).text ) [ 'results' ][ fullUrl ][ 'shortUrl' ]



    Gives us


  3. And the return should be:

    return JSON.parse( new URL ( u ).text ) [ ‘results‘ ][ fullUrl ][ ‘shortUrl‘ ]

    The comment system here seems to randomly strip bits out 😉

Comments are closed.