Category Archives: ColdBox

Playing with ColdBox request context decorators

I am working on a project that will eventually require a login. That being said, it would be nice to always have information for the currently logged in person stored in the PRC. ColdBox has a built in class fittingly called RequestContextDecorator which will easily handle this.

Here is a basic request context decorator:

There is not a lot going on here but I will cover the basics. First, a request context decorator must extend coldbox.system.web.context.RequestContextDecorator. Next a configure() method is required that will modify how the request contexts behave once they are created. Getting the original request context is handled by calling the getRequestContext() function and additionally you can get the private RC by calling getRequestContext(private = true).

Now you can modify the RC and PRC with any values you like. For extra points I have included getting ColdBox settings as well as getting an instance of a service through Wirebox.

ColdBox interceptor example

I have been using ColdBox for quite some time but the other day I decided to step out of my comfort zone and try to learn some new things about the framework. Interceptors are a feature of ColdBox that look really interesting but I have never looked into so I thought it would be a good time to check it out.

Quoting the documentation on the Wiki, interceptors are “ to increase functionality for applications and framework alike, without touching the core functionality or events, and thus encapsulating logic into separate decoupled objects.” This functionality can be bound to specific events in a request cycle and even create custom interception points and call those events with the announceInterception() method. Awesome stuff!

One of my first open-sourced projects I did was a utility called WhosOnCFC and I thought it would be a good starting point for my first ColdBox interceptor. When a browser views the web site it checks an internal list of the known clients and if the client is not known it tracks some basic information on the browser such as IP address, current URL and the user agent. On subsequent page loads it will update the current URL and time. Traditionally this would be handled in Application.cfc in onRequestStart() so lets see how to handle this with a ColdBox interceptor.

This is the basic layout for an interceptor. The configure() method is required but as this is a very simple interceptor no additional configuration is needed so it is empty..

Next is the afterAspectsLoad() method which is triggered once the application has started. It is ColdBox’s approximation of onApplicationStart(). This is where the instance of WhosonTracker is created and set in the Object Cache Manager so it will persist between requests.

Finally there is the preProcess() method which will execute on every page load. The method will grab the instance of the tracker from the OCM and call the trackHit() method which is where the magic happens.

If you were writing your own interceptor you could bind to as many or as few events as you like. These two events will do for this example.

Now lets take a look at the component that will be doing the work for us, WhosonTracker.cfc. Basically, when initialized we create an array that will store our client data. The trackHit() method is our meat and potatoes. Every request it will check to see if the client is known and either create a new client or update the current clients information. It will also clear out any clients that have not updated in the last five minutes.

There is also a getData() method that our handlers/services can use to get a listing of clients we can output.

Finally we need to register our interceptor with ColdBox so it is executed. Once the application is reloaded the new interceptor should be called on every page request..

As you can see it is easy to create your own interceptors. I did some searching while trying to figure things out and there is tons of documentation out there and a few recipes on the ColdBox site for creating your first interceptor, but it did not really walk you through the process. Hopefully someone may find this useful.

The full code listing is available here:

There you can find some additional code such as the handlers and views to output the data. My development server removes the /index.cfm from the URL by default so if your server does not support SES URLs, edit /config/Routes.cfm on line 15 and add /index.cfm to setBaseURL().

MovieBox demo app on GitHub

Just a quick note, I have a project up on GitHub called MovieBox. This was based on keyStream by Cory Fail, but is built on top of the ColdBox framework. Right now it is in a holding pattern because I am going to rewrite it using AngularJS for the frontend and Taffy for the backend REST API. I have been wanting a good learning project for Angular, bower, gulpjs, et al so this will be my guinea pig..

This project does have some pretty good bits, it can scan a directory of movies and pull the metadata from and update your library accordingly. You will need to specify the default location of your movie directory which is set in /config/Coldbox.cfc under custom settings. Currently the indexer does not run automatically, it must be forced by calling http://localhost/wtf/indexMovies. There is a SQL script for the database creation (mySQL format, but may work on others) to setup the database schema. It expects a data source named moviebox to be setup in the web/server administrator. Additionally, it is assumes the movies are stored as X:/movies/moviename or even better X:/movies/moviename (year).

