Hi all,
Thanks to the help of Alon, oved, Tal, Moti, Arik and others, the following 
changes were introduced:

1. Internal commands invocation -

When invoking an internal command from a command, please use the following :

Instead of Backend.getInstance().runInternalAction...

Use 

runInternalAction - a new method that was introdced at CommandBase.

This method has two variants - one that accepts command context, and the other 
that does not have a command contet -

runInternalAction(VdcActionType,VdcActionParametersBase,CommandContext)

and

runInternalAction(VdcActionType,VdcActionParametersBase)

If CommandContext is not passed the context at the calling command will be 
cloned and set at the child command.

If a Command context is pased - it should be the responsibility of the caller 
to clone, however, this will give the caller some degree of freedom to 
determine whether various
parts of the context will be cloned, or not.

Examples:

runInternalAction(VdcActionType.AddPermission, permissionParams)  has the same 
effect as :  runInternlAction(VdcActionType.AddPermissiosn, permissionParams, 
getContext().clone())


runInternlAction(VdcActionType.AddPermissiosn, permissionParams, 
getContext().clone().withoutCompensationContext()) - will cause the 
compensation context to be reset, and let the child command determine the value 
of compensation context (at handleTransactivity method).

The complete list of "context alteration methods" are -

withCompensationContext(CompensationContext)  , withoutCompensationContext()
withLock(EngineLock), withoutLock()
withExecutionContext(ExecutionContext), withoutExecutionContext() -  bare in 
mind that all these follow the chaining method "design pattern" [1] (I would 
like to thank Moti for the naming suggestions)


two methods for running InternalAction with context for tasks were created:

runInternalActionWithTasksContext(VdcActionType, VdcActionParametersBase)

runInternalActionWithTasksContext(VdcActionType, VdcActionParametersBase, 
EngineLock)


These methods use  ExecutionHandler.createDefaultContextForTasks to create the 
relevant command context to be passed to the child command.


runInternalMultipleActions was introduced to command base in a similar manner, 
with 3 versions:

runInternalMultipleActions(VdcActionType, ArrayList<VdcActionParametersBase>)

runInternalMultipleActions(VdcActionType, ArrayList<VdcActionParametersBase>, 
ExecutionContext)

runInternalMultipleActions(VdcActionType, ArrayList<VdcActionParametersBase>, 
CommandContext)


2. Queries invocation -


runInternalQuery(VdcQueryType, VdcQueryParametersBase) was introduced to 
command base.

Basically it takes the engine context from the current command context, and 
runs the internal query with it.

EngineContext is the context which should hold all the common attributes to our 
flows at engine - currently it holds the engineSessionId, working towards 
moving correlationId to it as well.



3. Commands & Queries coding

Each internal query should have a ctor that takes the parameters, and also the 
engine context .
As some of the queries are both internal and non internal you may have two 
ctors - one with parameters only, one with parameters and EngineContext

for example 

public class GetUnregisteredDiskQuery<P extends 
GetUnregisteredDiskQueryParameters> extends QueriesCommandBase<P> {

    public GetUnregisteredDiskQuery(P parameters) {
        this(parameters, null);
    }

    public GetUnregisteredDiskQuery(P parameters, EngineContext context) {
        super(parameters, context);
    }

Notice that the ctor without the context calls the one with the context.

Same happens at Commands:


   public RemovePermissionCommand(T parameters) {
        this(parameters, null);
    }

    public RemovePermissionCommand(T parameters, CommandContext commandContext) 
{
        super(parameters, commandContext);
    }



4. runVdsCommand was introduced to CommandBase as well

runVdsCommand(VDSCommandType, VdsCommandParameters) - currently this just runs 
the vds command on vds broker, working on propagating the engine context via 
vds broker as well.


Please use the above in your code. If you see any issues , or places where its 
problematic to use, feel free to contact me.


[1]
http://en.wikipedia.org/wiki/Method_chaining







_______________________________________________
Devel mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/devel

Reply via email to