Dan Wilson takes over the Model-Glue Framework

Hi everybody,

For the past five years (or so), I've been in charge of the Model-Glue framework. I've hit a standstill in my ability to progress or even maintain the code or the community: my professional work focuses more and more on RIA and J2EE technologies outside of ColdFusion and CFML (although MG + CFML is still my preference for creating HTML sites!).

After working with him and discussing the idea since MAX 2008, I've come to the decision to hand over control of the project and title of "Model-Glue's Benevolent Dictator" to Dan Wilson, a fellow North Carolinian, MG user, and all around great guy. He's been patching and helping MG3 out for about 6 months, and he's accepted a role as the leader of the framework.

Doug Hughes, president of Alagad, Inc. will be working with Dan as a temporary co-leader to help get things ramped up.

Dan's immediate goals (set by him, because he's now in charge!) include:

  • Getting MG3 ready for release at cf.Objective() 2009
  • Moving the Model-Glue site, documentation, and subversion repositories to servers at Alagad

Details of the change:

  • "Team Model-Glue" members (including myself) are now considered an advisory board. We'll help in whatever capacity we're able to, and Dan doesn't answer to us in any way. It's his show, and I have good faith in his decisions.
  • Alagad, Inc. will be providing code and documentation support to get MG3 out the door. This is a huge gift from Alagad to the MG community, and we thank them greatly for it!
  • Model-Glue's licensure will remain the same (ASL 2), but the copyright will change. To ensure that the framework remains community (and not corporate) property, any contributor will be granted credit in the copyright. This will immediately make Model-Glue "Copyright 2009, Raymond Camden, Sean Corfield, Raymond Camden, Doug Hughes, Joe Rinehart, Jared Rypka-Hauer, Chris Scott, Dan Wilson." This is a purposeful move: having this many people with ownership makes it damn near impossible to sell the IP rights to the framework. Unless, that is, some company would like to make an very generous cash offer to each of the contributors ;).

That's all. I've enjoyed working on Model-Glue, but it's obvious I'm just not the guy for it any longer. My open source time will be spent more on the Flex / Java side: I've contributed into the Swiz framework, and I'm working on a Hibernate-fueled data services framework code-named "RedShift" that should simulate the data synchronization bits that are part of LiveCycle Data Services via anything that can subscribe to a JMS bus (like a Flex app!).

On Model-Glue and CodexWiki

On the Model-Glue project, we're working through a number of issues on our upcoming Model-Glue:Gesture release. One hot topic is how to handle documentation. At some point, Codex Wiki was raised. Codex Wiki, as you know, is Wiki Software built using the ColdBox and Transfer Frameworks. The question was raised whether we would use it because it was written in ColdBox, or whether we should develop a Model-Glue version of Wiki Software.

From the start, I'm going to say we aren't ready to make any decisions on documentation implementation. The direction we go largely depends on the critical path issues to get us there and the resources we can put to the task. Our internal time line is tight so we've got to look at all the elements in the equation before finalizing documentation implementation.

That said, I want to make a few public statements to the community at large. There is no question about my commitment to the Model-Glue project, of course, but did you know I'm also a fan of ColdBox? I've got healthy respect for the very impressive ColdBox framework and even more respect for Luis Majano personally, whom I consider a friend. Luis is one of the most decent human beings out on the planet and he has put an almost super human effort into building and maintaining his framework ecosystem. He helped raise the bar for CF Frameworks.

I'm actually a big fan of Mach-II, believe it or not. I've personally contributed some minor bits and pieces here and there to Mach-II and I've been happy to do it. I've also put significant applications into production powered by Mach-II. Mach-II is a quality project run by very smart and dedicated people who have done an admirable job developing a quality framework with good features, a responsive, dedicated community and some of the sexiest Mach-II shirts in town! (I want one)

Did you know TACFUG, the User Group I run along with Jim Priest, uses Mach-II to power our most excellent User Group Website? (CHUG). Check it out: http://tacfug.org

Codex Wiki is great software and if it works out for us, we'll use it. I'm not going to burst into flame, just because it is written using the ColdBox framework. Should we need to add features, we'll build them and contribute back to the project even if it means I've got to learn ColdBox to do it.

In closing, I'm all for friendly rivalries, but we gain nothing by throwing rocks, being divisive or fragmenting effort by unnecessarily duplicating projects. The ColdFusion framework community stands to gain most by collaborating and providing a quality set of Open Source frameworks and Tools to the community and engaging the ColdFusion community to further embrace mature development standards and techniques. Consider Model-Glue a willing partner with those sharing our philosophy.

ModelGlue wants to hear from You!

Those of us who work in the labs of Model-Glue know a good idea when we see one. After taking the Transfer survey, we put together one of our own. We want to hear from you, Model-Glue user or not, on frameworks and what you find important.

Our Survey

The survey is really short, only a few questions, and we've thrown in a text area or two so you have room to give us a piece of your mind. The smart person you are, you can finish this survey in 10 minutes tops.

How we use the results

We'll use the information gained by this survey to drive development of the framework. As always, Model-Glue is by the people, for the people and of the people. Your input will be kept anonymous of course.

Wanna take it?

Take the Model-Glue Survey

JIRA/Tomcat Expert Assistance Needed


The illustrious Marc Esher has helped us out getting the JIRA instance back up and running. A big thanks to Marc and the other nice folks that offered their expertise

If you have experience managing JIRA and/or Tomcat, we at the Model-Glue project could use your help. See, we have our bug tracker on JIRA and the instance somehow, as we say in the south, Done Got Broken. Naturally, we'd like to get it back up and running so we can keep building neat and useful features in Everyone's Favorite Framework.

So, if you think you can roll up your sleeves and make a difference, leave us a comment and we'll be in touch.

New Model Glue 3 Feature: copyToScope()

We've just finished adding another feature to Model-Glue 3 called copyToScope(). This feature makes it easier to pull variables out of the event scope and place them into another scope. A big thanks to Paul Marcotte for suggesting this feature.

How does it work?

Say you want to pull 3 values from the event and use them in your view. Normally, you would run 3 separate commands:

<cfset foot = event.getValue("foot") />
<cfset hand = event.getValue("hand") />
<cfset xe.nested = event.getValue("xe.nested") />
the end result being that each value: foot,hand,xe.nested is now in the variables scope ready for use in your view.

Here in the labs of Model-Glue, we want to reduce developer excise when possible. The new copyToScope() method can be used to short cut the same process.

<cfset event.copyToScope(variables, "foot,hand,xe.nested") />

The end result is the exact same as above, except only 1 line of code is needed to pull several values from the event at once.

What about default values?

As event.getValue() takes an optional argument to set default values, our new friend event.copyToScope() will take an optional array of default values. The position of the list elements pertain to the position of the value in the array. This means the 1st value in the list gets the 1st position in the array, the 2nd gets the 2nd and so on. Let's look at an example where I want to provide defaults to 2 items in the list:

<cfset defaultArray = ["DefaultForFoot", "DefaultForHand"] />
<cfset event.copyToScope(variables, "foot,hand,xe.nested", defaultArray) />

Once the function executes, the value of variables.foot is DefaultForFoot and the value for variables.hand is DefaultForHand. If no value existed in the event for xe.nested, it will be set to an empty string as per normal when a value is requested from the event that has not been set yet.

Does it only work with the variables scope?

Nope. It will work with any scope you see fit. Session, Server, Application, even a plain ole struct, though I expect the variables scope will be most often used.

Where can I get the code?

You can update from SVN at http://svn.firemoss.com/modelglue and try the feature out. Several bugs have also been fixed including a bug with Railo compatibility submitted by Denny Valliant. Thanks to Denny for his contribution.

Model-Glue Welcomes Dan Wilson

This post is awfully belated: I'm happy to welcome Dan Wilson as a member to the Model-Glue project.

He's helping out with bug fixes, administering the AboutWeb-provided server that runs the new bug tracking site (and eventually docs / wiki), and writing blog entries for Model-Glue.com.

Welcome aboard, Dan!

New MG3 Feature: Dynamic viewMappings

Some of the new features in MG3, such as its revised core, focus on work being done in the more "enterprise" arena. A specific case that I'm working hard to support is the case where many customers are running "their own instance" of a common code base and how to support per-customer modification.

Realizing the use case, let's imagine that you host a blog platform. Customers can sign up and immediately have their own blog deployed. Each blog is running the exact same code base, all hosted on the same server/cluster.

Inevitably, a customer will offer to pony up cash to have a view things change. On the service / controller side, MG3 has you covered by allowing ColdSpring-based definition of services and controllers, allowing you to use ColdSpring "overriding" to one-off services and controllers.

