Ravi Nori has uploaded a new change for review.

Change subject: engine : Introduction of DecoratedCommand
......................................................................

engine : Introduction of DecoratedCommand

This patch introduces the DecoratedCommand class
that intercepts calls to endAction and calls
handleEndActionResult

Change-Id: I0ffe9899c324110502319078cf5fe16f3a4b8c11
Signed-off-by: Ravi Nori <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/DecoratedCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Command.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java
8 files changed, 127 insertions(+), 23 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/36/26336/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
index b2de356..83a19ea 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
@@ -37,6 +37,7 @@
 import org.ovirt.engine.core.bll.session.SessionDataContainer;
 import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
 import org.ovirt.engine.core.bll.tasks.TaskManagerUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.Command;
 import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.common.AuditLogType;
@@ -94,7 +95,7 @@
 import org.springframework.dao.DataAccessException;
 
 public abstract class CommandBase<T extends VdcActionParametersBase> extends 
AuditLogableBase implements
-        RollbackHandler, TransactionMethod<Object> {
+        RollbackHandler, TransactionMethod<Object>, Command<T> {
 
     /* Multiplier used to convert GB to bytes or vice versa. */
     protected static final long BYTES_IN_GB = 1024 * 1024 * 1024;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
index 97c5839..682145b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
@@ -31,7 +31,7 @@
     private static final Map<Guid, CommandMultiAsyncTasks> 
_multiTasksByCommandIds =
             new HashMap<Guid, CommandMultiAsyncTasks>();
 
-    private CommandMultiAsyncTasks GetCommandMultiAsyncTasks() {
+    public CommandMultiAsyncTasks GetCommandMultiAsyncTasks() {
         CommandMultiAsyncTasks entityInfo = null;
         synchronized (_lockObject) {
             entityInfo = _multiTasksByCommandIds.get(getCommandId());
@@ -115,7 +115,6 @@
     private void EndCommandAction() {
         CommandMultiAsyncTasks entityInfo = GetCommandMultiAsyncTasks();
         VdcReturnValueBase vdcReturnValue = null;
-        ExecutionContext context = null;
         boolean endActionRuntimeException = false;
 
         AsyncTasks dbAsyncTask = getParameters().getDbAsyncTask();
@@ -139,15 +138,7 @@
                     dbAsyncTask.getActionParameters().getExecutionIndex());
 
             try {
-                /**
-                 * Creates context for the job which monitors the action
-                 */
-                Guid stepId = dbAsyncTask.getStepId();
-                if (stepId != null) {
-                    context = ExecutionHandler.createFinalizingContext(stepId);
-                }
-
-                vdcReturnValue = coco.endAction(stepId, 
getEndActionType(dbAsyncTask), dbAsyncTask, context);
+                vdcReturnValue = coco.endAction(this);
 
             } catch (VdcBLLException ex) {
                 log.error(getErrorMessage());
@@ -172,7 +163,7 @@
                 handleEndActionRuntimeException(entityInfo, dbAsyncTask);
             } else {
                 boolean isTaskGroupSuccess = 
dbAsyncTask.getActionParameters().getTaskGroupSuccess();
-                handleEndActionResult(entityInfo, vdcReturnValue, context, 
isTaskGroupSuccess);
+                handleEndActionResult(entityInfo, vdcReturnValue, 
coco.getExecutionContext(dbAsyncTask.getStepId()), isTaskGroupSuccess);
             }
         }
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
index 9032f64..e2ef9b9 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
@@ -39,6 +39,7 @@
 
 public class CommandCoordinatorImpl extends CommandCoordinator {
 
+    private static final String EXECUTION_CONTEXT_MAP_NAME = 
"executionContext";
     private static final CommandCoordinatorImpl instance = new 
CommandCoordinatorImpl();
     private static final Log log = LogFactory.getLog(CommandCoordinator.class);
     private CommandsCache commandsCache = new CommandsCacheImpl();
@@ -47,7 +48,10 @@
         return instance;
     }
 
+    CacheWrapper<Guid, ExecutionContext> executionContextMap;
+
     private CommandCoordinatorImpl() {
+        executionContextMap = CacheProviderFactory.<Guid, 
ExecutionContext>getCacheWrapper(EXECUTION_CONTEXT_MAP_NAME);
     }
 
     public Step addTaskStep(ExecutionContext context, StepEnum stepName, 
String description) {
@@ -291,6 +295,71 @@
         }
     }
 
+    public VdcReturnValueBase endAction(SPMTask task) {
+        AsyncTasks dbAsyncTask = task.getParameters().getDbAsyncTask();
+        Guid stepId = dbAsyncTask.getStepId();
+        VdcActionType actionType = getEndActionType(dbAsyncTask);
+        Guid commandId = dbAsyncTask.getActionParameters().getCommandId();
+        VdcActionParametersBase parameters = dbAsyncTask.getActionParameters();
+        try {
+            ExecutionContext context = null;
+            if (stepId != null) {
+                context = createFinalizingContext(stepId);
+                executionContextMap.put(stepId, context);
+                CommandEntity commandEntity = commandsCache.get(commandId);
+                if (!actionType.equals(commandEntity.getCommandType())) {
+                    throw new RuntimeException("action types don't match");
+                } else {
+                    log.info("in CommandManager.endAction action types match " 
+ actionType.toString());
+                }
+                if (!parameters.equals(commandEntity.getCommandType())) {
+                    throw new RuntimeException("parameters dont match");
+                } else {
+                    log.info("in CommandManager.endAction parameters match " + 
parameters.toString());
+                }
+            }
+            CommandBase<?> command = 
CommandsFactory.getInstance().createCommand(actionType, parameters);
+            command.setContext(new CommandContext(context));
+            return new DecoratedCommand(this, command, (CommandAsyncTask) 
task).endAction();
+        } finally {
+            commandsCache.remove(commandId);
+        }
+    }
+
+    private VdcActionType getEndActionType(AsyncTasks dbAsyncTask) {
+        VdcActionType commandType = 
dbAsyncTask.getActionParameters().getCommandType();
+        if (!VdcActionType.Unknown.equals(commandType)) {
+            return commandType;
+        }
+        return dbAsyncTask.getaction_type();
+    }
+
+    @Override
+    public void endTaskJob(Guid stepId, boolean exitStatus) {
+        if (stepId != null) {
+            ExecutionContext context = executionContextMap.get(stepId);
+            ExecutionHandler.getInstance().endTaskJob(context, exitStatus);
+            executionContextMap.remove(stepId);
+        }
+    }
+
+    public ExecutionContext createFinalizingContext(Guid stepId) {
+        return ExecutionHandler.getInstance().createFinalizingContext(stepId);
+    }
+
+    @Override
+    public ExecutionContext getExecutionContext(Guid stepId) {
+        return executionContextMap.get(stepId);
+    }
+
+    @Override
+    public boolean taskHasContext(Guid stepId) {
+        if (stepId == null) {
+            return false;
+        }
+        return executionContextMap.containsKey(stepId);
+    }
+
     private AsyncTaskManager getAsyncTaskManager() {
         return AsyncTaskManager.getInstance(this);
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/DecoratedCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/DecoratedCommand.java
new file mode 100644
index 0000000..0cd3103
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/DecoratedCommand.java
@@ -0,0 +1,31 @@
+package org.ovirt.engine.core.bll.tasks;
+
+import org.ovirt.engine.core.bll.tasks.interfaces.Command;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
+
+public class DecoratedCommand<T extends VdcActionParametersBase> implements 
Command<T> {
+
+    private CommandCoordinator coco;
+    private Command<T> innerCommand;
+    private CommandAsyncTask task;
+
+    public DecoratedCommand(CommandCoordinator coco,
+                            Command<T> innerCommand,
+                            CommandAsyncTask task) {
+        this.coco = coco;
+        this.innerCommand = innerCommand;
+        this.task = task;
+    }
+
+    @Override
+    public VdcReturnValueBase endAction() {
+        return innerCommand.endAction();
+    }
+
+    @Override
+    public T getParameters() {
+        return innerCommand.getParameters();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java
index 808bf56..1f4a66d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CallBack.java
@@ -8,4 +8,5 @@
 
 public interface CallBack {
     public VdcReturnValueBase endAction(Guid stepId, VdcActionType actionType, 
AsyncTasks dbAsyncTask, ExecutionContext context);
+    public VdcReturnValueBase endAction(SPMTask task);
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Command.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Command.java
new file mode 100644
index 0000000..fde2de1
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Command.java
@@ -0,0 +1,9 @@
+package org.ovirt.engine.core.bll.tasks.interfaces;
+
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
+
+public interface Command<T extends VdcActionParametersBase> {
+    VdcReturnValueBase endAction();
+    T getParameters();
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java
index 32c7b2d..9e6e73c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/Poller.java
@@ -1,9 +1,15 @@
 package org.ovirt.engine.core.bll.tasks.interfaces;
 
+import java.util.ArrayList;
 import java.util.Map;
+
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
 import org.ovirt.engine.core.compat.Guid;
 
 public interface Poller {
+
     Map<Guid, AsyncTaskStatus> getAllTasksStatuses(Guid storagePoolID);
+    ArrayList<AsyncTaskCreationInfo> getAllTasksInfo(Guid storagePoolID);
+
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java
index 309083d..9a393cc 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java
@@ -1,16 +1,10 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
 package org.ovirt.engine.core.bll.tasks.interfaces;
 
-import java.util.ArrayList;
-import java.util.Map;
 
+import org.ovirt.engine.core.bll.job.ExecutionContext;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
-import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
 import org.ovirt.engine.core.common.businessentities.AsyncTasks;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
@@ -22,12 +16,14 @@
  */
 public interface TaskHelper {
 
-    ArrayList<AsyncTaskCreationInfo> getAllTasksInfo(Guid storagePoolID);
-
-    Map<Guid, AsyncTaskStatus> getAllTasksStatuses(Guid storagePoolID);
+    public void endTaskJob(Guid stepId, boolean exitStatus);
 
     void stopTask(Guid storagePoolID, Guid vdsmTaskID);
 
+    public boolean taskHasContext(Guid stepId);
+
+    public ExecutionContext getExecutionContext(Guid stepId);
+
     public VDSReturnValue clearTask(Guid storagePoolID, Guid vdsmTaskID);
 
     public SPMTask construct(AsyncTaskCreationInfo creationInfo);


-- 
To view, visit http://gerrit.ovirt.org/26336
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0ffe9899c324110502319078cf5fe16f3a4b8c11
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Ravi Nori <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to