Allon Mureinik has uploaded a new change for review.

Change subject: core: [WIP] introducing SPMAsyncTaskHandler
......................................................................

core: [WIP] introducing SPMAsyncTaskHandler

Initial revision of SPMAsyncTaskHandler and refactoring command base
accordingly.

Change-Id: I4f2d113ced0276a9d849b7f00c7757e003d35f4c
Signed-off-by: Allon Mureinik <amure...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CompleteCommandSPMAsyncTaskHandler.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTaskHandler.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
4 files changed, 120 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/56/7956/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 ae1aa9c..9f368cc 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
@@ -4,6 +4,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -26,6 +27,7 @@
 import org.ovirt.engine.core.bll.quota.Quotable;
 import org.ovirt.engine.core.bll.session.SessionDataContainer;
 import org.ovirt.engine.core.bll.tasks.AsyncTaskUtils;
+import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
@@ -115,6 +117,12 @@
      */
     protected Map<String, String> jobProperties;
 
+    /** Handlers for performing the logical parts of the command */
+    private List<? extends SPMAsyncTaskHandler> taskHandlers;
+
+    /** The handler to execute */
+    private int executionIndex = 0;
+
     protected CommandActionState getActionState() {
         return _actionState;
     }
@@ -139,6 +147,7 @@
         }
 
         commandId = commandIdFromParameters;
+        taskHandlers = initTaskHandlers();
     }
 
     /**
@@ -148,6 +157,10 @@
      */
     protected CommandBase(Guid commandId) {
         this.commandId = commandId;
+    }
+
+    protected List<? extends SPMAsyncTaskHandler> initTaskHandlers() {
+        return Collections.singletonList(new 
CompleteCommandSPMAsyncTaskHandler(this));
     }
 
     /**
@@ -309,8 +322,12 @@
      * </ol>
      * <li>Remove all the snapshots for this command, since we handled 
them.</li> </ol>
      */
-    @SuppressWarnings({ "unchecked", "synthetic-access" })
     protected void compensate() {
+        getCurrentTaskHandler().compensate();
+    }
+
+    @SuppressWarnings({ "unchecked", "synthetic-access" })
+    protected final void internalCompensate() {
         try {
             if (this instanceof Quotable) {
                 ((Quotable) this).rollbackQuota();
@@ -481,7 +498,7 @@
 
     private void InternalEndSuccessfully() {
         log.infoFormat("Ending command successfully: {0}", 
getClass().getName());
-        EndSuccessfully();
+        getCurrentTaskHandler().endSuccessfully();
     }
 
     protected void EndSuccessfully() {
@@ -490,7 +507,7 @@
 
     private void InternalEndWithFailure() {
         log.errorFormat("Ending command with failure: {0}", 
getClass().getName());
-        EndWithFailure();
+        getCurrentTaskHandler().endWithFailure();
     }
 
     protected void EndWithFailure() {
@@ -821,7 +838,7 @@
         boolean exceptionOccurred = true;
         try {
             logRunningCommand();
-            executeCommand();
+            getCurrentTaskHandler().beforeTask();
             functionReturnValue = getSucceeded();
             exceptionOccurred = false;
         } catch (RepositoryException e) {
@@ -1496,4 +1513,19 @@
         return AsyncTaskManager.getInstance();
     }
 
+    protected List<? extends SPMAsyncTaskHandler> getTaskHandlers() {
+        return Collections.unmodifiableList(taskHandlers);
+    }
+
+    protected SPMAsyncTaskHandler getCurrentTaskHandler() {
+        return getTaskHandlers().get(getExecutionIndex());
+    }
+
+    public int getExecutionIndex() {
+        return executionIndex;
+    }
+
+    public void setExecutionIndex(int executionIndex) {
+        this.executionIndex = executionIndex;
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CompleteCommandSPMAsyncTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CompleteCommandSPMAsyncTaskHandler.java
new file mode 100644
index 0000000..05de982
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CompleteCommandSPMAsyncTaskHandler.java
@@ -0,0 +1,44 @@
+package org.ovirt.engine.core.bll;
+
+import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
+
+public class CompleteCommandSPMAsyncTaskHandler implements SPMAsyncTaskHandler 
{
+
+    private CommandBase<?> cmd;
+
+    public CompleteCommandSPMAsyncTaskHandler(CommandBase<?> cmd) {
+        this.cmd = cmd;
+    }
+
+    @Override
+    public void beforeTask() {
+        cmd.executeCommand();
+    }
+
+    @Override
+    public SPMAsyncTask createTask() {
+        // Intentionally not implemented - for backwards compatibility, the 
task is created in cmd's Execute()
+        return null;
+    }
+
+    @Override
+    public void endSuccessfully() {
+        cmd.EndSuccessfully();
+    }
+
+    @Override
+    public void endWithFailure() {
+        cmd.EndWithFailure();
+    }
+
+    @Override
+    public void compensate() {
+        cmd.internalCompensate();
+    }
+
+    @Override
+    public VdcReturnValueBase getReturnValue() {
+        return cmd.getReturnValue();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTaskHandler.java
new file mode 100644
index 0000000..0e03c5b
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTaskHandler.java
@@ -0,0 +1,29 @@
+package org.ovirt.engine.core.bll.tasks;
+
+import org.ovirt.engine.core.bll.SPMAsyncTask;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
+
+/**
+ * This interface describes an object that handles async task execution.
+ * It contains callbacks that can be fired before/after a task's state changes
+ * (e.g., the task is created, finished, receives an error, etc.)
+ */
+public interface SPMAsyncTaskHandler {
+    /** @return The handler's return code */
+    public VdcReturnValueBase getReturnValue();
+
+    /** The execution carried out on the engine side before firing an async 
task. */
+    public void beforeTask();
+
+    /** @return The task that this handler is in charge of */
+    public SPMAsyncTask createTask();
+
+    /** A callback for the task completes successfully */
+    public void endSuccessfully();
+
+    /** A callback for the task fails to complete */
+    public void endWithFailure();
+
+    /** A callback for undoing the work of a task that has previously 
succeeded */
+    public void compensate();
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
index 262041e..513284d 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.core.bll;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -73,4 +74,14 @@
         assertEquals("wrong user id on command", user.getUserId(), 
command.getUserId());
         assertEquals("wrong user id on threadlocal", user, 
ThreadLocalParamsContainer.getVdcUser());
     }
+
+    /** Tests that the default implementation of {@link 
CommandBase#initTaskHandlers() is the backwards compatible one */
+    @Test
+    public void testInitTaskHandlers() {
+        VdcActionParametersBase paramterMock = 
mock(VdcActionParametersBase.class);
+        CommandBase<VdcActionParametersBase> command = new 
CommandBaseDummy(paramterMock);
+
+        assertEquals("Wrong number of task handlers", 1, 
command.getTaskHandlers().size());
+        assertTrue("Wrong task handler", command.getTaskHandlers().get(0) 
instanceof CompleteCommandSPMAsyncTaskHandler);
+    }
 }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4f2d113ced0276a9d849b7f00c7757e003d35f4c
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Allon Mureinik <amure...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to