As you know, ColdBox is now fully supported for BlueDragon and Railo. However, to port it was a bit tedious when it came to the auto-registration engine for handlers, since I need to traverse the handlers directory recursively and create an array of handlers. This is so easy in Adobe ColdFusion, but BlueDragon and Railo, does not support it (BD 6, railo 1). Here is the Adobe ColdFusion code:
That is awesome!! So easy!! Well, to do it the Java Way, takes some patience and well, some insight into recursion. The following example is using the CF/JAVA hybrid notation, but the end result is the same as above. And with some speed tests, the code actually compares, not that much of a slow down. So :)
Here is my call to the recursion, the entry point:
What I do is call my recurseListing method with the handlerArray I want the results in, the handlersPath into the initial directory and the working directory. Why do I send in the HandlerPath again? Well, I do it, to actually clean the path to show me the invocation paths, mumbo jumbo!! Give me the code!! Here it is:
Remember that this code is not to get the query like cfdirectory, it could, but you will have to do that, I am just showing how I solved my problem. This is a great exercise also.
//Init the oDirectory object with the initial working directory (Java File Object)
var oDirectory = CreateObject("java","java.io.File").init(arguments.Directory);
//Get an array listing of the objects in the directory
var Files = oDirectory.list();
//My Index.
var i = 1;
//My temp File Object
var tempfile = "";
//My clean handler string.
var cleanHandler = "";
//Loop Through listing if any files found.
for ( i=1; i lte arrayLen(Files); i=i+1 ){
//get first File reference as a File Object
tempFile = CreateObject("java","java.io.File").init(oDirectory,Files[i]);
//Directory Check for recursion, if directory, then recurse.
if ( tempFile.isDirectory() ){
//recurse, directory found, send in the new directory path.
arguments.fileArray = recurseListing(arguments.fileArray,tempFile.getPath(), arguments.HandlersPath);
}
else{
//File found
//Filter only cfc's, I could have used a Filter Java object, but was lazy.
if ( listlast(tempFile.getName(),".") neq "cfc" )
continue;
//Clean entry by using Handler Path (For my specific purposes)
cleanHandler = replacenocase(tempFile.getAbsolutePath(),arguments.handlersPath,"","all");
//Clean OS separators accordingly
if ( getSetting("OSFileSeparator",1) eq "/")
cleanHandler = removeChars(replacenocase(cleanHandler,"/",".","all"),1,1);
else
cleanHandler = removeChars(replacenocase(cleanHandler,"",".","all"),1,1);
//Clean Extension right off baby
cleanHandler = getPlugin("fileUtilities").ripExtension(cleanhandler);
//Add data to array, a cleaned Handler, thank you GOD, bless you.
ArrayAppend(arguments.fileArray,cleanHandler);
}
}
//else return the empty array or filled array.
return arguments.fileArray;
There you go, you can follow the comments to tell you what I did. This is an awesome exercise and shows you how ColdFusion is really powerful by leveraging its Java backbone. When things like this just work, it just amazes me of how ColdFusion has evolved and how EASY it is to overcome problems by leveraging Java. Viva Java Mis Amigos!! Viva!! Viva!!
Hope you enjoy this little java/cf/recursion tutorial. This example shows potential of how you can build your own recursion methods.
Blog
Recent Entries
Coming Soon: Version 4 Docker CommandBox Images with Enhanced Performance
CommandBox Docker images were the first CFML docker images and have nearly 2 million pulls, since their inception, to date. It's been a source of pride at Ortus that these images have been the most popular and reliable way to run CFML in containers and we are so very pleased to announce the next evolution, which will be the v4 images which run entirely on the BoxLang CLI and represent a significant overhaul of the image architecture.
These images are now available to test by appending -snapshot to your existing version tags and wil be released as stable, once CommandBox v6 emerges from release candidate status and is published as stable.
Free observability with BxMCP: give your AI agents eyes inside a live BoxLang runtime
Ortus Solutions today announces that bx-mcp, the Model Context Protocol (MCP) server for BoxLang, is now free for everyone. Install it, point any MCP capable client at it, and your AI coding assistant, IDE agent or automation pipeline can inspect and operate a live BoxLang runtime: JVM, caches, datasources, slow requests, schedulers, logs and more. No BoxLang+ subscription required.
Inherited a CFML Application With Few Tests? Here’s Where to Start!
You need to change an application that has been running for years.
It might be a ColdFusion customer portal, a Lucee application supporting internal operations, or a CFML system your team is preparing to modernize. People depend on it, but some of its behavior lives in old tickets, scattered documentation, and the memory of whoever has supported it longest.
Now a release is approaching. You know more testing would help. The difficult part is deciding where to begin without putting every other priority on hold.
Start with one important workflow and build evidence around what it needs to do.
Add Your Comment