The following is a quick brain dump of my progress. No promises on spelling here. It's 1:30am on a Friday after a particularly long week.
Active MQ is Gone:
I've eliminated ActiveMQ and replaced it with basic web service calls from the generators. REST wasn't in rails the last time I developed a full app. I like what they've done with the 2.0. It has a decidedly CRUD feel all the way through.
The switch from AMQ to REST greatly simplified communications mechanism and got around a limitation in the way the rails plug-in for AMQ handles, or rather doesn't handle temporary queues.
I'll post the communication message call flow as soon as I'm done testing it (see generator perl below).
UI Update / Schema
Most of the admin UI is built. I used Active Scaffold. It took a while, but I figured out how to organize the UI work flow so that it worked around Active Scaffold limitations.
This did require a change to the schema, but it's a really good change. I was previously keeping team information in the owners table.
The Owners table had the columns project_id, person_id, manager_id. The applicaiton logic stated that if person_id == manager_id then that person was the manager of the team.
I found myself writing a lot of code to deal with this logical relationship and when I tried to make it work with active scaffold it really started to hurt. So I changed the schema.
Now there is a Team table:
class CreateTeams < ActiveRecord::Migration
def self.up
create_table :teams do |t|
t.integer :project_id
t.integer :person_id (this is the manager)
t.timestamps
end
end
And the Owners Table now looks like this:
class CreateOwners < ActiveRecord::Migration
def self.up
create_table :owners do |t|
t.integer :team_id
t.integer :person_id
t.timestamps
end
end
I deleted a tun of code and acivescaffold just works!
Convetion over configuration every time!!!
Giving Active Scaffold a Push - Dynamic action_links
For the sake of UI consistency I did make one hack on top of Active Scaffold. I needed a link at the top of the table that had a dynamic value in it. On the teams table I wanted a link to add a new team and I needed to pass the current project ID. That requires a fair rewrite of the way active scaffold passes parameters when creating action links.
Instead of doing it the hard way I just replaced the links by modifying the resulting pages DOM with some JavaScript. http://code.google.com/p/thesisdev/source/browse/trunk/controller/app/views/teams/for_project.html.erb
CGI::Session::CookieStore::CookieOverflow
Every project has a bug that just scares the crap out of me. Getting 500 server errors because of a Cookie overflow was that bug for me. It happened at random on certain pages. It turned out to be the way I was using Active Scaffold.
I was rendering with this line
:active_scaffold => 'teams',Apparently Active Scaffold stores constrains in the session object. So after refreshing a few times and the leaving and returing to this page BOOOOOMM!!! All that project info was stored in the cookie and it overflowed its 4k limit.
:constraints => {:project_id => @project}
The fix was simple. Just change @project to @project.id so the new code is
:active_scaffold => 'teams',And that get's rid of the cookie overflows.
:constraints => {:project_id => @project.id}
Active Scaffold Sortable is a lie!
There's this amazing screencast showing a rails plugin that allows you to drag and drop records to reorder them. When I install the plugin I can't even get the server to start. I've tried every permutation of rails/active_scaffold version I can think of, posted emails on forums and even emailed the developer. Result = silence.
Based on the other forum posts it appears the code worked for a brief window when stars aligned and no one touched the active_scaffold code base. That time passed, and no one tagged the source tree, so it is lost forever. Sadly I'm giving up on sortable, and will have to figure out some other way to order bug lists and table column headers.
Generator Perl:
The perl package that enables the generator to talk to the controller via REST is written. Testing with the controller commences tomorrow.
I still have to integrate this with the generator, but I had a look through the generator logic and it's all neatly contained in a single well documented script. [Thank you me from 5 years ago!] Once the controller is tested I'll be able to drop the communication package in, and add/edit a few simple lines, to make the controller the master of the generators workload.
Deployment:
Three Red Hat Linux Virtual Machines should be available early next week so I can test the system in a truly distributed fashion.
What's Left in Development:
- Error checking logic for adding teams, owners and administrators
- Changing the generator to listen to the controller
- Controller / generator integration
- Controller UI for generators and generations
- Cloning Projects, Bug_Lists and Teams
- Lots of testing
- Deployment to the test bed
Once it's deployed I'm going to start writing my paper. The applicaion will have 3 weeks of real life soak time while I'm writing.
While I don't plan to deploy it in production before I finish the thesis, it should be very obvious if there are any problems with the system.