From 652ac556dcfbde2d38be8859f11d0006fe6372ca Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 7 Mar 2016 20:58:29 +0100 Subject: [PATCH] PageProcessInstances using new APIs - interim commit. --- .../gui/api/util/WebComponentUtil.java | 42 +-- .../itemApproval/ItemApprovalPanel.html | 33 --- .../itemApproval/ItemApprovalPanel.java | 261 ------------------ .../web/page/admin/server/PageTasks.java | 1 - .../WorkflowInformationPanel.java | 1 - .../admin/workflow/PageProcessInstance.java | 45 +-- .../admin/workflow/PageProcessInstances.html | 4 - .../admin/workflow/PageProcessInstances.java | 194 ++++--------- .../admin/workflow/ProcessInstancePanel.java | 26 +- .../workflow/dto/ProcessInstanceDto.java | 144 ++++------ .../dto/ProcessInstanceDtoProvider.java | 57 +++- .../workflow/dto/ProcessInstanceNewDto.java | 136 +++++++++ .../web/page/self/PageSelfDashboard.java | 42 ++- .../page/self/component/MyRequestsPanel.java | 186 ++++++------- .../midpoint/model/api/WorkflowService.java | 27 -- .../impl/controller/ModelController.java | 15 - .../midpoint/wf/api/WorkflowManager.java | 13 - .../midpoint/wf/impl/WorkflowManagerImpl.java | 5 - .../midpoint/wf/impl/AbstractWfTest.java | 14 +- .../general/TestGeneralChangeProcessor.java | 6 +- .../midpoint/repo/sql/data/common/RTask.java | 57 ++++ 21 files changed, 501 insertions(+), 808 deletions(-) delete mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.html delete mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.java create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceNewDto.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java index 077bba6e5f9..d629b9a0006 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java @@ -16,64 +16,43 @@ package com.evolveum.midpoint.gui.api.util; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.crypto.EncryptionException; -import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.crypto.EncryptionException; +import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PropertyDelta; -import com.evolveum.midpoint.prism.match.DistinguishedNameMatchingRule; -import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; -import com.evolveum.midpoint.prism.match.PolyStringOrigMatchingRule; -import com.evolveum.midpoint.prism.match.PolyStringStrictMatchingRule; -import com.evolveum.midpoint.prism.match.StringIgnoreCaseMatchingRule; +import com.evolveum.midpoint.prism.match.*; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.path.ItemPathSegment; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectPaging; -import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.task.api.TaskCategory; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.security.api.Authorization; -import com.evolveum.midpoint.security.api.AuthorizationConstants; -import com.evolveum.midpoint.security.api.MidPointPrincipal; -import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.task.api.TaskCategory; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.data.BaseSortableDataProvider; -import com.evolveum.midpoint.web.component.data.BoxedTablePanel; import com.evolveum.midpoint.web.component.data.Table; -import com.evolveum.midpoint.web.component.data.TablePanel; import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; -import com.evolveum.midpoint.web.component.prism.ObjectWrapper; import com.evolveum.midpoint.web.component.util.Selectable; -import com.evolveum.midpoint.web.component.wf.processes.itemApproval.ItemApprovalPanel; import com.evolveum.midpoint.web.page.PageDialog; import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior; -import com.evolveum.midpoint.web.page.admin.configuration.component.ObjectSelectionPanel; import com.evolveum.midpoint.web.security.MidPointApplication; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; -import com.sun.management.OperatingSystemMXBean; - import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.apache.wicket.*; @@ -88,29 +67,20 @@ import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; -import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.util.visit.IVisit; import org.apache.wicket.util.visit.IVisitor; -import javax.management.*; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; - import java.lang.management.ManagementFactory; import java.lang.management.MemoryMXBean; import java.lang.management.RuntimeMXBean; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Locale; +import java.util.*; /** * Utility class containing miscellaneous methods used mostly in Wicket components. diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.html deleted file mode 100644 index e74ebf3865e..00000000000 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -

...

- - -

- - -

-
- - - - - - diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.java deleted file mode 100644 index b0049ae7b56..00000000000 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.java +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Copyright (c) 2010-2013 Evolveum - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.evolveum.midpoint.web.component.wf.processes.itemApproval; - -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; -import com.evolveum.midpoint.web.component.wf.DecisionsPanel; -import com.evolveum.midpoint.web.page.admin.workflow.dto.DecisionDto; -import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import com.evolveum.midpoint.xml.ns.model.workflow.process_instance_state_3.ItemApprovalProcessState; -import com.evolveum.midpoint.xml.ns.model.workflow.process_instance_state_3.ItemApprovalRequestType; -import org.apache.commons.lang.StringEscapeUtils; -import org.apache.commons.lang.Validate; -import org.apache.wicket.AttributeModifier; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.panel.Panel; -import org.apache.wicket.model.AbstractReadOnlyModel; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.StringResourceModel; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author mederly - */ -public class ItemApprovalPanel extends Panel { - - private static final Trace LOGGER = TraceManager.getTrace(ItemApprovalPanel.class); - - private static final String ID_ITEM_TO_BE_APPROVED_LABEL = "itemToBeApprovedLabel"; - private static final String ID_ITEM_TO_BE_APPROVED = "itemToBeApproved"; - //private static final String ID_RESULT = "result"; - - private static final String ID_APPROVAL_SCHEMA = "approvalSchema"; - - private static final String ID_DECISIONS_DONE_LABEL = "decisionsDoneLabel"; - private static final String ID_DECISIONS_DONE = "decisionsDone"; - - private static final String ID_CURRENT_WORK_ITEMS = "currentWorkItems"; - private static final String ID_CURRENT_WORK_ITEMS_LABEL = "currentWorkItemsLabel"; - - private IModel model; - - public ItemApprovalPanel(String id, IModel model) { - super(id); - Validate.notNull(model); - this.model = model; - - initLayout(); - } - - private void initLayout() { - - Label itemToBeApprovedLabel = new Label(ID_ITEM_TO_BE_APPROVED_LABEL, new StringResourceModel("${}", new AbstractReadOnlyModel() { - @Override - public String getObject() { - if (!model.getObject().isAnswered()) { - return "ItemApprovalPanel.itemToBeApproved"; - } else { - Boolean result = model.getObject().getAnswerAsBoolean(); - if (result == null) { - return "ItemApprovalPanel.itemThatWasCompleted"; // actually, this should not happen, if the process is ItemApproval - } else if (result) { - return "ItemApprovalPanel.itemThatWasApproved"; - } else { - return "ItemApprovalPanel.itemThatWasRejected"; - } - } - } - })); - itemToBeApprovedLabel.add(new AttributeModifier("color", new AbstractReadOnlyModel() { - @Override - public String getObject() { - if (!model.getObject().isAnswered()) { - return "black"; // should not be visible, anyway - } else { - Boolean result = model.getObject().getAnswerAsBoolean(); - if (result == null) { - return "black"; // actually, this should not happen, if the process is ItemApproval - } else if (result) { - return "green"; - } else { - return "red"; - } - } - } - })); - add(itemToBeApprovedLabel); - - Label itemToBeApproved = new Label(ID_ITEM_TO_BE_APPROVED, new AbstractReadOnlyModel() { - - @Override - public String getObject() { - - ItemApprovalProcessState instanceState = (ItemApprovalProcessState) model.getObject().getInstanceState().getProcessSpecificState(); - ItemApprovalRequestType approvalRequestType = instanceState.getApprovalRequest(); - - if (approvalRequestType == null) { - return "?"; - } else { - Object item = approvalRequestType.getItemToApprove(); - if (item instanceof AssignmentType) { - AssignmentType assignmentType = (AssignmentType) item; - if (assignmentType.getTarget() != null) { - return assignmentType.getTarget().toString(); - } else if (assignmentType.getTargetRef() != null) { - return assignmentType.getTargetRef().getOid() + " (" + assignmentType.getTargetRef().getType() + ")"; - } else { - return "?"; - } - } else { - return item != null ? item.toString() : "(none)"; - } - } - } - }); - add(itemToBeApproved); - - // todo i18n - Label approvalSchema = new Label(ID_APPROVAL_SCHEMA, new AbstractReadOnlyModel() { - @Override - public Object getObject() { - StringBuilder retval = new StringBuilder(); - - ItemApprovalProcessState instanceState = (ItemApprovalProcessState) model.getObject().getInstanceState().getProcessSpecificState(); - ItemApprovalRequestType approvalRequestType = instanceState.getApprovalRequest(); - - if (approvalRequestType == null) { - return "?"; - } else { - ApprovalSchemaType approvalSchema = approvalRequestType.getApprovalSchema(); - if (approvalSchema != null) { - if (approvalSchema.getName() != null) { - retval.append(""); - retval.append(StringEscapeUtils.escapeHtml(approvalSchema.getName())); - retval.append(""); - } - if (approvalSchema.getDescription() != null) { - retval.append(" ("); - retval.append(StringEscapeUtils.escapeHtml(approvalSchema.getDescription())); - retval.append(")"); - } - if (approvalSchema.getName() != null || approvalSchema.getDescription() != null) { - retval.append("
"); - } - retval.append("Levels:

    "); - for (ApprovalLevelType level : approvalSchema.getLevel()) { - retval.append("
  1. "); - if (level.getName() != null) { - retval.append(StringEscapeUtils.escapeHtml(level.getName())); - } else { - retval.append("unnamed level"); - } - if (level.getDescription() != null) { - retval.append(" ("); - retval.append(StringEscapeUtils.escapeHtml(level.getDescription())); - retval.append(")"); - } - if (level.getEvaluationStrategy() != null) { - retval.append(" [" + level.getEvaluationStrategy() + "]"); - } - if (level.getAutomaticallyApproved() != null) { - String desc = level.getAutomaticallyApproved().getDescription(); - if (desc != null) { - retval.append(" (auto-approval condition: " + StringEscapeUtils.escapeHtml(desc) + ")"); - } else { - retval.append(" (auto-approval condition present)"); - } - } - retval.append("
    Approvers:
      "); - for (ObjectReferenceType approverRef : level.getApproverRef()) { - retval.append("
    • "); - retval.append(approverRef.getOid()); - if (approverRef.getType() != null) { - retval.append(" (" + approverRef.getType().getLocalPart() + ")"); - } - if (approverRef.getDescription() != null) { - retval.append (" - " + approverRef.getDescription()); - } - retval.append("
    • "); - } - for (ExpressionType expression : level.getApproverExpression()) { - retval.append("
    • Expression: "); - // todo display the expression - if (expression.getDescription() != null) { - retval.append(StringEscapeUtils.escapeHtml(expression.getDescription())); - } else { - retval.append("(...)"); - } - retval.append("
    • "); - } - } - - retval.append("
    "); // ends the list of approvers - retval.append("
"); // ends the list of levels - } - } - return retval.toString(); - } - }); - approvalSchema.setEscapeModelStrings(false); - add(approvalSchema); - - add(new Label(ID_DECISIONS_DONE_LABEL, new StringResourceModel("ItemApprovalPanel.decisionsDoneWhenFinishedIs_${finished}", model))); - - add(new DecisionsPanel(ID_DECISIONS_DONE, new AbstractReadOnlyModel>() { - @Override - public List getObject() { - List retval = new ArrayList<>(); - ProcessInstanceDto processInstanceDto = model.getObject(); - processInstanceDto.reviveIfNeeded(ItemApprovalPanel.this); - ItemApprovalProcessState instanceState = (ItemApprovalProcessState) processInstanceDto.getInstanceState().getProcessSpecificState(); - List allDecisions = instanceState.getDecisions(); - if (allDecisions != null) { - for (DecisionType decision : allDecisions) { - retval.add(new DecisionDto(decision)); - } - } - return retval; - } - })); - - VisibleEnableBehaviour visibleIfRunning = new VisibleEnableBehaviour() { - @Override - public boolean isVisible() { - return !model.getObject().isFinished(); - } - }; - -// Label workItemsPanelLabel = new Label(ID_CURRENT_WORK_ITEMS_LABEL, new ResourceModel("ItemApprovalPanel.currentWorkItems")); -// workItemsPanelLabel.add(visibleIfRunning); -// add(workItemsPanelLabel); - - //WorkItemsPanel workItemsPanel = new WorkItemsPanel(ID_CURRENT_WORK_ITEMS, new PropertyModel>(model, "workItems")); -// WorkItemsPanel workItemsPanel = new WorkItemsPanel(ID_CURRENT_WORK_ITEMS, new AbstractReadOnlyModel>() { -// @Override -// public List getObject() { -// return new ArrayList<>(); -// } -// }); -// workItemsPanel.add(visibleIfRunning); -// add(workItemsPanel); - } -} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java index fb8045713d9..e2b13d8a771 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTasks.java @@ -613,7 +613,6 @@ private void taskDetailsPerformed(AjaxRequestTarget target, TaskDto task) { if (task.getWorkflowProcessInstanceId() != null) { PageParameters parameters = new PageParameters(); parameters.add(OnePageParameterEncoder.PARAMETER, task.getWorkflowProcessInstanceId()); - parameters.add(PageProcessInstance.PARAM_PROCESS_INSTANCE_FINISHED, task.isWorkflowProcessInstanceFinished()); component.setResponsePage(new PageProcessInstance(parameters, (PageBase) component.getPage())); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/workflowInformation/WorkflowInformationPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/workflowInformation/WorkflowInformationPanel.java index 5688369d7be..6f8a13a9d82 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/workflowInformation/WorkflowInformationPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/workflowInformation/WorkflowInformationPanel.java @@ -56,7 +56,6 @@ public void onClick(AjaxRequestTarget target) { boolean finished = WorkflowInformationPanel.this.getModel().getObject().isWorkflowProcessInstanceFinished(); PageParameters parameters = new PageParameters(); parameters.add(OnePageParameterEncoder.PARAMETER, pid); - parameters.add(PageProcessInstance.PARAM_PROCESS_INSTANCE_FINISHED, finished); WorkflowInformationPanel.this.setResponsePage(new PageProcessInstance(parameters, (PageBase) WorkflowInformationPanel.this.getPage())); } }); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstance.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstance.java index a28492b8259..ed5975e6380 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstance.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstance.java @@ -28,7 +28,9 @@ import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.page.admin.server.PageTaskAdd; import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto; +import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceNewDto; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; import com.evolveum.midpoint.xml.ns._public.common.common_3.WfProcessInstanceType; import com.evolveum.midpoint.xml.ns.model.workflow.process_instance_state_3.ProcessInstanceState; @@ -54,12 +56,11 @@ public class PageProcessInstance extends PageAdminWorkItems { private static final Trace LOGGER = TraceManager.getTrace(PageProcessInstance.class); private static final String DOT_CLASS = PageTaskAdd.class.getName() + "."; - public static final String PARAM_PROCESS_INSTANCE_FINISHED = "processInstanceFinished"; // boolean value private static final String OPERATION_LOAD_TASK = DOT_CLASS + "loadProcessInstance"; private static final String ID_PROCESS_INSTANCE_PANEL = "processInstancePanel"; - private IModel model; + private LoadableModel model; private PageParameters parameters; @@ -72,10 +73,10 @@ public PageProcessInstance(final PageParameters parameters, PageBase previousPag this.parameters = parameters; setPreviousPage(previousPage); - model = new LoadableModel(false) { + model = new LoadableModel(false) { @Override - protected ProcessInstanceDto load() { + protected ProcessInstanceNewDto load() { return loadProcessInstance(); } }; @@ -83,40 +84,18 @@ protected ProcessInstanceDto load() { initLayout(); } - private ProcessInstanceDto loadProcessInstance() { - OperationResult result = new OperationResult(OPERATION_LOAD_TASK); - + private ProcessInstanceNewDto loadProcessInstance() { + Task opTask = getTaskManager().createTaskInstance(OPERATION_LOAD_TASK); + OperationResult result = opTask.getResult(); try { - StringValue pid = parameters.get(OnePageParameterEncoder.PARAMETER); - boolean finished = parameters.get(PARAM_PROCESS_INSTANCE_FINISHED).toBoolean(); - WfProcessInstanceType processInstance; - try { - processInstance = getWorkflowService().getProcessInstanceById(pid.toString(), finished, true, result); - } catch (ObjectNotFoundException e) { - if (finished == false) { - // maybe the process instance has finished in the meanwhile... - processInstance = getWorkflowService().getProcessInstanceById(pid.toString(), true, true, result); - } else { - throw e; - } - } - ProcessInstanceState processInstanceState = (ProcessInstanceState) processInstance.getState(); - Task shadowTask = null; - if (processInstanceState != null) { - String shadowTaskOid = processInstanceState.getShadowTaskOid(); - try { - shadowTask = getTaskManager().getTask(shadowTaskOid, result); - } catch (ObjectNotFoundException e) { - // task is already deleted, no problem here - } - } - return new ProcessInstanceDto(processInstance, shadowTask); + StringValue taskOid = parameters.get(OnePageParameterEncoder.PARAMETER); + TaskType task = getModelService().getObject(TaskType.class, taskOid.toString(), null, opTask, result).asObjectable(); + return new ProcessInstanceNewDto(task); } catch (Exception ex) { result.recordFatalError("Couldn't get process instance information.", ex); showResult(result); getSession().error(getString("pageProcessInstance.message.cantGetDetails")); - - showResult(result, false); + showResult(result, false); throw getRestartResponseException(PageProcessInstancesAll.class); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstances.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstances.html index 4295dab2858..076a1b071c0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstances.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstances.html @@ -19,12 +19,8 @@
-

-

-
-
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstances.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstances.java index ea1ec4f23ef..c8cf08e1d95 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstances.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageProcessInstances.java @@ -29,6 +29,7 @@ import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; import com.evolveum.midpoint.web.component.data.column.LinkColumn; import com.evolveum.midpoint.web.page.admin.home.PageDashboard; +import com.evolveum.midpoint.web.page.admin.server.PageTaskEdit; import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto; import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDtoProvider; import com.evolveum.midpoint.web.security.SecurityUtils; @@ -40,11 +41,13 @@ import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; +import org.apache.wicket.model.PropertyModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import java.util.ArrayList; @@ -66,7 +69,6 @@ public abstract class PageProcessInstances extends PageAdminWorkItems { private static final String DOT_CLASS = PageProcessInstances.class.getName() + "."; private static final String OPERATION_STOP_PROCESS_INSTANCES = DOT_CLASS + "stopProcessInstances"; - public PageProcessInstances(boolean requestedBy, boolean requestedFor) { this.requestedBy = requestedBy; this.requestedFor = requestedFor; @@ -78,142 +80,76 @@ private void initLayout() { add(mainForm); List> columns = initColumns(); - TablePanel table = new TablePanel("processInstancesTable", new ProcessInstanceDtoProvider(PageProcessInstances.this, requestedBy, requestedFor, false), - columns); + TablePanel table = new TablePanel("processInstancesTable", new ProcessInstanceDtoProvider(PageProcessInstances.this, requestedBy, requestedFor, false), columns); table.setOutputMarkupId(true); mainForm.add(table); - List> finishedColumns = initFinishedColumns(); - TablePanel finishedTable = new TablePanel("finishedProcessInstancesTable", new ProcessInstanceDtoProvider(PageProcessInstances.this, requestedBy, requestedFor, true), - finishedColumns); - finishedTable.setOutputMarkupId(true); - mainForm.add(finishedTable); - initItemButtons(mainForm); } private List> initColumns() { List> columns = new ArrayList>(); - IColumn column = new CheckBoxHeaderColumn(); + IColumn column = new CheckBoxHeaderColumn<>(); columns.add(column); - column = new LinkColumn(createStringResource("pageProcessInstances.item.name"), "name") { + column = new LinkColumn(createStringResource("pageProcessInstances.item.name"), ProcessInstanceDto.F_NAME) { @Override public void onClick(AjaxRequestTarget target, IModel rowModel) { ProcessInstanceDto piDto = rowModel.getObject(); - itemDetailsPerformed(target, false, piDto.getProcessInstance().getProcessInstanceId()); + itemDetailsPerformed(target, piDto.getTaskOid()); } }; columns.add(column); - columns.add(new AbstractColumn(createStringResource("pageProcessInstances.item.started")) { + columns.add(new PropertyColumn(createStringResource("pageProcessInstances.item.started"), ProcessInstanceDto.F_START_FORMATTED)); - @Override - public void populateItem(Item> item, String componentId, - final IModel rowModel) { - item.add(new Label(componentId, new AbstractReadOnlyModel() { - - @Override - public Object getObject() { - ProcessInstanceDto pi = rowModel.getObject(); - Date started = XmlTypeConverter.toDate(pi.getProcessInstance().getStartTimestamp()); - if (started == null) { - return "?"; - } else { - // todo i18n - return DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - started.getTime(), true, true) + " ago"; - } - } - })); - } - }); +// columns.add(new AbstractColumn(createStringResource("pageProcessInstances.item.finished")) { +// +// @Override +// public void populateItem(Item> item, String componentId, +// final IModel rowModel) { +// item.add(new Label(componentId, new AbstractReadOnlyModel() { +// +// @Override +// public Object getObject() { +// ProcessInstanceDto pi = rowModel.getObject(); +// Date finished = XmlTypeConverter.toDate(pi.getProcessInstance().getEndTimestamp()); +// if (finished == null) { +// return getString("pageProcessInstances.notYet"); +// } else { +// return WebComponentUtil.formatDate(finished); +// } +// } +// })); +// } +// }); +// +// columns.add(new AbstractColumn(createStringResource("pageProcessInstances.item.result")) { +// +// @Override +// public void populateItem(Item> item, String componentId, +// final IModel rowModel) { +// item.add(new Label(componentId, new AbstractReadOnlyModel() { +// +// @Override +// public Object getObject() { +// ProcessInstanceDto pi = rowModel.getObject(); +// Boolean result = ApprovalUtils.approvalBooleanValue(pi.getAnswer()); +// if (result == null) { +// return ""; +// } else { +// return result ? "APPROVED" : "REJECTED"; // todo i18n +// } +// } +// })); +// } +// }); return columns; } - private List> initFinishedColumns() { - List> columns = new ArrayList>(); - - IColumn column = new CheckBoxHeaderColumn(); - columns.add(column); - - column = new LinkColumn(createStringResource("pageProcessInstances.item.name"), "name") { - - @Override - public void onClick(AjaxRequestTarget target, IModel rowModel) { - ProcessInstanceDto piDto = rowModel.getObject(); - itemDetailsPerformed(target, true, piDto.getProcessInstance().getProcessInstanceId()); - } - }; - columns.add(column); - - columns.add(new AbstractColumn(createStringResource("pageProcessInstances.item.result")) { - - @Override - public void populateItem(Item> item, String componentId, - final IModel rowModel) { - item.add(new Label(componentId, new AbstractReadOnlyModel() { - - @Override - public Object getObject() { - ProcessInstanceDto pi = rowModel.getObject(); - Boolean result = ApprovalUtils.approvalBooleanValue(pi.getAnswer()); - if (result == null) { - return ""; - } else { - return result ? "APPROVED" : "REJECTED"; // todo i18n - } - } - })); - } - }); - - columns.add(new AbstractColumn(createStringResource("pageProcessInstances.item.started")) { - - @Override - public void populateItem(Item> item, String componentId, - final IModel rowModel) { - item.add(new Label(componentId, new AbstractReadOnlyModel() { - - @Override - public Object getObject() { - ProcessInstanceDto pi = rowModel.getObject(); - Date started = XmlTypeConverter.toDate(pi.getProcessInstance().getStartTimestamp()); - if (started == null) { - return "?"; - } else { - return WebComponentUtil.formatDate(started); - } - } - })); - } - }); - - columns.add(new AbstractColumn(createStringResource("pageProcessInstances.item.finished")) { - - @Override - public void populateItem(Item> item, String componentId, - final IModel rowModel) { - item.add(new Label(componentId, new AbstractReadOnlyModel() { - - @Override - public Object getObject() { - ProcessInstanceDto pi = rowModel.getObject(); - Date finished = XmlTypeConverter.toDate(pi.getProcessInstance().getEndTimestamp()); - if (finished == null) { - return getString("pageProcessInstances.notYet"); - } else { - return WebComponentUtil.formatDate(finished); - } - } - })); - } - }); - - return columns; - } private void initItemButtons(Form mainForm) { @@ -246,10 +182,6 @@ private TablePanel getTable() { return (TablePanel) get("mainForm:processInstancesTable"); } - private TablePanel getFinishedTable() { - return (TablePanel) get("mainForm:finishedProcessInstancesTable"); - } - // private List getSelectedItems() { // DataTable table = getTable().getDataTable(); // ProcessInstanceDtoProvider provider = (ProcessInstanceDtoProvider) table.getDataProvider(); @@ -264,8 +196,8 @@ private TablePanel getFinishedTable() { // return selected; // } - private boolean isSomeItemSelected(List instances, List finished, AjaxRequestTarget target) { - if (!instances.isEmpty() || !finished.isEmpty()) { + private boolean isSomeItemSelected(List instances, AjaxRequestTarget target) { + if (!instances.isEmpty()) { return true; } @@ -274,11 +206,10 @@ private boolean isSomeItemSelected(List instances, List processInstanceDtoList = WebComponentUtil.getSelectedData(getTable()); - List finishedProcessInstanceDtoList = WebComponentUtil.getSelectedData(getFinishedTable()); - if (!isSomeItemSelected(processInstanceDtoList, finishedProcessInstanceDtoList, target)) { + if (!isSomeItemSelected(processInstanceDtoList, target)) { return; } @@ -297,19 +227,12 @@ private void stopProcessInstancesPerformed(AjaxRequestTarget target) { WorkflowService workflowService = getWorkflowService(); for (ProcessInstanceDto processInstanceDto : processInstanceDtoList) { try { - workflowService.stopProcessInstance(processInstanceDto.getInstanceId(), - WebComponentUtil.getOrigStringFromPoly(user.getName()), result); +// workflowService.stopProcessInstance(processInstanceDto.getInstanceId(), +// WebComponentUtil.getOrigStringFromPoly(user.getName()), result); } catch (Exception ex) { // todo result.createSubresult("stopProcessInstance").recordPartialError("Couldn't stop process instance " + processInstanceDto.getName(), ex); } } - for (ProcessInstanceDto processInstanceDto : finishedProcessInstanceDtoList) { - try { - workflowService.deleteProcessInstance(processInstanceDto.getInstanceId(), result); - } catch (Exception ex) { // todo - result.createSubresult("deleteProcessInstance").recordPartialError("Couldn't delete process instance " + processInstanceDto.getName(), ex); - } - } if (result.isUnknown()) { result.recomputeStatus(); @@ -323,13 +246,10 @@ private void stopProcessInstancesPerformed(AjaxRequestTarget target) { ProcessInstanceDtoProvider provider = (ProcessInstanceDtoProvider) getTable().getDataTable().getDataProvider(); provider.clearCache(); - ProcessInstanceDtoProvider provider2 = (ProcessInstanceDtoProvider) getFinishedTable().getDataTable().getDataProvider(); - provider2.clearCache(); //refresh feedback and table target.add(getFeedbackPanel()); target.add(getTable()); - target.add(getFinishedTable()); setReinitializePreviousPages(true); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/ProcessInstancePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/ProcessInstancePanel.java index abbaa70626a..425d2b5c0e2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/ProcessInstancePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/ProcessInstancePanel.java @@ -24,14 +24,12 @@ import com.evolveum.midpoint.web.component.data.column.LinkPanel; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.component.wf.processes.EmptyProcessDetailsPanel; -import com.evolveum.midpoint.web.component.wf.processes.itemApproval.ItemApprovalPanel; import com.evolveum.midpoint.web.page.admin.server.PageTaskEdit; import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto; +import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceNewDto; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; -import com.evolveum.midpoint.xml.ns.model.workflow.process_instance_state_3.ItemApprovalProcessState; import com.evolveum.midpoint.xml.ns.model.workflow.process_instance_state_3.ProcessInstanceState; import com.evolveum.midpoint.xml.ns.model.workflow.process_instance_state_3.ProcessSpecificState; - import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Panel; @@ -43,13 +41,17 @@ import java.util.HashMap; import java.util.Map; -public class ProcessInstancePanel extends BasePanel { +public class ProcessInstancePanel extends BasePanel { private static final Trace LOGGER = TraceManager.getTrace(ProcessInstancePanel.class); private static final String ID_DETAILS = "details"; private static final String ID_TASK = "task"; private static final String ID_TASK_COMMENT = "taskComment"; + public static final String ID_NAME = "name"; + public static final String ID_PID = "pid"; + public static final String ID_STARTED = "started"; + public static final String ID_FINISHED = "finished"; private static Map,Class> panelsForProcesses = null; @@ -62,28 +64,28 @@ public static void registerProcessInstancePanel(Class model) { + public ProcessInstancePanel(String id, IModel model) { super(id, model); initLayoutLocal(); } private void initLayoutLocal() { - final IModel model = getModel(); + final IModel model = getModel(); - Label name = new Label("name", new PropertyModel(model, "name")); + Label name = new Label(ID_NAME, new PropertyModel(model, "name")); add(name); - Label pid = new Label("pid", new PropertyModel(model, "instanceId")); + Label pid = new Label(ID_PID, new PropertyModel(model, "instanceId")); add(pid); - Label started = new Label("started", new PropertyModel(model, "startedTime")); + Label started = new Label(ID_STARTED, new PropertyModel(model, "startedTime")); add(started); - Label finished = new Label("finished", new PropertyModel(model, "finishedTime")); + Label finished = new Label(ID_FINISHED, new PropertyModel(model, "finishedTime")); add(finished); // todo disable clicking behaviour if task does not exist @@ -126,7 +128,7 @@ public boolean isVisible() { } private Class getDetailsPanelClassName() { - ProcessInstanceDto processInstanceDto = getModel().getObject(); + ProcessInstanceNewDto processInstanceDto = getModel().getObject(); ProcessSpecificState processSpecificState = ((ProcessInstanceState) processInstanceDto.getProcessInstance().getState()).getProcessSpecificState(); if (processSpecificState != null) { Class dataClass = processSpecificState.getClass(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDto.java index a045898dfdb..1a04238cdae 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDto.java @@ -19,20 +19,13 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.web.component.util.Selectable; -import com.evolveum.midpoint.web.component.wf.processes.itemApproval.ItemApprovalPanel; -import com.evolveum.midpoint.wf.util.ApprovalUtils; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.WfProcessInstanceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemType; -import com.evolveum.midpoint.xml.ns.model.workflow.process_instance_state_3.ProcessInstanceState; - +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; import org.apache.commons.lang.Validate; import org.apache.wicket.Component; -import java.util.ArrayList; -import java.util.List; +import javax.xml.datatype.XMLGregorianCalendar; +import java.util.Date; /** * @author mederly @@ -40,99 +33,74 @@ public class ProcessInstanceDto extends Selectable { public static final String F_SHADOW_TASK = "shadowTask"; - public static final String F_SHADOW_TASK_EXISTING = "shadowTaskExisting"; - - WfProcessInstanceType processInstance; - ProcessInstanceState processInstanceState; - - private String shadowTaskName; - private boolean shadowTaskExisting; - - public ProcessInstanceDto(WfProcessInstanceType processInstance, Task shadowTask) { - Validate.notNull(processInstance); - this.processInstance = processInstance; - this.processInstanceState = (ProcessInstanceState) processInstance.getState(); - if (shadowTask != null) { - shadowTaskName = PolyString.getOrig(shadowTask.getName()); - shadowTaskExisting = true; - } else { - shadowTaskExisting = false; - } - } - - public String getStartedTime() { - return processInstance.getStartTimestamp() == null ? "-" : WebComponentUtil.formatDate(XmlTypeConverter.toDate(processInstance.getStartTimestamp())); - } - - public String getFinishedTime() { - return processInstance.getEndTimestamp() == null ? "-" : WebComponentUtil.formatDate(XmlTypeConverter.toDate(processInstance.getEndTimestamp())); - } + public static final String F_NAME = "name"; + public static final String F_START_FORMATTED = "startFormatted"; - public String getName() { - return PolyString.getOrig(processInstance.getName()); - } - - public String getInstanceId() { - return processInstance.getProcessInstanceId(); - } + private TaskType task; - public WfProcessInstanceType getProcessInstance() { - return processInstance; + public ProcessInstanceDto(TaskType task) { + Validate.notNull(task, "Task is null"); + Validate.notNull(task.getWorkflowContext(), "Task has no workflow context"); + this.task = task; } - public List getWorkItems() { - List retval = new ArrayList(); - if (processInstance.getWorkItems() != null) { - for (WorkItemType workItem : processInstance.getWorkItems()) { - retval.add(new WorkItemDto(workItem)); - } - } - return retval; + public XMLGregorianCalendar getStartTimestamp() { + return task.getWorkflowContext().getStartTimestamp(); } - public String getAnswer() { - if (processInstanceState == null) { - return null; - } - return processInstanceState.getAnswer(); + public String getStartFormatted() { + Date started = XmlTypeConverter.toDate(getStartTimestamp()); + return WebComponentUtil.formatDate(started); } - public boolean isAnswered() { - return getAnswer() != null; - } + public String getName() { + return PolyString.getOrig(task.getName()); + } + +// public List getWorkItems() { +// List retval = new ArrayList(); +// if (processInstance.getWorkItems() != null) { +// for (WorkItemType workItem : processInstance.getWorkItems()) { +// retval.add(new WorkItemDto(workItem)); +// } +// } +// return retval; +// } + +// public String getAnswer() { +// if (processInstanceState == null) { +// return null; +// } +// return processInstanceState.getAnswer(); +// } + +// public boolean isAnswered() { +// return getAnswer() != null; +// } // null if not answered or answer is not true/false - public Boolean getAnswerAsBoolean() { - return ApprovalUtils.approvalBooleanValue(getAnswer()); - } - - public boolean isFinished() { - return processInstance.isFinished(); - } +// public Boolean getAnswerAsBoolean() { +// return ApprovalUtils.approvalBooleanValue(getAnswer()); +// } - public boolean isShadowTaskExisting() { - return shadowTaskExisting; - } +// public boolean isFinished() { +// return processInstance.isFinished(); +// } - public String getShadowTask() { - String oid = processInstanceState.getShadowTaskOid(); - if (shadowTaskName != null) { - return shadowTaskName + " (" + oid + ")"; - } else { - return oid; - } - } +// public ProcessInstanceState getInstanceState() { +// return (ProcessInstanceState) processInstance.getState(); +// } - public ProcessInstanceState getInstanceState() { - return (ProcessInstanceState) processInstance.getState(); - } +// public String getShadowTaskOid() { +// return processInstanceState.getShadowTaskOid(); +// } - public String getShadowTaskOid() { - return processInstanceState.getShadowTaskOid(); + public void reviveIfNeeded(Component component) { +// WebComponentUtil.reviveIfNeeded(processInstance, component); +// WebComponentUtil.reviveIfNeeded(processInstanceState, component); } - public void reviveIfNeeded(Component component) { - WebComponentUtil.reviveIfNeeded(processInstance, component); - WebComponentUtil.reviveIfNeeded(processInstanceState, component); + public String getTaskOid() { + return task.getOid(); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDtoProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDtoProvider.java index b2f104a2e67..60f8809dad5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDtoProvider.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDtoProvider.java @@ -18,14 +18,22 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.model.api.WorkflowService; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.query.ObjectPaging; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.*; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.MidPointPrincipal; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.data.BaseSortableDataProvider; import com.evolveum.midpoint.web.security.SecurityUtils; import com.evolveum.midpoint.wf.api.WorkflowManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType; import com.evolveum.midpoint.xml.ns._public.common.common_3.WfProcessInstanceType; import org.apache.wicket.Component; @@ -33,6 +41,12 @@ import java.util.Iterator; import java.util.List; +import static com.evolveum.midpoint.gui.api.util.WebComponentUtil.*; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.F_OBJECT_REF; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.F_WORKFLOW_CONTEXT; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType.F_PROCESS_INSTANCE_ID; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType.F_REQUESTER_REF; + /** * @author lazyman * @author mederly @@ -75,7 +89,8 @@ public ProcessInstanceDtoProvider(Component component, boolean requestedBy, bool public Iterator internalIterator(long first, long count) { getAvailableData().clear(); - OperationResult result = new OperationResult(OPERATION_LIST_ITEMS); + Task opTask = getTaskManager().createTaskInstance(OPERATION_LIST_ITEMS); + OperationResult result = opTask.getResult(); try { // SortParam sortParam = getSort(); @@ -86,23 +101,22 @@ public Iterator internalIterator(long first, long // order = OrderDirectionType.DESCENDING; // } - WorkflowService wfm = getWorkflowService(); - List items = wfm.listProcessInstancesRelatedToUser(currentUser(), requestedBy, - requestedFor, finished, WebComponentUtil.safeLongToInteger(first), WebComponentUtil.safeLongToInteger(count), - result); + ObjectQuery query = getObjectQuery(); + query.setPaging(ObjectPaging.createPaging(safeLongToInteger(first), safeLongToInteger(count))); - for (WfProcessInstanceType item : items) { + List> tasks = getModel().searchObjects(TaskType.class, query, null, opTask, result); + for (PrismObject task : tasks) { try { - getAvailableData().add(new ProcessInstanceDto(item, null)); + getAvailableData().add(new ProcessInstanceDto(task.asObjectable())); } catch (Exception e) { - LoggingUtils.logUnexpectedException(LOGGER, "Unhandled exception when listing process instance ", e, item); + LoggingUtils.logUnexpectedException(LOGGER, "Unhandled exception when listing workflow task {}", e, task); result.recordPartialError("Couldn't list process instance.", e); } } } catch (Exception ex) { - LoggingUtils.logUnexpectedException(LOGGER, "Unhandled exception when listing process instances", ex); - result.recordFatalError("Couldn't list process instances.", ex); + LoggingUtils.logUnexpectedException(LOGGER, "Unhandled exception when listing wf-related tasks", ex); + result.recordFatalError("Couldn't list wf-related tasks.", ex); } if (result.isUnknown()) { @@ -116,15 +130,30 @@ public Iterator internalIterator(long first, long return getAvailableData().iterator(); } + private ObjectQuery getObjectQuery() throws SchemaException { + String currentUserOid = currentUser(); + S_FilterEntry q = QueryBuilder.queryFor(TaskType.class, getPrismContext()); + if (requestedBy) { + q = q.item(F_WORKFLOW_CONTEXT, F_REQUESTER_REF).ref(currentUserOid).and(); + } + if (requestedFor) { + q = q.item(F_OBJECT_REF).ref(currentUserOid).and(); + } + return q + .not().item(F_WORKFLOW_CONTEXT, F_PROCESS_INSTANCE_ID).isNull() + .build(); + } + @Override protected int internalSize() { int count = 0; - OperationResult result = new OperationResult(OPERATION_COUNT_ITEMS); + Task opTask = getTaskManager().createTaskInstance(OPERATION_COUNT_ITEMS); + OperationResult result = opTask.getResult(); try { - WorkflowService workflowService = getWorkflowService(); - count = workflowService.countProcessInstancesRelatedToUser(currentUser(), requestedBy, requestedFor, finished, result); + ObjectQuery query = getObjectQuery(); + count = getModel().countObjects(TaskType.class, query, null, opTask, result); } catch (Exception ex) { - String msg = "Couldn't list process instances"; + String msg = "Couldn't count process instances"; LoggingUtils.logUnexpectedException(LOGGER, msg, ex); result.recordFatalError(msg, ex); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceNewDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceNewDto.java new file mode 100644 index 00000000000..89cf6f8ffc5 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceNewDto.java @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2010-2013 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.web.page.admin.workflow.dto; + +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.prism.polystring.PolyString; +import com.evolveum.midpoint.prism.xml.XmlTypeConverter; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.web.component.util.Selectable; +import com.evolveum.midpoint.wf.util.ApprovalUtils; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WfProcessInstanceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemType; +import com.evolveum.midpoint.xml.ns.model.workflow.process_instance_state_3.ProcessInstanceState; +import org.apache.commons.lang.Validate; +import org.apache.wicket.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author mederly + */ +public class ProcessInstanceNewDto extends Selectable { + + public static final String F_SHADOW_TASK = "shadowTask"; + public static final String F_SHADOW_TASK_EXISTING = "shadowTaskExisting"; + + WfProcessInstanceType processInstance; + ProcessInstanceState processInstanceState; + + private String shadowTaskName; + private boolean shadowTaskExisting; + + public ProcessInstanceNewDto(TaskType task) { + Validate.notNull(processInstance); + this.processInstance = processInstance; + this.processInstanceState = (ProcessInstanceState) processInstance.getState(); +// if (shadowTask != null) { +// shadowTaskName = PolyString.getOrig(shadowTask.getName()); +// shadowTaskExisting = true; +// } else { +// shadowTaskExisting = false; +// } + } + + public String getStartedTime() { + return processInstance.getStartTimestamp() == null ? "-" : WebComponentUtil.formatDate(XmlTypeConverter.toDate(processInstance.getStartTimestamp())); + } + + public String getFinishedTime() { + return processInstance.getEndTimestamp() == null ? "-" : WebComponentUtil.formatDate(XmlTypeConverter.toDate(processInstance.getEndTimestamp())); + } + + public String getName() { + return PolyString.getOrig(processInstance.getName()); + } + + public String getInstanceId() { + return processInstance.getProcessInstanceId(); + } + + public WfProcessInstanceType getProcessInstance() { + return processInstance; + } + + public List getWorkItems() { + List retval = new ArrayList(); + if (processInstance.getWorkItems() != null) { + for (WorkItemType workItem : processInstance.getWorkItems()) { + retval.add(new WorkItemDto(workItem)); + } + } + return retval; + } + + public String getAnswer() { + if (processInstanceState == null) { + return null; + } + return processInstanceState.getAnswer(); + } + + public boolean isAnswered() { + return getAnswer() != null; + } + + // null if not answered or answer is not true/false + public Boolean getAnswerAsBoolean() { + return ApprovalUtils.approvalBooleanValue(getAnswer()); + } + + public boolean isFinished() { + return processInstance.isFinished(); + } + + public boolean isShadowTaskExisting() { + return shadowTaskExisting; + } + + public String getShadowTask() { + String oid = processInstanceState.getShadowTaskOid(); + if (shadowTaskName != null) { + return shadowTaskName + " (" + oid + ")"; + } else { + return oid; + } + } + + public ProcessInstanceState getInstanceState() { + return (ProcessInstanceState) processInstance.getState(); + } + + public String getShadowTaskOid() { + return processInstanceState.getShadowTaskOid(); + } + + public void reviveIfNeeded(Component component) { + WebComponentUtil.reviveIfNeeded(processInstance, component); + WebComponentUtil.reviveIfNeeded(processInstanceState, component); + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java index e4abf38e993..fa909276239 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java @@ -22,11 +22,13 @@ import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; +import com.evolveum.midpoint.prism.query.builder.S_FilterEntry; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.security.api.MidPointPrincipal; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.application.AuthorizationAction; @@ -46,10 +48,7 @@ import com.evolveum.midpoint.web.page.self.component.LinksPanel; import com.evolveum.midpoint.web.page.self.component.MyRequestsPanel; import com.evolveum.midpoint.web.security.SecurityUtils; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RichHyperlinkType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.WfProcessInstanceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemNewType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.midpoint.xml.ns.model.workflow.process_instance_state_3.ProcessInstanceState; import org.apache.commons.lang.Validate; import org.apache.wicket.Component; @@ -62,6 +61,10 @@ import java.util.ArrayList; import java.util.List; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.F_OBJECT_REF; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.F_WORKFLOW_CONTEXT; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType.F_PROCESS_INSTANCE_ID; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType.F_REQUESTER_REF; import static com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemNewType.F_WORK_ITEM_CREATED_TIMESTAMP; /** @@ -251,31 +254,19 @@ private CallableResult> loadMyRequests() { return callableResult; } - OperationResult result = new OperationResult(OPERATION_LOAD_REQUESTS); + Task opTask = createSimpleTask(OPERATION_LOAD_REQUESTS); + OperationResult result = opTask.getResult(); callableResult.setResult(result); try { - List processInstanceTypes = getWorkflowService().listProcessInstancesRelatedToUser(user.getOid(), - true, false, false, 0, MAX_REQUESTS, result); - List processInstanceTypesFinished = getWorkflowService().listProcessInstancesRelatedToUser(user.getOid(), - true, false, true, 0, MAX_REQUESTS, result); - if (processInstanceTypes != null && processInstanceTypesFinished != null){ - processInstanceTypes.addAll(processInstanceTypesFinished); - } - for (WfProcessInstanceType processInstanceType : processInstanceTypes) { - ProcessInstanceState processInstanceState = (ProcessInstanceState) processInstanceType.getState(); - Task shadowTask = null; - if (processInstanceState != null) { - String shadowTaskOid = processInstanceState.getShadowTaskOid(); - try { - shadowTask = getTaskManager().getTask(shadowTaskOid, result); - } catch (ObjectNotFoundException e) { - // task is already deleted, no problem here - result.muteLastSubresultError(); - } - } + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, getPrismContext()) + .item(F_WORKFLOW_CONTEXT, F_REQUESTER_REF).ref(user.getOid()) + .and().not().item(F_WORKFLOW_CONTEXT, F_PROCESS_INSTANCE_ID).isNull() + .build(); - list.add(new ProcessInstanceDto(processInstanceType, shadowTask)); + List> tasks = getModelService().searchObjects(TaskType.class, query, null, opTask, result); + for (PrismObject task : tasks) { + list.add(new ProcessInstanceDto(task.asObjectable())); } } catch (Exception e) { result.recordFatalError("Couldn't get list of work items.", e); @@ -289,6 +280,7 @@ private CallableResult> loadMyRequests() { return callableResult; } + private PrismObject loadUser() { MidPointPrincipal principal = SecurityUtils.getPrincipalUser(); Validate.notNull(principal, "No principal"); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/component/MyRequestsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/component/MyRequestsPanel.java index b3634c6a6c8..0061e076f28 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/component/MyRequestsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/component/MyRequestsPanel.java @@ -12,6 +12,7 @@ import com.evolveum.midpoint.web.page.admin.resources.dto.ResourceController; import com.evolveum.midpoint.web.page.admin.resources.dto.ResourceDto; import com.evolveum.midpoint.web.page.admin.resources.dto.ResourceState; +import com.evolveum.midpoint.web.page.admin.server.PageTaskEdit; import com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusIcon; import com.evolveum.midpoint.web.page.admin.workflow.PageProcessInstance; import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto; @@ -58,7 +59,7 @@ protected void initLayout() { @Override public void onClick(AjaxRequestTarget target, IModel rowModel) { ProcessInstanceDto piDto = rowModel.getObject(); - itemDetailsPerformed(target, false, piDto.getProcessInstance().getProcessInstanceId()); + itemDetailsPerformed(target, piDto.getTaskOid()); } }); } else { @@ -77,105 +78,104 @@ public Object getObject() { } }); } - columns.add(new IconColumn(createStringResource("pageProcessInstances.item.result")) { - - @Override - protected IModel createIconModel(final IModel rowModel) { - return new AbstractReadOnlyModel() { - - @Override - public String getObject() { - ProcessInstanceDto dto = rowModel.getObject(); - Boolean result = ApprovalUtils.approvalBooleanValue(dto.getAnswer()); - if (result == null) { - return OperationResultStatusIcon - .parseOperationalResultStatus(OperationResultStatusType.IN_PROGRESS).getIcon(); - } else { - return result ? - OperationResultStatusIcon - .parseOperationalResultStatus(OperationResultStatusType.SUCCESS).getIcon() - : OperationResultStatusIcon - .parseOperationalResultStatus(OperationResultStatusType.FATAL_ERROR).getIcon(); - } - } - }; - } - - @Override - protected IModel createTitleModel(final IModel rowModel) { - return new AbstractReadOnlyModel() { - - @Override - public String getObject() { - ProcessInstanceDto dto = rowModel.getObject(); - Boolean result = ApprovalUtils.approvalBooleanValue(dto.getAnswer()); - if (result == null) { - return MyRequestsPanel.this.getString(OperationResultStatus.class.getSimpleName() + "." + - OperationResultStatus.IN_PROGRESS); - } else { - return result ? - createStringResource("MyRequestsPanel.approved").getString() - : createStringResource("MyRequestsPanel.rejected").getString(); - } - - } - }; - } - - }); - - columns.add(new AbstractColumn(createStringResource("MyRequestsPanel.started")) { - - @Override - public void populateItem(Item> item, String componentId, - final IModel rowModel) { - item.add(new Label(componentId, new AbstractReadOnlyModel() { - - @Override - public Object getObject() { - ProcessInstanceDto pi = rowModel.getObject(); - Date started = XmlTypeConverter.toDate(pi.getProcessInstance().getStartTimestamp()); - if (started == null) { - return "?"; - } else { - // todo i18n - return DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - started.getTime(), true, true) + " ago"; - } - } - })); - } - }); - - columns.add(new AbstractColumn(createStringResource("pageProcessInstances.item.finished")) { - - @Override - public void populateItem(Item> item, String componentId, - final IModel rowModel) { - item.add(new Label(componentId, new AbstractReadOnlyModel() { - - @Override - public Object getObject() { - ProcessInstanceDto pi = rowModel.getObject(); - Date finished = XmlTypeConverter.toDate(pi.getProcessInstance().getEndTimestamp()); - if (finished == null) { - return getString("pageProcessInstances.notYet"); - } else { - return WebComponentUtil.formatDate(finished); - } - } - })); - } - }); +// columns.add(new IconColumn(createStringResource("pageProcessInstances.item.result")) { +// +// @Override +// protected IModel createIconModel(final IModel rowModel) { +// return new AbstractReadOnlyModel() { +// +// @Override +// public String getObject() { +// ProcessInstanceDto dto = rowModel.getObject(); +// Boolean result = ApprovalUtils.approvalBooleanValue(dto.getAnswer()); +// if (result == null) { +// return OperationResultStatusIcon +// .parseOperationalResultStatus(OperationResultStatusType.IN_PROGRESS).getIcon(); +// } else { +// return result ? +// OperationResultStatusIcon +// .parseOperationalResultStatus(OperationResultStatusType.SUCCESS).getIcon() +// : OperationResultStatusIcon +// .parseOperationalResultStatus(OperationResultStatusType.FATAL_ERROR).getIcon(); +// } +// } +// }; +// } +// +// @Override +// protected IModel createTitleModel(final IModel rowModel) { +// return new AbstractReadOnlyModel() { +// +// @Override +// public String getObject() { +// ProcessInstanceDto dto = rowModel.getObject(); +// Boolean result = ApprovalUtils.approvalBooleanValue(dto.getAnswer()); +// if (result == null) { +// return MyRequestsPanel.this.getString(OperationResultStatus.class.getSimpleName() + "." + +// OperationResultStatus.IN_PROGRESS); +// } else { +// return result ? +// createStringResource("MyRequestsPanel.approved").getString() +// : createStringResource("MyRequestsPanel.rejected").getString(); +// } +// +// } +// }; +// } +// +// }); +// +// columns.add(new AbstractColumn(createStringResource("MyRequestsPanel.started")) { +// +// @Override +// public void populateItem(Item> item, String componentId, +// final IModel rowModel) { +// item.add(new Label(componentId, new AbstractReadOnlyModel() { +// +// @Override +// public Object getObject() { +// ProcessInstanceDto pi = rowModel.getObject(); +// Date started = XmlTypeConverter.toDate(pi.getProcessInstance().getStartTimestamp()); +// if (started == null) { +// return "?"; +// } else { +// // todo i18n +// return DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - started.getTime(), true, true) + " ago"; +// } +// } +// })); +// } +// }); +// +// columns.add(new AbstractColumn(createStringResource("pageProcessInstances.item.finished")) { +// +// @Override +// public void populateItem(Item> item, String componentId, +// final IModel rowModel) { +// item.add(new Label(componentId, new AbstractReadOnlyModel() { +// +// @Override +// public Object getObject() { +// ProcessInstanceDto pi = rowModel.getObject(); +// Date finished = XmlTypeConverter.toDate(pi.getProcessInstance().getEndTimestamp()); +// if (finished == null) { +// return getString("pageProcessInstances.notYet"); +// } else { +// return WebComponentUtil.formatDate(finished); +// } +// } +// })); +// } +// }); ISortableDataProvider provider = new ListDataProvider(this, getModel()); TablePanel accountsTable = new TablePanel(ID_REQUESTS_TABLE, provider, columns); add(accountsTable); } - private void itemDetailsPerformed(AjaxRequestTarget target, boolean finished, String pid) { + private void itemDetailsPerformed(AjaxRequestTarget target, String pid) { PageParameters parameters = new PageParameters(); parameters.add(OnePageParameterEncoder.PARAMETER, pid); - parameters.add(PageProcessInstance.PARAM_PROCESS_INSTANCE_FINISHED, finished); - setResponsePage(new PageProcessInstance(parameters, this.getPageBase())); + setResponsePage(new PageTaskEdit(parameters, this.getPageBase())); } } diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/WorkflowService.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/WorkflowService.java index 2c679f17868..46d8a0afb2f 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/WorkflowService.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/WorkflowService.java @@ -15,33 +15,6 @@ */ public interface WorkflowService { - /* - * Process instances - * ================= - */ - - int countProcessInstancesRelatedToUser(String userOid, boolean requestedBy, boolean requestedFor, boolean finished, OperationResult parentResult); - - List listProcessInstancesRelatedToUser(String userOid, boolean requestedBy, boolean requestedFor, boolean finished, int first, int count, OperationResult parentResult); - - /** - * Returns information about a process instance. WorkItems attribute is filled-in only upon request! (see getWorkItems parameter) - * - * @param instanceId - * @param historic - * @param getWorkItems - * @param parentResult - * @return - * @throws ObjectNotFoundException - * @throws WorkflowException - */ - public WfProcessInstanceType getProcessInstanceById(String instanceId, boolean historic, boolean getWorkItems, OperationResult parentResult) throws ObjectNotFoundException; - - /* - * CHANGING THINGS - * =============== - */ - /** * Approves or rejects a work item (without supplying any further information). * @param taskId identifier of activiti task backing the work item diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java index f6c54ab2d38..6ec57809f35 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelController.java @@ -1808,21 +1808,6 @@ private void authorizeNodeCollectionOperation(ModelAuthorizationAction action, C //endregion //region Workflow-related operations - @Override - public int countProcessInstancesRelatedToUser(String userOid, boolean requestedBy, boolean requestedFor, boolean finished, OperationResult parentResult) { - return getWorkflowManagerChecked().countProcessInstancesRelatedToUser(userOid, requestedBy, requestedFor, finished, parentResult); - } - - @Override - public List listProcessInstancesRelatedToUser(String userOid, boolean requestedBy, boolean requestedFor, boolean finished, int first, int count, OperationResult parentResult) { - return getWorkflowManagerChecked().listProcessInstancesRelatedToUser(userOid, requestedBy, requestedFor, finished, first, count, parentResult); - } - - @Override - public WfProcessInstanceType getProcessInstanceById(String instanceId, boolean historic, boolean getWorkItems, OperationResult parentResult) throws ObjectNotFoundException { - return getWorkflowManagerChecked().getProcessInstanceById(instanceId, historic, getWorkItems, parentResult); - } - @Override public void approveOrRejectWorkItem(String workItemId, boolean decision, String comment, OperationResult parentResult) { getWorkflowManagerChecked().approveOrRejectWorkItem(workItemId, decision, comment, parentResult); diff --git a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WorkflowManager.java b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WorkflowManager.java index 1ff705b77d7..21bd03cb26c 100644 --- a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WorkflowManager.java +++ b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WorkflowManager.java @@ -60,19 +60,6 @@ SearchResultList searchContainers(Class type, Ob List listProcessInstancesRelatedToUser(String userOid, boolean requestedBy, boolean requestedFor, boolean finished, int first, int count, OperationResult parentResult); - /** - * Returns information about a process instance. WorkItems attribute is filled-in only upon request! (see getWorkItems parameter) - * - * @param instanceId - * @param historic - * @param getWorkItems - * @param parentResult - * @return - * @throws ObjectNotFoundException - * @throws WorkflowException - */ - public WfProcessInstanceType getProcessInstanceById(String instanceId, boolean historic, boolean getWorkItems, OperationResult parentResult) throws ObjectNotFoundException; - /* * CHANGING THINGS * =============== diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/WorkflowManagerImpl.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/WorkflowManagerImpl.java index 6e23749c963..5e801277f98 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/WorkflowManagerImpl.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/WorkflowManagerImpl.java @@ -144,11 +144,6 @@ public List listProcessInstancesRelatedToUser(String user return processInstanceProvider.listProcessInstancesRelatedToUser(userOid, requestedBy, requestedFor, finished, first, count, parentResult); } - @Override - public WfProcessInstanceType getProcessInstanceById(String instanceId, boolean historic, boolean getWorkItems, OperationResult parentResult) throws ObjectNotFoundException { - return processInstanceProvider.getProcessInstanceByInstanceId(instanceId, historic, getWorkItems, parentResult); - } - @Override public void stopProcessInstance(String instanceId, String username, OperationResult parentResult) { processInstanceManager.stopProcessInstance(instanceId, username, parentResult); diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java index 0bbaf845a64..992c42f0046 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTest.java @@ -427,22 +427,22 @@ protected void executeTest(String testName, String oid, TestDetails testDetails) String pid = wfTaskUtil.getProcessId(subtask); assertNotNull("Workflow process instance id not present in subtask " + subtask, pid); - WfProcessInstanceType processInstance = workflowServiceImpl.getProcessInstanceById(pid, false, true, result); - assertNotNull("Process instance information cannot be retrieved", processInstance); - assertEquals("Incorrect number of work items", 1, processInstance.getWorkItems().size()); +// WfProcessInstanceType processInstance = workflowServiceImpl.getProcessInstanceById(pid, false, true, result); +// assertNotNull("Process instance information cannot be retrieved", processInstance); +// assertEquals("Incorrect number of work items", 1, processInstance.getWorkItems().size()); - String taskId = processInstance.getWorkItems().get(0).getWorkItemId(); + //String taskId = processInstance.getWorkItems().get(0).getWorkItemId(); //WorkItemDetailed workItemDetailed = wfDataAccessor.getWorkItemDetailsById(taskId, result); - org.activiti.engine.task.Task t = activitiEngine.getTaskService().createTaskQuery().taskId(taskId).singleResult(); + org.activiti.engine.task.Task t = activitiEngine.getTaskService().createTaskQuery().processInstanceId(pid).singleResult(); assertNotNull("activiti task not found", t); String executionId = t.getExecutionId(); - LOGGER.trace("Task id = " + taskId + ", execution id = " + executionId); + LOGGER.trace("Execution id = {}", executionId); boolean approve = testDetails.decideOnApproval(executionId); - workflowServiceImpl.approveOrRejectWorkItem(taskId, approve, null, result); + workflowServiceImpl.approveOrRejectWorkItem(t.getId(), approve, null, result); login(userAdministrator); } } diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java index eb006485bc7..67754bd0286 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/general/TestGeneralChangeProcessor.java @@ -231,7 +231,7 @@ void completeWorkItem(WorkItemType workItem, String taskId, OperationResult resu PrismObject questionFormPrism = workItemContents.asObjectable().getQuestionForm().asPrismObject(); - WfProcessInstanceType instance = workflowServiceImpl.getProcessInstanceById(workItem.getProcessInstanceId(), false, true, result); + WfProcessInstanceType instance = null; //workflowServiceImpl.getProcessInstanceById(workItem.getProcessInstanceId(), false, true, result); PrismProperty dummyResourceDelta = ((ProcessInstanceState) instance.getState()).getProcessSpecificState().asPrismContainerValue().findProperty(ApprovingDummyResourceChangesScenarioBean.DUMMY_RESOURCE_DELTA_QNAME); ObjectDeltaType deltaType = dummyResourceDelta.getRealValue(); display("dummyResourceDelta", DeltaConvertor.createObjectDelta(deltaType, prismContext)); @@ -331,7 +331,7 @@ void completeWorkItem(WorkItemType workItem, String taskId, OperationResult resu PrismObject questionFormPrism = workItemContents.asObjectable().getQuestionForm().asPrismObject(); - WfProcessInstanceType instance = workflowServiceImpl.getProcessInstanceById(workItem.getProcessInstanceId(), false, true, result); + WfProcessInstanceType instance = null; //workflowServiceImpl.getProcessInstanceById(workItem.getProcessInstanceId(), false, true, result); PrismProperty dummyResourceDelta = ((ProcessInstanceState) instance.getState()).getProcessSpecificState().asPrismContainerValue().findProperty(ApprovingDummyResourceChangesScenarioBean.DUMMY_RESOURCE_DELTA_QNAME); ObjectDeltaType deltaType = dummyResourceDelta.getRealValue(); display("dummyResourceDelta", DeltaConvertor.createObjectDelta(deltaType, prismContext)); @@ -433,7 +433,7 @@ private void executeTest(String testName, String oid, int subtaskCount, boolean String pid = wfTaskUtil.getProcessId(subtask); assertNotNull("Workflow process instance id not present in subtask " + subtask, pid); - WfProcessInstanceType processInstance = workflowServiceImpl.getProcessInstanceById(pid, false, true, result); + WfProcessInstanceType processInstance = null; //workflowServiceImpl.getProcessInstanceById(pid, false, true, result); assertNotNull("Process instance information cannot be retrieved", processInstance); assertEquals("Incorrect number of work items", 1, processInstance.getWorkItems().size()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java index 638e0177c47..2fb54fba9c9 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.data.common.enums.*; import com.evolveum.midpoint.repo.sql.query.definition.JaxbName; +import com.evolveum.midpoint.repo.sql.query.definition.JaxbPath; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; import com.evolveum.midpoint.repo.sql.util.MidPointJoinedPersister; @@ -30,6 +31,7 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.ForeignKey; import org.hibernate.annotations.Index; @@ -73,6 +75,12 @@ public class RTask extends RObject implements OperationResult { private Set dependent; private RTaskWaitingReason waitingReason; + // workflow-related information (note: objectRef is already present in task information) + private String wfProcessInstanceId; + private REmbeddedReference requesterRef; + private XMLGregorianCalendar wfStartTimestamp; + private XMLGregorianCalendar wfEndTimestamp; + @ElementCollection @ForeignKey(name = "fk_task_dependent") @CollectionTable(name = "m_task_dependent", joinColumns = { @@ -146,6 +154,27 @@ public RPolyString getName() { return name; } + @JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "processInstanceId") }) + public String getWfProcessInstanceId() { + return wfProcessInstanceId; + } + + @JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "requesterRef") }) + @Embedded + public REmbeddedReference getRequesterRef() { + return requesterRef; + } + + @JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "startTimestamp") }) + public XMLGregorianCalendar getWfStartTimestamp() { + return wfStartTimestamp; + } + + @JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "endTimestamp") }) + public XMLGregorianCalendar getWfEndTimestamp() { + return wfEndTimestamp; + } + public void setName(RPolyString name) { this.name = name; } @@ -174,6 +203,22 @@ public void setCategory(String category) { this.category = category; } + public void setWfProcessInstanceId(String wfProcessInstanceId) { + this.wfProcessInstanceId = wfProcessInstanceId; + } + + public void setRequesterRef(REmbeddedReference requesterRef) { + this.requesterRef = requesterRef; + } + + public void setWfStartTimestamp(XMLGregorianCalendar wfStartTimestamp) { + this.wfStartTimestamp = wfStartTimestamp; + } + + public void setWfEndTimestamp(XMLGregorianCalendar wfEndTimestamp) { + this.wfEndTimestamp = wfEndTimestamp; + } + public String getHandlerUri() { return handlerUri; } @@ -289,6 +334,10 @@ public boolean equals(Object o) { if (waitingReason != null ? !waitingReason.equals(rTask.waitingReason) : rTask.waitingReason != null) return false; if (status != rTask.status) return false; + if (requesterRef != null ? !requesterRef.equals(rTask.requesterRef) : rTask.requesterRef != null) return false; + if (wfProcessInstanceId != null ? !wfProcessInstanceId.equals(rTask.wfProcessInstanceId) : rTask.wfProcessInstanceId != null) return false; + if (wfStartTimestamp != null ? !wfStartTimestamp.equals(rTask.wfStartTimestamp) : rTask.wfStartTimestamp != null) return false; + if (wfEndTimestamp != null ? !wfEndTimestamp.equals(rTask.wfEndTimestamp) : rTask.wfEndTimestamp != null) return false; return true; } @@ -342,6 +391,14 @@ public static void copyFromJAXB(TaskType jaxb, RTask repo, PrismContext prismCon repo.setWaitingReason(RUtil.getRepoEnumValue(jaxb.getWaitingReason(), RTaskWaitingReason.class)); repo.setDependent(RUtil.listToSet(jaxb.getDependent())); + WfContextType wfc = jaxb.getWorkflowContext(); + if (wfc != null) { + repo.setWfProcessInstanceId(wfc.getProcessInstanceId()); + repo.setRequesterRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getRequesterRef(), prismContext)); + repo.setWfStartTimestamp(wfc.getStartTimestamp()); + repo.setWfEndTimestamp(wfc.getEndTimestamp()); + } + RUtil.copyResultFromJAXB(taskDefinition, jaxb.F_RESULT, jaxb.getResult(), repo, prismContext); }