Blog

Luis Majano

November 08, 2010

Spread the word


Share your thoughts

After much hard work and testing we have now reached our first release candidate for our ColdBox 3.0.0 series, Release Candidate 1. It has been a year now since this release has been under development, testing and now we are almost there. This release brings the latest stability possible for the platform as all tickets are closed for the 3.0.0 release and hints of our last big framework decoupling, WireBox. The next release will be WireBox 1.0 and shortly after we will do our final 3.0.0 release. Before upgrading we always recommend looking at our compatibility guide and also our what's new guide that includes everything new in the 3.0.0 Platform.

WireBox is a lightweight standalone dependency injection and AOP framework based on conventions and CFML dynamic goodness. It is the culmination of years of reliability within ColdBox and soon it will be available for all to benefit from. In the next coming days I will be releasing the object binding DSL, configuration and capabilities. It is pretty much what has been in ColdBox since version 2.6 but now with some extra goodness. We have been inspired by Google Guice, pico container and of course Spring, but leveraging what CFML does best, productivity without the cost of simplicity.

So let's get an overview of the major aspects of this release and where you can get it:

Sample Applications Thanks to Curt Gratz and the Computer Know How crew, all sample applications have been update to 3.0.0 standards and several new sample apps have been added to the mix. We have now over 25 full blow sample applications in our bundle release where you can learn from and even use for your apps. So Kudos to Curt and Crew for all the great support and help.

Stability & Performance Bug Fixes Thanks to the thousands of users around the world who have contributed their time to testing, load testing and performance tuning this core is the fastest release we have seen in our 3.0.0 milestones and the most stable. All open tickets that we had initially created for the 3.0.0 platform have been closed.

IOC Updates The entire IOC architecture has been rewritten for ColdBox 3.0.0. So now the IOC plugin can talk to any object factory that implements our adapter interface. We have updated it to work with ColdSpring, ColdSpring2, LightWire and WireBox or your very own object factory. You can also now declare parent factories for the main factory of your application, if your adapter supports it. The IOC plugin will create the parent factory for you and wire it to the main one for you. Cool huh?

// CFC declaration
//IOC Integration
ioc = {
    framework         = "coldspring",
    reload                 = true,
    objectCaching     = true,
    definitionFile  = "config/coldspring.xml.cfm",
    parentFactory     = {
        framework = "coldspring",
        definitionFile = "config/parent.xml.cfm"
    }
};

// Custom factory
ioc = {
    // the framework is the type of the adapter to use.
    framework         = "com.model.MyBeanFactory",
    reload                 = true,
    objectCaching     = true,
    definitionFile  = "config/coldspring.xml.cfm"
};

The plugin has also been updated on how it does object caching and metadata caching for ioc objects so now it can create a buffer layer between your IoC factory and CacheBox for added performance. You can also from the configuration decide if you want the factory reloading on each request, which is great for development.

Implicit View Rendering You can now render views without the need of creating events for them. If you are building a prototype or migrating from legacy code into the framework, this will be a great asset. So let's say you want to execute the event: site.contact which should map thanks to our conventions to a site.cfc event handler and a contact() method. However, if they do not exist, the framework will look for a view called: views/site/contact.cfm and if it finds it, it will execute it! This means that just by dropping views in the views folder convention they become virtual events.

Module Enhancements You can now define an implicit defaultLayout element in the layoutSettings element of the configuration file. Very handy to save on typing!

layoutSettings = { 	defaultLayout = "MyLayout.cfm" }; 

Modules can also now have host global overrides for layouts and views. What this means is that before if you wanted to override a layout or view in a module from the parent application you had to do the following:

/layouts/modules/{moduleName}/myLayout.cfm /views/modules/{moduleName}/myView.cfm

Which affects only a specific layout or view, but what if you want to affect by default a common layout or view for several modules? Enter common module view/layout overrrides:

/layouts/modules/myLayout.cfm /views/modules/myView.cfm

This means that the /modules/myLayout.cfm will be used for all modules if a specifc module override is not found. Great to have commonality on overrides that spans accross modules.

RESTful extension detection Our ColdBox 3.0.0 series has one of the best supports for RESTful web services than any other release. With extension detection we are complete now. The SES interceptor now by default does URL extension detection via the incoming routed URL. You can turn on/off by using the new setExtensionDetection() method from your Routes.cfm template. So if an incoming URL is:

http://myapp.com/users/john.xml or http://myapp.com/users/john.json 

The interceptor will see that an extension is requested and actually create a request collection variable for you called format with the value of the extension: format=xml, format=json. The interceptor also allows for you to setup the valid extensions it should recognize. By default the interceptor recognizes the following extension list: xml, json, jsont, html, htm, rss. You can change this list by using the new method: setValidExtensions() on your Routes.cfm template.

// auto detect extensions, you don't have to do this as the default is true.
setExtensionDetection(true);

// Set xml and json as the only valid extensions for routing.
setValidExtensions("xml,json,jsont");

This is great for RESTful webservices as now your resources can have valid transformation extensions.