All videos should be available to the web server under the /media directory. Assuming you are using Nginx as the front end proxy it is an easy as creating an alias in your site definition, but it should be easy enough to do in other servers.

If your server does not support SES URLs you must edit the /config/Routes.cfm and add “index.cfm” to the setBaseURL() line. Also, I would definitely recommend using the development branch as it is the most updated (and also contains the SQL script for database generation).

Aside from that, everything should work great. 🙂  The indexer will attempt to download the movie poster and backdrop and will copy the data into the movie folder as well as the data folder under the web root. If the data folder does not exist it will be created for you. If you have a lot of data, expect the initial look up to take a while. Subsequent scans will ignore titles that are already known.

You can check it out here:

CommandBox is not just for ColdBox

A few weeks ago I think it was Ray who had posted something about CommandBox. I had heard about it before its release, but I totally missed it when it was unveiled at Into the Box.

I have to say it has quite a few features that I really love. Being able to completely setup a ColdBox application scaffold with just one command is great. The package management system is another awesome feature in and of itself; one that other languages have had a leg up on ColdFusion for a very long time.

One feature that might be easily overlooked (I certainly did) is the embedded server. I did play around with it initially then I promptly forgot all about it. Which brings me to today when I wanted to check out a project from github (Taffy, but that is another post), I wasn’t anywhere near my home machine and I really didn’t want to install Railo Express just to test something out. Turns out it wasn’t an issue, I just extracted all the files out to a directory, fired up CommandBox, typed “server start” and fired up a Railo server I could play around with without any additional configuration needed.

Incidentally, you can access the web/server administrator and it will retain your configuration data for that folder so your settings will persist which also is really awesome.

If you haven’t looked into CommandBox because you don’t use ColdBox it might be worth a look. I look forward to seeing where this project goes in the future. You can see the intro video here: API and ColdFusion

Last week while hanging out in the #coldfusion IRC channel I came across a nifty new app called keyStream created by Cory Fail. In a nutshell, it is a ColdFusion application that allows you to stream your media to your devices while you are attached to your home network. This appeals to my tender sensibilities since I tend to watch movies online more than on a TV.

KeyStream is a great application, one thing that was missing for me was being able to hit an API to pull down movie metadata. If you have a lot of media files it is nice to have an automated way of scanning through a whole directory of files in one fell swoop ala XBMC or comparable media applications. With that in mind, I set to see how difficult it would be to interface with in ColdFusion and I found that it actually was not that difficult.

Here is the TMDBService object for ColdBox although it could easily be ported:

First step though is getting an API key. Cruise over to and sign up for an API key. It is free so even us starving developers can afford it.

Doing a lookup basically requires two steps. First we will pass the movie name in as a string to the findMovie(name, year) function which goes to the APIs /search/movie endpoint. This will return a list of matches back from, if there is an exact match it will be pushed up to the top of the list. Assuming the first position is the movie we want it is time to go to the APIs /movie/{id} endpoint(getMovieData(id) function in the gist if you are following along), passing it the id we got in the first call. This is where we get all the fun stuff such as the poster and backdrop data, overview, release date and IMDB rating. If you would want to see it when viewing your media, this is where you would find it.

To speed the process up a little bit I created the scrape() method that fires these two calls in one swoop. It assumes it will always have an exact match in the movie title, things get a little hairy when there isn’t an exact match but this is still a work in progress.


The final step is to call the APIs /configuration endpoint if you are wanting to download the cover and background art. This data tells you where to look on their image server for the images since they are sorted out by size and then it is just a matter of making a cfhttp call out and downloading the images to your local server. Assuming there is enough interest I could provide a more detailed accounting of getting this done. The finished product could look something like this: