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