Archives by Month

June

2010

Mapping current grails domain classes to use mongodb

I have a grails app that I am building and wanted try out using mongodb sense i have heard so many good things about it. The quick start guide doesn’t give you and helpful hints on how to map current domain classes to use mongodb. It only helps you create new domain classes to use mongo.

The excerpt below is strait from the wiki of the mongodb plugin for grails github account. Hope this helps some of you out.

The MongoDB Grails plugin is primarily exposed to Grails applications as a Spring bean called ‘mongo’.
Grails classes can then easily make use of it throughout their code by simply adding a ‘mongo’
property to their classes which support dependency injection (domain/controllers/services), eg:

class UserController{
     def mongo
  }

Configuration

At startup the MongoDB plugin will look for a ‘mongo’ configuration property in your
Config.groovy file which defines your MongoDB databases and related configuration
properties.

#Config.groovy

  mongo{
     databases{
        server1{
           host = "localhost"
           port = 1234  // if ommited, will use the default MongoDB port
        }

        server2{
           host = "192.168.1.2"
        }
     }

     shortcuts{
        users = "server1/app/users"
        comments = "server2/app/comments"
     }
  }

The above example registers two different database hosts which can then be accessed using the mongo
bean: mongo.server1.<dbname>.<collection>. ‘dbname’ and ‘collection’ will
return the corrisponding Java MongoDB driver equivalents (DB, DBCollection).

Shortcuts

Shortcuts can also be defined to shorten the syntax required to access a collection by registering a
root-level mongo property directly with a collection. For example, in the above
example we mapped the ‘users’ shortcut to “server1/app/users”, which lets us use mongo.users
instead of mongo.server1.app.users.

Shortcuts have the added benefit of making it easier to change your server topology without having to
change your code; if you were to move your users collection to a different server, you would just update
your alias.

Shortcuts will also be used in the future to reference server-pools.

Mapping Domain Objects

The MongoDbWrapper makes it easy to save and restore your Grails domain objects
to a collection by using mappers which convert your domain objects to BasicDBObjects,
and vice-versa.

To register your Domain class with a mapper you need to add two static helper fields
to your class:

class User{
    String firstName
    String lastName

    static mongoTypeName = "user"
    static mongoFields = ['fn':firstName','ln':'lastName']
  }

When your objects are converted to documents a property ‘_t’ is added to help identify the type.
This type identifier is specified with mongoTypeName. You then specify which fields
should be saved, and their respective keys.

Domain objects can then be coverted to docs by calling the MOP added method “toMongoDoc()”.

def user = new User( firstName:"mark", lastName:"priatel" )
    def userDoc = user.toMongoDoc()

You can also convert documents retured from queries back into their Domain equivilants
using the toObject() method added to BasicDBObject and BasicDBList (via MOP):

mongo.users.find().each{ doc ->
     def userDomainObject = doc.toObject()
  }

The mapper will also process mapped properties and Lists:

class Address{
     String city
     String country

     static mongoTypeName = "address"
     static mongoFields = [ 'ci':'city' , 'co' : 'country' ]
  }

  class User{
    String firstName
    String lastName
    Address address

    static mongoTypeName = "user"
    static mongoFields = ['fn':firstName','ln':'lastName','adrs':'address']
  }

  def adrs = new Address( city:'ottawa' , country:'canada' )
  def user = new User( firstName:'mark', lastName:'priatel',address:adrs)

  mongo.users.save( user.toMongoDoc() )

  (bson)
      { "_id" : ObjectId("4b952284d8e992502c9629e3"), "_t" : "u", "fn" : "mark",
      "ln" : "priatel", "adrs" : { "_t" : "a", "ci" : "ottawa", "co" : "canada" } }

Of course, you can still save your domain objects using GORM.

def user = new User( firstname:"mark" )
  user.save()
  mongo.users.save( user.toMongoDoc() )

MongoDB Document Builder

The mongo bean exposes a special root-level property ‘doc’ which can be used to create
BasicDBObjectS (which are used by the Java driver to represent MongoDB documents) using a
Groovy builder syntax:

def userData = mongo.doc{
     firstName("mark")
     lastName("priatel")
     company("iolog")
     address{
        city("ottawa")
        country("canada")
     }
  }

  mongo.user.save(userData)

  println userData._id

Fix for break points, line numbers, and other UI bugs in Eclipse on OS X

There are a number of small bugs with Eclipse on OS X that you may run into from time to time. Some of the biggest ones that I have seen are line numbers not showing up in the code editor, break points not showing, line numbers not scrolling when you scroll the code window, errors not showing in the code editor and a host of other small things like this with the UI.

This mainly takes place when I go from having a duel display environment to unhooking my laptop from the external monitor or vice versa. Use too think the the only fix for this was restarting OS X after I make the switch from one setup to another but passing an argument to eclipse when it startes up seems to do the trick. Restarting Eclipse is way faster than having to restart OS X.

Here is what you do:
  1. close Eclipse if it is open
  2. open up a terminal window … (if you don’t know what terminal is then you may not really be a developer)
  3. execute Eclipse from terminal and pass it the “clean” argument like so  
$ /Applications/eclipse/eclipse -clean
If eclipse is installed somewhere else on your system then naturally you will need to use the proper path to get to the eclipse directory.

Enable Quick Look for ActionScript and Flex files on Snow Leopard – flash tekkie

  • Download qlcoloecode
  • Copy the downloaded QLColorCode.qlgenerator file to /Library/QuickLook
  • Right-click QLColorCode.qlgenerator
  • Choose Show Package
  • Locate the Info.plist file
  • Find the LSItemContentTypes key and add the following string to the array:
  • com.apple.applesingle-archive

    If you are interested in taking this corse then submit your email. I'll make sure you get a discount for signing up early.