Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
June 9, 2023
COLDBOX-1229 Added debug argument to ScheduleExecutor and Scheduler when creating tasks for consistency
COLDBOX-1230 Reorganized ScheduledTasks functions within the CFC into code groups and comments
COLDBOX-1226 Scheduled Tasks Updates
COLDBOX-1145 RestHandler OnError() Exception not checking for empty `exception` blocks which would cause another exception on development ONLY
July 23, 2022
COLDBOX-1134 Router closure responses not marshalling complex content to json
COLDBOX-1132 New virtual app was always starting up the virtual coldbox app instead of checking if it was running already
COLDBOX-1131 Updated Missing Action Response Code to 404 instead of 405
COLDBOX-1127 All core async proxies should send exceptions to the error log
COLDBOX-1130 New config/ColdBox.cfc
global injections: webMapping
, coldboxVersion
COLDBOX-1126 Funnel all out and err logging on a ColdBox Scheduled Task to LogBox
COLDBOX-1135 Remove HandlerTestCase
as it is no longer in usage.
May 13, 2024
COLDBOX-1274 javacasting to long for new Java LocalDateTime instead of int, Adobe not doing type promotion
COLDBOX-1279 Render encapsulator bleed of this scope by engines
COLDBOX-1273 Removal of deprecated CFML functions in core
COLDBOX-1275 Improved engine detection by the CFMLEngine feature class
COLDBOX-1278 Remove unsafe evaluate function usage
A historical snapshot of all major versions of ColdBox
In this section you will find the release notes for each version we release under this major version. If you are looking for the release notes of previous major versions use the version switcher at the top left of this documentation book. Here is a breakdown of our major version releases.
Version 3.0 - March 2011
Version 2.0 - April 2007
Version 1.0 - June 2006
May 1, 2023
Github actions for LTS Releases
LTS Updates
COLDBOX-1219 CFProvider ACF versions are Hard-Coded
WIREBOX-132 WireBox caches Singletons even if their autowired dependencies throw exceptions.
February 17, 2022
Bugs
COLDBOX-1093 Remove debug writedumps left over from previous testing
COLDBOX-1085 Fix instance of bad route merging the routes but loosing the handler
Minor Improvements
COLDBOX-1095 Update Response Pagination Properties for Case-Sensitive Engines
COLDBOX-1091 default status code to 302 in the internal relocate() just like CFML does instead of 0 and eliminate source
COLDBOX-1089 Update the internal cfml engine checker to have more engine based feature checkers
COLDBOX-1088 Switch isInstance
check on renderdata in controller to secondary of $renderdata check to optimize speed
Bugs
CACHEBOX-80 Bug in JDBCMetadataIndexer sortedKeys() using non-existent variable arguments.objectKey
Minor Improvements
CACHEBOX-81 JDBCStore Dynamically generate queryExecute options + new config to always include DSN due to ACF issues
ColdBox 6.3.0 is a minor release that squashes lots of bugs and does tons of improvements for performance!
[COLDBOX-890] - Renderer methods assume the module exists and throws exception when sending invalid url data
[COLDBOX-914] - Can no longer have duplicate routes with different conditions
[COLDBOX-935] - Colon (:) in URL Path Causes Exception Error
[COLDBOX-964] - invalidEventHandler does not work when calling invalid action on valid handler
[COLDBOX-967] - autowire annotation for test cases is not working as it should
[COLDBOX-968] - Fix declaring multiple resources at once
[COLDBOX-978] - AsyncManager threads don't release DB connections to pool for Adobe CF
[COLDBOX-973] - Add new exception type catch for the RestHandler: `PermissionDenied` to trap in valid authorizations
[COLDBOX-965] - Content type http header bypasses requestContext with render data - set explicit http header via request context
[COLDBOX-971] - Implement caching strategy for application helper lookups into the `template` cache
[COLDBOX-972] - Coldbox DataMarshaller Throws Error with Lucee-Light Engine
[COLDBOX-974] - Have the html helper manifests in local memory instead of the template cache to avoid cleanup issues
[COLDBOX-975] - Remove unecessary locks for view path setups in the renderer
[COLDBOX-976] - Remove unecessary lock in the bootstrap to get the controller reference, it's already there for the reload checks
[COLDBOX-979] - Module service now profiles registration and activation into the logs with the version and path of a module
[CACHEBOX-67] - getStoreMetadataReport()
- wrong order of the reduce()
parameters
[WIREBOX-111] - Refactor the way cffeed
is used so that ACF 2021 doesn't choke on first startups, only when used
ColdBox 6.4.0 is more of a major than a minor release due to the amount of work we have done to bring you one of the most revolutionary features of this framework: Scheduled Tasks.
Scheduled tasks have always been a point of soreness for many developers in ANY language. Especially choosing where to place them for execution: should it be cron? windows task scheduler? ColdFusion engine? Jenkins, Gitlab? and the list goes on and on.
The ColdBox Scheduled Tasks offers a fresh, programmatic and human approach to scheduling tasks on your server and multi-server application. It allows you to define your tasks in a portable Scheduler we lovingly call the Scheduler.cfc
which not only can be used to define your tasks, but also monitor all of their life-cycles and metrics of tasks. Since ColdBox is also hierarchical, it allows for every single ColdBox Module to also define a Scheduler
and register their own tasks as well. This is a revolutionary approach to scheduling tasks in an HMVC application.
You can learn all about them in our two sections:
Bugs
Improvements
New Features
June 21, 2022
Here is a listing of all the major updates and improvements in this version.
Event caching has been updated to allow the caching of the set http response code from your handler code via event.setHTTPHeader()
or event.renderData()
. This is essential from a developer's perspective as it will respect whatever response code you respond with. This is also imperative for RESTFul services.
This release brings in a complete re-architecture of the creation, inspection and wiring of objects in WireBox in order to increase performance. Every single line of code was optimized and analyzed in order to bring the creation, inspection and wiring of objects to its maximum speed. This will be noted more on the creation of transient (non-persisted) objects more than in singleton objects. So if you are asking WireBox for transient objects, you will see and feel the difference.
In some of our performance testing we had about 4000 object instantiations running between 500ms-1,100 ms depending on CPU load. While with simple createObject()
and no wiring, they click around 400-700 ms. Previously, we had the same instantiations clocking at 900-3,500 ms. So we can definitely see a major improvement in this area.
This release sports the creation of the encapsulated virtual ColdBox App: coldbox.system.testing.VirtualApp.
Previously, the only way to create virtual apps was to do it manually just like the BaseTestCase
object did when doing integration testing and that's about it. In this release, we provide a clean interface for starting, restarting, checking and shutting down virtual applications that can be used for testing, proxying, etc. It also allows a faster and eager approach to starting the virtual application before your runner and tests. This will allow any ORM bridges to be respected and best of all the ability to execute anything in the framework before your runners, suites or specs. Database migrations anyone?
All application templates have been updated to use the new Virtual App in the tests/Application.cfc.
This will allow for a virtual application to be started once your runner or specs are executed and shutdown at the end of the request. Here are the two methods in charge of doing this in the Application.cfc
Your integration tests and unit tests remain the same. The only difference is that internally they all use this object to create the virtual applications.
Also note the code on line 8. This allow the developer to decide when then virtual app starts.
All scheduled tasks have automatic exception handling now. Before, whenever you had exceptions and you did NOT implement any of the exception handling listeners, your code would be swallowed up and never to be seen! Now, we avoid this and log them to standard error so you can debug your code.
Also, in the previous version, if you had an exception your afterAnyTask()
or the after()
life cycle methods would never be called. Now they are!! Hooray!!
All ColdBox enabled schedulers will have the following automatic injections so you can have ease of use for leveraging objects and contexts during your task declarations and executables.
All module schedulers will have the following extra automatic injections:
All scheduled tasks now support the ability to seed in the start and end dates via our DSL:
startOn( date, time = "00:00" )
endOn( data, time = "00:00" )
This means that you can tell the scheduler when the task will become active on a specific data and time (using the scheduler's timezone), and when the task will become disabled.
Every time unit can now be used as plural or singular, so it can allow you to create beautiful scheduled task DSLs:
Nanosecond(s)
Microsecond(s)
Millisecond(s)
Second(s)
Minute(s)
Hour(s)
Day(s)
All executors and schedulers can now be shutdown more gracefully by passing a timeout
argument to the async manager and automatically by the framework. This will allow the executor to shutdown and gracefully yell at it's tasks to shutdown in a default period of 30 seconds. It will wait and then try again, if not, then well, you can't directly kill anything anymore, so you will be notified so you can do harsher punishments to these tasks.
The only exception this is NOT the case in a normal ColdBox app is when a reinit happens or when integration testing is being executed. Then we revert to the previous behavior of nuking the executors and schedulers.
AsyncManager
shutdownAllExecutors( force, timeout )
shutdownExecutor( name, force, timeout)
The timeout ONLY works when the force
argument is false. If force
is true, then it's NOT gracefully shutdown. This usually happens on ColdBox reinits or integration testing.
Schedulers
All schedulers have a shutdownTimeout
property that defaults to 30 seconds. When you configure your schedulers you can change this value to whatever you see fit.
Executors - shutdown and wait...
All executors now have a new method: shutdownAndAwaitTermination( numeric timeout = 30 )
which is used to do just that. It places the executor in shutdown mode and waits the timeout for all the tasks to complete. If they don't complete then it issues a forced shutdown.
All handlers/layouts and views get a new function called forAttribute( data )
which will allow you to serialize simple or complex data so it can be used within HTML attributes. This will take care of serialize the data and encoding it correctly so it can be bound to the HTML attribute so the JavaScript framework can use it as native JSON.
This technique will allow you to bridge your CFML apps with your JS apps natively.
This was a rough regression due to the way Hibernate is loaded by the CFML engines. We have moved to a lazy load first strategy on the entire architecture of the framework. So anything using the ColdBox proxy, like the ORM event handling, will now work in any loading situation.
Bug
Improvement
New Feature
Task
Bug
Improvement
Improvement
Bug
Improvement
Fixes issues with Adobe losing App Context in Scheduled Tasks. You can now run scheduled tasks in Adobe with full app support.
When running scheduled tasks in ACF loading of contexts produce a null pointer exception
DataMarshaller
no longer accepts 'row', 'column' or 'struct' as a valid argument.
Convert util to script and optimize
Add more debugging when exceptions occur when loading/unloading thread contexts
Implement caching strategy for application helper lookups into the default
cache instead of the template
cache.
New SchedulerService
that mointors and registers application scheduled tasks in an HMVC fashion
Added out and error stream helpers to Scheduled Tasks for better debugging
newTask
() method on scheduled executor to replace nameless newSchedule
New scheduler object to keep track and metrics of registered tasks
New Scheduled Task with life-cycles and metrics
New async.time package to deal with periods, durations, time offsets and so much more
Added CFML Duration and Periods to async manager so task executions can be nicer and pin point accuracy
Allow structs for query strings when doing relocations
Encapsulate any type of exception in the REST Handler in a onAnyOtherException
() action which can also be overidden by concrete handlers
Add registration and activation timestamps to the a module configuration object for active profiling.
Rename renderLayout()
to just layout()
and deprecate it for v7
Rename renderView(
) to just view()
and deprecate it for v7
virtual inheritance causes double inits
on objects that do not have a constructor and their parent does.
onDIComplete
() is called twice using virtual inheritance
New coldbox dsl => coldbox:appScheduler
which gives you the appScheduler@coldbox
instance
new injection dsl: wirebox:asyncManager
Thanks to the inspiration of where you can mark a spec or test to be skipped from execution by prefixing it with the letter x
you can now do the same for any task declaration. If they are prefixed with the letter x
they will be registered but disabled automatically for you.
Finally in this version of ColdBox asynchronous interceptors will work with any complex data without any thread contingency or duplication. You can even use them for ORM events and it will work accordingly. So go for it, your interception calls!
Persistence of variables failing due to null support
Renderer is causing coldbox RestHandler to render convention view
Exceptions in async interceptors are missing onException announcement
Interception with async
annotation causes InterceptorState Exception on Reinit
A view not set exception is thrown when trying to execution handler ColdBox methods that are not concrete actions when they should be invalid events.
Update getServerIP() so it avoids looking at the cgi scope as it can cause issues on ACF
Event Caching Does Not Preserve HTTP Response Codes
Regression on ColdBox v6.6.1 around usage of statusCode = 0 on relocates
RequestService context creation not thread safe
Missing scopes on isNull() checks
RestHandler Try/Catches Break In Testbox When RunEvent() is Called
Scheduled tasks have no default error handling
Creating scheduled task with unrecognized timeUnit throws null pointer
afterAnyTask() and task.after() don't run after failing task
Error in onAnyTaskError() or after() tasks not handled and executor dies.
Coldbox Renderer.RenderLayout() Overwrites Event's Current View
Convert mixer util to script and utilize only the necessary mixins by deprecating older mixins
Enhance EntityNotFound Exception Messages for rest handlers
SES is always disabled on RequestContext until RoutingService request capture : SES is the new default for ColdBox Apps
coldbox 6.5 and 6.6 break ORM event handling in cborm
Scheduled Tasks: Inject module context variables to module schedulers and inject global context into global scheduler
Create singular aliases for timeunits
New xTask() method in the schedulers that will automatically disable the task but still register it. Great for debugging!
Log schedule task failures to console so errors are not ignored
Scheduler's onShutdown() callback now receives the boolean force and numeric timeout arguments
The Scheduler's shutdown method now has two arguments: boolean force, numeric timeout
All schedulers have a new property: shutdownTimeout which defaults to 30 that can be used to control how long to wait for tasks to gracefully complete when shutting down.
New coldobx.system.testing.VirtualApp object that can startup,restart and shutdown Virtual Testing Applications
Async interceptos can now discover their announced data without duplicating it via cfthread
Interception Event pools are now using synchronized linked maps to provide concurrency
New super type function "forAttribute" to help us serialize simple/complex data and encoded for usage in html attributes
announce onException
interception from RESTHandler, when exceptions are detected
Async schedulers and executors can now have a graceful shutdown and await for task termination with a configurable timeout.
Scheduled tasks add start and end date/times
lucee async tests where being skipped due to missing engine check
Remove nextRun stat from scheduled task, it was never implemented
Cachebox concurrent store meta index not thread safe during reaping
Remove the usage of identity hash codes, they are no longer relevant and can cause contention under load
Remove the usage of identity hash codes, they are no longer relevant and can cause contention under load
File Appender missing text "ExtraInfo: "
Inherited Metadata Usage - Singleton attribute evaluated before Scopes
Massive refactor to improve object creation and injection wiring
Injector now caches all object contains lookups to increase performance across hierarchy lookups
Lazy load all constructs on the Injector to improve performance
Remove the usage of identity hash codes, they are no longer relevant and can cause contention under load
Property | Description |
| The ColdBox running app controller |
| The CacheBox reference |
| The WireBox reference |
| A configured LogBox logger |
| The ColdBox version you are running |
| The ColdBox app mapping |
| Function to get access to the java system |
| Retrieve a Java System property or env value by name. It looks at properties first then environment variables |
g | Retrieve a Java System property value by key |
| Retrieve a Java System environment value by name |
Property | Description |
| The module’s mapping |
| The module’s path on disk |
| The module’s settings structure |
July 9th, 2021
Please note that the following ticket corrects behavior in ColdBox that MIGHT affect interceptors
that have injected dependencies that have the same name as application helper methods from other modules.
Example:
The interceptor above has a dependency of auth
from the cbauth
module. However, the cbauth
module also has an application helper called auth
. So at runtime, this will throw an exception:
This is because now we can't inject the cbauth
mixin because we already have a cbauth
dependency injected. The resolution, is to RENAME the injection variables so they don't collide with module application helpers.
Regression
COLDBOX-1024 Module helpers no longer injected/mixed into interceptors
COLDBOX-1024 Module helpers no longer injected/mixed into interceptors
COLDBOX-1026 Update BeanPopulator
for Hibernate 5 detection in Lucee new extension
COLDBOX-1025 Added back the finally block, just to make sure cleanup are done in bootstrap reinits
COLDBOX-1021 fix lastBusinessDay
tests to reflect if the now is the actual last business day of the month
COLDBOX-1020 ColdBox does not allow for non-existent client cookies when using Flash RAM
COLDBOX-1019 ACF 2021 introduced getTimezone()
so we need to be specific when getting timezones in the scheduler or else it fails
COLDBOX-1016 CF-2018 stats.lastResult
is null when task->call have runEvent("xxxx")
COLDBOX-1015 Element cleaner not matching on query strings due to misordering of map keys. Use a TreepMap
to normalize ordering so event caching and view caching cleanups can ocur.
COLDBOX-1014 response object cached response was never used, rely on the master bootstrap ColdBox cache response header
COLDBOX-1013 RendererEncapsulator
overwrites view()
-Method from FrameworkSupertype
COLDBOX-1010 this.nullSupport = true
breaks coldbox
COLDBOX-1008 ScheduleTask
listeners are only testing for isClosure()
and lambdas return false, so do an or check for isCustomFunction() to
support lambdas
COLDBOX-1007 scheduled task doesn't listen to when()
in Scheduler.cfc
COLDBOX-1004 Custom matchers debug()
function not found since it's injected in isolation
COLDBOX-1003 Scheduler service DI constructor argument was using the string literal instead of the string value for the scheduler name
COLDBOX-1002 added this scope to getTimezone()
to address issue with ACF-2021 bif
COLDBOX-1001 category not logged correctly in async loggers
COLDBOX-1023 Readjustments to fail fast and reloading procedures when there are exceptions and reiniting becomes impossible.
COLDBOX-1018 Enable proxy to use the ColdBox app key defined in the bootstrap instead of hard coding it
COLDBOX-1017 Delay loadApplicationHelpers()
in interceptors so modules can contribute udf helpers and even core interceptors can load them.
COLDBOX-1012 Move coldbox inited flag to after after aspects load, so we can make sure all modules are loaded before serving requests
COLDBOX-1009 RESTHandler capture JWT TokenException to authentication failures
CACHEBOX-68 BlackHoleStore never finishes reap() method
ColdBox 6.1.0 is a minor release sporting fixes and a few minor updates to make your coding life easier 😂.
[COLDBOX-920] - RenderLayout
throws exception when called multiple times in single request with explicit view
[COLDBOX-921] - Adobe compat for null checks on exception beans
[COLDBOX-927] - Can't disable session management
[COLDBOX-928] - Buildlink's queryString
can now be a struct
and it will be converted to the string equivalent for you
[COLDBOX-922] - Whoops can be slow while dumping out CFC instances
[WIREBOX-82] - builder.toVirtualInheritance(): scoping issues
[WIREBOX-83] - When using sandbox security, and using a provider DSL the file existence checks blow up
[LOGBOX-53] - Direct console debugging is left in the AbstractAppender
and FileAppender
The major compatibility issues will be covered as well as how to smoothly upgrade to this release from previous ColdBox versions. You can also check out the What's New guide to give you a full overview of the changes.
Lucee 4.5 support has been dropped.
ColdFusion 11 support has been dropped. Adobe doesn't support them anymore, so neither do we.
The following settings have been changed and altering behavior:
coldbox.autoMapModels
is now defaulted to true
Which means that all your models will be MAPPED for you. If you have specific mappers in your config/WireBox.cfc make sure they override the mapping or turn this setting false.
coldbox.onInvalidEvent
has been REMOVED in preference to coldbox.invalidEventHandler
coldbox.jsonPayloadToRC
is now defaulted to true
The buildLink()
method had an argument linkTo
. It has now changed to to
to provide simplification
The SES
interceptor has finally been removed. You can now remove it from your interceptor declarations. If you are relying on the SES interceptor for routing, then you will need to access the RoutingService
via the following injection methods or retrieval methods:
This method was marked for deprecation in ColdBox 5 and now it is removed. You can use the getInstance()
method instead.
get()
method to $get()
All WireBox providers now implement the new interface which has changed the method of get()
to $get()
to avoid proxying to methods that already implement a get()
method. So if you are using the get()
method just update it to the new $get()
method.
The getSetting()
method does NOT include a fwSetting
boolean argument anymore. You can now use the getColdBoxSetting()
method instead.
This method has now been deprecated in favor of its shorthand announce().
This method will still work but it will be removed in the next major version. So just rename it now. Also note that the interceptData
has now changed to just data
This method was used in the event manager and interceptor service and has been marked for deprecation. Please use the method announce()
instead. Which is also a consistency in naming now.
setNextEvent()
RemovedThe method setNextEvent()
has been removed in favor of relocate().
We had deprecated this method in ColdBox 5.
These methods have been deprecated since version 4 and they are now removed.
getBufferObject()
getBufferString()
appendToBuffer()
clearBuffer()
Every interception listener receives the buffer
as an argument so there is no need to go to global functions for working with the buffer.
All interceptors receive arguments when listening, we have renamed the interceptData
to just data
. The old approach still works but it is marked as deprecated. So just rename it to data
Default Bug Report Files are now located in /coldbox/system/exceptions/
. Previously /coldbox/system/includes/
So make sure you update your CustomErrorTemplate
path to this new path:
The entire rendering mechanisms in ColdBox 6 have changed. We have retained backwards compatibility but there might be some loopholes that worked before that won't work now. Basically, the renderer is a singleton and each view renders in isolation. Meaning if a view sets a variable in it's variables
scope NO OTHER view will have access to it.
February 02, 2022
We have created a shortcut approach to creating RESTFul API resources in your ColdBox Routers via the new method apiResources()
. This method will create all the routes for your API service with no HTML views.
Verb | Route | Event | Purpose |
---|---|---|---|
We have made several enhancements with modules:
Performance optimizations when registering and activating modules
Modules now track their own registration and activation load times (Which are now visible in cbdebugger)
Better logging of modules when they activate and register
We have been working on a new directory structure for ColdBox applications where the web root is not just dumped with everything on it. We have made several internal tickets to allow for this to work and we have a very early alpha available in github:
There are so many tickets that helped resolved issues with the ColdBox schedulers and scheduled tasks. We have also solidifying our Adobe scope issues and brought many new helpers for developers when building task objects.
If you are building multi-tenant applications with ColdBox and are leveraging domain and subdomain routing, then you can easily use the domain
argument in all of our request(), execute()
and HTTP Verb methods to simulate the domain in play for THAT specific spec execution.
ColdBox has always had its internal way of figuring out what identifier to use for each user's request based on the way ColdFusion works. However, now you can influence and provide your own approach instead of relying on the core CFML approach. You will do this by adding a coldbox.identifierProvider
closure/lambda into your config/Coldbox.cfc
.
Welcome to the world of hierarchical dependency injection. We had the ability before to add a parent injector to WireBox, but now you can not only add a parent, but also many children to the hierarchy.
Every injector has the capability to store an ordered collection (ordered struct
) of child injectors via the childInjectors
property. Child injectors are used internally in many instances to provide a hierarchical approach to DI where instances can be searched for locally, in the parent and in the children. Here are some of the new methods to assist with child injectors:
hasChildInjector( name )
- Verify if a child injector has been registered
registerChildInjector( name, child )
- Register a child injector by name
removeChildInjector( name )
- Remove a child injector by name
getChildInjector( name )
- Get a child injector by name
getChildInjectors()
- Get all the child injectors registered
getChildInjectorNames()
- Get an array of all the registered child injectors
getInstance()
The getInstance()
method now has an injector
argument so you can EXPLICITLY request an instance from a child injector by name getInstance( name : "service", injector : "childInjector" )
Apart from the explicit lookup it can also do implicit hierarchical lookups using the following order:
Locally
Parent
All Children (in order of registration)
containsInstance( name )
- This method now also searches in the child collection for the specific name
instance. The lookup searches in the following order:
Locally
Parent
Children
shutdown()
- The shutdown method has been enhanced to issue shutdown method calls to all child injectors registered.
The getInstance()
has been modified to have an injector
argument that you can use to specifically ask for an instance from that child injector. If the child injector has not been registered you will get a InvalidChildInjector
Exception.
The following is the DSL you can use to explicitly target a child injector for a dependency. You will prefix it with wirebox:child:{name}
and the name of the injector:
The coldbox.system.ioc.IInjector
interface's getInstance()
method has been modified to include support for child injector retrievals:
Bug
COLDBOX-1072 Non config apps fails since the core Settings.cfc had the configure() method removed
COLDBOX-1069 Framework Initialization Fails in @be on AutoWire of App Scheduler
COLDBOX-1066 Scheduled tasks not accessing application scope on Adobe Engines
COLDBOX-1063 ColdBox schedulers starting before the application is ready to serve requests
COLDBOX-1062 Scheduler service not registering schedulers with the appropriate name
COLDBOX-1051 scheduler names can only be used once - executor needs to be removed
COLDBOX-1036 Scheduled tasks fail after upgrading to coldbox 6.5. Downgrading to 6.4.0 works.
COLDBOX-1027 actions for a specific pattern cannot point to different handlers
Improvement
COLDBOX-1074 Improvements to module loading/activation log messages
COLDBOX-1071 Make unloadAll() in ModuleService more resilient by verifying loaded modules exist
COLDBOX-1061 Change default template cache from concurrentSoftReference to ConcurrentReference to avoid auto cleanups
COLDBOX-1056 Default route names to pattern when using route()
COLDBOX-1050 New router method: apiResources()
to allow you to define resources without the new and edit actions
COLDBOX-1049 Update elixirPath to allow for many permutations of filenames and arguments to avoid cache collisions
COLDBOX-1048 Ability for the response setPagination()
to use any incoming argument for storage
COLDBOX-1037 Move onRequestCapture
after default event capture to allow for consistency on the capture
COLDBOX-980 Deprecate declaration of multiple resources on a single resources()
call
COLDBOX-676 Improve routing DSL to allow for different HTTP verbs on the the same route to point to different events or actions
New Feature
COLDBOX-1082 Announce onException
interception points for async interceptors
COLDBOX-1080 experimental web mapping support to allow for modern app templates with assets outside of the webroot
COLDBOX-1076 Ability to pass in the domain to test executions in via integration testing
COLDBOX-1073 Enable automated full null support via github actions
COLDBOX-1065 ScheduledTask new getMemento
() to get the state of the task
COLDBOX-1064 Schedulers can now get the current thread and thread name: getCurrentThread(), getThreadName()
as private helpers
COLDBOX-1033 New controller method: getUserSessionIdentifier
() which gives you the unique request tracking identifier according to our algorithms
COLDBOX-1032 New coldbox setting identifierProvider
which can be a closure/udf/lambda that provides a unique tracking identifier for user requests
Bug
CACHEBOX-76 Fixed method return value + SQL compatibility on jdbc metadata indexer thanks to @homestar9
CACHEBOX-75 reap operation was not ignoring 0 values for last access timeouts
CACHEBOX-74 Typo in queryExecute Attribute "datasource" in the JDBCStore.cfc
Improvement
CACHEBOX-73 Replace IIF and urlEncodedFormat on cache content reports
CACHEBOX-79 Lower logging verbosity of cache reaping from info to debug messages
Bug
WIREBOX-124 Killing IInjector
interface usages due to many issues across cfml engines, leaving them for docs only
WIREBOX-118 Never override an existing variables key with virtual inheritance
Improvement
WIREBOX-120 DSLs process method now receives the caller targetID
alongside the targetObject
and the target
definition
New Feature
WIREBOX-122 New wirebox DSL to inject the target's metadata that's cached in the target's binder: wirebox:objectMetadata
WIREBOX-121 New WireBoxDSL: wirebox:targetID
to give you back the target ID used when injecting the object
WIREBOX-119 Missing coldbox:schedulerService
DSL
WIREBOX-117 HDI - Ability for injectors to have a collection of child injectors to delegate lookups to, basically Hierarchical DI
Task
WIREBOX-123 Removal of usage of Injector dsl interface due to so many issues with multiple engines
ColdBox 6.2.0 is a minor release with some major improvements in many areas like:
Async programming
Logging
Object creations
WireBox Mappings and Binders
This is a major change in the core as we have finally rewritten the WireBox Binder
and object Mapping
objects to script. This resulted in a 45-50% code reduction for those objects and an impressive 30% speed improvements when creating and processing mappings with the new binder processing optimizations. We analyzed every single line of code on these two objects and we are incredibly satisfied with the initial results.
That's right, we have some async goodness prepared for future versions when dealing with multiple directory mappings and much more.
We have done more runtime analysis on our asynchronous
package and we have optimized the heck out of it using the amazing FusionReactor Profilers! Especially the applyAll()
and collection based parallel computing. We reached a point where all of our tests cases where running faster than even native Lucee/Adobe 2021 parallel constructs. Below you can see a snapshot of our test bed creating 1000 transient objects with dependency injections and object populations using async constructs.
You can find our test bed here: https://github.com/ColdBox/coldbox-platform/blob/development/tests/suites/async/performance-parallel-tests.cfm
Just a reminder that the ColdBox async capabilities are all powered by the Java concurrency packages leveraging Completable Futures, Executors and Scheduled Tasks. It is not only true to the Java API but we have made tons of enhancements especially for ColdFusion and its dynamic nature. Check out our docs!
It is also available to ANY ColdFusion application that is NOT running ColdBox. This is achieved by using either of our standalone libraries: WireBox, CacheBox and LogBox.
This version introduces the capability for you to tag your integration tests with an autowire
annotation on the component tag. By adding this annotation, your test object will be inspected and wired with dependencies just like any other WireBox object.
We have also included a new object coldbox.system.testing.CustomMatchers
which will register matchers into TestBox when doing integration tests. It will give you the nice ability to expect status codes and validation exceptions on RESTFul Requests via the ColdBox Response object.
toHaveStatus()
toHaveInvalidData()
Thanks to Dom Watson (@dom_watson) from PresideCMS (@presidecms) for many contributions to help clean up ColdBox view rendering! This release focuses on more performance and memory utilization updates, as well as refactoring external dependencies from pre singleton rendering approaches, which has resulted in more performance gains and lower memory usages on high rendering apps.
We have had tons of updates and requests from our new exception handling experience in ColdBox: Whoops! In this release we tackle CFML core engine files so they can render appropriately, AJAX rendering for exceptions and best of all a huge performance and size boost when dealing with exceptions. Even when dealing with exceptions we want the best and the fastest experience possible for our developers.
The previous approach whoops took was to read and load all the source code of all the templates that caused the exception. You could then navigate them to discover your faults. However, each template could be loaded from 1 to up to 10 times if the stack trace followed it. In this new update we provide source template caching and dynamic runtime injection and highlighting of the source code. This has granted us the following improvements in small test cases (Your improvements could be higher)
[COLDBOX-936] - ExceptionBean
throws exception on weird ORM illegal access collection on scope dump
[COLDBOX-937] - Migration to cgi.server_name
and server_port
did not account for the incoming browser port but the cf service port
[COLDBOX-938] - getFullURL()
is not accounting for app mappings
[COLDBOX-939] - Invalid event handler detection was overriding some event handler beans
[COLDBOX-941] - timeUnits
had type mismatches when used in async futures' allApply
[COLDBOX-948] - Whoops should validate a file exists before trying to present it to the code viewer
[COLDBOX-942] - Add timeout
and timeUnit
arguments to the allApply()
method directly when using Futures
[COLDBOX-943] - New global settings: sesBasePath
and HtmlBasePath
that represent the pathing with no host and protocol
[COLDBOX-946] - new request context method getFullPath()
which returns the full url with no protocol or host
[COLDBOX-957] - New autowire
annotation or `variables.autowire
` on integration tests so ColdBox will autowire the test with dependencies via WireBox
[COLDBOX-958] - Store the test case metadata on ```variables.metadata``` so it can be reused by any helper within test operations
[COLDBOX-959] - New ColdBox CustomMatchers
object found at coldbox.system.testing.CustomMatchers
which is loaded on all tests
[COLDBOX-895] - migrating usage of cgi.http_host
to cgi.server_name
due to inconsistencies with proxy requests that affects caching and many other features
[COLDBOX-931] - ProcessStackTrace()
Creates Many Nested Spans, improved output HTML
[COLDBOX-933] - Improved safety reset for base test cases
[COLDBOX-940] - Performance optimizations for entire async package
[COLDBOX-944] - Refactored cgi server and port detections to improve testability and single responsibiilty principles
[COLDBOX-945] - Event caching now bases off the multi host key from the event.getSESBaseURL()
to improve consistencies and single responsibility
[COLDBOX-947] - encapsulate processEception()
from the bootstrap to within the exception objects
[COLDBOX-949] - better exception tracking for interceptor getProperty()
calls that don't exist
[COLDBOX-952] - RendererEncapsulator
: use of filter method for rendererVariables
is inefficient, migrated to less fluent but more performant approach.
[COLDBOX-953] - Update DateFormat
Mask to use lowercase "d" to be compatible with ACF2021
[COLDBOX-954] - Refactor viewsHelperRef
and layoutsHelperRef
to local renderer variables instead of settings, which resulted in even better speed improvements
[COLDBOX-955] - If in an Ajax request and an exception occurs using Whoops the view is unusable
[COLDBOX-956] - Whoops loads multiple files into the DOM for the templates in the stacktrace causing major slowdownsa
[COLDBOX-945] - Event caching now bases off the multi host key from the event.getSESBaseURL() to improve consistencies and single responsibility
[COLDBOX-953] - Update DateFormat
Mask to use lowercase "d" to be compatible with ACF2021
[WIREBOX-99] - parameter [binder] to function [process] is required but was not passed in When setting coldbox.autoMap to false and choosing either method of mapping a directory:
[WIREBOX-102] - ACF incompats with future combinations due to dumb elvis operator bug
[WIREBOX-98] - Pass the current injector
to the binder's life-cycle methods: onShutdown(), onLoad()
[WIREBOX-100] - Create a processEagerInits()
so it can process them at wirebox load
[WIREBOX-101] - Complete rewrite of the Mapping
object to script and performance optimizations
[WIREBOX-103] - Complete rewrite of the WireBox Binder
to script and optimizations
[WIREBOX-104] - New WireBox config: autoProcessMappings
which can be used to auto process metadata inspections on startup.
[COLDBOX-960] - jsonPayloadToRC
is not working in 6.2 update
[COLDBOX-961] - Random bug dealing with integration testing when dealing with routes vs direct events
[WIREBOX-105] - Regression: Remove default dsl of "" from initArg()
and addDIConstructorArgument()
[WIREBOX-106] - Regression: parentInjector() stopRecursions()
collision with internal property name
[COLDBOX-963] - Use Java URI for more resiliant getFullURL
to avoid double slashes
[WIREBOX-107] - wirebox metadata caching broken
[WIREBOX-109] - Standalone event pool interceptData
-> data not backwards compat
[WIREBOX-108] - WireBox not handling cachebox, logbox, and asyncmanager instances properly
[CACHEBOX-65] - CacheBox not handling wirebox, logbox, and asynmanager instances properly
[LOGBOX-60] - Ignore interrupted exceptions from appenders' scheduler pool
ColdBox 6.0.0 is a major release for the ColdBox HMVC platform. It has some dramatic new features as we keep pushing for more modern and sustainable approaches to web development. We break down the major areas of development below and you can also find the full release notes per library at the end.
It is also yet another source code reduction due to the dropping of support for the following CFML Engines:
Adobe ColdFusion 11
Lucee 4.5
The info-graphic above shows you the supported engines the 6.x platform will support.
We have done a tremendous amount of work to expose all the async and parallel programming constructs in ColdBox to the entire framework so developers can leverage them. There is just so much we have done on this release for concurrency, task scheduling, and parallel programming to include in one page. So visit our Async Programming section to start delving into what we are lovingly calling cbFutures!
Thanks to our new futures approach, all major internal libraries (WireBox, CacheBox, LogBox, MVC) will leverage them for different tasks that require asynchronicity and scheduling. You will see a noticeble difference especially in the following areas:
Cache Reaping: All cache reaping is now done via a scheduled task running on specific frequencies
File Appenders: It uses an async schedule to stream log data to files instead of blocking operations for sending logs. It will use a logging in-memory queue to stream the log data to the file. So you can potentially send 10000 log events and eventually they will be streamed to disk.
A ColdBox future is used for async/parallel programming where you can register a task or multiple tasks that will execute in a non-blocking approach and trigger dependent computations which could also be asynchronous. This Future object can then be used to monitor the execution of the task and create rich completion/combining pipelines upon the results of such tasks. You can still use a get()
blocking operation, but that is an over simplistic approach to async programming because you are ultimately blocking to get the result.
ColdBox futures are backed by Java's CompletableFuture
API, so the majority of things will apply as well; even Java developers will feel at home. It will allow you to create rich pipelines for creating multiple Futures, chaining, composing and combining results.
This new approach to creating async pipelines and parallel processing, will further create extensibility and robustness in your ColdBox applications.
coldbox-tasks
Global ExecutorColdBox apps by default register a coldbox-tasks
fixed executor (20 threads - IO bound) that is used internally for cleanups, tasks, and schedules. However, any module or application can leverage it for scheduling tasks or workers.
CacheBox has been refactored to leverage the async facilities in ColdBox to schedule cache reaps instead of a request initiating the reaps. This brings a lot more stability and consistency to the reaping of caches as they all execute within the new ColdBox coldbox-tasks
schedule task executor.
If you are in CacheBox standalone mode, then the task scheduler will be called cachebox-tasks
.
LogBox has been entirely rewritten in script and a more fluent programming approach. It has also been revamped to leverage the scheduling executors and async programming aspects of our async package. All loggers now sport logging via an async queue and it is completely non-blocking. If you do heavy logging, the performance will be substantial.
The ModuleService
and all internal ColdBox services have deeper logging constructs and more information logging to understand what happens inside of the core.
Thanks to Eric Peterson, we have included Whoops as part of our core exception handling template. All the new application templates come pre-configured with whoops as part of the development
custom error template.
Warning: Make sure you DO NOT choose this template on production as it can expose code. We do our best to use environment detection to NEVER render it in production, but things can always happen. So always use it within the development
method.
This exception template will help you visualize and navigate your exceptions so you can fix those pesky bugs 🐞. You can even configure it to open the files directly into your favorite IDE using the coldbox.exceptionEditor
setting:
Valid Exception Editors are:
vscode
(Default)
vscode-insiders
sublime
textmate
emacs
macvim
idea
atom
espresso
After many years of adding a base handler and a response object to our application templates, we finally have integrated them into the core so developers can have even more support when building RESTFul services. This new rest handler will provide you with tons of utilities and approaches to make all of your RESTFul services:
Uniform
Consistent
A consistent and extensible response object
Error handling
Invalid Route handling
Much more
New base class coldbox.system.RestHandler
which you can inherit from or use our new restHandler
annotation. This will give you access to our enhanced API utilities and the native response object via the request context's getResponse()
method.
You can now build all of your api’s using the native response object like the rest templates, but now from the core directly. This Rest Handler gives you the following actions out of the box:
The aroundHandler
() provided in the RestHandler
will intercept all rest calls in order to provide consistency and uniformity to all your actions. It will try/catch for major known exceptions, time your requests, add extra output on development and much more. Here are a list of the features available to you:
Exception Handling
Automatic trapping of the following exceptions: InvalidCredentials, ValidationException, EntityNotFound, RecordNotFound
Automatic trapping of other exceptions
Logging automatically the exception with extra restful metadata
If in a development
environment it will respond with much more information necessary for debugging both in the response object and headers
Development Responses
If you are in a development
environment it will set the following headers for you:
x-current-route
x-current-routed-url
x-current-routed-namespace
x-current-event
Global Headers
The following headers are sent in each request
x-response-time
: The time the request took in CF
x-cached-response
: If the request is cached via event caching
The aroundHandler()
is also smart in detecting the following outputs from a handler:
Handler return
results
Setting a view or layout to render
Explicit renderData()
calls
getResponse()
Will get you the current prc.response
object, if the object doesn’t exist, it will create it and set it for you
The core response object can be found here: coldbox.system.web.context.Response
If you would like to extend or modify the behavior of the core RestHandler
then you will have to create your own base handler that inherits from it. Then all of your concrete handlers will inherit from your very own handler.
The response object can be found here: coldbox.system.web.context.Response
and the rest handler constructs it by calling the request context’s getResponse
() method. The method verifies if there is a prc.response
object and if it exists it returns it, else it creates a new one. So if you would like to use your very own, then just make sure that before the request you place your own response object in the prc
scope.
Here is a simple example using a preProcess()
interceptor. Create a simple interceptor with commandbox e.g
and add the following method:
Don't forget to register your interceptor in config/Coldbox.cfc:
That’s it. Once that response object is in the prc
scope, ColdBox will utilize it. Just make sure that your custom Response object satisfies the methods in the core one. If you want to modify the output of the response object a good place to do that would be in the getDataPacket()
method of your own MyResponseObject
. Just make sure this method will return a struct
.
when()
Our super type now includes a new when()
method that will allow you to build functional statements within your handlers. Here is the signature of this functional helper:
The target
is a boolean and can be an expression that evaluates to a boolean. If the target
is true, then the success
closure will be executed for you, if not, the failure
closure will be executed.
The entire rendering mechanisms have changed in ColdBox 6 and we now support a singleton based approach to view rendering. It still allows for variable safety, but the way renderings in ColdBox 6 are done are orders of magnitude faster than pre ColdBox 6 days. If you are using applications like ContentBox or Preside CMS or applications with tons of renderView()
calls, your applications will fly now!
Thanks to a community pull request you now have the ability to chose the reinit key instead of the default of fwReinit
. This is useful for security purposes.
Then you can use it in the request: http://localhost/index.cfm?cbReinit=true
If you are using LogBox in standalone mode, you can now construct it by passing the path to your LogBox configuration file or no path at all and we will construct LogBox with our new default config file to stream logs to the console.
These methods have been deprecated in favor of our new announce()
method. We have also deprecated the argument interceptData
in favor of just data.
listen()
method to register one-off closuresHave you ever wanted to dynamically listen to events but not create CFC to enclose the method? Well, now you can use the new listen()
method which accepts a closure/udf so you can listen to ColdBox interceptions. Here is the method signature:
This allows you to easily register dynamic closures/udfs whenever you like so they can listen to events:
onColdBoxShutdown()
We have created a new interception point that is fired before ColdBox is shutdown completely. This can come from a reinit or an application expiration. This is a great place to shutdown custom executors, or messaging queues like RabbitMQ.
We have done several enhancements to the entire routing capabilities in ColdBox apart from several bug fixes.
buildLink()
Ease of UseWe have also re-arranged the arguments so you can easily build links with query strings using positional arguments instead of name-value pairs:
buildLink()
Named Route SupportThe request context method event.buildLink()
has been now added named route support. The event.route()
method was introduced to do named routing with a name
and params
argument. Now, you can also use this approach but via the to
argument in the buildLink()
method by just passing a struct.
You can now add custom metadata to specific route or resourceful routes by using the meta()
method or the meta
argument. This is simply a struct of name value pairs you can add into the route record.
Now, how good is adding the metadata if you can't get it. So you can get the current route's metadata via the new request context method: getCurrentRouteMeta()
method:
We have also added the method getCurrentRouteRecord()
to the request context so you can get the struct definition of the route record of the currently routed route. Below is a sample screenshot of the record:
The toRedirect()
method has been enhanced to accept a closure as the target
of relocation. This closure will received the parsed parameters, the incoming route record and the event object. You can now determine dynamically where the relocation will go.
This is great if you need to actually parse the incoming route and do a dynamic relocation.
Happy Redirecting!
The full release notes per library can be found below. Just click on the library tab and explore their release notes:
[COLDBOX-48] - CacheBox creates multiple reap threads if the initial one take longer to complete than the reap frequency
[COLDBOX-339] - Error in AbstractFlashScope: key does't exists due to race conditions
[COLDBOX-822] - InvalidEvent is not working when set to a module event
[COLDBOX-829] - Stopgap for Lucee bug losing sessionCluster application setting
[COLDBOX-832] - toResponse() silently fails on incorrect data types
[COLDBOX-837] - Unable to manually call invalid event method without producing error
[COLDBOX-839] - Router method and argument name discrepancy
[COLDBOX-845] - Capture request before announcing onRequestCapture
[COLDBOX-850] - XML Converter Updated invoke() to correctly call method by name
[COLDBOX-857] - ElixirPath does not take in account of module root
[COLDBOX-861] - Self-autowire fails for applications with context root configured in ColdBox Proxy
[COLDBOX-862] - when passing custom cfml executors to futures it blows up as the native executor is not set
[COLDBOX-873] - NullPointerException in ScheduledExecutor (Lucee 5.3.4.80)
[COLDBOX-875] - PopulateFromQuery : Gracefully handle out of index rownumber in populateFromQuery #450
[COLDBOX-878] - ColdBox 6 blows up if models directory doesn't exist
[COLDBOX-879] - Reinit-Password-Check does not use the new "reinitKey"-Setting
[COLDBOX-880] - ViewHelpers not working in CB-6 RC
[COLDBOX-885] - Pagination not showing from rest response
[COLDBOX-889] - RendererEncapsulator passes view-variables to "next" rendered view
[COLDBOX-891] - Whoops breaking on some exceptions
[COLDBOX-897] - Template cache eventSnippets don't match module events or event suffixes
[COLDBOX-899] - queryString argument ignored when using event in `BaseTestCase#execute`
[COLDBOX-903] - Renderer.ViewNotSetException when renderLayout used in request
[COLDBOX-911] - Garbled text in Whoops error screen - utf8 encoding
[COLDBOX-268] - Async Workers
[COLDBOX-749] - Performance: make renderer a singleton
[COLDBOX-848] - Improve the bug reporting template for development based on whoops
[COLDBOX-849] - Incorporate Response and RestHandler into core
[COLDBOX-851] - All ColdBox apps get a `coldbox-tasks` scheduler executor for internal ColdBox services and scheduled tasks
[COLDBOX-852] - Updated the default ColdBox config appender to be to console instead of the dummy one
[COLDBOX-853] - ColdBox controller gets a reference to the AsyncManager and registers a new `AsyncManager@coldbox` wirebox mapping
[COLDBOX-855] - Allow for the application to declare it's executors via the new `executors` configuration element
[COLDBOX-856] - Allow for a module to declare it's executors via the new `executors` configuration element
[COLDBOX-858] - Introduction of async/parallel programming via cbPromises
[COLDBOX-859] - ability to do async scheduled tasks with new async cbpromises
[COLDBOX-860] - Convert proxy to script and optimize it
[COLDBOX-863] - Add setting to define reinit key vs. hard-coded fwreinit: reinitKey
[COLDBOX-864] - jsonPayloadToRC now defaults to true
[COLDBOX-865] - autoMapModels defaults to true now
[COLDBOX-868] - RequestContext Add urlMatches to match current urls
[COLDBOX-869] - Response, SuperType => New functional if construct when( boolean, success, failure )
[COLDBOX-871] - Removed fwsetting argument from getSetting() in favor of a new function: getColdBoxSetting()
[COLDBOX-874] - BaseTestCase new method getHandlerResults() to easy get the handler results, also injected into test request contexts
[COLDBOX-876] - New dsl coldbox:coldboxSettings alias to coldbox:fwSettings
[COLDBOX-877] - New dsl coldbox:asyncManager to get the async manager
[COLDBOX-887] - Elixir manifest support for module and app roots via discovery
[COLDBOX-894] - New listen() super type and interceptor service method to register one-off closures on specific interception points
[COLDBOX-905] - The buildLink( to ) argument can now be a struct to support named routes : { name, params }
[COLDBOX-906] - Move queryString as the second argument for buildLink() so you can use it with psoitional params
[COLDBOX-907] - New context method: getCurrentRouteRecord() which gives you the full routed route record
[COLDBOX-908] - New context method: getCurrentRouteMeta() which gives you the routed route metadata if any
[COLDBOX-909] - New router method: meta() that you can use to store metadata for a specific route
[COLDBOX-910] - Every route record can now store a struct of metadata alongside of it using the `meta` key
[COLDBOX-912] - Allow toRedirect() to accept a closure which receives the matched route, you can process and then return the redirect location
[COLDBOX-915] - New onColdBoxShutdown interception point fired when the entire framework app is going down
[COLDBOX-866] - onInvalidEvent is now removed in favor of invalidEventHandler, this was deprecated in 5.x
[COLDBOX-867] - Removed interceptors.SES as it was deprecated in 5
[COLDBOX-870] - setnextEvent removed as it was deprecated in 5
[COLDBOX-872] - getModel() is now fully deprecated and removed in fvor of getInstance()
[COLDBOX-886] - elixir version 2 support removed
[COLDBOX-900] - `request` and associated integration test methods are not in the official docs
[COLDBOX-830] - Update cachebox flash ram to standardize on unique key discovery
[COLDBOX-833] - Improvements to threading for interceptors and logging to avoid dumb Adobe duplicates
[COLDBOX-841] - Change announceInterception() and processState() to a single method name like: announce()
[COLDBOX-846] - Use relocate and setNextEvent status codes in getStatusCode for testing integration
[COLDBOX-882] - Deprecate interceptData in favor of just data
[COLDBOX-892] - Please add an easily accessible "fwreinit" button to whoops...
[COLDBOX-895] - migrating usage of cgi.http_host to cgi.server_name due to inconsistencies with proxy requests that affects caching and many other features
[COLDBOX-904] - Interceptor Buffer Methods Removed
[COLDBOX-916] - Better module registration/activation logging to identify location and version
[WIREBOX-90] - Fix constructor injection with virtual inheritance
[WIREBOX-91] - Injector's get a reference to an asyncManager and a task scheduler whether they are in ColdBox or non-ColdBox mode
[WIREBOX-92] - New `executors` dsl so you can easily inject executors ANYWEHRE
[WIREBOX-97] - New dsl coldbox:coldboxSetting:{setting} alias to coldbox:fwSetting:{setting}
[WIREBOX-88] - Improve WireBox error on Adobe CF
[WIREBOX-93] - Rename WireBox provider get() to $get() to avoid conflicts with provided classes
[WIREBOX-94] - getInstance() now accepts either dsl or name via the first argument and initArguments as second argument
[CACHEBOX-59] - Announced Events in the set() of the cacheBoxProvider
[CACHEBOX-63] - cfthread-20506;variable [ATTRIBUES] doesn't exist;lucee.runtime.exp.ExpressionException: variable [ATTRIBUES] doesn't exist
[CACHEBOX-24] - CacheBox reaper : migrate to a scheduled task via cbPromises
[CACHEBOX-60] - CacheFactory gets a reference to an asyncManager and a task scheduler whether they are in ColdBox or non-ColdBox mode
[CACHEBOX-64] - Migrations to script and more fluent programming
[LOGBOX-35] - FileAppender: if logging happens in a thread, queue never gets processed and, potentially, you run out of heap space
[LOGBOX-38] - Rotate property is defined but never used
[LOGBOX-45] - Work around for adobe bug CF-4204874 where closures are holding on to tak contexts
[LOGBOX-50] - Rolling file appender inserting tabs on first line
[LOGBOX-5] - Allow config path as string in LogBox init (standalone)
[LOGBOX-11] - Allow standard appenders to be configured by name (instead of full path)
[LOGBOX-36] - Added an `err()` to abstract appenders for reporting to the error streams
[LOGBOX-42] - All appenders get a reference to the running LogBox instance
[LOGBOX-43] - LogBox has a scheduler executor and the asyncmanager attached to it for standalone and ColdBox mode.
[LOGBOX-44] - Rolling appender now uses the new async schedulers to stream data to files
[LOGBOX-46] - Update ConsoleAppender to use TaskScheduler
[LOGBOX-47] - AbstractAppender log listener and queueing facilities are now available for all appenders
[LOGBOX-48] - DB Appender now uses a queueing approach to sending log messages
[LOGBOX-49] - Rolling File Appender now uses the async scheduler for log rotation checks
Original Size: 218.54 KB New Size: 145.22 KB About 30-40% reduction on size depending on repetition of the templates
Original Rendering Speed: 288ms New Rendering Speed: 76ms About 74-80% rendering improvements
GET
/photos
photos.index
Get all photos
POST
/photos
photos.create
Create a photo
GET
/photos/:id
photos.show
Show a photo by id
PUT/PATCH
/photos/:id
photos.update
Update a photo by id
DELETE
/photos/:id
photos.delete
Delete a photo by id
Core Actions
Purpose
aroundHandler()
Wraps all rest actions uniformly to provide consistency and error trapping.
onError()
An implicit error handler is provided just in case anything explodes in your restful actions. Sends an appropriate 500 error
onValidationException()
Traps any and makes sure it sends the appropriate 400 response with the invalid data. Useful for using cbValidation
onEntityNotFoundException()
Traps any or exceptions and makes sure it send an appropriate 404 response. Useful for leveraging cborm or Quick ORM
onInvalidHTTPMethod()
Traps any invalid HTTP method security exception and sends the appropriate 405 not allowed response
onMissingAction()
Traps any invalid actions/resource called in your application and sends the appropriate 404 response
onAuthenticationFailure()
Traps InvalidCredentials exceptions and sends the appropriate 403 invalid credentials response. If you are using cbSecurity it will also verify jwt token expiration and change the error messages accordingly.
onAuthorizationFailure()
Action that can be used when a user does not have authorization or access to your application or code. Usually you will call this manually or from a security library like cbSecurity or cbGuard. It will send a 401 not authorized response.
onInvalidRoute()
Action that can be used as a catch all from your router so it can catch all routes that are invalid. It will send a 404 response accordingly.
onExpectationFailed()
Utility method for when an expectation of the request fails ( e.g. an expected parameter is not provided ). This action is called manually from your own handlers and it will output a 417 response back to the user.