From 05693d035b4dac8c1fbd0ecbd0447ae4f8c820ca Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 28 Aug 2019 12:21:22 +0200 Subject: [PATCH 01/20] Fix error when displaying assignments After (some) recent change, items like tenantRef and orgRef are no longer empty, because they contain non-null type specification. GUI was not prepared for this and failed, calling getObject with null OID. --- .../midpoint/web/component/assignment/AssignmentsUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java index bc755164f3b..1294dd69d11 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java @@ -360,7 +360,7 @@ public static String getAssignmentSpecificInfoLabel(AssignmentType assignmentTyp } ObjectReferenceType targetRefObj = assignmentType.getTargetRef(); - if (targetRefObj != null && !SchemaConstants.ORG_DEFAULT.equals(targetRefObj.getRelation())){ + if (targetRefObj != null && !SchemaConstants.ORG_DEFAULT.equals(targetRefObj.getRelation())) { sb.append(pageBase.createStringResource("AbstractRoleAssignmentPanel.relationLabel").getString()); sb.append(": "); String relationDisplayName = WebComponentUtil.getRelationHeaderLabelKeyIfKnown(targetRefObj.getRelation()); @@ -369,7 +369,7 @@ public static String getAssignmentSpecificInfoLabel(AssignmentType assignmentTyp pageBase.createStringResource(targetRefObj.getRelation().getLocalPart()).getString()); } ObjectReferenceType tenantRef = assignmentType.getTenantRef(); - if (tenantRef != null && !tenantRef.asReferenceValue().isEmpty()) { + if (tenantRef != null && tenantRef.getOid() != null) { String tenantDisplayName = WebComponentUtil.getEffectiveName(tenantRef, OrgType.F_DISPLAY_NAME, pageBase, "loadTenantName"); if (StringUtils.isNotEmpty(tenantDisplayName)){ if (StringUtils.isNotEmpty(sb.toString())){ @@ -382,7 +382,7 @@ public static String getAssignmentSpecificInfoLabel(AssignmentType assignmentTyp } ObjectReferenceType orgRef = assignmentType.getOrgRef(); - if (orgRef != null && !orgRef.asReferenceValue().isEmpty()) { + if (orgRef != null && orgRef.getOid() != null) { String orgDisplayName = WebComponentUtil.getEffectiveName(orgRef, OrgType.F_DISPLAY_NAME, pageBase, "loadOrgName"); if (StringUtils.isNotEmpty(orgDisplayName)){ if (StringUtils.isNotEmpty(sb.toString())){ From e3572da149ae4740097756587b4b037fe52b0a56 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 28 Aug 2019 12:22:51 +0200 Subject: [PATCH 02/20] Re-enable synchronization on ExtItemDictionary This is a safety measure, treating potential concurrency issues - but only if they occur on the same node. See MID-4799, MID-4710. --- .../data/common/dictionary/ExtItemDictionary.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/dictionary/ExtItemDictionary.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/dictionary/ExtItemDictionary.java index 7f8669cdd74..21039114d6b 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/dictionary/ExtItemDictionary.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/dictionary/ExtItemDictionary.java @@ -92,21 +92,18 @@ private void fetchItemsAttempt() { } } - // TODO add "synchronized" before 4.0 release @NotNull - public RExtItem createOrFindItemDefinition(@NotNull ItemDefinition definition, boolean throwExceptionAfterCreate) { + public synchronized RExtItem createOrFindItemDefinition(@NotNull ItemDefinition definition, boolean throwExceptionAfterCreate) { return createOrFindItemByDefinitionInternal(definition, true, throwExceptionAfterCreate); } - // TODO add "synchronized" before 4.0 release @NotNull - public RExtItem createOrFindItemDefinition(@NotNull ItemDefinition definition) { + public synchronized RExtItem createOrFindItemDefinition(@NotNull ItemDefinition definition) { return createOrFindItemByDefinitionInternal(definition, true, true); } - // TODO add "synchronized" before 4.0 release @Nullable - public RExtItem findItemByDefinition(@NotNull ItemDefinition definition) { + public synchronized RExtItem findItemByDefinition(@NotNull ItemDefinition definition) { return createOrFindItemByDefinitionInternal(definition, false, true); } @@ -177,8 +174,7 @@ private void executeAttempts(String operationName, Class type, String operati } } - // TODO add "synchronized" before 4.0 release - public RExtItem getItemById(Integer extItemId) { + public synchronized RExtItem getItemById(Integer extItemId) { boolean fresh = fetchItemsIfNeeded(); RExtItem extItem = itemsById.get(extItemId); if (extItem != null || fresh) { From a7cb8f19751fd42389ba9af56d1e98d434b7cc4c Mon Sep 17 00:00:00 2001 From: kate Date: Wed, 28 Aug 2019 12:34:27 +0200 Subject: [PATCH 03/20] schrodinger archetype tests fixes --- .../scenarios/ObjectListArchetypeTests.java | 3 ++- .../schrodinger/component/common/PrismForm.java | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/scenarios/ObjectListArchetypeTests.java b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/scenarios/ObjectListArchetypeTests.java index e0f0544b53f..8cd722bdea7 100644 --- a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/scenarios/ObjectListArchetypeTests.java +++ b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/scenarios/ObjectListArchetypeTests.java @@ -35,6 +35,7 @@ public class ObjectListArchetypeTests extends TestBase { private static final String OBJECT_COLLECTION_VIEW_HEADER = "Object collection view"; private static final String NEW_GUI_OBJECT_LIST_VIEW_HEADER = "New gui object list view"; private static final String NEW_OBJECT_LIST_VIEW_CONTAINER_KEY = "GuiObjectListViewType.details"; + private static final String NEW_OBJECT_LIST_VIEW_CONTAINER_NEW_VALUE_KEY = "GuiObjectListViewType.details.newValue"; private static final String COLLECTION_HEADER = "Collection"; public static final String OBJECT_LIST_ARCHETYPE_TESTS_GROUP = "bjectListArchetypeTests"; @@ -49,7 +50,7 @@ public void configureArchetypeObjectListView(){ PrismForm prismForm = adminGuiTab.form(); prismForm .expandContainerPropertiesPanel(OBJECT_COLLECTION_VIEWS_HEADER) - .addNewContainerValue(OBJECT_COLLECTION_VIEW_HEADER, NEW_OBJECT_LIST_VIEW_CONTAINER_KEY) + .addNewContainerValue(OBJECT_COLLECTION_VIEW_HEADER, NEW_GUI_OBJECT_LIST_VIEW_HEADER) .expandContainerPropertiesPanel(NEW_OBJECT_LIST_VIEW_CONTAINER_KEY) .expandContainerPropertiesPanel(COLLECTION_HEADER); diff --git a/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/common/PrismForm.java b/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/common/PrismForm.java index 83bd943c2f4..d483ece5373 100644 --- a/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/common/PrismForm.java +++ b/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/common/PrismForm.java @@ -260,7 +260,10 @@ public PrismForm selectOption(String attributeName, String option) { } public PrismForm expandContainerPropertiesPanel(String containerHeaderKey){ - SelenideElement panelHeader = $(Schrodinger.byElementAttributeValue("div", "data-s-resource-key", containerHeaderKey)); + SelenideElement panelHeader = $(Schrodinger.byElementAttributeValue("a", "data-s-resource-key", containerHeaderKey)) + .waitUntil(Condition.visible, MidPoint.TIMEOUT_DEFAULT_2_S) + .parent() + .parent(); SelenideElement headerChevron = panelHeader.$(By.tagName("i")); if (headerChevron.getAttribute("class") != null && !headerChevron.getAttribute("class").contains(CARET_DOWN_ICON_STYLE)) { @@ -277,12 +280,17 @@ public PrismForm expandContainerPropertiesPanel(String containerHeaderKey){ } public PrismForm addNewContainerValue(String containerHeaderKey, String newContainerHeaderKey){ - SelenideElement panelHeader = $(Schrodinger.byDataResourceKey("div", containerHeaderKey)); - panelHeader.$(Schrodinger.byDataId("addButton")).click(); + SelenideElement panelHeader = $(By.linkText(containerHeaderKey)) + .parent() + .parent(); + panelHeader.$(Schrodinger.byDataId("addButton")) + .waitUntil(Condition.visible, MidPoint.TIMEOUT_DEFAULT_2_S) + .click(); panelHeader .parent() - .$(Schrodinger.byDataResourceKey(newContainerHeaderKey)) + .parent() + .$(By.linkText(newContainerHeaderKey)) .shouldBe(Condition.visible) .waitUntil(Condition.visible, MidPoint.TIMEOUT_DEFAULT_2_S); From bba588d6681e367d7884d0500cbaae650b7add1a Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 28 Aug 2019 15:19:36 +0200 Subject: [PATCH 04/20] Improve conversion error reporting When doing ConnID -> midPoint resource object conversion we now log SchemaExceptions more precisely. This is related to MID-5004. --- .../provisioning/ucf/impl/connid/ConnIdConvertor.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/ConnIdConvertor.java b/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/ConnIdConvertor.java index ffff7eeb1db..2998e7fb3a0 100644 --- a/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/ConnIdConvertor.java +++ b/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/ConnIdConvertor.java @@ -327,8 +327,7 @@ PrismObject convertToResourceObject(ConnectorObject co ObjectClassComplexTypeDefinition ocDef = attributesContainerDefinition.getComplexTypeDefinition(); ResourceAttributeDefinition uidDefinition = ConnIdUtil.getUidDefinition(ocDef); if (uidDefinition == null) { - throw new SchemaException("No definition for ConnId UID attribute found in definition " - + ocDef); + throw new SchemaException("No definition for ConnId UID attribute found in definition " + ocDef); } if (attributesContainer.getValue().findItem(uidDefinition.getItemName()) == null) { ResourceAttribute uidRoa = uidDefinition.instantiate(); @@ -337,7 +336,10 @@ PrismObject convertToResourceObject(ConnectorObject co } return shadowPrism; - + } catch (SchemaException e) { + result.recordFatalError(e); + throw new SchemaException("Couldn't convert resource object from ConnID to midPoint: uid=" + co.getUid() + ", name=" + + co.getName() + ", class=" + co.getObjectClass() + ": " + e.getMessage(), e); } catch (Throwable t) { result.recordFatalError(t); throw t; From 57100b949184dab8237e3922a091d5fd1d312073 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 28 Aug 2019 16:22:04 +0200 Subject: [PATCH 05/20] Relax applyDefinition w/force for refs (MID-5692) We no longer insist on having target type definition in schema, if the definition can be determined using object class or if the object has its own definition. --- .../web/page/admin/server/PageTaskEdit.java | 2 +- .../prism/impl/PrismReferenceValueImpl.java | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java index a62e7a6b1ff..2b8f6351fd8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/server/PageTaskEdit.java @@ -348,7 +348,7 @@ protected PrismObjectWrapper loadObjectWrapper(PrismObject o wrapper = owf.createObjectWrapper(object, ItemStatus.NOT_CHANGED, context); } catch (Exception ex) { result.recordFatalError(getString("PageTaskEdit.message.loadObjectWrapper.fatalError"), ex); - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load user", ex); + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load task", ex); try { WrapperContext context = new WrapperContext(task, result); wrapper = owf.createObjectWrapper(object, ItemStatus.NOT_CHANGED, context); diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismReferenceValueImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismReferenceValueImpl.java index 4990fb417bc..c616cd1aaac 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismReferenceValueImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismReferenceValueImpl.java @@ -311,15 +311,22 @@ public void applyDefinition(PrismReferenceDefinition definition, boolean force) return; } PrismContext prismContext = definition.getPrismContext(); + PrismObjectDefinition objectDefinition = prismContext.getSchemaRegistry() + .findObjectDefinitionByCompileTimeClass(object.getCompileTimeClass()); QName targetTypeName = definition.getTargetTypeName(); - if (targetTypeName == null) { - throw new SchemaException("Cannot apply definition to composite object in reference "+getParent() - +": the target type name is not specified in the reference schema"); - } - - PrismObjectDefinition objectDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(object.getCompileTimeClass()); if (objectDefinition == null) { - objectDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByType(targetTypeName); + if (targetTypeName == null) { + if (object.getDefinition() != null) { + // Target type is not specified (e.g. as in task.objectRef) but we have at least some definition; + // so let's keep it. TODO reconsider this + return; + } else { + throw new SchemaException("Cannot apply definition to composite object in reference "+getParent() + +": the object has no present definition; it's definition cannot be determined from it's class;" + + "and target type name is not specified in the reference schema"); + } + } + objectDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByType(targetTypeName); } if (objectDefinition == null) { throw new SchemaException("Cannot apply definition to composite object in reference "+getParent() From 01ebe541f39beccfc0305cf220fe0e9e1a662770 Mon Sep 17 00:00:00 2001 From: kate Date: Wed, 28 Aug 2019 19:30:14 +0200 Subject: [PATCH 06/20] schrodinger port fix --- .../src/test/resources/configuration/schrodinger.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/schrodingertest/src/test/resources/configuration/schrodinger.properties b/testing/schrodingertest/src/test/resources/configuration/schrodinger.properties index 8c2156a92a3..ff9ab423ed4 100644 --- a/testing/schrodingertest/src/test/resources/configuration/schrodinger.properties +++ b/testing/schrodingertest/src/test/resources/configuration/schrodinger.properties @@ -1,6 +1,6 @@ username=administrator password=5ecr3t -base_url=http://localhost:8080/midpoint +base_url=http://localhost:8180/midpoint webdriver=webdriver.chrome.driver webdriverLocation=/opt/chromedriver # By default if no value is specified for headless start then the value is: false From dc9bb002d21d21cf4b350787001ebbbdae15ed1a Mon Sep 17 00:00:00 2001 From: kate Date: Wed, 28 Aug 2019 23:00:22 +0200 Subject: [PATCH 07/20] mid-5690 fix - npe while export all objects --- .../midpoint/model/impl/controller/SchemaTransformer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java index f659ff24b76..aadb2c10745 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SchemaTransformer.java @@ -53,6 +53,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.Contract; import org.springframework.beans.factory.annotation.Autowired; @@ -634,7 +635,7 @@ public ObjectTemplateType determineObjectTemplate(PrismOb return null; } ObjectReferenceType objectTemplateRef = archetypePolicy.getObjectTemplateRef(); - if (objectTemplateRef == null) { + if (objectTemplateRef == null || StringUtils.isEmpty(objectTemplateRef.getOid())) { return null; } PrismObject template = cacheRepositoryService.getObject(ObjectTemplateType.class, objectTemplateRef.getOid(), null, result); From 992a3aea1641b6d4c7d1068f82b9e9f7451f37c7 Mon Sep 17 00:00:00 2001 From: kate Date: Thu, 29 Aug 2019 16:20:41 +0200 Subject: [PATCH 08/20] MID-5696 fix ClassCastException when approving a work item --- .../web/page/admin/cases/CaseWorkItemsPanel.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemsPanel.java index 58a2544a20e..f2ab2b7094a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemsPanel.java @@ -35,15 +35,12 @@ import com.evolveum.midpoint.web.component.menu.cog.ButtonInlineMenuItem; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction; -import com.evolveum.midpoint.web.component.util.SelectableBean; -import com.evolveum.midpoint.web.component.wf.WorkItemsPanel; import com.evolveum.midpoint.web.page.admin.workflow.PageAttorneySelection; import com.evolveum.midpoint.web.session.PageStorage; 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.*; -import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; @@ -252,9 +249,9 @@ public String getButtonIconCssClass(){ @Override public IModel getEnabled() { - IModel> rowModel = ((ColumnMenuAction>)getAction()).getRowModel(); - if (rowModel != null && rowModel.getObject() != null && rowModel.getObject().getValue() != null){ - CaseWorkItemType workItem = rowModel.getObject().getValue(); + IModel> rowModel = ((ColumnMenuAction>)getAction()).getRowModel(); + if (rowModel != null && rowModel.getObject() != null && rowModel.getObject().getRealValue() != null){ + CaseWorkItemType workItem = rowModel.getObject().getRealValue(); return Model.of(!CaseTypeUtil.isClosed(CaseTypeUtil.getCase(workItem))); } else { return super.getEnabled(); From 4819dee1f7234b582d1b1a5301fcb3604f6f7117 Mon Sep 17 00:00:00 2001 From: kate Date: Fri, 30 Aug 2019 00:57:19 +0200 Subject: [PATCH 09/20] expression new value fix --- .../gui/impl/prism/component/ExpressionPropertyPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/ExpressionPropertyPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/ExpressionPropertyPanel.java index 55edb881b78..c3355cabb96 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/ExpressionPropertyPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/ExpressionPropertyPanel.java @@ -151,7 +151,7 @@ private void expressionValueAddPerformed(AjaxRequestTarget target, ExpressionVal getModelObject().getValues().clear(); getModelObject().getValues().add(newExpressionValueWrapper); -// getModelObject().getItem().setRealValue(newExpressionValue); + getModelObject().getItem().setRealValue(newExpressionValue); } catch (SchemaException ex){ LOGGER.error("Unable to create new expression value, ", ex.getLocalizedMessage()); } From 07390a8570f5b5e5d22e5f1be6d4f7bb43dab649 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 30 Aug 2019 11:14:02 +0200 Subject: [PATCH 10/20] Make assignment ref. mapper more robust --- .../sql/helpers/mapper/AssignmentReferenceMapper.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AssignmentReferenceMapper.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AssignmentReferenceMapper.java index fb1f147de70..3d24f2bbf85 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AssignmentReferenceMapper.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AssignmentReferenceMapper.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.repo.sql.data.common.other.RCReferenceOwner; import com.evolveum.midpoint.repo.sql.helpers.modify.MapperContext; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; @@ -42,11 +43,15 @@ public RAssignmentReference map(Referencable input, MapperContext context) { RAssignment owner = (RAssignment) context.getOwner(); QName name = context.getDelta().getPath().lastName().asSingleName(); - RCReferenceOwner refType = null; - if (MetadataType.F_CREATE_APPROVER_REF.equals(name)) { + RCReferenceOwner refType; + if (QNameUtil.match(name, MetadataType.F_CREATE_APPROVER_REF)) { refType = RCReferenceOwner.CREATE_APPROVER; - } else if (MetadataType.F_MODIFY_APPROVER_REF.equals(name)) { + } else if (QNameUtil.match(name, MetadataType.F_MODIFY_APPROVER_REF)) { refType = RCReferenceOwner.MODIFY_APPROVER; + } else { + // TODO a warning here? + // TODO what about CASE_REVIEWER type? + refType = null; } RAssignmentReference ref = new RAssignmentReference(); From 2394f0517d78f9dbec34895dbeaaa159060b7cd8 Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Fri, 30 Aug 2019 11:45:12 +0200 Subject: [PATCH 11/20] fixing MID-5703 --- .../midpoint/web/component/dialog/ConfirmationPanel.java | 8 ++++---- .../midpoint/web/page/admin/configuration/PageAbout.java | 4 ---- .../web/page/admin/configuration/PageDebugList.java | 5 ----- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ConfirmationPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ConfirmationPanel.java index 331de522a4f..da9d33205e3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ConfirmationPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ConfirmationPanel.java @@ -59,9 +59,9 @@ public ConfirmationPanel(String id, IModel message) { initLayout(message); } - public boolean getLabelEscapeModelStrings() { - return true; - } +// public boolean getLabelEscapeModelStrings() { +// return true; +// } public void setMessage(IModel message) { Label label = (Label) get(ID_PANEL).get(ID_CONFIRM_TEXT); @@ -72,7 +72,7 @@ private void initLayout(IModel message) { WebMarkupContainer panel = new WebMarkupContainer(ID_PANEL); Label label = new Label(ID_CONFIRM_TEXT, message); - label.setEscapeModelStrings(getLabelEscapeModelStrings()); + label.setEscapeModelStrings(true); panel.add(label); AjaxButton yesButton = new AjaxButton(ID_YES, diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAbout.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAbout.java index 93b8a15b905..722dee91f81 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAbout.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageAbout.java @@ -443,10 +443,6 @@ public void yesPerformed(AjaxRequestTarget target) { resetStateToInitialConfig(target); } - @Override - public boolean getLabelEscapeModelStrings() { - return false; - } }; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java index 0e27e0a4052..5ccdeedd1a4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java @@ -959,11 +959,6 @@ public void yesPerformed(AjaxRequestTarget target) { break; } } - - @Override - public boolean getLabelEscapeModelStrings() { - return false; - } }; } From a924b3c4abec7a98c4c753c62f374381aea38bc7 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 30 Aug 2019 13:56:28 +0200 Subject: [PATCH 12/20] Add repo support for candidateRef (MID-5700) DB scripts are updated as well. In addition, the following was changed in DB scripts: - item counts in object+assignment extensions were removed - upgrade scripts now drop obsolete Activiti tables --- config/sql/_all/h2-4.0-all.sql | 15 +--- config/sql/_all/h2-upgrade-3.9-4.0.sql | 26 ++++++ config/sql/_all/mysql-4.0-all-utf8mb4.sql | 15 +--- config/sql/_all/mysql-4.0-all.sql | 15 +--- .../_all/mysql-upgrade-3.9-4.0-utf8mb4.sql | 46 +++++++++++ config/sql/_all/mysql-upgrade-3.9-4.0.sql | 46 +++++++++++ config/sql/_all/oracle-4.0-all.sql | 15 +--- config/sql/_all/oracle-upgrade-3.9-4.0.sql | 47 +++++++++++ config/sql/_all/postgresql-4.0-all.sql | 15 +--- .../sql/_all/postgresql-upgrade-3.9-4.0.sql | 47 +++++++++++ config/sql/_all/sqlserver-4.0-all.sql | 15 +--- config/sql/_all/sqlserver-upgrade-3.9-4.0.sql | 54 +++++++++++++ .../midpoint/repo/sql/ModifyTest.java | 79 +++++++++++++++++-- .../repo/sql/QueryInterpreter2Test.java | 51 ++++++++++++ .../midpoint/repo/sql/SearchTest.java | 61 ++++++++++++++ .../src/test/resources/basic/objects.xml | 5 ++ .../data/common/container/RCaseWorkItem.java | 26 +++++- .../container/RCaseWorkItemReference.java | 25 ++++-- .../common/id/RCaseWorkItemReferenceId.java | 17 +++- .../other/RCaseWorkItemReferenceOwner.java | 30 +++++++ .../mapper/CaseWorkItemReferenceMapper.java | 16 +++- 21 files changed, 571 insertions(+), 95 deletions(-) create mode 100644 repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/other/RCaseWorkItemReferenceOwner.java diff --git a/config/sql/_all/h2-4.0-all.sql b/config/sql/_all/h2-4.0-all.sql index 651a0c34191..d1ddc68fb1c 100644 --- a/config/sql/_all/h2-4.0-all.sql +++ b/config/sql/_all/h2-4.0-all.sql @@ -180,12 +180,6 @@ CREATE TABLE m_assignment_ext_string ( CREATE TABLE m_assignment_extension ( owner_id INTEGER NOT NULL, owner_owner_oid VARCHAR(36) NOT NULL, - booleansCount SMALLINT, - datesCount SMALLINT, - longsCount SMALLINT, - polysCount SMALLINT, - referencesCount SMALLINT, - stringsCount SMALLINT, PRIMARY KEY (owner_owner_oid, owner_id) ); CREATE TABLE m_assignment_policy_situation ( @@ -293,10 +287,11 @@ CREATE TABLE m_case_wi ( CREATE TABLE m_case_wi_reference ( owner_id INTEGER NOT NULL, owner_owner_oid VARCHAR(36) NOT NULL, + reference_type INTEGER NOT NULL, relation VARCHAR(157) NOT NULL, targetOid VARCHAR(36) NOT NULL, targetType INTEGER, - PRIMARY KEY (owner_owner_oid, owner_id, targetOid, relation) + PRIMARY KEY (owner_owner_oid, owner_id, reference_type, targetOid, relation) ); CREATE TABLE m_connector_target_system ( connector_oid VARCHAR(36) NOT NULL, @@ -320,16 +315,13 @@ CREATE TABLE m_focus_policy_situation ( ); CREATE TABLE m_object ( oid VARCHAR(36) NOT NULL, - booleansCount SMALLINT, createChannel VARCHAR(255), createTimestamp TIMESTAMP, creatorRef_relation VARCHAR(157), creatorRef_targetOid VARCHAR(36), creatorRef_type INTEGER, - datesCount SMALLINT, fullObject BLOB, lifecycleState VARCHAR(255), - longsCount SMALLINT, modifierRef_relation VARCHAR(157), modifierRef_targetOid VARCHAR(36), modifierRef_type INTEGER, @@ -338,9 +330,6 @@ CREATE TABLE m_object ( name_norm VARCHAR(255), name_orig VARCHAR(255), objectTypeClass INTEGER, - polysCount SMALLINT, - referencesCount SMALLINT, - stringsCount SMALLINT, tenantRef_relation VARCHAR(157), tenantRef_targetOid VARCHAR(36), tenantRef_type INTEGER, diff --git a/config/sql/_all/h2-upgrade-3.9-4.0.sql b/config/sql/_all/h2-upgrade-3.9-4.0.sql index 913d2c509ce..e37ff5f085f 100644 --- a/config/sql/_all/h2-upgrade-3.9-4.0.sql +++ b/config/sql/_all/h2-upgrade-3.9-4.0.sql @@ -98,3 +98,29 @@ ALTER TABLE m_audit_resource -- 2019-07-30 11:30 ALTER TABLE m_audit_item ALTER COLUMN changedItemPath VARCHAR(900); + +-- 2019-08-30 12:32 + +ALTER TABLE m_case_wi_reference ADD COLUMN reference_type INTEGER; +UPDATE m_case_wi_reference SET reference_type = 0 WHERE reference_type IS NULL; +ALTER TABLE m_case_wi_reference ALTER COLUMN reference_type INTEGER NOT NULL; + +ALTER TABLE m_case_wi_reference DROP CONSTRAINT fk_case_wi_reference_owner; +ALTER TABLE m_case_wi_reference DROP PRIMARY KEY; +ALTER TABLE m_case_wi_reference ADD PRIMARY KEY (owner_owner_oid, owner_id, reference_type, targetOid, relation); +ALTER TABLE m_case_wi_reference + ADD CONSTRAINT fk_case_wi_reference_owner FOREIGN KEY (owner_owner_oid, owner_id) REFERENCES m_case_wi (owner_oid, id); + +ALTER TABLE m_assignment_extension DROP COLUMN IF EXISTS booleansCount; +ALTER TABLE m_assignment_extension DROP COLUMN IF EXISTS datesCount; +ALTER TABLE m_assignment_extension DROP COLUMN IF EXISTS longsCount; +ALTER TABLE m_assignment_extension DROP COLUMN IF EXISTS polysCount; +ALTER TABLE m_assignment_extension DROP COLUMN IF EXISTS referencesCount; +ALTER TABLE m_assignment_extension DROP COLUMN IF EXISTS stringsCount; + +ALTER TABLE m_object DROP COLUMN IF EXISTS booleansCount; +ALTER TABLE m_object DROP COLUMN IF EXISTS datesCount; +ALTER TABLE m_object DROP COLUMN IF EXISTS longsCount; +ALTER TABLE m_object DROP COLUMN IF EXISTS polysCount; +ALTER TABLE m_object DROP COLUMN IF EXISTS referencesCount; +ALTER TABLE m_object DROP COLUMN IF EXISTS stringsCount; \ No newline at end of file diff --git a/config/sql/_all/mysql-4.0-all-utf8mb4.sql b/config/sql/_all/mysql-4.0-all-utf8mb4.sql index 9a9d060555c..98ba9d0421a 100644 --- a/config/sql/_all/mysql-4.0-all-utf8mb4.sql +++ b/config/sql/_all/mysql-4.0-all-utf8mb4.sql @@ -214,12 +214,6 @@ CREATE TABLE m_assignment_ext_string ( CREATE TABLE m_assignment_extension ( owner_id INTEGER NOT NULL, owner_owner_oid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin NOT NULL, - booleansCount SMALLINT, - datesCount SMALLINT, - longsCount SMALLINT, - polysCount SMALLINT, - referencesCount SMALLINT, - stringsCount SMALLINT, PRIMARY KEY (owner_owner_oid, owner_id) ) DEFAULT CHARACTER SET utf8mb4 @@ -358,10 +352,11 @@ CREATE TABLE m_case_wi ( CREATE TABLE m_case_wi_reference ( owner_id INTEGER NOT NULL, owner_owner_oid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin NOT NULL, + reference_type INTEGER NOT NULL, relation VARCHAR(157) NOT NULL, targetOid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin NOT NULL, targetType INTEGER, - PRIMARY KEY (owner_owner_oid, owner_id, targetOid, relation) + PRIMARY KEY (owner_owner_oid, owner_id, reference_type, targetOid, relation) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin @@ -400,16 +395,13 @@ CREATE TABLE m_focus_policy_situation ( ENGINE = InnoDB; CREATE TABLE m_object ( oid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin NOT NULL, - booleansCount SMALLINT, createChannel VARCHAR(255), createTimestamp DATETIME(6), creatorRef_relation VARCHAR(157), creatorRef_targetOid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin , creatorRef_type INTEGER, - datesCount SMALLINT, fullObject LONGBLOB, lifecycleState VARCHAR(191), - longsCount SMALLINT, modifierRef_relation VARCHAR(157), modifierRef_targetOid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin , modifierRef_type INTEGER, @@ -418,9 +410,6 @@ CREATE TABLE m_object ( name_norm VARCHAR(191), name_orig VARCHAR(191), objectTypeClass INTEGER, - polysCount SMALLINT, - referencesCount SMALLINT, - stringsCount SMALLINT, tenantRef_relation VARCHAR(157), tenantRef_targetOid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin , tenantRef_type INTEGER, diff --git a/config/sql/_all/mysql-4.0-all.sql b/config/sql/_all/mysql-4.0-all.sql index b3d31953b8c..62c13093e2f 100644 --- a/config/sql/_all/mysql-4.0-all.sql +++ b/config/sql/_all/mysql-4.0-all.sql @@ -214,12 +214,6 @@ CREATE TABLE m_assignment_ext_string ( CREATE TABLE m_assignment_extension ( owner_id INTEGER NOT NULL, owner_owner_oid VARCHAR(36) NOT NULL, - booleansCount SMALLINT, - datesCount SMALLINT, - longsCount SMALLINT, - polysCount SMALLINT, - referencesCount SMALLINT, - stringsCount SMALLINT, PRIMARY KEY (owner_owner_oid, owner_id) ) DEFAULT CHARACTER SET utf8 @@ -357,10 +351,11 @@ CREATE TABLE m_case_wi ( CREATE TABLE m_case_wi_reference ( owner_id INTEGER NOT NULL, owner_owner_oid VARCHAR(36) NOT NULL, + reference_type INTEGER NOT NULL, relation VARCHAR(157) NOT NULL, targetOid VARCHAR(36) NOT NULL, targetType INTEGER, - PRIMARY KEY (owner_owner_oid, owner_id, targetOid, relation) + PRIMARY KEY (owner_owner_oid, owner_id, reference_type, targetOid, relation) ) DEFAULT CHARACTER SET utf8 COLLATE utf8_bin @@ -399,16 +394,13 @@ CREATE TABLE m_focus_policy_situation ( ENGINE = InnoDB; CREATE TABLE m_object ( oid VARCHAR(36) NOT NULL, - booleansCount SMALLINT, createChannel VARCHAR(255), createTimestamp DATETIME(6), creatorRef_relation VARCHAR(157), creatorRef_targetOid VARCHAR(36), creatorRef_type INTEGER, - datesCount SMALLINT, fullObject LONGBLOB, lifecycleState VARCHAR(255), - longsCount SMALLINT, modifierRef_relation VARCHAR(157), modifierRef_targetOid VARCHAR(36), modifierRef_type INTEGER, @@ -417,9 +409,6 @@ CREATE TABLE m_object ( name_norm VARCHAR(255), name_orig VARCHAR(255), objectTypeClass INTEGER, - polysCount SMALLINT, - referencesCount SMALLINT, - stringsCount SMALLINT, tenantRef_relation VARCHAR(157), tenantRef_targetOid VARCHAR(36), tenantRef_type INTEGER, diff --git a/config/sql/_all/mysql-upgrade-3.9-4.0-utf8mb4.sql b/config/sql/_all/mysql-upgrade-3.9-4.0-utf8mb4.sql index a01a6d5762c..bfd9944ea09 100644 --- a/config/sql/_all/mysql-upgrade-3.9-4.0-utf8mb4.sql +++ b/config/sql/_all/mysql-upgrade-3.9-4.0-utf8mb4.sql @@ -108,3 +108,49 @@ CREATE INDEX iAuditResourceOidRecordId ON m_audit_resource (record_id); ALTER TABLE m_audit_resource ADD CONSTRAINT fk_audit_resource FOREIGN KEY (record_id) REFERENCES m_audit_event (id); + +-- 2019-08-30 12:32 + +ALTER TABLE m_case_wi_reference ADD COLUMN reference_type INTEGER NOT NULL DEFAULT 0; + +ALTER TABLE m_case_wi_reference DROP PRIMARY KEY, ADD PRIMARY KEY(owner_owner_oid, owner_id, reference_type, targetOid, relation); + +ALTER TABLE m_assignment_extension DROP COLUMN booleansCount; +ALTER TABLE m_assignment_extension DROP COLUMN datesCount; +ALTER TABLE m_assignment_extension DROP COLUMN longsCount; +ALTER TABLE m_assignment_extension DROP COLUMN polysCount; +ALTER TABLE m_assignment_extension DROP COLUMN referencesCount; +ALTER TABLE m_assignment_extension DROP COLUMN stringsCount; + +ALTER TABLE m_object DROP COLUMN booleansCount; +ALTER TABLE m_object DROP COLUMN datesCount; +ALTER TABLE m_object DROP COLUMN longsCount; +ALTER TABLE m_object DROP COLUMN polysCount; +ALTER TABLE m_object DROP COLUMN referencesCount; +ALTER TABLE m_object DROP COLUMN stringsCount; + +DROP TABLE act_evt_log; +DROP TABLE act_ge_property; +DROP TABLE act_hi_actinst; +DROP TABLE act_hi_attachment; +DROP TABLE act_hi_comment; +DROP TABLE act_hi_detail; +DROP TABLE act_hi_identitylink; +DROP TABLE act_hi_procinst; +DROP TABLE act_hi_taskinst; +DROP TABLE act_hi_varinst; +DROP TABLE act_id_info; +DROP TABLE act_id_membership; +DROP TABLE act_id_group; +DROP TABLE act_id_user; +DROP TABLE act_procdef_info; +DROP TABLE act_re_model; +DROP TABLE act_ru_event_subscr; +DROP TABLE act_ru_identitylink; +DROP TABLE act_ru_job; +DROP TABLE act_ru_task; +DROP TABLE act_ru_variable; +DROP TABLE act_ge_bytearray; +DROP TABLE act_re_deployment; +DROP TABLE act_ru_execution; +DROP TABLE act_re_procdef; diff --git a/config/sql/_all/mysql-upgrade-3.9-4.0.sql b/config/sql/_all/mysql-upgrade-3.9-4.0.sql index a553aee4b21..ac06cc71d1c 100644 --- a/config/sql/_all/mysql-upgrade-3.9-4.0.sql +++ b/config/sql/_all/mysql-upgrade-3.9-4.0.sql @@ -108,3 +108,49 @@ CREATE INDEX iAuditResourceOidRecordId ON m_audit_resource (record_id); ALTER TABLE m_audit_resource ADD CONSTRAINT fk_audit_resource FOREIGN KEY (record_id) REFERENCES m_audit_event (id); + +-- 2019-08-30 12:32 + +ALTER TABLE m_case_wi_reference ADD COLUMN reference_type INTEGER NOT NULL DEFAULT 0; + +ALTER TABLE m_case_wi_reference DROP PRIMARY KEY, ADD PRIMARY KEY(owner_owner_oid, owner_id, reference_type, targetOid, relation); + +ALTER TABLE m_assignment_extension DROP COLUMN booleansCount; +ALTER TABLE m_assignment_extension DROP COLUMN datesCount; +ALTER TABLE m_assignment_extension DROP COLUMN longsCount; +ALTER TABLE m_assignment_extension DROP COLUMN polysCount; +ALTER TABLE m_assignment_extension DROP COLUMN referencesCount; +ALTER TABLE m_assignment_extension DROP COLUMN stringsCount; + +ALTER TABLE m_object DROP COLUMN booleansCount; +ALTER TABLE m_object DROP COLUMN datesCount; +ALTER TABLE m_object DROP COLUMN longsCount; +ALTER TABLE m_object DROP COLUMN polysCount; +ALTER TABLE m_object DROP COLUMN referencesCount; +ALTER TABLE m_object DROP COLUMN stringsCount; + +DROP TABLE act_evt_log; +DROP TABLE act_ge_property; +DROP TABLE act_hi_actinst; +DROP TABLE act_hi_attachment; +DROP TABLE act_hi_comment; +DROP TABLE act_hi_detail; +DROP TABLE act_hi_identitylink; +DROP TABLE act_hi_procinst; +DROP TABLE act_hi_taskinst; +DROP TABLE act_hi_varinst; +DROP TABLE act_id_info; +DROP TABLE act_id_membership; +DROP TABLE act_id_group; +DROP TABLE act_id_user; +DROP TABLE act_procdef_info; +DROP TABLE act_re_model; +DROP TABLE act_ru_event_subscr; +DROP TABLE act_ru_identitylink; +DROP TABLE act_ru_job; +DROP TABLE act_ru_task; +DROP TABLE act_ru_variable; +DROP TABLE act_ge_bytearray; +DROP TABLE act_re_deployment; +DROP TABLE act_ru_execution; +DROP TABLE act_re_procdef; \ No newline at end of file diff --git a/config/sql/_all/oracle-4.0-all.sql b/config/sql/_all/oracle-4.0-all.sql index ff3ed2c6515..048e5f04e96 100644 --- a/config/sql/_all/oracle-4.0-all.sql +++ b/config/sql/_all/oracle-4.0-all.sql @@ -176,12 +176,6 @@ CREATE TABLE m_assignment_ext_string ( CREATE TABLE m_assignment_extension ( owner_id NUMBER(10, 0) NOT NULL, owner_owner_oid VARCHAR2(36 CHAR) NOT NULL, - booleansCount NUMBER(5, 0), - datesCount NUMBER(5, 0), - longsCount NUMBER(5, 0), - polysCount NUMBER(5, 0), - referencesCount NUMBER(5, 0), - stringsCount NUMBER(5, 0), PRIMARY KEY (owner_owner_oid, owner_id) ) INITRANS 30; CREATE TABLE m_assignment_policy_situation ( @@ -289,10 +283,11 @@ CREATE TABLE m_case_wi ( CREATE TABLE m_case_wi_reference ( owner_id NUMBER(10, 0) NOT NULL, owner_owner_oid VARCHAR2(36 CHAR) NOT NULL, + reference_type NUMBER(10, 0) NOT NULL, relation VARCHAR2(157 CHAR) NOT NULL, targetOid VARCHAR2(36 CHAR) NOT NULL, targetType NUMBER(10, 0), - PRIMARY KEY (owner_owner_oid, owner_id, targetOid, relation) + PRIMARY KEY (owner_owner_oid, owner_id, reference_type, targetOid, relation) ) INITRANS 30; CREATE TABLE m_connector_target_system ( connector_oid VARCHAR2(36 CHAR) NOT NULL, @@ -316,16 +311,13 @@ CREATE TABLE m_focus_policy_situation ( ) INITRANS 30; CREATE TABLE m_object ( oid VARCHAR2(36 CHAR) NOT NULL, - booleansCount NUMBER(5, 0), createChannel VARCHAR2(255 CHAR), createTimestamp TIMESTAMP, creatorRef_relation VARCHAR2(157 CHAR), creatorRef_targetOid VARCHAR2(36 CHAR), creatorRef_type NUMBER(10, 0), - datesCount NUMBER(5, 0), fullObject BLOB, lifecycleState VARCHAR2(255 CHAR), - longsCount NUMBER(5, 0), modifierRef_relation VARCHAR2(157 CHAR), modifierRef_targetOid VARCHAR2(36 CHAR), modifierRef_type NUMBER(10, 0), @@ -334,9 +326,6 @@ CREATE TABLE m_object ( name_norm VARCHAR2(255 CHAR), name_orig VARCHAR2(255 CHAR), objectTypeClass NUMBER(10, 0), - polysCount NUMBER(5, 0), - referencesCount NUMBER(5, 0), - stringsCount NUMBER(5, 0), tenantRef_relation VARCHAR2(157 CHAR), tenantRef_targetOid VARCHAR2(36 CHAR), tenantRef_type NUMBER(10, 0), diff --git a/config/sql/_all/oracle-upgrade-3.9-4.0.sql b/config/sql/_all/oracle-upgrade-3.9-4.0.sql index 583bebf89af..8e8be964991 100644 --- a/config/sql/_all/oracle-upgrade-3.9-4.0.sql +++ b/config/sql/_all/oracle-upgrade-3.9-4.0.sql @@ -125,3 +125,50 @@ ALTER TABLE m_audit_resource -- 2019-07-30 11:30 ALTER TABLE m_audit_item MODIFY changedItemPath VARCHAR2(900 CHAR); + +-- 2019-08-30 12:32 + +ALTER TABLE m_case_wi_reference ADD reference_type NUMBER(10, 0) DEFAULT 0 NOT NULL; + +ALTER TABLE m_case_wi_reference DROP PRIMARY KEY; +ALTER TABLE m_case_wi_reference ADD PRIMARY KEY(owner_owner_oid, owner_id, reference_type, targetOid, relation); + +ALTER TABLE m_assignment_extension DROP COLUMN booleansCount; +ALTER TABLE m_assignment_extension DROP COLUMN datesCount; +ALTER TABLE m_assignment_extension DROP COLUMN longsCount; +ALTER TABLE m_assignment_extension DROP COLUMN polysCount; +ALTER TABLE m_assignment_extension DROP COLUMN referencesCount; +ALTER TABLE m_assignment_extension DROP COLUMN stringsCount; + +ALTER TABLE m_object DROP COLUMN booleansCount; +ALTER TABLE m_object DROP COLUMN datesCount; +ALTER TABLE m_object DROP COLUMN longsCount; +ALTER TABLE m_object DROP COLUMN polysCount; +ALTER TABLE m_object DROP COLUMN referencesCount; +ALTER TABLE m_object DROP COLUMN stringsCount; + +DROP TABLE act_evt_log; +DROP TABLE act_ge_property; +DROP TABLE act_hi_actinst; +DROP TABLE act_hi_attachment; +DROP TABLE act_hi_comment; +DROP TABLE act_hi_detail; +DROP TABLE act_hi_identitylink; +DROP TABLE act_hi_procinst; +DROP TABLE act_hi_taskinst; +DROP TABLE act_hi_varinst; +DROP TABLE act_id_info; +DROP TABLE act_id_membership; +DROP TABLE act_id_group; +DROP TABLE act_id_user; +DROP TABLE act_procdef_info; +DROP TABLE act_re_model; +DROP TABLE act_ru_event_subscr; +DROP TABLE act_ru_identitylink; +DROP TABLE act_ru_job; +DROP TABLE act_ru_task; +DROP TABLE act_ru_variable; +DROP TABLE act_ge_bytearray; +DROP TABLE act_re_deployment; +DROP TABLE act_ru_execution; +DROP TABLE act_re_procdef; \ No newline at end of file diff --git a/config/sql/_all/postgresql-4.0-all.sql b/config/sql/_all/postgresql-4.0-all.sql index 11a141ca958..7b079930a6c 100644 --- a/config/sql/_all/postgresql-4.0-all.sql +++ b/config/sql/_all/postgresql-4.0-all.sql @@ -176,12 +176,6 @@ CREATE TABLE m_assignment_ext_string ( CREATE TABLE m_assignment_extension ( owner_id INT4 NOT NULL, owner_owner_oid VARCHAR(36) NOT NULL, - booleansCount INT2, - datesCount INT2, - longsCount INT2, - polysCount INT2, - referencesCount INT2, - stringsCount INT2, PRIMARY KEY (owner_owner_oid, owner_id) ); CREATE TABLE m_assignment_policy_situation ( @@ -289,10 +283,11 @@ CREATE TABLE m_case_wi ( CREATE TABLE m_case_wi_reference ( owner_id INT4 NOT NULL, owner_owner_oid VARCHAR(36) NOT NULL, + reference_type INT4 NOT NULL, relation VARCHAR(157) NOT NULL, targetOid VARCHAR(36) NOT NULL, targetType INT4, - PRIMARY KEY (owner_owner_oid, owner_id, targetOid, relation) + PRIMARY KEY (owner_owner_oid, owner_id, reference_type, targetOid, relation) ); CREATE TABLE m_connector_target_system ( connector_oid VARCHAR(36) NOT NULL, @@ -316,16 +311,13 @@ CREATE TABLE m_focus_policy_situation ( ); CREATE TABLE m_object ( oid VARCHAR(36) NOT NULL, - booleansCount INT2, createChannel VARCHAR(255), createTimestamp TIMESTAMP, creatorRef_relation VARCHAR(157), creatorRef_targetOid VARCHAR(36), creatorRef_type INT4, - datesCount INT2, fullObject BYTEA, lifecycleState VARCHAR(255), - longsCount INT2, modifierRef_relation VARCHAR(157), modifierRef_targetOid VARCHAR(36), modifierRef_type INT4, @@ -334,9 +326,6 @@ CREATE TABLE m_object ( name_norm VARCHAR(255), name_orig VARCHAR(255), objectTypeClass INT4, - polysCount INT2, - referencesCount INT2, - stringsCount INT2, tenantRef_relation VARCHAR(157), tenantRef_targetOid VARCHAR(36), tenantRef_type INT4, diff --git a/config/sql/_all/postgresql-upgrade-3.9-4.0.sql b/config/sql/_all/postgresql-upgrade-3.9-4.0.sql index dbdf463b98e..9d5d2b01ede 100644 --- a/config/sql/_all/postgresql-upgrade-3.9-4.0.sql +++ b/config/sql/_all/postgresql-upgrade-3.9-4.0.sql @@ -127,3 +127,50 @@ ALTER TABLE IF EXISTS m_audit_resource -- 2019-07-30 11:30 ALTER TABLE m_audit_item ALTER COLUMN changedItemPath TYPE VARCHAR (900); + +-- 2019-08-30 12:32 + +ALTER TABLE m_case_wi_reference ADD reference_type INT4 DEFAULT 0 NOT NULL; + +ALTER TABLE m_case_wi_reference DROP CONSTRAINT m_case_wi_reference_pkey; +ALTER TABLE m_case_wi_reference ADD PRIMARY KEY(owner_owner_oid, owner_id, reference_type, targetOid, relation); + +ALTER TABLE m_assignment_extension DROP COLUMN booleansCount; +ALTER TABLE m_assignment_extension DROP COLUMN datesCount; +ALTER TABLE m_assignment_extension DROP COLUMN longsCount; +ALTER TABLE m_assignment_extension DROP COLUMN polysCount; +ALTER TABLE m_assignment_extension DROP COLUMN referencesCount; +ALTER TABLE m_assignment_extension DROP COLUMN stringsCount; + +ALTER TABLE m_object DROP COLUMN booleansCount; +ALTER TABLE m_object DROP COLUMN datesCount; +ALTER TABLE m_object DROP COLUMN longsCount; +ALTER TABLE m_object DROP COLUMN polysCount; +ALTER TABLE m_object DROP COLUMN referencesCount; +ALTER TABLE m_object DROP COLUMN stringsCount; + +DROP TABLE act_evt_log; +DROP TABLE act_ge_property; +DROP TABLE act_hi_actinst; +DROP TABLE act_hi_attachment; +DROP TABLE act_hi_comment; +DROP TABLE act_hi_detail; +DROP TABLE act_hi_identitylink; +DROP TABLE act_hi_procinst; +DROP TABLE act_hi_taskinst; +DROP TABLE act_hi_varinst; +DROP TABLE act_id_info; +DROP TABLE act_id_membership; +DROP TABLE act_id_group; +DROP TABLE act_id_user; +DROP TABLE act_procdef_info; +DROP TABLE act_re_model; +DROP TABLE act_ru_event_subscr; +DROP TABLE act_ru_identitylink; +DROP TABLE act_ru_job; +DROP TABLE act_ru_task; +DROP TABLE act_ru_variable; +DROP TABLE act_ge_bytearray; +DROP TABLE act_re_deployment; +DROP TABLE act_ru_execution; +DROP TABLE act_re_procdef; diff --git a/config/sql/_all/sqlserver-4.0-all.sql b/config/sql/_all/sqlserver-4.0-all.sql index ad77d7b19dc..29207b5294a 100644 --- a/config/sql/_all/sqlserver-4.0-all.sql +++ b/config/sql/_all/sqlserver-4.0-all.sql @@ -176,12 +176,6 @@ CREATE TABLE m_assignment_ext_string ( CREATE TABLE m_assignment_extension ( owner_id INT NOT NULL, owner_owner_oid NVARCHAR(36) COLLATE database_default NOT NULL, - booleansCount SMALLINT, - datesCount SMALLINT, - longsCount SMALLINT, - polysCount SMALLINT, - referencesCount SMALLINT, - stringsCount SMALLINT, PRIMARY KEY (owner_owner_oid, owner_id) ); CREATE TABLE m_assignment_policy_situation ( @@ -289,10 +283,11 @@ CREATE TABLE m_case_wi ( CREATE TABLE m_case_wi_reference ( owner_id INT NOT NULL, owner_owner_oid NVARCHAR(36) COLLATE database_default NOT NULL, + reference_type INT NOT NULL, relation NVARCHAR(157) COLLATE database_default NOT NULL, targetOid NVARCHAR(36) COLLATE database_default NOT NULL, targetType INT, - PRIMARY KEY (owner_owner_oid, owner_id, targetOid, relation) + PRIMARY KEY (owner_owner_oid, owner_id, reference_type, targetOid, relation) ); CREATE TABLE m_connector_target_system ( connector_oid NVARCHAR(36) COLLATE database_default NOT NULL, @@ -316,16 +311,13 @@ CREATE TABLE m_focus_policy_situation ( ); CREATE TABLE m_object ( oid NVARCHAR(36) COLLATE database_default NOT NULL, - booleansCount SMALLINT, createChannel NVARCHAR(255) COLLATE database_default, createTimestamp DATETIME2, creatorRef_relation NVARCHAR(157) COLLATE database_default, creatorRef_targetOid NVARCHAR(36) COLLATE database_default, creatorRef_type INT, - datesCount SMALLINT, fullObject VARBINARY(MAX), lifecycleState NVARCHAR(255) COLLATE database_default, - longsCount SMALLINT, modifierRef_relation NVARCHAR(157) COLLATE database_default, modifierRef_targetOid NVARCHAR(36) COLLATE database_default, modifierRef_type INT, @@ -334,9 +326,6 @@ CREATE TABLE m_object ( name_norm NVARCHAR(255) COLLATE database_default, name_orig NVARCHAR(255) COLLATE database_default, objectTypeClass INT, - polysCount SMALLINT, - referencesCount SMALLINT, - stringsCount SMALLINT, tenantRef_relation NVARCHAR(157) COLLATE database_default, tenantRef_targetOid NVARCHAR(36) COLLATE database_default, tenantRef_type INT, diff --git a/config/sql/_all/sqlserver-upgrade-3.9-4.0.sql b/config/sql/_all/sqlserver-upgrade-3.9-4.0.sql index 99c1a346715..dad9d9186d0 100644 --- a/config/sql/_all/sqlserver-upgrade-3.9-4.0.sql +++ b/config/sql/_all/sqlserver-upgrade-3.9-4.0.sql @@ -101,3 +101,57 @@ ALTER TABLE m_audit_resource -- 2019-07-30 11:30 ALTER TABLE m_audit_item ALTER COLUMN changedItemPath nvarchar(442) NOT NULL; + +-- 2019-08-30 12:32 + +ALTER TABLE m_case_wi_reference ADD reference_type INT DEFAULT 0 NOT NULL; + +-- This will delete the primary key for M_CASE_WI_REFERENCE table +DECLARE @sql NVARCHAR(MAX); +SELECT @sql = 'ALTER TABLE m_case_wi_reference DROP CONSTRAINT ' + name + ';' + FROM sys.key_constraints + WHERE [type] = 'PK' + AND [parent_object_id] = OBJECT_ID('m_case_wi_reference'); +EXEC sp_executeSQL @sql; + +ALTER TABLE m_case_wi_reference ADD PRIMARY KEY(owner_owner_oid, owner_id, reference_type, targetOid, relation); + +ALTER TABLE m_assignment_extension DROP COLUMN booleansCount; +ALTER TABLE m_assignment_extension DROP COLUMN datesCount; +ALTER TABLE m_assignment_extension DROP COLUMN longsCount; +ALTER TABLE m_assignment_extension DROP COLUMN polysCount; +ALTER TABLE m_assignment_extension DROP COLUMN referencesCount; +ALTER TABLE m_assignment_extension DROP COLUMN stringsCount; + +ALTER TABLE m_object DROP COLUMN booleansCount; +ALTER TABLE m_object DROP COLUMN datesCount; +ALTER TABLE m_object DROP COLUMN longsCount; +ALTER TABLE m_object DROP COLUMN polysCount; +ALTER TABLE m_object DROP COLUMN referencesCount; +ALTER TABLE m_object DROP COLUMN stringsCount; + +DROP TABLE act_evt_log; +DROP TABLE act_ge_property; +DROP TABLE act_hi_actinst; +DROP TABLE act_hi_attachment; +DROP TABLE act_hi_comment; +DROP TABLE act_hi_detail; +DROP TABLE act_hi_identitylink; +DROP TABLE act_hi_procinst; +DROP TABLE act_hi_taskinst; +DROP TABLE act_hi_varinst; +DROP TABLE act_id_info; +DROP TABLE act_id_membership; +DROP TABLE act_id_group; +DROP TABLE act_id_user; +DROP TABLE act_procdef_info; +DROP TABLE act_re_model; +DROP TABLE act_ru_event_subscr; +DROP TABLE act_ru_identitylink; +DROP TABLE act_ru_job; +DROP TABLE act_ru_task; +DROP TABLE act_ru_variable; +DROP TABLE act_ge_bytearray; +DROP TABLE act_re_deployment; +DROP TABLE act_ru_execution; +DROP TABLE act_re_procdef; diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java index 89b3bb23826..7f19c189ff0 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java @@ -39,6 +39,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; import org.hibernate.Session; +import org.jetbrains.annotations.NotNull; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.testng.AssertJUnit; @@ -1121,11 +1122,11 @@ public void test310ModifyCaseWorkItemAssignee() throws Exception { // GIVEN OperationResult result = new OperationResult(TEST_NAME); - final String OLD_OID = "f3285c65-a4fa-4bf3-bd78-3008bcf99d3c"; + final String OLD_OID = "0f4082cf-c0b6-4cd2-a3db-544c668bab0c"; final String NEW_OID = "4cbdc40b-5693-4174-8634-acd3e0b96168"; PrismObject caseObject = prismContext.createObjectable(CaseType.class) - .name("testcase2") + .name("case310") .oid("7d0c37f8-26e5-4213-af95-cfde175f3ff7") .state("open") .beginWorkItem() @@ -1145,13 +1146,81 @@ public void test310ModifyCaseWorkItemAssignee() throws Exception { // THEN + List workItems = assertAssignee(NEW_OID, 1, result); + assertAssignee(OLD_OID, 0, result); + + System.out.println(workItems.get(0).asPrismContainerValue().debugDump()); + } + + @Test + public void test320ModifyCaseWorkItemAssigneeAndCandidate() throws Exception { + final String TEST_NAME = "test320ModifyCaseWorkItemAssigneeAndCandidate"; + TestUtil.displayTestTitle(TEST_NAME); + + // GIVEN + OperationResult result = new OperationResult(TEST_NAME); + + final String OLD_OID = "d886a44c-732d-44d4-8403-e7c44bbfba8b"; + final String OLD2_OID = "9a28119e-1283-4328-9e2f-ef383728a4d1"; + final String NEW_OID = "fba02f49-d019-4642-9941-6d8482be5d58"; + + PrismObject caseObject = prismContext.createObjectable(CaseType.class) + .name("case320") + .state("open") + .beginWorkItem() + .id(1L) + .assigneeRef(new ObjectReferenceType().oid(OLD_OID).type(UserType.COMPLEX_TYPE)) + .candidateRef(new ObjectReferenceType().oid(OLD_OID).type(UserType.COMPLEX_TYPE)) // intentionally the same + .candidateRef(new ObjectReferenceType().oid(OLD2_OID).type(UserType.COMPLEX_TYPE)) + .end() + .asPrismObject(); + repositoryService.addObject(caseObject, null, result); + + assertAssignee(OLD_OID, 1, result); + assertCandidate(OLD_OID, 1, result); + assertCandidate(OLD2_OID, 1, result); + + // WHEN + + List> itemDeltas = prismContext.deltaFor(CaseType.class) + .item(CaseType.F_WORK_ITEM, 1L, CaseWorkItemType.F_ASSIGNEE_REF) + .replace(new ObjectReferenceType().oid(NEW_OID).type(UserType.COMPLEX_TYPE)) + .item(CaseType.F_WORK_ITEM, 1L, CaseWorkItemType.F_CANDIDATE_REF) + .add(new ObjectReferenceType().oid(NEW_OID).type(UserType.COMPLEX_TYPE)) + .asItemDeltas(); + repositoryService.modifyObject(CaseType.class, caseObject.getOid(), itemDeltas, getModifyOptions(), result); + + // THEN + + assertAssignee(OLD_OID, 0, result); + assertAssignee(NEW_OID, 1, result); + assertCandidate(OLD_OID, 1, result); + assertCandidate(OLD2_OID, 1, result); + List workItems = assertCandidate(NEW_OID, 1, result); + + System.out.println(workItems.get(0).asPrismContainerValue().debugDump()); + } + + @NotNull + private List assertAssignee(String assigneeOid, int expected, OperationResult result) + throws SchemaException { ObjectQuery query = prismContext.queryFor(CaseWorkItemType.class) - .item(CaseWorkItemType.F_ASSIGNEE_REF).ref(NEW_OID) + .item(CaseWorkItemType.F_ASSIGNEE_REF).ref(assigneeOid) .build(); List workItems = repositoryService.searchContainers(CaseWorkItemType.class, query, null, result); - assertEquals("Wrong # of work items found", 1, workItems.size()); + assertEquals("Wrong # of work items found", expected, workItems.size()); + return workItems; + } - System.out.println(workItems.get(0).asPrismContainerValue().debugDump()); + @NotNull + private List assertCandidate(String candidateOid, int expected, OperationResult result) + throws SchemaException { + ObjectQuery query = prismContext.queryFor(CaseWorkItemType.class) + .item(CaseWorkItemType.F_CANDIDATE_REF).ref(candidateOid) + .build(); + List workItems = repositoryService.searchContainers(CaseWorkItemType.class, query, null, result); + assertEquals("Wrong # of work items found", expected, workItems.size()); + return workItems; } @Test // MID-5104 diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index ea172bd3817..493f84e1642 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -4777,4 +4777,55 @@ public void test1435QueryNameNormAsString() throws Exception { close(session); } } + + @Test + public void test1440QueryWorkItemsByAssignee() throws Exception { + Session session = open(); + try { + ObjectQuery q = prismContext.queryFor(CaseWorkItemType.class) + .item(CaseWorkItemType.F_ASSIGNEE_REF).ref("123") + .build(); + String real = getInterpretedQuery2(session, CaseWorkItemType.class, q, false); + String expected = "select\n" + + " c.ownerOid,\n" + + " c.id\n" + + "from\n" + + " RCaseWorkItem c\n" + + " left join c.assigneeRef a\n" + + "where\n" + + " (\n" + + " a.targetOid = :targetOid and\n" + + " a.relation in (:relation)\n" + + " )"; + assertEqualsIgnoreWhitespace(expected, real); + } finally { + close(session); + } + } + + @Test + public void test1442QueryWorkItemsByCandidate() throws Exception { + Session session = open(); + try { + ObjectQuery q = prismContext.queryFor(CaseWorkItemType.class) + .item(CaseWorkItemType.F_CANDIDATE_REF).ref("123") + .build(); + String real = getInterpretedQuery2(session, CaseWorkItemType.class, q, false); + String expected = "select\n" + + " c.ownerOid,\n" + + " c.id\n" + + "from\n" + + " RCaseWorkItem c\n" + + " left join c.candidateRef c2\n" + + "where\n" + + " (\n" + + " c2.targetOid = :targetOid and\n" + + " c2.relation in (:relation)\n" + + " )"; + assertEqualsIgnoreWhitespace(expected, real); + } finally { + close(session); + } + } + } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java index c92973a60b7..a02b6cc1045 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/SearchTest.java @@ -1072,4 +1072,65 @@ public void testSearchAssignmentHolder() throws SchemaException { assertTrue("returned object is not a AssignmentHolderType: " + object, object.asObjectable() instanceof AssignmentHolderType); } } + + @Test + public void testCaseWorkItemAssignee() throws SchemaException { + ObjectQuery query = prismContext.queryFor(CaseType.class) + .item(CaseType.F_WORK_ITEM, CaseWorkItemType.F_ASSIGNEE_REF).ref("5905f321-630f-4de3-abc9-ba3a614aac36") + .build(); + OperationResult result = new OperationResult("search"); + List> cases = repositoryService.searchObjects(CaseType.class, query, null, result); + result.recomputeStatus(); + assertTrue(result.isSuccess()); + assertEquals("Should find one object", 1, cases.size()); + } + + @Test + public void testCaseWorkItemCandidate() throws SchemaException { + ObjectQuery query = prismContext.queryFor(CaseType.class) + .item(CaseType.F_WORK_ITEM, CaseWorkItemType.F_CANDIDATE_REF).ref("5905f321-630f-4de3-abc9-ba3a614aac36") + .build(); + OperationResult result = new OperationResult("search"); + List> cases = repositoryService.searchObjects(CaseType.class, query, null, result); + result.recomputeStatus(); + assertTrue(result.isSuccess()); + assertEquals("Should find one object", 1, cases.size()); + } + + @Test + public void testCaseWorkItemCandidateOther() throws SchemaException { + ObjectQuery query = prismContext.queryFor(CaseType.class) + .item(CaseType.F_WORK_ITEM, CaseWorkItemType.F_CANDIDATE_REF).ref("d2bda14f-8571-4c99-bbe4-25c132650998") + .build(); + OperationResult result = new OperationResult("search"); + List> cases = repositoryService.searchObjects(CaseType.class, query, + schemaHelper.getOperationOptionsBuilder().distinct().build(), result); + result.recomputeStatus(); + assertTrue(result.isSuccess()); + assertEquals("Should find one object", 1, cases.size()); + } + + @Test + public void testWorkItemCandidate() throws SchemaException { + ObjectQuery query = prismContext.queryFor(CaseWorkItemType.class) + .item(CaseWorkItemType.F_CANDIDATE_REF).ref("d2bda14f-8571-4c99-bbe4-25c132650998") + .build(); + OperationResult result = new OperationResult("search"); + SearchResultList workItems = repositoryService.searchContainers(CaseWorkItemType.class, query, null, result); + result.recomputeStatus(); + assertTrue(result.isSuccess()); + assertEquals("Wrong # of work items found", 2, workItems.size()); + } + + @Test + public void testWorkItemCandidateOther() throws SchemaException { + ObjectQuery query = prismContext.queryFor(CaseWorkItemType.class) + .item(CaseWorkItemType.F_CANDIDATE_REF).ref("5905f321-630f-4de3-abc9-ba3a614aac36") + .build(); + OperationResult result = new OperationResult("search"); + SearchResultList workItems = repositoryService.searchContainers(CaseWorkItemType.class, query, null, result); + result.recomputeStatus(); + assertTrue(result.isSuccess()); + assertEquals("Wrong # of work items found", 1, workItems.size()); + } } diff --git a/repo/repo-sql-impl-test/src/test/resources/basic/objects.xml b/repo/repo-sql-impl-test/src/test/resources/basic/objects.xml index cd2816736c9..4c94486391a 100644 --- a/repo/repo-sql-impl-test/src/test/resources/basic/objects.xml +++ b/repo/repo-sql-impl-test/src/test/resources/basic/objects.xml @@ -1721,10 +1721,15 @@ open + + + + + diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItem.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItem.java index 6d670b2562d..c23cecaf989 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItem.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItem.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.repo.sql.data.common.RCase; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.id.RCaseWorkItemId; +import com.evolveum.midpoint.repo.sql.data.common.other.RCaseWorkItemReferenceOwner; import com.evolveum.midpoint.repo.sql.query.definition.*; import com.evolveum.midpoint.repo.sql.query2.definition.IdQueryProperty; import com.evolveum.midpoint.repo.sql.util.DtoTranslationException; @@ -27,11 +28,11 @@ import com.evolveum.midpoint.repo.sql.util.RUtil; import com.evolveum.midpoint.schema.util.WorkItemTypeUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType; -import org.hibernate.annotations.Cascade; import org.hibernate.annotations.ForeignKey; -import org.hibernate.annotations.GenericGenerator; -import org.hibernate.annotations.Persister; +import org.hibernate.annotations.*; +import javax.persistence.Entity; +import javax.persistence.Table; import javax.persistence.*; import javax.xml.datatype.XMLGregorianCalendar; import java.util.HashSet; @@ -64,6 +65,7 @@ public class RCaseWorkItem implements Container { private Integer stageNumber; private REmbeddedReference originalAssigneeRef; private Set assigneeRef = new HashSet<>(); + private Set candidateRef = new HashSet<>(); private REmbeddedReference performerRef; private String outcome; private XMLGregorianCalendar closeTimestamp; @@ -129,6 +131,7 @@ public void setOriginalAssigneeRef(REmbeddedReference originalAssigneeRef) { this.originalAssigneeRef = originalAssigneeRef; } + @Where(clause = RCaseWorkItemReference.REFERENCE_TYPE + "= 0") @JaxbName(localPart = "assigneeRef") @OneToMany(mappedBy = "owner", orphanRemoval = true) @ForeignKey(name = "none") @@ -141,6 +144,19 @@ public void setAssigneeRef(Set assigneeRef) { this.assigneeRef = assigneeRef; } + @Where(clause = RCaseWorkItemReference.REFERENCE_TYPE + "= 1") + @JaxbName(localPart = "candidateRef") + @OneToMany(mappedBy = "owner", orphanRemoval = true) + @ForeignKey(name = "none") + @Cascade({org.hibernate.annotations.CascadeType.ALL}) + public Set getCandidateRef() { + return candidateRef; + } + + public void setCandidateRef(Set candidateRef) { + this.candidateRef = candidateRef; + } + @Column public REmbeddedReference getPerformerRef() { return performerRef; @@ -232,7 +248,9 @@ private static void toRepo(RCaseWorkItem rWorkItem, CaseWorkItemType workItem, R rWorkItem.setStageNumber(workItem.getStageNumber()); rWorkItem.setOriginalAssigneeRef(RUtil.jaxbRefToEmbeddedRepoRef(workItem.getOriginalAssigneeRef(), context.relationRegistry)); rWorkItem.getAssigneeRef().addAll(RCaseWorkItemReference.safeListReferenceToSet( - workItem.getAssigneeRef(), rWorkItem, context.relationRegistry)); + workItem.getAssigneeRef(), rWorkItem, context.relationRegistry, RCaseWorkItemReferenceOwner.ASSIGNEE)); + rWorkItem.getCandidateRef().addAll(RCaseWorkItemReference.safeListReferenceToSet( + workItem.getCandidateRef(), rWorkItem, context.relationRegistry, RCaseWorkItemReferenceOwner.CANDIDATE)); rWorkItem.setPerformerRef(RUtil.jaxbRefToEmbeddedRepoRef(workItem.getPerformerRef(), context.relationRegistry)); rWorkItem.setOutcome(WorkItemTypeUtil.getOutcome(workItem)); rWorkItem.setCloseTimestamp(workItem.getCloseTimestamp()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItemReference.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItemReference.java index 24db8e0051f..43fa6fa90e9 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItemReference.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItemReference.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.id.RCaseWorkItemReferenceId; +import com.evolveum.midpoint.repo.sql.data.common.other.RCaseWorkItemReferenceOwner; import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; import com.evolveum.midpoint.repo.sql.query.definition.JaxbType; import com.evolveum.midpoint.repo.sql.query2.definition.NotQueryable; @@ -53,10 +54,12 @@ public class RCaseWorkItemReference extends RReference { public static final String TABLE = "m_case_wi_reference"; + public static final String REFERENCE_TYPE = "reference_type"; private RCaseWorkItem owner; private String ownerOwnerOid; // case OID private Integer ownerId; // work item ID + private RCaseWorkItemReferenceOwner referenceType; @ForeignKey(name = "fk_case_wi_reference_owner") @MapsId("workItem") @@ -123,7 +126,17 @@ public String getRelation() { return super.getRelation(); } - @Column(name = "targetType") + @Id + @Column(name = REFERENCE_TYPE, nullable = false) + public RCaseWorkItemReferenceOwner getReferenceType() { + return referenceType; + } + + public void setReferenceType(RCaseWorkItemReferenceOwner referenceType) { + this.referenceType = referenceType; + } + + @Column(name = "targetType") @Enumerated(EnumType.ORDINAL) @Override public RObjectType getType() { @@ -131,14 +144,15 @@ public RObjectType getType() { } public static Set safeListReferenceToSet(List list, - RCaseWorkItem owner, RelationRegistry relationRegistry) { + RCaseWorkItem owner, RelationRegistry relationRegistry, + RCaseWorkItemReferenceOwner type) { Set set = new HashSet<>(); if (list == null || list.isEmpty()) { return set; } for (ObjectReferenceType ref : list) { - RCaseWorkItemReference rRef = jaxbRefToRepo(ref, owner, relationRegistry); + RCaseWorkItemReference rRef = jaxbRefToRepo(ref, owner, relationRegistry, type); if (rRef != null) { set.add(rRef); } @@ -147,7 +161,7 @@ public static Set safeListReferenceToSet(List Date: Fri, 30 Aug 2019 16:33:53 +0200 Subject: [PATCH 13/20] claimable work items page --- .../midpoint/gui/api/GuiStyleConstants.java | 3 +- .../midpoint/gui/api/page/PageBase.java | 6 + .../admin/cases/CaseWorkItemActionsPanel.java | 2 +- .../CaseWorkItemListWithDetailsPanel.java | 2 +- .../page/admin/cases/CaseWorkItemsPanel.java | 2 +- .../page/admin/cases/PageCaseWorkItems.java | 28 ++- .../admin/cases/PageWorkItemsClaimable.java | 175 ++++++++++++++++++ .../workflow/PageWorkItemsClaimable.java | 39 ---- .../schema/util/CaseWorkItemUtil.java | 4 + 9 files changed, 212 insertions(+), 49 deletions(-) create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java delete mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItemsClaimable.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/GuiStyleConstants.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/GuiStyleConstants.java index c3cb5081f14..3a4b4a9641d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/GuiStyleConstants.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/GuiStyleConstants.java @@ -211,6 +211,7 @@ public class GuiStyleConstants { public static final String BLUE_COLOR = "color-blue"; public static final String CLASS_ICON_SIGN_OUT = "fa fa-sign-out"; - + public static final String CLASS_ICON_CLAIM = "fa fa-paper-plane-o"; + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java index 0f9a57dd9d6..8dcce8b52f3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java @@ -57,6 +57,7 @@ import com.evolveum.midpoint.prism.util.PolyStringUtils; import com.evolveum.midpoint.repo.api.CacheDispatcher; import com.evolveum.midpoint.repo.api.CounterManager; +import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.common.ObjectResolver; import com.evolveum.midpoint.repo.common.expression.Expression; import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext; @@ -529,6 +530,10 @@ public RelationRegistry getRelationRegistry() { return getMidpointApplication().getRelationRegistry(); } + public RepositoryService getRepositoryService() { + return getMidpointApplication().getRepositoryService(); + } + public ExpressionFactory getExpressionFactory() { return getMidpointApplication().getExpressionFactory(); } @@ -1856,6 +1861,7 @@ public String getBubbleLabel() { addMenuItem(item, "PageAdmin.menu.top.caseWorkItems.listAll", GuiStyleConstants.CLASS_OBJECT_WORK_ITEM_ICON, PageCaseWorkItemsAll.class); addMenuItem(item, "PageAdmin.menu.top.caseWorkItems.list", PageCaseWorkItemsAllocatedToMe.class); addMenuItem(item, "PageAdmin.menu.top.workItems.listAttorney", PageAttorneySelection.class); + addMenuItem(item, "PageWorkItemsClaimable.title", PageWorkItemsClaimable.class); createFocusPageViewMenu(item.getItems(), "PageAdmin.menu.top.caseWorkItems.view", PageCaseWorkItem.class); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java index 774bf3641f9..b16aa1c5082 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java @@ -75,7 +75,7 @@ protected void onInitialize(){ private void initLayout(){ WebMarkupContainer actionButtonsContainer = new WebMarkupContainer(ID_ACTION_BUTTONS); actionButtonsContainer.setOutputMarkupId(true); - actionButtonsContainer.add(new VisibleBehaviour(() -> !isParentCaseClosed())); + actionButtonsContainer.add(new VisibleBehaviour(() -> CaseWorkItemUtil.isCaseWorkItemNotClosed(CaseWorkItemActionsPanel.this.getModelObject()))); add(actionButtonsContainer); AjaxButton workItemApproveButton = new AjaxButton(ID_WORK_ITEM_APPROVE_BUTTON, getApproveButtonTitleModel()) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemListWithDetailsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemListWithDetailsPanel.java index 0fdb73a31af..b3106f23b2d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemListWithDetailsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemListWithDetailsPanel.java @@ -127,7 +127,7 @@ protected Component getCustomForm(){ actionsPanel.setOutputMarkupId(true); actionsPanel.add(new VisibleBehaviour(() -> { CaseWorkItemType workItemSelected = getDetailsPanelItemsList().size() > 0 ? getDetailsPanelItemsList().get(0).getRealValue() : null; - return workItemSelected != null && workItemSelected.getCloseTimestamp() == null; + return CaseWorkItemUtil.isCaseWorkItemNotClosed(workItemSelected); })); getDetailsPanelContainer().add(actionsPanel); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemsPanel.java index f2ab2b7094a..a4207dace65 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemsPanel.java @@ -300,7 +300,7 @@ private void workItemActionPerformed(IModel getContainerableListPanel(){ + public ContainerableListPanel getContainerableListPanel(){ return (ContainerableListPanel) get(ID_WORKITEMS_TABLE); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java index 9566aa93c64..5faa480fffe 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java @@ -25,6 +25,7 @@ import javax.xml.datatype.XMLGregorianCalendar; +import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.gui.api.component.ContainerableListPanel; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; @@ -40,8 +41,10 @@ import com.evolveum.midpoint.web.application.AuthorizationAction; import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.application.Url; -import com.evolveum.midpoint.web.component.data.column.ColumnUtils; -import com.evolveum.midpoint.web.component.data.column.IconColumn; +import com.evolveum.midpoint.web.component.data.column.*; +import com.evolveum.midpoint.web.component.menu.cog.ButtonInlineMenuItem; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction; import com.evolveum.midpoint.web.component.search.Search; import com.evolveum.midpoint.web.component.search.SearchFactory; import com.evolveum.midpoint.web.component.search.SearchFormPanel; @@ -84,8 +87,6 @@ import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.data.BoxedTablePanel; import com.evolveum.midpoint.web.component.data.Table; -import com.evolveum.midpoint.web.component.data.column.IsolatedCheckBoxPanel; -import com.evolveum.midpoint.web.component.data.column.LinkColumn; import com.evolveum.midpoint.web.component.form.multivalue.MultiValueChoosePanel; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.admin.cases.dto.CaseWorkItemDtoProvider; @@ -172,6 +173,17 @@ OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getRelationRegistry()) workItemsPanel = new CaseWorkItemsPanel(ID_CASE_WORK_ITEMS_TABLE, CaseWorkItemsPanel.View.FULL_LIST){ private static final long serialVersionUID = 1L; + @Override + protected List createRowActions() { + List menu = super.createRowActions(); + + List additionalMenu = PageCaseWorkItems.this.createRowActions(); + if (additionalMenu != null){ + menu.addAll(additionalMenu); + } + return menu; + } + @Override protected ObjectFilter getCaseWorkItemsFilter(){ return PageCaseWorkItems.this.getCaseWorkItemsFilter(); @@ -186,8 +198,12 @@ protected ObjectFilter getCaseWorkItemsFilter(){ return null; } - private Table getCaseWorkItemsTable() { - return (Table) get(createComponentPath(ID_CASE_WORK_ITEMS_TABLE)); + protected List createRowActions(){ + return new ArrayList<>(); + } + + protected CaseWorkItemsPanel getCaseWorkItemsTable() { + return (CaseWorkItemsPanel) get(createComponentPath(ID_CASE_WORK_ITEMS_TABLE)); } //todo peace of old code. not sure if it should be implemented diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java new file mode 100644 index 00000000000..2f08b9724f6 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2010-2014 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.cases; + +import com.evolveum.midpoint.gui.api.GuiStyleConstants; +import com.evolveum.midpoint.gui.api.component.ContainerableListPanel; +import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; +import com.evolveum.midpoint.model.api.WorkflowService; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.result.OperationResultStatus; +import com.evolveum.midpoint.schema.util.CaseTypeUtil; +import com.evolveum.midpoint.schema.util.CaseWorkItemUtil; +import com.evolveum.midpoint.schema.util.WorkItemId; +import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.*; +import com.evolveum.midpoint.web.application.AuthorizationAction; +import com.evolveum.midpoint.web.application.PageDescriptor; +import com.evolveum.midpoint.web.component.data.column.ColumnMenuAction; +import com.evolveum.midpoint.web.component.menu.cog.ButtonInlineMenuItem; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; +import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction; +import com.evolveum.midpoint.web.page.admin.workflow.PageAdminWorkItems; +import com.evolveum.midpoint.web.page.admin.workflow.PageWorkItems; +import com.evolveum.midpoint.web.page.admin.workflow.WorkItemsPageType; +import com.evolveum.midpoint.web.page.admin.workflow.dto.WorkItemDto; +import com.evolveum.midpoint.web.security.SecurityUtils; +import com.evolveum.midpoint.wf.util.QueryUtils; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OtherPrivilegesLimitationType; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractWorkItemType.F_CREATE_TIMESTAMP; + +/** + * @author lazyman + */ +@PageDescriptor(url = "/admin/workItemsClaimable", action = { + @AuthorizationAction(actionUri = PageAdminWorkItems.AUTH_APPROVALS_ALL, + label = PageAdminWorkItems.AUTH_APPROVALS_ALL_LABEL, + description = PageAdminWorkItems.AUTH_APPROVALS_ALL_DESCRIPTION), + @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_CLAIMABLE_WORK_ITEMS_URL, + label = "PageWorkItemsClaimable.auth.claimableWorkItems.label", + description = "PageWorkItemsClaimable.auth.claimableWorkItems.description")}) +public class PageWorkItemsClaimable extends PageCaseWorkItems { + private static final long serialVersionUID = 1L; + + private static final String DOT_CLASS = PageWorkItemsClaimable.class.getName() + "."; + private static final String PARAMETER_CASE_ID = "caseId"; + private static final String OPERATION_LOAD_CLAIMABLE_WORK_ITEMS = DOT_CLASS + "loadClaimableWorkItems"; + private static final String OPERATION_CLAIM_ITEMS = DOT_CLASS + "claimItem"; + + public PageWorkItemsClaimable() { + super(); + } + + @Override + protected ObjectFilter getCaseWorkItemsFilter(){ + OperationResult result = new OperationResult(OPERATION_LOAD_CLAIMABLE_WORK_ITEMS); + try { + return QueryUtils.filterForGroups(getPrismContext().queryFor(CaseWorkItemType.class), + SecurityUtils.getPrincipalUser().getOid(), + getRepositoryService(), getRelationRegistry(), result) + .buildFilter(); + } catch (SchemaException ex){ + return null; + } + } + + @Override + protected List createRowActions(){ + List menu = new ArrayList<>(); + menu.add(new ButtonInlineMenuItem(createStringResource("pageWorkItem.button.claim")) { + private static final long serialVersionUID = 1L; + + @Override + public InlineMenuItemAction initAction() { + return new ColumnMenuAction>() { + + @Override + public void onClick(AjaxRequestTarget target) { + claimWorkItemPerformed(getRowModel(), target); + } + }; + } + + @Override + public IModel getEnabled() { + IModel> rowModel = ((ColumnMenuAction>)getAction()).getRowModel(); + if (rowModel != null && rowModel.getObject() != null && rowModel.getObject().getRealValue() != null){ + CaseWorkItemType workItem = rowModel.getObject().getRealValue(); + return Model.of(CaseWorkItemUtil.isCaseWorkItemNotClosed(workItem)); + } else { + return super.getEnabled(); + } + } + + @Override + public IModel getConfirmationMessageModel(){ + return createStringResource("CaseWorkItemsPanel.confirmWorkItemsClaimAction"); + } + + @Override + public String getButtonIconCssClass(){ + return GuiStyleConstants.CLASS_ICON_CLAIM; + } + }); + + return menu; + } + + private void claimWorkItemPerformed(IModel> rowModel, AjaxRequestTarget target){ + List> selectedWorkItems = new ArrayList<>(); + if (rowModel == null) { + ContainerableListPanel tablePanel = getCaseWorkItemsTable().getContainerableListPanel(); + selectedWorkItems.addAll(tablePanel.getProvider().getSelectedData()); + } else { + selectedWorkItems.addAll(Arrays.asList(rowModel.getObject())); + } + + if (selectedWorkItems.size() == 0){ + warn(getString("CaseWorkItemsPanel.noWorkItemIsSelected")); + target.add(getFeedbackPanel()); + return; + } + + Task task = createSimpleTask(OPERATION_CLAIM_ITEMS); + OperationResult mainResult = task.getResult(); + WorkflowService workflowService = getWorkflowService(); + for (PrismContainerValueWrapper workItem : selectedWorkItems) { + OperationResult result = mainResult.createSubresult(OPERATION_CLAIM_ITEMS); + try { + workflowService.claimWorkItem(WorkItemId.of(workItem.getRealValue()), task, result); + result.computeStatusIfUnknown(); + } catch (ObjectNotFoundException | SecurityViolationException | RuntimeException | SchemaException | ObjectAlreadyExistsException | CommunicationException | ConfigurationException | ExpressionEvaluationException e) { + result.recordPartialError(createStringResource("pageWorkItems.message.partialError.claimed").getString(), e); + } + } + if (mainResult.isUnknown()) { + mainResult.recomputeStatus(); + } + + if (mainResult.isSuccess()) { + mainResult.recordStatus(OperationResultStatus.SUCCESS, + createStringResource("pageWorkItems.message.success.claimed").getString()); + } + + showResult(mainResult); + + resetWorkItemCountModel(); + target.add(this); + } + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItemsClaimable.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItemsClaimable.java deleted file mode 100644 index cd5e26fa803..00000000000 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItemsClaimable.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2010-2014 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; - -import com.evolveum.midpoint.security.api.AuthorizationConstants; -import com.evolveum.midpoint.web.application.AuthorizationAction; -import com.evolveum.midpoint.web.application.PageDescriptor; - -/** - * @author lazyman - */ -@PageDescriptor(url = "/admin/workItemsClaimable", action = { - @AuthorizationAction(actionUri = PageAdminWorkItems.AUTH_APPROVALS_ALL, - label = PageAdminWorkItems.AUTH_APPROVALS_ALL_LABEL, - description = PageAdminWorkItems.AUTH_APPROVALS_ALL_DESCRIPTION), - @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_CLAIMABLE_WORK_ITEMS_URL, - label = "PageWorkItemsClaimable.auth.claimableWorkItems.label", - description = "PageWorkItemsClaimable.auth.claimableWorkItems.description")}) -public class PageWorkItemsClaimable extends PageWorkItems { - - public PageWorkItemsClaimable() { - super(WorkItemsPageType.CLAIMABLE); - } - -} diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java index f084de55a89..8e502ec6f4d 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java @@ -70,4 +70,8 @@ public static CaseWorkItemType getWorkItem(CaseType aCase, long id) { } return null; } + + public static boolean isCaseWorkItemNotClosed(CaseWorkItemType workItem){ + return workItem != null && workItem.getCloseTimestamp() == null; + } } From a5494c49ceae8158e7542795fb854ff7913e14a4 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 30 Aug 2019 16:53:30 +0200 Subject: [PATCH 14/20] Fix the filter for claimable work items --- .../page/admin/cases/PageWorkItemsClaimable.java | 9 +-------- .../admin/workflow/dto/WorkItemDtoProvider.java | 2 +- .../com/evolveum/midpoint/wf/util/QueryUtils.java | 13 +++++++++---- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java index 2f08b9724f6..a9841f37f51 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java @@ -23,7 +23,6 @@ import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; -import com.evolveum.midpoint.schema.util.CaseTypeUtil; import com.evolveum.midpoint.schema.util.CaseWorkItemUtil; import com.evolveum.midpoint.schema.util.WorkItemId; import com.evolveum.midpoint.security.api.AuthorizationConstants; @@ -36,13 +35,9 @@ import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction; import com.evolveum.midpoint.web.page.admin.workflow.PageAdminWorkItems; -import com.evolveum.midpoint.web.page.admin.workflow.PageWorkItems; -import com.evolveum.midpoint.web.page.admin.workflow.WorkItemsPageType; -import com.evolveum.midpoint.web.page.admin.workflow.dto.WorkItemDto; import com.evolveum.midpoint.web.security.SecurityUtils; import com.evolveum.midpoint.wf.util.QueryUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OtherPrivilegesLimitationType; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -51,8 +46,6 @@ import java.util.Arrays; import java.util.List; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractWorkItemType.F_CREATE_TIMESTAMP; - /** * @author lazyman */ @@ -79,7 +72,7 @@ public PageWorkItemsClaimable() { protected ObjectFilter getCaseWorkItemsFilter(){ OperationResult result = new OperationResult(OPERATION_LOAD_CLAIMABLE_WORK_ITEMS); try { - return QueryUtils.filterForGroups(getPrismContext().queryFor(CaseWorkItemType.class), + return QueryUtils.filterForClaimableItems(getPrismContext().queryFor(CaseWorkItemType.class), SecurityUtils.getPrincipalUser().getOid(), getRepositoryService(), getRelationRegistry(), result) .buildFilter(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java index 7bab51f571a..a97722c9cc1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java @@ -175,7 +175,7 @@ private ObjectQuery createQuery(OperationResult result) throws SchemaException { if (WorkItemsPageType.ALL.equals(workItemsPageType) && authorizedToSeeAll) { return q.build(); } else if (WorkItemsPageType.CLAIMABLE.equals(workItemsPageType)) { - return QueryUtils.filterForGroups(q, currentUserOid(), getRepositoryService(), getRelationRegistry(), result).build(); + return QueryUtils.filterForClaimableItems(q, currentUserOid(), getRepositoryService(), getRelationRegistry(), result).build(); } else { // not authorized to see all => sees only allocated to him (not quite what is expected, but sufficient for the time being) return QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(), diff --git a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java index 6a3b87364fa..e13b1f2fc07 100644 --- a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java +++ b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.wf.util; -import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; @@ -74,10 +73,12 @@ public static S_AtomicFilterExit filterForNotClosedStateAndAssignees(S_FilterEnt } } - public static S_FilterExit filterForGroups(S_FilterEntryOrEmpty q, String userOid, RepositoryService repositoryService, + public static S_FilterExit filterForClaimableItems(S_FilterEntryOrEmpty q, String userOid, RepositoryService repositoryService, RelationRegistry relationRegistry, OperationResult result) throws SchemaException { - return q.item(CaseWorkItemType.F_CANDIDATE_REF).ref(getGroupsForUser(userOid, repositoryService, relationRegistry, result)); + List candidates = getCandidatesForUser(userOid, repositoryService, relationRegistry, result); + return q.item(CaseWorkItemType.F_CANDIDATE_REF).ref(candidates) + .and().item(CaseWorkItemType.F_ASSIGNEE_REF).isNull(); } private static List getPotentialAssigneesForUser(MidPointPrincipal principal, @@ -94,7 +95,11 @@ private static List getPotentialAssigneesForUser(MidPointPr return rv; } - private static List getGroupsForUser(String userOid, RepositoryService repositoryService, + /** + * Returns values to look for in candidateRef field. Basically, all the groups a user is member of should be present here. + * The question is what to do if candidateRef points to another user or users. This case is obviously not supported yet. + */ + private static List getCandidatesForUser(String userOid, RepositoryService repositoryService, RelationRegistry relationRegistry, OperationResult result) throws SchemaException { List rv = new ArrayList<>(); UserType userType; From 9050f0b758fbd82528e22025391658e92e95f716 Mon Sep 17 00:00:00 2001 From: kate Date: Sat, 31 Aug 2019 02:58:56 +0200 Subject: [PATCH 15/20] claim wi button on the wi details panel --- .../gui/api/util/WebComponentUtil.java | 35 +++++++++++++++--- .../admin/cases/CaseWorkItemActionsPanel.html | 1 + .../admin/cases/CaseWorkItemActionsPanel.java | 36 ++++++++++++++++--- .../admin/cases/PageWorkItemsClaimable.java | 27 ++------------ .../schema/util/CaseWorkItemUtil.java | 13 ++++--- 5 files changed, 75 insertions(+), 37 deletions(-) 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 5f99e30a70c..a1468c01688 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 @@ -32,11 +32,7 @@ import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; import com.evolveum.midpoint.gui.impl.prism.PrismPropertyValueWrapper; import com.evolveum.midpoint.gui.impl.prism.PrismPropertyWrapper; -import com.evolveum.midpoint.model.api.AssignmentObjectRelation; -import com.evolveum.midpoint.model.api.ModelExecuteOptions; -import com.evolveum.midpoint.model.api.ModelInteractionService; -import com.evolveum.midpoint.model.api.ModelPublicConstants; -import com.evolveum.midpoint.model.api.RoleSelectionSpecification; +import com.evolveum.midpoint.model.api.*; import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView; import com.evolveum.midpoint.model.api.util.ResourceUtils; import com.evolveum.midpoint.model.api.visualizer.Scene; @@ -3591,6 +3587,35 @@ public static void workItemApproveActionPerformed(AjaxRequestTarget target, Case pageBase.processResult(target, result, false); } + public static void claimWorkItemActionPerformed(CaseWorkItemType workItemToClaim, + String operation, AjaxRequestTarget target, PageBase pageBase){ + Task task = pageBase.createSimpleTask(operation); + OperationResult mainResult = task.getResult(); + WorkflowService workflowService = pageBase.getWorkflowService(); + OperationResult result = mainResult.createSubresult(operation); + try { + workflowService.claimWorkItem(WorkItemId.of(workItemToClaim), task, result); + result.computeStatusIfUnknown(); + } catch (ObjectNotFoundException | SecurityViolationException | RuntimeException | SchemaException | + ObjectAlreadyExistsException | CommunicationException | ConfigurationException | ExpressionEvaluationException e) { + result.recordPartialError(pageBase.createStringResource("pageWorkItems.message.partialError.claimed").getString(), e); + } + if (mainResult.isUnknown()) { + mainResult.recomputeStatus(); + } + + if (mainResult.isSuccess()) { + mainResult.recordStatus(OperationResultStatus.SUCCESS, + pageBase.createStringResource("pageWorkItems.message.success.claimed").getString()); + } + + pageBase.showResult(mainResult); + + pageBase.resetWorkItemCountModel(); + target.add(pageBase); + + } + public static void assumePowerOfAttorneyIfRequested(OperationResult result, PrismObject powerDonor, PageBase pageBase) { if (powerDonor != null) { WebModelServiceUtils.assumePowerOfAttorney(powerDonor, pageBase.getModelInteractionService(), pageBase.getTaskManager(), result); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.html index a5ac2d16b88..184e6d042ad 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.html @@ -21,6 +21,7 @@
+
\ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java index b16aa1c5082..83a2a94d886 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java @@ -16,17 +16,22 @@ package com.evolveum.midpoint.web.page.admin.cases; import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.component.ContainerableListPanel; import com.evolveum.midpoint.gui.api.component.ObjectBrowserPanel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; +import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; +import com.evolveum.midpoint.model.api.WorkflowService; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.schema.util.CaseTypeUtil; import com.evolveum.midpoint.schema.util.CaseWorkItemUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.WorkItemId; import com.evolveum.midpoint.task.api.Task; +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; @@ -40,6 +45,8 @@ import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.model.IModel; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -53,6 +60,7 @@ public class CaseWorkItemActionsPanel extends BasePanel { private static final String DOT_CLASS = CaseWorkItemActionsPanel.class.getName() + "."; private static final String OPERATION_SAVE_WORK_ITEM = DOT_CLASS + "saveWorkItem"; + private static final String OPERATION_CLAIM_ITEMS = DOT_CLASS + "claimItem"; private static final String OPERATION_DELEGATE_WORK_ITEM = DOT_CLASS + "delegateWorkItem"; private static final String OPERATION_COMPLETE_WORK_ITEM = DOT_CLASS + "completeWorkItem"; @@ -60,6 +68,7 @@ public class CaseWorkItemActionsPanel extends BasePanel { private static final String ID_WORK_ITEM_APPROVE_BUTTON = "workItemApproveButton"; private static final String ID_WORK_ITEM_REJECT_BUTTON = "workItemRejectButton"; private static final String ID_WORK_ITEM_DELEGATE_BUTTON = "workItemDelegateButton"; + private static final String ID_WORK_ITEM_CLAIM_BUTTON = "workItemClaimButton"; private static final String ID_ACTION_BUTTONS = "actionButtons"; public CaseWorkItemActionsPanel(String id, IModel caseWorkItemModel){ @@ -89,6 +98,7 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { } }; + workItemApproveButton.add(new VisibleBehaviour(() -> !CaseWorkItemUtil.isWorkItemClaimable(getModelObject()))); workItemApproveButton.setOutputMarkupId(true); actionButtonsContainer.add(workItemApproveButton); @@ -103,6 +113,7 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { } }; workItemRejectButton.setOutputMarkupId(true); + workItemRejectButton.add(new VisibleBehaviour(() -> !CaseWorkItemUtil.isWorkItemClaimable(getModelObject()))); actionButtonsContainer.add(workItemRejectButton); AjaxButton workItemDelegateButton = new AjaxButton(ID_WORK_ITEM_DELEGATE_BUTTON, @@ -115,7 +126,23 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { } }; workItemDelegateButton.setOutputMarkupId(true); + workItemDelegateButton.add(new VisibleBehaviour(() -> !CaseWorkItemUtil.isWorkItemClaimable(getModelObject()))); actionButtonsContainer.add(workItemDelegateButton); + + AjaxButton workItemClaimButton = new AjaxButton(ID_WORK_ITEM_CLAIM_BUTTON, + createStringResource("pageWorkItem.button.claim")) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget ajaxRequestTarget) { + claimWorkItemPerformed(ajaxRequestTarget); + } + }; + workItemClaimButton.add(new VisibleBehaviour(() -> CaseWorkItemUtil.isCaseWorkItemNotClosed(getModelObject()) && + CaseWorkItemUtil.isWorkItemClaimable(getModelObject()))); //todo filter for user groups + workItemClaimButton.setOutputMarkupId(true); + + actionButtonsContainer.add(workItemClaimButton); } private CaseWorkItemType getCaseWorkItemModelObject(){ @@ -128,10 +155,6 @@ protected AbstractWorkItemOutputType getWorkItemOutput(boolean approved){ .outcome(ApprovalUtils.toUri(approved)); } - private boolean isParentCaseClosed(){ - return CaseTypeUtil.isClosed(CaseWorkItemUtil.getCase(getCaseWorkItemModelObject())); - } - private void delegatePerformed(AjaxRequestTarget target) { ObjectBrowserPanel panel = new ObjectBrowserPanel( getPageBase().getMainPopupBodyId(), UserType.class, @@ -169,6 +192,11 @@ private void delegateConfirmedPerformed(AjaxRequestTarget target, UserType deleg getPageBase().redirectBack(); } + private void claimWorkItemPerformed(AjaxRequestTarget target){ + WebComponentUtil.claimWorkItemActionPerformed(getModelObject(), OPERATION_CLAIM_ITEMS, target, getPageBase()); + + } + protected Component getCustomForm() { return null; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java index 2f08b9724f6..962a8e78e68 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageWorkItemsClaimable.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.gui.api.component.ContainerableListPanel; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; import com.evolveum.midpoint.model.api.WorkflowService; import com.evolveum.midpoint.prism.query.ObjectFilter; @@ -144,32 +145,10 @@ private void claimWorkItemPerformed(IModel workItem : selectedWorkItems) { - OperationResult result = mainResult.createSubresult(OPERATION_CLAIM_ITEMS); - try { - workflowService.claimWorkItem(WorkItemId.of(workItem.getRealValue()), task, result); - result.computeStatusIfUnknown(); - } catch (ObjectNotFoundException | SecurityViolationException | RuntimeException | SchemaException | ObjectAlreadyExistsException | CommunicationException | ConfigurationException | ExpressionEvaluationException e) { - result.recordPartialError(createStringResource("pageWorkItems.message.partialError.claimed").getString(), e); - } + WebComponentUtil.claimWorkItemActionPerformed(workItem.getRealValue(), OPERATION_CLAIM_ITEMS, target, + PageWorkItemsClaimable.this); } - if (mainResult.isUnknown()) { - mainResult.recomputeStatus(); - } - - if (mainResult.isSuccess()) { - mainResult.recordStatus(OperationResultStatus.SUCCESS, - createStringResource("pageWorkItems.message.success.claimed").getString()); - } - - showResult(mainResult); - - resetWorkItemCountModel(); - target.add(this); } } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java index 8e502ec6f4d..2fd6861b57d 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java @@ -16,14 +16,14 @@ package com.evolveum.midpoint.schema.util; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismContainerable; -import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType; +import org.apache.commons.collections.CollectionUtils; import org.jetbrains.annotations.NotNull; +import java.util.List; + /** * @author bpowers @@ -74,4 +74,9 @@ public static CaseWorkItemType getWorkItem(CaseType aCase, long id) { public static boolean isCaseWorkItemNotClosed(CaseWorkItemType workItem){ return workItem != null && workItem.getCloseTimestamp() == null; } + + public static boolean isWorkItemClaimable(CaseWorkItemType workItem){ + return workItem != null && workItem.getOriginalAssigneeRef() == null && + CollectionUtils.isEmpty(workItem.getAssigneeRef()) && CollectionUtils.isNotEmpty(workItem.getCandidateRef()); + } } From 96e8fc35ca03136b2f363c469a3470b6eac36e26 Mon Sep 17 00:00:00 2001 From: kate Date: Sun, 1 Sep 2019 00:44:28 +0200 Subject: [PATCH 16/20] visibility fix for claim button --- .../admin/cases/CaseWorkItemActionsPanel.java | 3 ++- .../schema/util/CaseWorkItemUtil.java | 20 +++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java index 83a2a94d886..b31f3e710a3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/CaseWorkItemActionsPanel.java @@ -139,7 +139,8 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { } }; workItemClaimButton.add(new VisibleBehaviour(() -> CaseWorkItemUtil.isCaseWorkItemNotClosed(getModelObject()) && - CaseWorkItemUtil.isWorkItemClaimable(getModelObject()))); //todo filter for user groups + CaseWorkItemUtil.isWorkItemClaimable(getModelObject()) && + CaseWorkItemActionsPanel.this.getPageBase().getWorkflowManager().isCurrentUserAuthorizedToClaim(getModelObject()))); workItemClaimButton.setOutputMarkupId(true); actionButtonsContainer.add(workItemClaimButton); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java index 2fd6861b57d..e5769481ba2 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CaseWorkItemUtil.java @@ -19,7 +19,9 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -76,7 +78,21 @@ public static boolean isCaseWorkItemNotClosed(CaseWorkItemType workItem){ } public static boolean isWorkItemClaimable(CaseWorkItemType workItem){ - return workItem != null && workItem.getOriginalAssigneeRef() == null && - CollectionUtils.isEmpty(workItem.getAssigneeRef()) && CollectionUtils.isNotEmpty(workItem.getCandidateRef()); + return workItem != null && (workItem.getOriginalAssigneeRef() == null || StringUtils.isEmpty(workItem.getOriginalAssigneeRef().getOid())) + && !doesAssigneeExist(workItem) && CollectionUtils.isNotEmpty(workItem.getCandidateRef()); } + + public static boolean doesAssigneeExist(CaseWorkItemType workItem){ + if (workItem == null || CollectionUtils.isEmpty(workItem.getAssigneeRef())){ + return false; + } + for (ObjectReferenceType assignee : workItem.getAssigneeRef()){ + if (StringUtils.isNotEmpty(assignee.getOid())){ + return true; + } + } + return false; + } + + } From 5c4a6ca1a6aaeb8abc715099ebae1af4e2dd52aa Mon Sep 17 00:00:00 2001 From: skublik Date: Mon, 2 Sep 2019 09:14:15 +0200 Subject: [PATCH 17/20] alignment of prism property label and labels in polystring panel --- .../impl/prism/component/PolyStringEditorPanel.html | 10 +++++----- .../impl/prism/component/PolyStringEditorPanel.java | 11 +++++++++++ .../main/resources/static/less/midpoint-theme.less | 1 + 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/PolyStringEditorPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/PolyStringEditorPanel.html index aecb8c6f152..cc3892fcc7c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/PolyStringEditorPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/PolyStringEditorPanel.html @@ -17,8 +17,8 @@ -
-
+
+
@@ -28,8 +28,8 @@
-
-
+
+
@@ -41,7 +41,7 @@
-
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/PolyStringEditorPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/PolyStringEditorPanel.java index 9e9b4275c7f..9b62948d1f4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/PolyStringEditorPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/component/PolyStringEditorPanel.java @@ -91,6 +91,7 @@ private void initLayout(){ WebMarkupContainer localizedValueContainer = new WebMarkupContainer(ID_LOCALIZED_VALUE_CONTAINER); localizedValueContainer.setOutputMarkupId(true); + localizedValueContainer.add(getInputFieldClassAppenderForContainer()); localizedValueContainer.add(new VisibleBehaviour(() -> showFullData || StringUtils.isNotEmpty(localizedValue))); add(localizedValueContainer); @@ -126,6 +127,7 @@ public void onClick(AjaxRequestTarget target) { WebMarkupContainer originValueContainer = new WebMarkupContainer(ID_ORIGIN_VALUE_CONTAINER); originValueContainer.setOutputMarkupId(true); + originValueContainer.add(getInputFieldClassAppenderForContainer()); originValueContainer.add(new VisibleBehaviour(() -> showFullData || StringUtils.isEmpty(localizedValue))); add(originValueContainer); @@ -399,6 +401,15 @@ private void showHideLanguagesPerformed(AjaxRequestTarget target){ target.add(PolyStringEditorPanel.this); } + private AttributeAppender getInputFieldClassAppenderForContainer(){ + return AttributeModifier.append("class", new LoadableModel() { + @Override + protected String load() { + return showFullData ? "prism-property" : ""; + } + }); + } + private AttributeAppender getInputFieldClassAppender(){ return AttributeModifier.append("class", new LoadableModel() { @Override diff --git a/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less b/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less index e8c309dc824..e080cd82854 100644 --- a/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less +++ b/gui/admin-gui/src/main/resources/static/less/midpoint-theme.less @@ -916,6 +916,7 @@ body .treeview-menu > li > span:hover { .prism-property-label { //padding because expand collapse button, which have 37px padding-left: 20px; word-wrap:break-word; + padding-top: 5px; } .prism-value { // DEPRECATED: rework the prism-value vs prism-property-value later From 8476114d89ab85a2e6b29479920638698f584473 Mon Sep 17 00:00:00 2001 From: kate Date: Mon, 2 Sep 2019 09:58:35 +0200 Subject: [PATCH 18/20] icon for trace archetype object --- .../src/main/resources/initial-objects/026-archetype-trace.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gui/admin-gui/src/main/resources/initial-objects/026-archetype-trace.xml b/gui/admin-gui/src/main/resources/initial-objects/026-archetype-trace.xml index 7ddcd0cc48c..5afb9a04962 100644 --- a/gui/admin-gui/src/main/resources/initial-objects/026-archetype-trace.xml +++ b/gui/admin-gui/src/main/resources/initial-objects/026-archetype-trace.xml @@ -27,6 +27,9 @@ Traces + + fa fa-stethoscope + From 0d49aea97b2c0da4e509075e4f96a772e6f763f5 Mon Sep 17 00:00:00 2001 From: kate Date: Mon, 2 Sep 2019 11:22:04 +0200 Subject: [PATCH 19/20] MID-5694 audit log viewer search fix --- .../AutoCompleteItemDefinitionPanel.java | 7 ----- .../gui/api/component/path/ItemPathPanel.java | 27 ++++++++++++------- .../component/path/ItemPathSegmentPanel.java | 5 ++-- .../component/AuditLogViewerPanel.java | 1 + 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteItemDefinitionPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteItemDefinitionPanel.java index aded7cb4246..9235d627fb3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteItemDefinitionPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/AutoCompleteItemDefinitionPanel.java @@ -58,13 +58,6 @@ protected Iterator getChoices(String input) { } - @Override - protected void onConfigure() { - super.onConfigure(); - itemDefinitionAsStringModel.setObject(null); - } - - }; input.add(new OnChangeAjaxBehavior() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/path/ItemPathPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/path/ItemPathPanel.java index 0207268c03b..bf27c7bdd84 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/path/ItemPathPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/path/ItemPathPanel.java @@ -7,6 +7,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.markup.html.WebMarkupContainer; @@ -64,6 +65,16 @@ public ItemPathPanel(String id, ItemPathType itemPath) { } + @Override + protected void onConfigure(){ + super.onConfigure(); + if (getModelObject() == null || getModelObject().getItemDef() == null){ + ItemPathSegmentPanel itemPathSegmentPanel = getItemPathSegmentPanel(); + if (itemPathSegmentPanel != null){ + itemPathSegmentPanel.getBaseFormComponent().getDefaultModel().setObject(null); + } + } + } private void initLayout() { initItemPathPanel(); @@ -87,15 +98,7 @@ public boolean isVisible() { }); - ItemPathSegmentPanel itemDefPanel = new ItemPathSegmentPanel(ID_DEFINITION, - new IModel() { - - private static final long serialVersionUID = 1L; - public ItemPathDto getObject() { - return ItemPathPanel.this.getModelObject(); - } - - }) { + ItemPathSegmentPanel itemDefPanel = new ItemPathSegmentPanel(ID_DEFINITION, getModel()) { private static final long serialVersionUID = 1L; @@ -109,6 +112,7 @@ protected void onUpdateAutoCompletePanel(AjaxRequestTarget target) { ItemPathPanel.this.onUpdate(ItemPathPanel.this.getModelObject()); } }; + itemDefPanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); itemDefPanel.setOutputMarkupId(true); itemPathPanel.add(itemDefPanel); @@ -118,7 +122,6 @@ protected void onUpdateAutoCompletePanel(AjaxRequestTarget target) { @Override public void onClick(AjaxRequestTarget target) { refreshItemPathPanel(new ItemPathDto(ItemPathPanel.this.getModelObject()), true, target); - } }; @@ -287,4 +290,8 @@ protected void onUpdate(ItemPathDto itemPathDto) { } + protected ItemPathSegmentPanel getItemPathSegmentPanel(){ + return (ItemPathSegmentPanel) get(ID_ITEM_PATH).get(ID_DEFINITION); + } + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/path/ItemPathSegmentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/path/ItemPathSegmentPanel.java index 0337a17048b..33d4f26532d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/path/ItemPathSegmentPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/path/ItemPathSegmentPanel.java @@ -6,6 +6,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; import org.apache.commons.lang.StringUtils; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -85,7 +86,7 @@ protected void onUpdateAutoComplete(AjaxRequestTarget target, } }; -// itemDefPanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); + itemDefPanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); itemDefPanel.setOutputMarkupId(true); add(itemDefPanel); } @@ -146,7 +147,7 @@ public boolean validate() { } public Component getBaseFormComponent() { - return get(ID_DEFINITION); + return ((AutoCompleteItemDefinitionPanel)get(ID_DEFINITION)).getBaseFormComponent(); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java index f577ac53d73..f3df9456ce0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java @@ -29,6 +29,7 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.gui.api.component.path.ItemPathDto; import com.evolveum.midpoint.prism.path.ItemPath; import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AjaxRequestTarget; From c11794dd3a3b295951c815c7ecf9670fb9771b54 Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Mon, 2 Sep 2019 15:15:10 +0200 Subject: [PATCH 20/20] test for wrapper delta - create object --- .../midpoint/gui/TestWrapperDelta.java | 128 ++++++++++++------ 1 file changed, 84 insertions(+), 44 deletions(-) diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestWrapperDelta.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestWrapperDelta.java index 008982673c0..3935f6be1a5 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestWrapperDelta.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestWrapperDelta.java @@ -11,7 +11,6 @@ import com.evolveum.midpoint.gui.impl.prism.PrismPropertyWrapper; import com.evolveum.midpoint.gui.test.TestMidPointSpringApplication; import com.evolveum.midpoint.model.api.ModelExecuteOptions; -import com.evolveum.midpoint.model.api.context.Mapping; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -34,6 +33,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import com.evolveum.prism.xml.ns._public.types_3.ModificationTypeType; +import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ActiveProfiles; @@ -81,11 +81,6 @@ public void test100modifyUserFullname() throws Exception { WrapperContext ctx = new WrapperContext(task, result); PrismObjectWrapper objectWrapper =createObjectWrapper(userElaineBefore, ItemStatus.NOT_CHANGED, ctx); -// ModelServiceLocator locator = getServiceLocator(task); -// PrismObjectWrapperFactory objectFactory = locator.findObjectWrapperFactory(userElaineBefore.getDefinition()); -// -// PrismObjectWrapper objectWrapper = objectFactory.createObjectWrapper(userElaineBefore, ItemStatus.NOT_CHANGED, ctx); - PrismPropertyWrapper fullName = objectWrapper.findProperty(UserType.F_FULL_NAME); fullName.getValue().setRealValue(PrismTestUtil.createPolyString("Sparrow-Marley")); @@ -95,24 +90,6 @@ public void test100modifyUserFullname() throws Exception { assertModificationsSize(elaineDelta, 1); assertModification(elaineDelta, UserType.F_FULL_NAME, ModificationTypeType.REPLACE, PrismTestUtil.createPolyString("Sparrow-Marley")); -// assertNotNull("Unexpeted null delta", elaineDelta); -// -// Collection> modifications = elaineDelta.getModifications(); -// assertEquals( ObjectDelta elaineDelta = objectWrapper.getObjectDelta(); -// assertNotNull("Unexpeted null delta", elaineDelta); -// -// Collection> modifications = elaineDelta.getModifications(); -// assertEquals("Enexpected modifications size", 1, modifications.size()); - -// PropertyDelta fullNameDelta = elaineDelta.findPropertyDelta(UserType.F_FULL_NAME); -// assertNotNull("Unexpected null fullName delta", fullNameDelta); -// assertTrue(fullNameDelta.isReplace()); -// -// Collection> valuesToReplace = fullNameDelta.getValuesToReplace(); -// assertEquals("Unexpected numbers of values", 1, valuesToReplace.size()); -// PrismPropertyValue value = valuesToReplace.iterator().next(); -// assertEquals("Unexpected value to replace", "Sparrow-Marley", value.getValue().getOrig()); - //WHEN executeChanges(elaineDelta, null, task, result); @@ -171,26 +148,7 @@ public void test110modifyUserAddAssignment() throws Exception { WrapperContext ctx = new WrapperContext(task, result); PrismObjectWrapper objectWrapper =createObjectWrapper(userElaineBefore, ItemStatus.NOT_CHANGED, ctx); - PrismContainerWrapper assignment = objectWrapper.findContainer(UserType.F_ASSIGNMENT); - assertNotNull("unexpected null assignment wrapper", assignment); - assertEquals("Unexpected values for assignment " + assignment.getValues().size(), 0, assignment.getValues().size()); - - ModelServiceLocator locator = getServiceLocator(task); - - PrismContainerValue newAssignment = assignment.getItem().createNewValue(); - AssignmentType newAssignmentType = newAssignment.asContainerable(); - - ConstructionType constructionType = new ConstructionType(locator.getPrismContext()); - constructionType.setResourceRef(ObjectTypeUtil.createObjectRef(resourceDummy, locator.getPrismContext())); - constructionType.setKind(ShadowKindType.ACCOUNT); - constructionType.setIntent("default"); - - newAssignmentType.setConstruction(constructionType); - - PrismContainerValue newAssignmentClone = newAssignment.clone(); - - PrismContainerValueWrapper vw = locator.createValueWrapper(assignment, newAssignment, ValueStatus.ADDED, ctx); - assignment.getValues().add(vw); + PrismContainerValue newAssignmentClone = createDummyResourceAssignment(objectWrapper, 0, task, result); ObjectDelta delta = objectWrapper.getObjectDelta(); assertModificationsSize(delta, 1); @@ -296,6 +254,88 @@ public void test111modifyUserAssignemnt() throws Exception { } + @Test + public void test200createUser() throws Exception { + String TEST_NAME = "test200createUser"; + displayTestTitle(TEST_NAME); + + Task task = createSimpleTask(TEST_NAME); + OperationResult result = task.getResult(); + + PrismObjectDefinition def = getServiceLocator(task).getPrismContext().getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); + PrismObject user = def.instantiate(); + WrapperContext ctx = new WrapperContext(task, result); + + PrismObjectWrapper userWrapper = createObjectWrapper(user, ItemStatus.ADDED, ctx); + + PrismPropertyWrapper username = userWrapper.findProperty(UserType.F_NAME); + username.getValue().setRealValue(PrismTestUtil.createPolyString("guybrush")); + + PrismPropertyWrapper fullName = userWrapper.findProperty(UserType.F_FULL_NAME); + fullName.getValue().setRealValue(PrismTestUtil.createPolyString("Guybrush Threepwood")); + + PrismPropertyWrapper password = userWrapper.findProperty(SchemaConstants.PATH_PASSWORD_VALUE); + ProtectedStringType pwd = new ProtectedStringType(); + pwd.setClearValue("howMuchWoodWouldWoodchuckChuckIfWoodchuckCouldChuckWood"); + password.getValue().setRealValue(pwd); + + PrismContainerValue newAssignment = createDummyResourceAssignment(userWrapper, 0, task, result); + + ObjectDelta delta = userWrapper.getObjectDelta(); + assertModificationsSize(delta, 0); + + PrismObject objectToAdd = delta.getObjectToAdd(); + assertNotNull("Unexpected null object to add", objectToAdd); + + assertUserProperty(objectToAdd, UserType.F_NAME, PrismTestUtil.createPolyString("guybrush")); + assertUserProperty(objectToAdd, UserType.F_FULL_NAME, PrismTestUtil.createPolyString("Guybrush Threepwood")); + + UserAsserter.forUser(objectToAdd) + .assertName("guybrush") + .assertFullName("Guybrush Threepwood") + .assertAssignments(1); + + PrismProperty passwordBeforeSave = objectToAdd.findProperty(SchemaConstants.PATH_PASSWORD_VALUE); + assertNotNull("Unexpected null password property", passwordBeforeSave); + assertEquals("Unexpected password in delta: " + passwordBeforeSave.getRealValue(), pwd, passwordBeforeSave.getRealValue()); + + executeChanges(delta, null, task, result); + + PrismObject userAfter = findUserByUsername("guybrush"); + + UserAsserter.forUser(userAfter) + .assertName("guybrush") + .assertFullName("Guybrush Threepwood") + .assertAssignments(1); + + } + + private PrismContainerValue createDummyResourceAssignment(PrismObjectWrapper objectWrapper, int existingAssignments, Task task, OperationResult result) throws Exception { + PrismContainerWrapper assignment = objectWrapper.findContainer(UserType.F_ASSIGNMENT); + assertNotNull("unexpected null assignment wrapper", assignment); + assertEquals("Unexpected values for assignment " + assignment.getValues().size(), existingAssignments, assignment.getValues().size()); + + ModelServiceLocator locator = getServiceLocator(task); + + PrismContainerValue newAssignment = assignment.getItem().createNewValue(); + AssignmentType newAssignmentType = newAssignment.asContainerable(); + + ConstructionType constructionType = new ConstructionType(locator.getPrismContext()); + constructionType.setResourceRef(ObjectTypeUtil.createObjectRef(resourceDummy, locator.getPrismContext())); + constructionType.setKind(ShadowKindType.ACCOUNT); + constructionType.setIntent("default"); + + newAssignmentType.setConstruction(constructionType); + + PrismContainerValue newAssignmentClone = newAssignment.clone(); + + WrapperContext ctx = new WrapperContext(task, result); + PrismContainerValueWrapper vw = locator.createValueWrapper(assignment, newAssignment, ValueStatus.ADDED, ctx); + assignment.getValues().add(vw); + + return newAssignmentClone; + } + private ExpressionType createAsIsExpression() { ExpressionType expressionType = new ExpressionType(); ObjectFactory objectFactory = new ObjectFactory();