Unit-Integration Testing Enhancements We have updated our bases test cases to support two new methods:

  • getMockDatasource() - to retrieve mocked datasource bean objects
  • getMockConfigBean() - to retrieve a mocked configuration bean object with mock data structures
  • getMockPlugin() - to construct and return a mocked capable custom or core plugin object

Request Context Updates The way the request context was being created has been optimized and considerable speed increase was seen in our generation tests. We have also added the following new method:

  • isAjax() - Which allows you to distinguish between Ajax and non Ajax requests.

We have also added an interception point to the request context called: onRequestCapture(). This is a great interception point that will allow you to manipulate the incoming request collection before flash RAM is inflated, debug detections, event detection and most importantly event caching detection. From this interception point you can add a user's locale to the request collection on a cached event so now the cached event's entry will depend on the user's locale. You can also add in a user's jsession ID or unique identifier to allow event caching to now transcend the global space to the ANY space.

onRequestCapture(event, interceptData){
  //let's add the user's locale to the event caching mix
  event.setValue("userLocal", getFWLocale() );
}

So now that you got a look at the good stuff, let's look at the nitty gritty:

Ticket # Summary
866 Refactor Utilities plugin into more granular existing plugins, removing unused methods.(Compatibility)
931 ioc adapters finalization for common ioc factories
987 Ability to declare implicit default layout configurations for modules
997 automatic extension detection via incoming URI extension
1060 Update cache flash scope to use a setting with the name of the cache to use, else use default cache name
1073 The method lookupQuiet was not found in component coldbox.system.cache.archive.MTCacheManager.
1076 On some occassions the IDs of the rc/prc panels are colliding and not opening/closing the right row.
1079 populateFromQueryWithPrefix
1080 Modules not inheriting parent layouts/views correctly in discover algorithms
1083 new unit testing method: getMockPlugin() that gives you a plugin instance already mocked up and ready for usage or testing
1084 new requestcontext method isAjax(), tries to read the xmlhttp request header and determine if request is ajax based
1085 handler service not treating cached handlers right, so recreates them.
1086 updated approach to retrieve model objects from cache services
1087 bug on interceptorSettings for CFC configuration, the value should be customInterceptionPoints and not customInterceptors
1089 implicit view rendering with no event needed. If event does not exist but view does, then view gets dispatched
1090 Updated the AntiSamy XSS project to latest version of 1.4.1
1096 when using modulesAutoReload the module service was not clearing the setting but actually replacing, causing reference issues on startups
1097 Unecessary key iterations on configuration settings when creating request context
1098 Module common view-layout conventions so host can override view-layouts for all modules by Kalen Gibbons
1100 ioc plugin completely revamped for 3.0.0 for usage of adapters and deprecation of antiquated code (COMPATIBILITY)
1101 ioc plugin now supports parent factories on declared factories in the coldbox configuration
1102 ses new method: setValidExtensions(list) gives you the ability to set a list of extensions the interceptor will auto detect for you and place in the format variable in the request collection. This goes hand in hand with the setExtensionDetection() method.
1103 antisamy updated so you can define a custom policy file in your application settings: AntiSamy_Custom_Policy
1104 throw an invalid event exception when a non-valid or non-loaded module is detected for firing
1105 setNextEvent should support from ssl to non-ssl URL conversions
1107 New Interception point: onRequestCapture
1110 new base test helper: getMockDatasource() to return mocked datasource bean objects
1111 new base test helper: getMockConfigBean() so you can create a mocked configuraiton bean easily
1113 stringbuffer missing javacast on init() so the buffer number 16 was being inited
1114 json conversion not handling null values when encoding

Add Your Comment

Recent Entries

BoxLang 1.0.0 Beta 23 Launched

BoxLang 1.0.0 Beta 23 Launched

The latest release of BoxLang, Beta 23, marks a significant step forward in our journey to create the ultimate dynamic language for the JVM. Packed with powerful new features, important bug fixes, and thoughtful optimizations, this update is designed to make your development experience smoother, faster, and more reliable, especially after now starting to take 100s of comments and bug reports from our community.

Luis Majano
Luis Majano
November 23, 2024
TestBox Latest Updates and News!

TestBox Latest Updates and News!

We’re thrilled to have launched the new TestBox website and TestBox 6.0! If you haven’t had a chance to explore yet, visit TestBox to discover updated documentation, powerful resources, and features that make testing more efficient than ever.

Maria Jose Herrera
Maria Jose Herrera
November 21, 2024
Is Your ColdFusion Application Ready for the Future?

Is Your ColdFusion Application Ready for the Future?

In a rapidly evolving digital world, maintaining performance, security, and scalability for ColdFusion applications is more challenging than ever. Whether you're using Lucee or Adobe ColdFusion, legacy systems can become a bottleneck for growth, innovation, and user satisfaction. The need to future-proof your ColdFusion applications has never been more critical.

But where do you start?


The Hidden Costs of an Outdated ColdFusion Application

As you...

Cristobal Escobar
Cristobal Escobar
November 21, 2024