For views, however, things were tricky. To support this case, the concept of "dynamic viewMappings" is implemented.

Model-Glue crawls an array of "view mappings" looking for your application's views: it's defined in your app's Coldspring.xml file.

With dynamic viewMappings added, you can manipulate this list at runtime.

Let's solve our blog engine case, pretending that customer "acmeCorp" needs a suite of custom views, overriding the default views only when a custom is defined. All we have to do is update the viewMappings inside a listener function whenever the user is from acmeCorp:

<cfset var customViewMappings = user.getCompany().getCustomViewMapping() />

<cfif len(customViewMappings)>
    <cfset event.setValue("viewMappingAdvice", viewMappings) />    

Et voila.

See http://docs.model-glue.com/wiki/HowTos/HowToUseDynamicViewMappings for more information

Update on ModelGlue:3 Gesture

Version 3 of the Model-Glue framework is under development right now. Here is an update on where we stand...

Issue Tracker

Reporting bugs/enhancement requests for Model-Glue just got easier. We now have a fully licensed JIRA issue tracker. This will help us stay on top of bugs, features and such. A special thanks to the fine folks at Atlassian for making licenses available to the Model-Glue project at no charge.

Load Testing

I've been load testing a MG:3 application pretty heavily for the last couple of weeks. The framework holds up extremely well to load and shows no memory leakage or other misbehavior.

Fixed Bugs

The bug count has been reduced by 50%. Keep logging and reporting issues!

Want to try Model-Glue:3?

The framework still has an Alpha label for now and while we have a pretty active group of folks using the MG:3 alpha, others are still welcome. Download the latest framework code from http://svn.firemoss.com/modelglue/trunk/ModelGlue and tell us what you think.

Help: anyone have a server for Model-Glue?

If you or your company would like to be associated with helping out the Model-Glue framework (not sponsorship, but a decent logo placement), I'm looking for someone willing to host Jira and Confluence for ongoing bug tracking and documentation authoring.

While I'm able to acquire free licenses of both because of Model-Glue's open source status, I'm not able to host them on the firemoss.com VPS. If anyone has a server that could support running Tomcat (or deploying these to an existing JEE server such as JBoss) and would like to be part of the Model-Glue "team," please comment or drop me a line at joe@firemoss.com. Both applications are super-easy to install and get running, can be made to play nice with an existing Apache web server, and work with just about any database.

MG3: Application.cfc integration

Towards the end of last week, I finished adding Application.cfc integration into Model-Glue 3. I've taken a few passes at it, and finally hit upon a solution I'm happy with.

The short of it is that working with onSessionStart, onSessionEnd, and onApplicationStart within a Model-Glue 3 application is just like working with earlier Model-Glue application's onRequestStart or onRequestEnd broadcasts: just listen for it and do what you need to do!

For example, if you had a UserCountController that incremented and decremented the number of current sessions, you could subscibe its functions like so:

<controller name="UserCountController" type="com.myapp.controller.UserCountController>
<message-listener message="
onApplicationStart" function="resetUserCount" />
<message-listener message="
onSessionStart" function="incrementUserCount" />
<message-listener message="
onSessionEnd function="decrementUserCount" />



When you listen for onSessionEnd, you obviously don't have a URL or FORM scope to populate into the event. Instead, the only defined event value is "sessionScope," which is (you guessed it) the session scope of the expiring session.

Enabling it

There's now an Application.cfc as part of the application template. If you'd like to use this in an upgraded application, I believe you can just replace your Application.cfm with the CFC from the new template, modifying the copy with your application's name, settings, etc.

What about "sub-applications?"

In a "sub-application" setup, you may have more than one Model-Glue application in a given application scope, using ModelGlue_APP_KEY to keep them separate. In another situation, you may have a non-Model-Glue application sharing an application scope with Model-Glue.

The implementation used accounts for both. As long as the Application.cfc from the new application template is used, it'll introspect the application scope (using the ModelGlueFrameworkLocator, inspired by ColdSpring's BeanFactoryUtils) to find all instances of Model-Glue, firing the appropriate onSessionStart/End/etc. events in all of your applications.

In other words, if you've got two Model-Glue apps sharing the same application scope and a session starts orends, both will have their onSessionStart/End mechanics fired.

More Entries

© 2018 Joe Rinehart
BlogCFC was created by Raymond Camden. This blog is running version