diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java index e135030108d..67681dc249e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/dto/TaskDto.java @@ -406,10 +406,10 @@ private void fillInWorkflowAttributes(TaskType taskType) throws SchemaException PrismProperty finished = getExtensionProperty(taskType, WfTaskExtensionItemsNames.WFPROCESS_INSTANCE_FINISHED_PROPERTY_NAME); workflowProcessInstanceFinished = finished != null && Boolean.TRUE.equals(finished.getRealValue()); - PrismProperty lastDetails = getExtensionProperty(taskType, WfTaskExtensionItemsNames.WFLAST_DETAILS_PROPERTY_NAME); - if (lastDetails != null) { - workflowLastDetails = lastDetails.getRealValue(); - } +// PrismProperty lastDetails = getExtensionProperty(taskType, WfTaskExtensionItemsNames.WFLAST_DETAILS_PROPERTY_NAME); +// if (lastDetails != null) { +// workflowLastDetails = lastDetails.getRealValue(); +// } workflowDeltasIn = retrieveDeltasToProcess(taskType); workflowDeltasOut = retrieveResultingDeltas(taskType); 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 c8cf08e1d95..47f30148ff0 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 @@ -33,6 +33,7 @@ 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; +import com.evolveum.midpoint.web.session.UserProfileStorage; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; import com.evolveum.midpoint.wf.util.ApprovalUtils; @@ -41,6 +42,7 @@ 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.ISortableDataProvider; 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; @@ -54,6 +56,10 @@ import java.util.Date; import java.util.List; +import static com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto.F_ANSWER; +import static com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto.F_END_FORMATTED; +import static com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto.F_START_FORMATTED; + /** * @author mederly */ @@ -61,6 +67,7 @@ public abstract class PageProcessInstances extends PageAdminWorkItems { public static final String ID_STOP = "stop"; public static final String ID_BACK = "back"; + public static final String ID_PROCESS_INSTANCES_TABLE = "processInstancesTable"; boolean requestedBy; // true if we want to show process instances requested BY a user boolean requestedFor; // true if we want to show instances requested FOR a user @@ -79,78 +86,15 @@ private void initLayout() { Form mainForm = new Form("mainForm"); add(mainForm); - List> columns = initColumns(); - TablePanel table = new TablePanel("processInstancesTable", new ProcessInstanceDtoProvider(PageProcessInstances.this, requestedBy, requestedFor, false), columns); - table.setOutputMarkupId(true); - mainForm.add(table); + ISortableDataProvider provider = new ProcessInstanceDtoProvider(PageProcessInstances.this, requestedBy, requestedFor); + WorkflowRequestsPanel panel = new WorkflowRequestsPanel(ID_PROCESS_INSTANCES_TABLE, provider, + UserProfileStorage.TableId.PAGE_WORKFLOW_REQUESTS, getItemsPerPage(UserProfileStorage.TableId.PAGE_WORKFLOW_REQUESTS)); + panel.setOutputMarkupId(true); + mainForm.add(panel); initItemButtons(mainForm); } - private List> initColumns() { - List> columns = new ArrayList>(); - - IColumn column = new CheckBoxHeaderColumn<>(); - columns.add(column); - - column = new LinkColumn(createStringResource("pageProcessInstances.item.name"), ProcessInstanceDto.F_NAME) { - - @Override - public void onClick(AjaxRequestTarget target, IModel rowModel) { - ProcessInstanceDto piDto = rowModel.getObject(); - itemDetailsPerformed(target, piDto.getTaskOid()); - } - }; - columns.add(column); - - columns.add(new PropertyColumn(createStringResource("pageProcessInstances.item.started"), ProcessInstanceDto.F_START_FORMATTED)); - -// 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 void initItemButtons(Form mainForm) { AjaxButton stop = new AjaxButton(ID_STOP, createStringResource("pageProcessInstances.button.stop")) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/component/MyRequestsPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/WorkflowRequestsPanel.html similarity index 100% rename from gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/component/MyRequestsPanel.html rename to gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/WorkflowRequestsPanel.html diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/WorkflowRequestsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/WorkflowRequestsPanel.java new file mode 100644 index 00000000000..f6857a75b72 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/WorkflowRequestsPanel.java @@ -0,0 +1,147 @@ +package com.evolveum.midpoint.web.page.admin.workflow; + +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.prism.xml.XmlTypeConverter; +import com.evolveum.midpoint.schema.result.OperationResultStatus; +import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.web.component.data.TablePanel; +import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; +import com.evolveum.midpoint.web.component.data.column.IconColumn; +import com.evolveum.midpoint.web.component.data.column.LinkColumn; +import com.evolveum.midpoint.web.component.util.ListDataProvider; +import com.evolveum.midpoint.web.component.util.SimplePanel; +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; +import com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDtoProvider; +import com.evolveum.midpoint.web.page.admin.workflow.dto.WorkItemNewDto; +import com.evolveum.midpoint.web.session.UserProfileStorage; +import com.evolveum.midpoint.web.util.OnePageParameterEncoder; +import com.evolveum.midpoint.wf.util.ApprovalUtils; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType; +import org.apache.commons.lang.time.DurationFormatUtils; +import org.apache.wicket.ajax.AjaxRequestTarget; +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.ISortableDataProvider; +import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.AbstractReadOnlyModel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.request.mapper.parameter.PageParameters; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusIcon.FATAL_ERROR; +import static com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusIcon.IN_PROGRESS; +import static com.evolveum.midpoint.web.page.admin.server.dto.OperationResultStatusIcon.SUCCESS; +import static com.evolveum.midpoint.web.page.admin.workflow.dto.ProcessInstanceDto.*; + +/** + * @author Kate + * @author mederly + */ + +public class WorkflowRequestsPanel extends BasePanel { + + private static final String ID_REQUESTS_TABLE = "requestsTable"; + + private ISortableDataProvider provider; + + public WorkflowRequestsPanel(String id, ISortableDataProvider provider, + UserProfileStorage.TableId tableId, long pageSize) { + super(id); + this.provider = provider; + initLayout(tableId, pageSize); + } + + private void initLayout(UserProfileStorage.TableId tableId, long pageSize) { + TablePanel table = new TablePanel<>(ID_REQUESTS_TABLE, provider, initColumns(), tableId, pageSize); + table.setOutputMarkupId(true); + add(table); + } + + private List> initColumns() { + + List> columns = new ArrayList>(); + + IColumn column = new CheckBoxHeaderColumn<>(); + columns.add(column); + + columns.add(new PropertyColumn(createStringResource("pageProcessInstances.item.object"), F_OBJECT_NAME)); + columns.add(new PropertyColumn(createStringResource("pageProcessInstances.item.target"), F_TARGET_NAME)); + + if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_WORK_ITEMS_ALL_URL, + AuthorizationConstants.AUTZ_UI_WORK_ITEMS_PROCESS_INSTANCE_URL)) { + columns.add(new LinkColumn(createStringResource("MyRequestsPanel.name"), "name") { + @Override + public void onClick(AjaxRequestTarget target, IModel rowModel) { + ProcessInstanceDto piDto = rowModel.getObject(); + itemDetailsPerformed(target, piDto.getTaskOid()); + } + }); + } else { + columns.add(new PropertyColumn(createStringResource("MyRequestsPanel.name"), F_NAME)); + } + + columns.add(new PropertyColumn(createStringResource("pageProcessInstances.item.state"), F_STATE)); + + columns.add(new PropertyColumn(createStringResource("pageProcessInstances.item.started"), F_START_FORMATTED)); + + columns.add(new IconColumn(createStringResource("pageProcessInstances.item.result")) { + @Override + protected IModel createIconModel(final IModel rowModel) { + return new AbstractReadOnlyModel() { + @Override + public String getObject() { + return choose(rowModel, IN_PROGRESS.getIcon(), SUCCESS.getIcon(), FATAL_ERROR.getIcon()); + } + }; + } + + @Override + protected IModel createTitleModel(final IModel rowModel) { + return new AbstractReadOnlyModel() { + @Override + public String getObject() { + return choose(rowModel, + createStringResource("MyRequestsPanel.inProgress").getString(), + createStringResource("MyRequestsPanel.approved").getString(), + createStringResource("MyRequestsPanel.rejected").getString()); + } + }; + } + + private String choose(IModel rowModel, String inProgress, String approved, String rejected) { + ProcessInstanceDto dto = rowModel.getObject(); + Boolean result = ApprovalUtils.approvalBooleanValue(dto.getAnswer()); + if (result == null) { + return inProgress; + } else { + return result ? approved : rejected; + } + } + }); + + columns.add(new PropertyColumn(createStringResource("pageProcessInstances.item.finished"), F_END_FORMATTED)); + + return columns; + } + + + + private void itemDetailsPerformed(AjaxRequestTarget target, String pid) { + PageParameters parameters = new PageParameters(); + parameters.add(OnePageParameterEncoder.PARAMETER, pid); + setResponsePage(new PageTaskEdit(parameters, this.getPageBase())); + } +} 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 1a04238cdae..7fde8a57f8e 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 @@ -20,21 +20,33 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; 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 org.apache.commons.lang.Validate; import org.apache.wicket.Component; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.model.AbstractReadOnlyModel; +import org.apache.wicket.model.IModel; import javax.xml.datatype.XMLGregorianCalendar; import java.util.Date; +import static com.evolveum.midpoint.gui.api.util.WebComponentUtil.formatDate; +import static com.evolveum.midpoint.prism.xml.XmlTypeConverter.*; + /** * @author mederly */ public class ProcessInstanceDto extends Selectable { - public static final String F_SHADOW_TASK = "shadowTask"; + public static final String F_OBJECT_NAME = "objectName"; + public static final String F_TARGET_NAME = "targetName"; + public static final String F_SHADOW_TASK = "shadowTask"; // DELETE THIS! public static final String F_NAME = "name"; public static final String F_START_FORMATTED = "startFormatted"; + public static final String F_END_FORMATTED = "endFormatted"; + public static final String F_STATE = "state"; + public static final String F_ANSWER = "answer"; private TaskType task; @@ -48,15 +60,39 @@ public XMLGregorianCalendar getStartTimestamp() { return task.getWorkflowContext().getStartTimestamp(); } + public XMLGregorianCalendar getEndTimestamp() { + return task.getWorkflowContext().getEndTimestamp(); + } + public String getStartFormatted() { - Date started = XmlTypeConverter.toDate(getStartTimestamp()); - return WebComponentUtil.formatDate(started); + Date started = toDate(getStartTimestamp()); + return formatDate(started); + } + + public String getEndFormatted() { + return formatDate(toDate(getEndTimestamp())); } public String getName() { return PolyString.getOrig(task.getName()); } + public String getAnswer() { + return task.getWorkflowContext().getAnswer(); + } + + public String getObjectName() { + return WebComponentUtil.getName(task.getWorkflowContext().getObjectRef()); + } + + public String getTargetName() { + return WebComponentUtil.getName(task.getWorkflowContext().getTargetRef()); + } + + public String getState() { + return task.getWorkflowContext().getState(); + } + // public List getWorkItems() { // List retval = new ArrayList(); // if (processInstance.getWorkItems() != null) { 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 60f8809dad5..c6afdfd720f 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 @@ -46,6 +46,7 @@ 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.WfContextType.F_START_TIMESTAMP; /** * @author lazyman @@ -64,8 +65,7 @@ public class ProcessInstanceDtoProvider extends BaseSortableDataProvider> loadMyRequests() { callableResult.setResult(result); try { - ObjectQuery query = QueryBuilder.queryFor(TaskType.class, getPrismContext()) + ObjectQuery query = QueryBuilder.queryFor(TaskType.class, prismContext) .item(F_WORKFLOW_CONTEXT, F_REQUESTER_REF).ref(user.getOid()) .and().not().item(F_WORKFLOW_CONTEXT, F_PROCESS_INSTANCE_ID).isNull() + .desc(F_WORKFLOW_CONTEXT, F_START_TIMESTAMP) .build(); List> tasks = getModelService().searchObjects(TaskType.class, query, null, opTask, result); 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 deleted file mode 100644 index 0061e076f28..00000000000 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/component/MyRequestsPanel.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.evolveum.midpoint.web.page.self.component; - -import com.evolveum.midpoint.gui.api.util.WebComponentUtil; -import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.schema.result.OperationResultStatus; -import com.evolveum.midpoint.security.api.AuthorizationConstants; -import com.evolveum.midpoint.web.component.data.TablePanel; -import com.evolveum.midpoint.web.component.data.column.IconColumn; -import com.evolveum.midpoint.web.component.data.column.LinkColumn; -import com.evolveum.midpoint.web.component.util.ListDataProvider; -import com.evolveum.midpoint.web.component.util.SimplePanel; -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; -import com.evolveum.midpoint.web.util.OnePageParameterEncoder; -import com.evolveum.midpoint.wf.util.ApprovalUtils; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType; -import org.apache.commons.lang.time.DurationFormatUtils; -import org.apache.wicket.ajax.AjaxRequestTarget; -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.ISortableDataProvider; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.AbstractReadOnlyModel; -import org.apache.wicket.model.IModel; -import org.apache.wicket.request.mapper.parameter.PageParameters; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -/** - * Created by Kate on 03.10.2015. - */ -public class MyRequestsPanel extends SimplePanel> { - private static final String ID_REQUESTS_TABLE = "requestsTable"; - - public MyRequestsPanel(String id) { - super(id, null); - } - - public MyRequestsPanel(String id, IModel> model) { - super(id, model); - } - - @Override - protected void initLayout() { - List> columns = new ArrayList>(); - if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_WORK_ITEMS_ALL_URL, - AuthorizationConstants.AUTZ_UI_WORK_ITEMS_PROCESS_INSTANCE_URL)) { - columns.add(new LinkColumn(createStringResource("MyRequestsPanel.name"), "name") { - - @Override - public void onClick(AjaxRequestTarget target, IModel rowModel) { - ProcessInstanceDto piDto = rowModel.getObject(); - itemDetailsPerformed(target, piDto.getTaskOid()); - } - }); - } else { - columns.add(new AbstractColumn(createStringResource("MyRequestsPanel.name")) { - @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(); - return pi.getName(); - } - })); - } - }); - } -// 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, String pid) { - PageParameters parameters = new PageParameters(); - parameters.add(OnePageParameterEncoder.PARAMETER, pid); - setResponsePage(new PageTaskEdit(parameters, this.getPageBase())); - } -} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/session/UserProfileStorage.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/session/UserProfileStorage.java index ec37aa8ff28..f7832142c3c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/session/UserProfileStorage.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/session/UserProfileStorage.java @@ -49,6 +49,7 @@ public enum TableId { PAGE_TASKS_NODES_PANEL, PAGE_USERS_PANEL, PAGE_WORK_ITEMS, + PAGE_WORKFLOW_REQUESTS, PAGE_RESOURCES_CONNECTOR_HOSTS, PAGE_REPORTS, PAGE_CERT_CAMPAIGN_OUTCOMES_PANEL, diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index 32f0a8b4818..c092af41ad2 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -1715,6 +1715,9 @@ pageProcessInstances.item.name=Name pageProcessInstances.item.owner=Owner pageProcessInstances.item.result=Result pageProcessInstances.item.started=Started +pageProcessInstances.item.object=Object +pageProcessInstances.item.target=Target +pageProcessInstances.item.state=State pageProcessInstances.item.status=Status pageProcessInstances.message.noItemSelected=No process instance has been selected. pageProcessInstances.notYet=not yet @@ -2924,6 +2927,7 @@ TableConfigurationPanel.tableColumns=Table columnsCountToolbar.label.unknownCoun MyRequestsPanel.started = Started MyRequestsPanel.rejected = Rejected MyRequestsPanel.approved = Approved +MyRequestsPanel.inProgress = In progress MyRequestsPanel.name = Name PageSelfDashboard.title=Home PageSelfDashboard.workItems=My work items diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-workflows-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-workflows-3.xsd index dc3ed42355c..0424e8dccde 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-workflows-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-workflows-3.xsd @@ -742,6 +742,21 @@ + + + + Object whose modification is to be approved. (Normally the same as task.objectRef but there can be differences + in cases when the object is only to be created.) TODO - think this through. + + + + + + + Target of assignment/association/etc that is to be approved. + + + diff --git a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WfTaskExtensionItemsNames.java b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WfTaskExtensionItemsNames.java index a77d1283df0..a7604db162c 100644 --- a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WfTaskExtensionItemsNames.java +++ b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/api/WfTaskExtensionItemsNames.java @@ -46,9 +46,6 @@ public class WfTaskExtensionItemsNames { // turned off in WfTaskUtil class. public static final QName WFSTATUS_PROPERTY_NAME = new QName(WORKFLOW_EXTENSION_NS, "status"); - // A dump of recent process instance variables (for diagnostic purposes). - public static final QName WFLAST_VARIABLES_PROPERTY_NAME = new QName(WORKFLOW_EXTENSION_NS, "lastVariables"); - // String representation of recent process instance information (for diagnostic purposes). public static final QName WFLAST_DETAILS_PROPERTY_NAME = new QName(WORKFLOW_EXTENSION_NS, "lastDetails"); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceProvider.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceProvider.java index aada202f50c..a03d0845035 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceProvider.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/ProcessInstanceProvider.java @@ -64,7 +64,9 @@ import javax.xml.bind.JAXBException; import java.util.*; +import static com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames.VARIABLE_OBJECT_REF; import static com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames.VARIABLE_REQUESTER_REF; +import static com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames.VARIABLE_TARGET_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_WORK_ITEM; @@ -381,6 +383,16 @@ private WfContextType activitiToMidpointWfContextHistory(HistoricProcessInstance wfc.setRequesterRef(requesterRef.toObjectReferenceType()); } + LightweightObjectRef objectRef = (LightweightObjectRef) vars.get(VARIABLE_OBJECT_REF); + if (objectRef != null) { + wfc.setObjectRef(objectRef.toObjectReferenceType()); + } + + LightweightObjectRef targetRef = (LightweightObjectRef) vars.get(VARIABLE_TARGET_REF); + if (targetRef != null) { + wfc.setTargetRef(targetRef.toObjectReferenceType()); + } + ChangeProcessor cp = wfConfiguration.findChangeProcessor((String) vars.get(CommonProcessVariableNames.VARIABLE_MIDPOINT_CHANGE_PROCESSOR)); if (cp == null) { throw new SchemaException("No change processor information in process instance " + instance.getId()); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/JobController.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/JobController.java index 966fe481e7d..dab9aadd53b 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/JobController.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/JobController.java @@ -22,7 +22,10 @@ import com.evolveum.midpoint.model.impl.controller.ModelOperationTaskHandler; import com.evolveum.midpoint.model.impl.lens.LensContext; import com.evolveum.midpoint.prism.Item; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; +import com.evolveum.midpoint.prism.delta.builder.S_ItemEntry; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; @@ -53,6 +56,8 @@ import com.evolveum.midpoint.wf.impl.processes.common.CommonProcessVariableNames; import com.evolveum.midpoint.wf.impl.processors.ChangeProcessor; import com.evolveum.midpoint.wf.impl.util.MiscDataUtil; +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.WorkItemType; import com.evolveum.midpoint.xml.ns.model.workflow.process_instance_state_3.ProcessInstanceState; import org.apache.commons.lang.Validate; @@ -68,6 +73,9 @@ import java.util.Set; import java.util.TreeMap; +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_STATE; + /** * Manages everything related to a activiti process instance, including the task that monitors that process instance. * @@ -114,6 +122,9 @@ public class JobController { @Autowired private WorkItemProvider workItemProvider; + + @Autowired + private PrismContext prismContext; //endregion //region Job creation & re-creation @@ -410,14 +421,14 @@ private void recordProcessInstanceState(Job job, String stateDescription, Proces LOGGER.trace("recordProcessInstanceState starting."); Task task = job.getTask(); try { - task.setDescription(stateDescription); - if (event != null) { - wfTaskUtil.setWfLastVariables(task, dumpVariables(event)); - } - if (USE_WFSTATUS) { - wfTaskUtil.addWfStatus(task, prepareValueForWfStatusProperty(stateDescription)); - } - wfTaskUtil.setLastDetails(task, stateDescription); + task.addModification(taskDelta().item(F_WORKFLOW_CONTEXT, F_STATE).replace(stateDescription).asItemDelta()); +// if (event != null) { +// wfTaskUtil.setWfLastVariables(task, dumpVariables(event)); +// } +// if (USE_WFSTATUS) { +// wfTaskUtil.addWfStatus(task, prepareValueForWfStatusProperty(stateDescription)); +// } +// wfTaskUtil.setLastDetails(task, stateDescription); task.savePendingModifications(parentResult); } catch (Exception ex) { // todo LoggingUtils.logException(LOGGER, "Couldn't record information from WfMS into task {}", ex, task); @@ -426,6 +437,10 @@ private void recordProcessInstanceState(Job job, String stateDescription, Proces LOGGER.trace("recordProcessInstanceState ending."); } + private S_ItemEntry taskDelta() throws SchemaException { + return DeltaBuilder.deltaFor(TaskType.class, prismContext); + } + private String prepareValueForWfStatusProperty(String stateDescription) { // statusTsDt (for wfStatus): [: ] // (timestamp is to enable easy sorting, [] to easy parsing) diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskUtil.java index dee2063a4aa..940775fbac3 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/jobs/WfTaskUtil.java @@ -18,32 +18,15 @@ import com.evolveum.midpoint.model.api.context.ModelContext; import com.evolveum.midpoint.model.impl.lens.LensContext; -import com.evolveum.midpoint.prism.Objectable; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; -import com.evolveum.midpoint.prism.PrismReference; -import com.evolveum.midpoint.prism.PrismReferenceDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.repo.api.RepositoryService; -import com.evolveum.midpoint.schema.DeltaConvertor; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskBinding; import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -54,9 +37,7 @@ import com.evolveum.midpoint.wf.impl.processors.primary.aspect.PrimaryChangeAspect; import com.evolveum.midpoint.wf.processors.primary.PcpTaskExtensionItemsNames; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; - import org.apache.commons.lang.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -65,13 +46,7 @@ import javax.annotation.PostConstruct; import javax.xml.namespace.QName; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Handles low-level task operations, e.g. handling wf* properties in task extension. @@ -103,9 +78,6 @@ public class WfTaskUtil { public static final String WAIT_FOR_TASKS_HANDLER_URI = "<<< marker for calling pushWaitForTasksHandlerUri >>>"; // workflow-related extension properties - private PrismPropertyDefinition wfStatusPropertyDefinition; - private PrismPropertyDefinition wfLastDetailsPropertyDefinition; - private PrismPropertyDefinition wfLastVariablesPropertyDefinition; private PrismPropertyDefinition wfPrimaryChangeAspectPropertyDefinition; private PrismPropertyDefinition wfChangeProcessorPropertyDefinition; private PrismPropertyDefinition wfProcessIdPropertyDefinition; @@ -118,9 +90,6 @@ public class WfTaskUtil { @PostConstruct public void init() { - wfStatusPropertyDefinition = prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(WfTaskExtensionItemsNames.WFSTATUS_PROPERTY_NAME); - wfLastDetailsPropertyDefinition = prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(WfTaskExtensionItemsNames.WFLAST_DETAILS_PROPERTY_NAME); - wfLastVariablesPropertyDefinition = prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(WfTaskExtensionItemsNames.WFLAST_VARIABLES_PROPERTY_NAME); wfPrimaryChangeAspectPropertyDefinition = prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(PcpTaskExtensionItemsNames.WFPRIMARY_CHANGE_ASPECT_NAME); wfChangeProcessorPropertyDefinition = prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(WfTaskExtensionItemsNames.WFCHANGE_PROCESSOR_PROPERTY_NAME); wfProcessIdPropertyDefinition = prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(WfTaskExtensionItemsNames.WFPROCESSID_PROPERTY_NAME); @@ -130,9 +99,6 @@ public void init() { wfRootTaskOidPropertyDefinition = prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(WfTaskExtensionItemsNames.WFROOT_TASK_OID_PROPERTY_NAME); wfApprovedByReferenceDefinition = prismContext.getSchemaRegistry().findReferenceDefinitionByElementName(PcpTaskExtensionItemsNames.WFAPPROVED_BY_REFERENCE_NAME); - Validate.notNull(wfStatusPropertyDefinition, WfTaskExtensionItemsNames.WFSTATUS_PROPERTY_NAME + " definition was not found"); - Validate.notNull(wfLastDetailsPropertyDefinition, WfTaskExtensionItemsNames.WFLAST_DETAILS_PROPERTY_NAME + " definition was not found"); - Validate.notNull(wfLastVariablesPropertyDefinition, WfTaskExtensionItemsNames.WFLAST_VARIABLES_PROPERTY_NAME + " definition was not found"); Validate.notNull(wfPrimaryChangeAspectPropertyDefinition, PcpTaskExtensionItemsNames.WFPRIMARY_CHANGE_ASPECT_NAME + " definition was not found"); Validate.notNull(wfChangeProcessorPropertyDefinition, WfTaskExtensionItemsNames.WFCHANGE_PROCESSOR_PROPERTY_NAME + " definition was not found"); Validate.notNull(wfProcessIdPropertyDefinition, WfTaskExtensionItemsNames.WFPROCESSID_PROPERTY_NAME + " definition was not found"); @@ -142,13 +108,6 @@ public void init() { Validate.notNull(wfRootTaskOidPropertyDefinition, WfTaskExtensionItemsNames.WFROOT_TASK_OID_PROPERTY_NAME + " definition was not found"); Validate.notNull(wfApprovedByReferenceDefinition, PcpTaskExtensionItemsNames.WFAPPROVED_BY_REFERENCE_NAME + " definition was not found"); - if (wfLastVariablesPropertyDefinition.isIndexed() != Boolean.FALSE) { - throw new SystemException("lastVariables property isIndexed attribute is incorrect (should be FALSE, it is " + wfLastVariablesPropertyDefinition.isIndexed() + ")"); - } - if (wfLastDetailsPropertyDefinition.isIndexed() != Boolean.FALSE) { - throw new SystemException("lastDetails property isIndexed attribute is incorrect (should be FALSE, it is " + wfLastDetailsPropertyDefinition.isIndexed() + ")"); - } - } void setWfProcessIdImmediate(Task task, String pid, OperationResult parentResult) throws SchemaException, ObjectNotFoundException { @@ -157,15 +116,6 @@ void setWfProcessIdImmediate(Task task, String pid, OperationResult parentResult setExtensionPropertyImmediate(task, wfProcessIdPropertyDefinition, pid, parentResult); } - String getLastVariables(Task task) { - PrismProperty p = task.getExtensionProperty(WfTaskExtensionItemsNames.WFLAST_VARIABLES_PROPERTY_NAME); - if (p == null) { - return null; - } else { - return p.getValue(String.class).getValue(); - } - } - String getLastDetails(Task task) { PrismProperty p = task.getExtensionProperty(WfTaskExtensionItemsNames.WFLAST_DETAILS_PROPERTY_NAME); if (p == null) { @@ -343,23 +293,6 @@ public void setTaskNameIfEmpty(Task t, PolyStringType taskName) { } - public void setWfLastVariables(Task task, String value) throws SchemaException { - PrismProperty wfLastVariablesProperty = wfLastVariablesPropertyDefinition.instantiate(); - wfLastVariablesProperty.setValue(new PrismPropertyValue(value)); - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("WfLastVariable INDEXED = " + wfLastVariablesProperty.getDefinition().isIndexed()); - } - task.setExtensionProperty(wfLastVariablesProperty); - - } - - public void addWfStatus(Task task, String value) throws SchemaException { - PrismProperty wfStatusProperty = wfStatusPropertyDefinition.instantiate(); - PrismPropertyValue newValue = new PrismPropertyValue(value); - wfStatusProperty.addValue(newValue); - task.addExtensionProperty(wfStatusProperty); - } - private T getExtensionValue(Class clazz, Task task, QName propertyName) { PrismProperty property = task.getExtensionProperty(propertyName); return property != null ? property.getRealValue(clazz) : null; @@ -386,13 +319,6 @@ public void deleteModelOperationContext(Task task, OperationResult result) throw task.setModelOperationContext(null); } - public void setLastDetails(Task task, String status) throws SchemaException { - PrismProperty wfLastDetailsProperty = wfLastDetailsPropertyDefinition.instantiate(); - PrismPropertyValue newValue = new PrismPropertyValue(status); - wfLastDetailsProperty.setValue(newValue); - task.setExtensionProperty(wfLastDetailsProperty); - } - public void addApprovedBy(Task task, ObjectReferenceType referenceType) throws SchemaException { PrismReference wfApprovedBy = wfApprovedByReferenceDefinition.instantiate(); PrismReferenceValue newValue = new PrismReferenceValue(referenceType.getOid()); @@ -442,18 +368,6 @@ public List getApprovedByFromTaskTree(Task task, return retval; } - public PrismPropertyDefinition getWfStatusPropertyDefinition() { - return wfStatusPropertyDefinition; - } - - public PrismPropertyDefinition getWfLastDetailsPropertyDefinition() { - return wfLastDetailsPropertyDefinition; - } - - public PrismPropertyDefinition getWfLastVariablesPropertyDefinition() { - return wfLastVariablesPropertyDefinition; - } - public PrismPropertyDefinition getWfPrimaryChangeAspectPropertyDefinition() { return wfPrimaryChangeAspectPropertyDefinition; } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java index 3adb59539f1..b1ff6c46a59 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java @@ -781,4 +781,7 @@ public void storeOperationStats() { @Override public void initializeWorkflowContextImmediate(String processInstanceId, OperationResult result) throws SchemaException { } + + @Override public void addModification(ItemDelta delta) throws SchemaException { + } } 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 2fb54fba9c9..6bbbf3748f7 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 @@ -77,7 +77,9 @@ public class RTask extends RObject implements OperationResult { // workflow-related information (note: objectRef is already present in task information) private String wfProcessInstanceId; - private REmbeddedReference requesterRef; + private REmbeddedReference wfRequesterRef; + private REmbeddedReference wfObjectRef; + private REmbeddedReference wfTargetRef; private XMLGregorianCalendar wfStartTimestamp; private XMLGregorianCalendar wfEndTimestamp; @@ -161,8 +163,20 @@ public String getWfProcessInstanceId() { @JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "requesterRef") }) @Embedded - public REmbeddedReference getRequesterRef() { - return requesterRef; + public REmbeddedReference getWfRequesterRef() { + return wfRequesterRef; + } + + @JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "objectRef") }) + @Embedded + public REmbeddedReference getWfObjectRef() { + return wfObjectRef; + } + + @JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "targetRef") }) + @Embedded + public REmbeddedReference getWfTargetRef() { + return wfTargetRef; } @JaxbPath(itemPath = { @JaxbName(localPart = "workflowContext"), @JaxbName(localPart = "startTimestamp") }) @@ -207,8 +221,16 @@ public void setWfProcessInstanceId(String wfProcessInstanceId) { this.wfProcessInstanceId = wfProcessInstanceId; } - public void setRequesterRef(REmbeddedReference requesterRef) { - this.requesterRef = requesterRef; + public void setWfRequesterRef(REmbeddedReference wfRequesterRef) { + this.wfRequesterRef = wfRequesterRef; + } + + public void setWfObjectRef(REmbeddedReference wfObjectRef) { + this.wfObjectRef = wfObjectRef; + } + + public void setWfTargetRef(REmbeddedReference wfTargetRef) { + this.wfTargetRef = wfTargetRef; } public void setWfStartTimestamp(XMLGregorianCalendar wfStartTimestamp) { @@ -334,7 +356,9 @@ 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 (wfRequesterRef != null ? !wfRequesterRef.equals(rTask.wfRequesterRef) : rTask.wfRequesterRef != null) return false; + if (wfObjectRef != null ? !wfObjectRef.equals(rTask.wfObjectRef) : rTask.wfObjectRef != null) return false; + if (wfTargetRef != null ? !wfTargetRef.equals(rTask.wfTargetRef) : rTask.wfTargetRef != 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; @@ -394,7 +418,9 @@ public static void copyFromJAXB(TaskType jaxb, RTask repo, PrismContext prismCon WfContextType wfc = jaxb.getWorkflowContext(); if (wfc != null) { repo.setWfProcessInstanceId(wfc.getProcessInstanceId()); - repo.setRequesterRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getRequesterRef(), prismContext)); + repo.setWfRequesterRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getRequesterRef(), prismContext)); + repo.setWfObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getObjectRef(), prismContext)); + repo.setWfTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getTargetRef(), prismContext)); repo.setWfStartTimestamp(wfc.getStartTimestamp()); repo.setWfEndTimestamp(wfc.getEndTimestamp()); } diff --git a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java index fd3f5a278c2..d0d20cfa3ae 100644 --- a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java +++ b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java @@ -934,7 +934,14 @@ void initializeWorkflowContextImmediate(String processInstanceId, OperationResul */ public void refresh(OperationResult parentResult) throws ObjectNotFoundException, SchemaException; - /** + /** + * Changes in-memory representation immediately and schedules a corresponding batched modification. + * @param delta + * @throws SchemaException + */ + void addModification(ItemDelta delta) throws SchemaException; + + /** * Saves modifications done against the in-memory version of the task into the repository. */ void savePendingModifications(OperationResult parentResult) throws ObjectNotFoundException, diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java index de2dd44127a..8f30ce15557 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java @@ -297,6 +297,12 @@ public void addPendingModification(ItemDelta delta) { ItemDelta.merge(pendingModifications, delta); } + @Override + public void addModification(ItemDelta delta) throws SchemaException { + addPendingModification(delta); + delta.applyTo(taskPrism); + } + @Override public void savePendingModifications(OperationResult parentResult) throws ObjectNotFoundException, SchemaException, ObjectAlreadyExistsException {