Interceptor used for opening the {@link CommandContext} and {@link CommandInvocationContext}.
Since 7.1, this interceptor will not always open a new command context but instead reuse an existing command context if possible. This is required for supporting process engine public API access from delegation code (see {@link ProcessEngineServicesAware}.). However, for every command, a new command invocation context is created. While a command context holds resources that are shared between multiple commands, such as database sessions, a command invocation context holds resources specific for a single command.
The interceptor will check whether an open command context exists. If true, it will reuse the command context. If false, it will open a new one. We will always push the context to the {@link Context} stack. So ins some situations, you will see the same context being pushed to the sackmultiple times. The rationale is that the size of the stack should allow you to determine whether you are currently running an 'inner' command or an 'outer' command as well as your current stack size. Existing code may rely on this behavior.
The interceptor can be configured using the property {@link #alwaysOpenNew}. If this property is set to true, we will always open a new context regardless whether there already exists an active context or not. This is required for properly supporting REQUIRES_NEW semantics for commands run through the {@link ProcessEngineConfigurationImpl#getCommandInterceptorsTxRequiresNew()}chain. In that context the 'inner' command must be able to succeed / fail independently from the 'outer' command.
@author Tom Baeyens
@author Daniel Meyer
@author Thorben Lindhauer