From 541f4f66edf225594a38ed0af0db532cb9d4d27c Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 9 Jul 2014 12:11:30 +0200 Subject: [PATCH 01/12] A couple of bulk action samples. --- .../list-selected-resource-objects-2.xml | 61 +++++++++++++++++++ .../list-selected-resource-objects-3.xml | 61 +++++++++++++++++++ .../list-selected-resource-objects.xml | 57 +++++++++++++++++ ...cted-users.xml => list-selected-users.xml} | 0 4 files changed, 179 insertions(+) create mode 100644 samples/tasks/bulk-actions/list-selected-resource-objects-2.xml create mode 100644 samples/tasks/bulk-actions/list-selected-resource-objects-3.xml create mode 100644 samples/tasks/bulk-actions/list-selected-resource-objects.xml rename samples/tasks/bulk-actions/{log-selected-users.xml => list-selected-users.xml} (100%) diff --git a/samples/tasks/bulk-actions/list-selected-resource-objects-2.xml b/samples/tasks/bulk-actions/list-selected-resource-objects-2.xml new file mode 100644 index 00000000000..9f4e7cf9695 --- /dev/null +++ b/samples/tasks/bulk-actions/list-selected-resource-objects-2.xml @@ -0,0 +1,61 @@ + + + + + + + List selected resource objects (by name) + + + + c:ShadowType + + + + resourceRef + + ef2bc95b-76e0-48e2-86d6-3d4f02d30001 + ResourceType + + + + objectClass + ri:CustomAcceptedDomainObjectClass + + + attributes/icfs:name + test domain + + + + + log + + + + + + runnable + + BulkActions + http://midpoint.evolveum.com/xml/ns/public/model/scripting/handler-3 + single + + + diff --git a/samples/tasks/bulk-actions/list-selected-resource-objects-3.xml b/samples/tasks/bulk-actions/list-selected-resource-objects-3.xml new file mode 100644 index 00000000000..6544dae7a93 --- /dev/null +++ b/samples/tasks/bulk-actions/list-selected-resource-objects-3.xml @@ -0,0 +1,61 @@ + + + + + + + List selected resource objects (by uid) + + + + c:ShadowType + + + + resourceRef + + ef2bc95b-76e0-48e2-86d6-3d4f02d30001 + ResourceType + + + + objectClass + ri:CustomAcceptedDomainObjectClass + + + attributes/icfs:uid + ec51c25e-1de6-4747-872e-f5f58203ef22 + + + + + log + + + + + + runnable + + BulkActions + http://midpoint.evolveum.com/xml/ns/public/model/scripting/handler-3 + single + + + diff --git a/samples/tasks/bulk-actions/list-selected-resource-objects.xml b/samples/tasks/bulk-actions/list-selected-resource-objects.xml new file mode 100644 index 00000000000..107aff733d5 --- /dev/null +++ b/samples/tasks/bulk-actions/list-selected-resource-objects.xml @@ -0,0 +1,57 @@ + + + + + + + List selected resource objects + + + + c:ShadowType + + + + resourceRef + + ef2bc95b-76e0-48e2-86d6-3d4f02d30001 + ResourceType + + + + objectClass + ri:CustomAcceptedDomainObjectClass + + + + + log + + + + + + runnable + + BulkActions + http://midpoint.evolveum.com/xml/ns/public/model/scripting/handler-3 + single + + + diff --git a/samples/tasks/bulk-actions/log-selected-users.xml b/samples/tasks/bulk-actions/list-selected-users.xml similarity index 100% rename from samples/tasks/bulk-actions/log-selected-users.xml rename to samples/tasks/bulk-actions/list-selected-users.xml From 7ec1bed1a7955e3327091d10c022fe3154aedde7 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 9 Jul 2014 12:22:22 +0200 Subject: [PATCH 02/12] Added missing adopt() --- .../web/page/admin/resources/content/PageAccount.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageAccount.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageAccount.java index a02fc5e019e..161c2b915b3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageAccount.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageAccount.java @@ -201,11 +201,17 @@ private void savePerformed(AjaxRequestTarget target) { ObjectWrapper wrapper = accountModel.getObject(); try { ObjectDelta delta = wrapper.getObjectDelta(); + if (delta == null) { + return; + } + if (delta.getPrismContext() == null) { + getPrismContext().adopt(delta); + } if (LOGGER.isTraceEnabled()) { LOGGER.trace("Account delta computed from form:\n{}", new Object[]{delta.debugDump(3)}); } - if (delta == null || delta.isEmpty()) { + if (delta.isEmpty()) { return; } WebMiscUtil.encryptCredentials(delta, true, getMidpointApplication()); From 1fc146b2eb28180b6cc73a384970d3d5b6367b8f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 10 Jul 2014 14:08:37 +0200 Subject: [PATCH 03/12] Enhancing the WSDL documentation a bit. --- .../xml/ns/public/model/model-3.wsdl | 419 ++++++++++++++---- 1 file changed, 337 insertions(+), 82 deletions(-) diff --git a/infra/schema/src/main/resources/xml/ns/public/model/model-3.wsdl b/infra/schema/src/main/resources/xml/ns/public/model/model-3.wsdl index 6c37fd1f935..f491d24022e 100644 --- a/infra/schema/src/main/resources/xml/ns/public/model/model-3.wsdl +++ b/infra/schema/src/main/resources/xml/ns/public/model/model-3.wsdl @@ -29,19 +29,19 @@ - Interface of the IDM Model subsystem. +

Interface of the IDM Model subsystem.

- IDM Model Web interface provides access unified to the identity objects stored in the repository and on the resources. It - abstracts away the details about where and how are the data stored, it hides all the low-level system components. +

IDM Model Web interface provides unified access to the identity objects stored in the repository and on resources. It + abstracts away the details about where and how are the data stored, it hides all the low-level system components.

- Implementation of this interface are expected to enforce a consistency of access control decisions and model, e.g. to enforce - Role-Based Access Control (RBAC). RBAC is only one of many possibly models and this interface may have many implementations. +

Implementations of this interface are expected to enforce a consistency of access control decisions and model, e.g. to enforce + Role-Based Access Control (RBAC). RBAC is only one of many possibly models and this interface may have many implementations.

- Implementations of this interface may automatically derive properties and attributes for objects. E.g. RBAC models may - automatically derive resource accounts attributes based on user role membership. +

Implementations of this interface may automatically derive properties and attributes for objects. E.g. RBAC models may + automatically derive resource accounts attributes based on user role membership.

- This a web service version of the IDM Model Interface represented in WSDL. As such it has some inherent limitations but it is - usable for remote access to the Model services. +

This a web service version of the IDM Model Interface represented in WSDL. As such it has some inherent limitations but it is + usable for remote access to the Model services.

@@ -64,33 +64,102 @@ schemaLocation="http://midpoint.evolveum.com/xml/ns/public/resource/capabilities-3"/> + + + A request for getObject operation. + + - - - + + + + Type (class) of an object to get. For example, {...common-3}UserType means the user object type. + + + + + + + OID of the object to get. + + + + + + + Options influencing the retrieval and processing of the object. + + + + + + A response from getObject operation. + + - - + + + + The retrieved object. + + + + + + + The result of the operation. + + + + + + A request for executeChanges operation. + + - - + + + + List of object deltas to be applied. + + + + + + + Options influencing the execution of the operation. + + + + + + A response from executeChanges operation. + + - + + + + List of object delta operations (deltas + operation results). OIDs of newly created objects can be found + in these ObjectDeltas (which may or may not be original ObjectDeltas passed to the method). + + + @@ -98,24 +167,58 @@ + + + A request for searchObjects operation. + + - - + + + + Type (class) of an object to get. For example, {...common-3}UserType means the user object type. + + + + - Search criteria (may be null). + Search criteria. If not specified, all objects of a given type are returned. + + + + + + + Options influencing the retrieval and processing of objects. - + + + A response from searchObjects operation. + + - - + + + + List of objects that match given criteria. + + + + + + + The result of the operation. + + + @@ -123,37 +226,99 @@ + + + A request for findShadowOwner operation. + + - + + + + OID of the shadow to look for an owner. + + + + + + A response from findShadowOwner operation. + + - - + + + + Owner of the account (if found). + + + + + + + Operation result covering the operation executed. + + + + + + A request for testResource operation. + + - + + + + OID of the resource that is to be tested. + + + + + + A response from testResource operation. + + - + + + + Result from the resource test. + + + + + + A request for importFromResource operation. + + + - + + + + OID of the resource to be imported from. + + + @@ -167,8 +332,19 @@ + + + A response from importFromResource operation. + + - + + + + Task that is (asynchronously) executing the import procedure. + + + @@ -179,34 +355,96 @@ + + + A request for notifyChange operation. + + - + + + + Description of the change in the external resource. + + + + + + A response from notifyChange operation. + + - + + + + Task, in context of which the event was processed. + + + + + + A request for executeScripts operation. + + - - + + + + Scripts in the XML format. + + + + + + + Scripts in the midPoint Scripting Language (textual) format. Not yet available. + + + - + + + + Options that drive the script execution. + + + + + + A response from executeScripts operation. + + - - + + + + Output of the execution of script(s). + + + + + + + Operation result covering the execution of script(s). + + + @@ -235,11 +473,6 @@ - - @@ -311,15 +544,20 @@ - Returns object for provided OID. - Must fail if object with the OID does not exists. +

Returns object for provided OID. It retrieves the object from an appropriate source + for an object type (e.g. internal repository, resource or both), merging data as necessary, + processing any policies, caching mechanisms, etc. This can be influenced by using options.

- Reference resolution is SUPPORTED by this operation. +

Must fail if object with the OID does not exists.

- Faults: - any SystemFaultType - IllegalArgumentFaultType: wrong OID format - ObjectNotFoundFaultType: object with specified OID does not exists +

Reference resolution is SUPPORTED by this operation.

+ +

Faults (TODO):

+
    +
  • any SystemFaultType
  • +
  • IllegalArgumentFaultType: wrong OID format
  • +
  • ObjectNotFoundFaultType: object with specified OID does not exists
  • +
@@ -328,11 +566,26 @@ - Search for objects in the repository. Searches through all - object types. Returns a list of objects that match search - criteria. +

+ Search for objects. +

+

+ Searches through all object of a specified type. Returns a list of objects that match + search criteria. +

+

+ Note that this method has a very limited scaling capability + as all the results are stored in the memory. DO NOT USE on large datasets. + Recommended usage is only when using queries that cannot return large number + of results (e.g. queries for unique values) or when combined with paging capability. +

+

+ Returns empty list if object type is correct but there are no objects of + that type. Fails if object type is wrong. Should fail if unknown property is + specified in the query. +

- Faults: + TODO Faults: any SystemFaultType IllegalArgumentFaultType: wrong object type SchemaViolationFaultType: unknown property used in search query @@ -406,16 +659,20 @@ - Returns the User object representing owner of specified account - (account shadow). - May return (null?? empty??) object if there is no owner - specified for the account. - - Implements the backward "owns" association between account - shadow and user. Forward association is implemented by property - "account" of user object. +

+ Returns the User object representing owner of specified account (account + shadow). +

+

+ May return null if there is no owner specified for the account. +

+

+ Implements the backward "owns" association between account shadow and + user. Forward association is implemented by property "linkRef" of user + object. +

- Faults: + Faults (TODO): any SystemFaultType IllegalArgumentFaultType: wrong OID format ObjectNotFoundFaultType: object with specified OID does not exists @@ -427,22 +684,22 @@ - WARNING: - This operation should not be here. It is in fact +

WARNING:

+

This operation should not be here. It is in fact just a diagnostics methods from the provisioning interface that need to be accessed from GUI. Do not use it for - anything serious. It will disappear eventually. + anything serious. It will disappear eventually.

- Test the resouce connection and basic resource connector - functionality. +

Test the resouce connection and basic resource connector + functionality.

- This operation will NOT raise fault in case the resource +

This operation will NOT raise fault in case the resource connection fails. It such case it will indicate the failure in the return message, but the operation itself succeeds. The operations fails only if the provided arguments are wrong, - in case of system error, system misconfiguration, etc. + in case of system error, system misconfiguration, etc.

- Faults: + Faults (TODO): any SystemFaultType ObjectNotFoundFaultType: specified Resource definition does not exist
@@ -453,19 +710,17 @@ - TODO: update description - - Launch import task that will import all the accounts from the - resource. +

Launch import task that will import all the accounts (or other objects + of specified type) from the resource.

- WARNING: This operation is not considered public. It is a +

WARNING: This operation is not considered public. It is a temporary solution until we have full-featured task management. - It may be removed any time without a warning. + It may be removed any time without a warning.

- DO NOT USE IT unless you are really sure you know what you - are doing. +

DO NOT USE IT unless you are really sure you know what you + are doing.

- Faults: + Faults (TODO): any SystemFaultType ObjectNotFoundFaultType: specified Resource definition does not exist
@@ -476,9 +731,7 @@ - TODO: update description - - Trigger change notification. +

Triggers processing of a resource-related change notification.

@@ -487,6 +740,8 @@ +

Executes one or more midPoint scripts (bulk actions).

+

NOTE: This method is not fully implemented yet.

From 37cc834e9c483e2b902df589400618076c7f0a1a Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 10 Jul 2014 14:44:32 +0200 Subject: [PATCH 04/12] Added prismContext to ItemDelta and PrismContainerValue. Made prismContext in Definition and ObjectDelta mandatory. Added calls to revive at many places in GUI, trying to solve MID-1928 (missing prismContext). --- .../assignment/AssignmentTablePanel.java | 2 +- .../web/component/prism/ContainerWrapper.java | 18 +- .../web/component/prism/ItemWrapper.java | 3 +- .../web/component/prism/ObjectWrapper.java | 18 +- .../web/component/prism/PropertyWrapper.java | 12 ++ .../web/component/util/LoadableModel.java | 10 ++ .../itemApproval/ItemApprovalPanel.java | 4 +- .../admin/configuration/PageDebugView.java | 7 +- .../admin/resources/content/PageAccount.java | 3 +- .../web/page/admin/roles/PageRole.java | 2 + .../web/page/admin/users/PageOrgUnit.java | 7 + .../web/page/admin/users/PageUser.java | 21 +-- .../web/page/admin/workflow/PageWorkItem.java | 13 +- .../workflow/dto/ProcessInstanceDto.java | 6 + .../midpoint/web/util/WebMiscUtil.java | 47 ++++++ .../midpoint/prism/ComplexTypeDefinition.java | 2 +- .../evolveum/midpoint/prism/Definition.java | 7 +- .../com/evolveum/midpoint/prism/Item.java | 19 ++- .../midpoint/prism/ItemDefinition.java | 2 +- .../midpoint/prism/PrismContainer.java | 16 +- .../prism/PrismContainerDefinition.java | 6 +- .../midpoint/prism/PrismContainerValue.java | 57 +++++-- .../evolveum/midpoint/prism/PrismContext.java | 8 +- .../midpoint/prism/PrismProperty.java | 8 +- .../prism/PrismPropertyDefinition.java | 2 +- .../midpoint/prism/PrismReference.java | 4 +- .../prism/PrismReferenceDefinition.java | 2 +- .../evolveum/midpoint/prism/PrismValue.java | 2 +- .../midpoint/prism/delta/ContainerDelta.java | 20 +-- .../midpoint/prism/delta/ItemDelta.java | 49 ++++-- .../midpoint/prism/delta/ObjectDelta.java | 15 +- .../midpoint/prism/delta/PropertyDelta.java | 40 ++--- .../midpoint/prism/delta/ReferenceDelta.java | 34 ++-- .../prism/json/PrismJasonProcessor.java | 2 +- .../midpoint/prism/parser/QueryConvertor.java | 2 +- .../midpoint/prism/parser/XNodeProcessor.java | 14 +- .../midpoint/prism/util/RawTypeUtil.java | 10 +- .../prism/xml/ns/_public/types_3/RawType.java | 2 +- .../evolveum/midpoint/prism/TestCompare.java | 2 +- .../evolveum/midpoint/prism/TestDelta.java | 158 +++++++++--------- .../com/evolveum/midpoint/prism/TestDiff.java | 12 +- .../prism/TestPrismObjectConstruction.java | 26 +-- .../midpoint/schema/TestDiffEquals.java | 8 +- .../midpoint/schema/TestJaxbConstruction.java | 2 + .../midpoint/schema/TestSchemaDelta.java | 8 +- ...ImportAccountsFromResourceTaskHandler.java | 6 +- .../ImportObjectsFromFileTaskHandler.java | 4 +- .../lens/projector/AssignmentProcessor.java | 2 +- .../lens/projector/CredentialsProcessor.java | 2 +- .../impl/lens/projector/InboundProcessor.java | 2 +- .../projector/ReconciliationProcessor.java | 4 +- .../impl/util/AbstractScannerTaskHandler.java | 2 +- .../AbstractInternalModelIntegrationTest.java | 2 +- .../model/intest/TestMultiResource.java | 2 +- .../test/AbstractModelIntegrationTest.java | 8 +- .../primary/user/AddRoleAssignmentAspect.java | 2 +- .../provisioning/impl/ResourceManager.java | 2 +- .../ucf/impl/ConnectorInstanceIcfImpl.java | 2 +- .../provisioning/test/ucf/TestUcfOpenDj.java | 6 +- .../midpoint/repo/sql/ConcurrencyTest.java | 13 +- .../midpoint/repo/sql/ModifyTest.java | 8 +- .../task/quartzimpl/TaskQuartzImpl.java | 12 +- .../TestQuartzTaskManagerContract.java | 2 +- .../midpoint/testing/sanity/TestSanity.java | 2 +- 64 files changed, 510 insertions(+), 285 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java index 6c91a813377..08f65f04bd8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java @@ -445,7 +445,7 @@ public void handleAssignmentsWhenAdd(PrismObject object, PrismContainerDefini public ContainerDelta handleAssignmentDeltas(ObjectDelta userDelta, PrismContainerDefinition def, QName assignmentPath) throws SchemaException { - ContainerDelta assDelta = new ContainerDelta(new ItemPath(), assignmentPath, def); + ContainerDelta assDelta = new ContainerDelta(new ItemPath(), assignmentPath, def, def.getPrismContext()); // hoping that def contains a prism context! //PrismObject org = (PrismObject)getModel().getObject().getAssignmentParent(); //PrismObjectDefinition orgDef = org.getDefinition(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerWrapper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerWrapper.java index dd0f41534c3..bb876f55fdd 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerWrapper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerWrapper.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -88,7 +89,22 @@ public ContainerWrapper(ObjectWrapper object, T container, ContainerStatus statu containerDefinition = getContainerDefinition(); properties = createProperties(pageBase); } - + + public void revive(PrismContext prismContext) throws SchemaException { + if (container != null) { + container.revive(prismContext); + } + if (containerDefinition != null) { + containerDefinition.revive(prismContext); + } + if (properties != null) { + for (PropertyWrapper propertyWrapper : properties) { + propertyWrapper.revive(prismContext); + } + } + } + + protected PrismContainerDefinition getContainerDefinition() { if (main) { return object.getDefinition(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ItemWrapper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ItemWrapper.java index b816e0afdd3..f25c5718397 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ItemWrapper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ItemWrapper.java @@ -17,11 +17,12 @@ package com.evolveum.midpoint.web.component.prism; import com.evolveum.midpoint.prism.Item; +import com.evolveum.midpoint.prism.Revivable; /** * @author lazyman */ -public interface ItemWrapper { +public interface ItemWrapper extends Revivable { String getDisplayName(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java index 10ef61c8bfc..03f50e4086a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapper.java @@ -55,7 +55,7 @@ /** * @author lazyman */ -public class ObjectWrapper implements Serializable { +public class ObjectWrapper implements Serializable, Revivable { public static final String F_DISPLAY_NAME = "displayName"; public static final String F_SELECTED = "selected"; @@ -120,6 +120,20 @@ public void initializeContainers(PageBase pageBase) { containers = createContainers(pageBase); } + public void revive(PrismContext prismContext) throws SchemaException { + if (object != null) { + object.revive(prismContext); + } + if (oldDelta != null) { + oldDelta.revive(prismContext); + } + if (containers != null) { + for (ContainerWrapper containerWrapper : containers) { + containerWrapper.revive(prismContext); + } + } + } + public List getAssociations() { return associations; } @@ -480,7 +494,7 @@ public ObjectDelta getObjectDelta() throws SchemaException { ItemPath path = containerWrapper.getPath() != null ? containerWrapper.getPath() : new ItemPath(); - PropertyDelta pDelta = new PropertyDelta(path, propertyDef.getName(), propertyDef); + PropertyDelta pDelta = new PropertyDelta(path, propertyDef.getName(), propertyDef, propertyDef.getPrismContext()); // hoping the prismContext is there for (ValueWrapper valueWrapper : propertyWrapper.getValues()) { valueWrapper.normalize(); ValueStatus valueStatus = valueWrapper.getStatus(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PropertyWrapper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PropertyWrapper.java index ce7ad40999d..e64cad8b8f3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PropertyWrapper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PropertyWrapper.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.web.component.prism; import com.evolveum.midpoint.prism.ItemDefinition; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; import com.evolveum.midpoint.prism.PrismPropertyDefinition; @@ -25,6 +26,7 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; @@ -66,6 +68,15 @@ public PropertyWrapper(ContainerWrapper container, PrismProperty property, boole } } + public void revive(PrismContext prismContext) throws SchemaException { + if (property != null) { + property.revive(prismContext); + } + if (itemDefinition != null) { + itemDefinition.revive(prismContext); + } + } + protected PrismPropertyDefinition getItemDefinition() { PrismPropertyDefinition propDef = container.getContainerDefinition().findPropertyDefinition(property.getDefinition().getName()); if (propDef == null) { @@ -222,4 +233,5 @@ public boolean isReadonly() { public void setReadonly(boolean readonly) { this.readonly = readonly; } + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/LoadableModel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/LoadableModel.java index 80747ce0e28..2f4bca8f633 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/LoadableModel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/LoadableModel.java @@ -16,6 +16,9 @@ package com.evolveum.midpoint.web.component.util; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.web.util.WebMiscUtil; import org.apache.wicket.model.IModel; public abstract class LoadableModel implements IModel { @@ -101,4 +104,11 @@ protected void onLoad() { protected void onDetach() { } + + public void revive(PrismContext prismContext) throws SchemaException { + if (isLoaded()) { + WebMiscUtil.reviveObject(object, prismContext); + } + } + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.java index 2772b886115..c9bc840c72c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wf/processes/itemApproval/ItemApprovalPanel.java @@ -234,7 +234,9 @@ public Object getObject() { @Override public List getObject() { List retval = new ArrayList<>(); - ItemApprovalProcessState instanceState = (ItemApprovalProcessState) model.getObject().getInstanceState().getProcessSpecificState(); + ProcessInstanceDto processInstanceDto = model.getObject(); + processInstanceDto.reviveIfNeeded(ItemApprovalPanel.this); + ItemApprovalProcessState instanceState = (ItemApprovalProcessState) processInstanceDto.getInstanceState().getProcessSpecificState(); List allDecisions = instanceState.getDecisions(); if (allDecisions != null) { for (DecisionType decision : allDecisions) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java index 529d38a20ef..27cdce7069b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugView.java @@ -264,10 +264,7 @@ public void savePerformed(AjaxRequestTarget target) { try { PrismObject oldObject = dto.getObject(); - if (oldObject.getPrismContext() == null) { - LOGGER.warn("No prism context in old object {}, adding it", oldObject); - oldObject.setPrismContext(getPrismContext()); - } + oldObject.revive(getPrismContext()); Holder> objectHolder = new Holder>(null); validateObject(editor.getModel().getObject(), objectHolder, validateSchema.getObject(), result); @@ -279,7 +276,7 @@ public void savePerformed(AjaxRequestTarget target) { if (delta.getPrismContext() == null) { LOGGER.warn("No prism context in delta {} after diff, adding it", delta); - delta.setPrismContext(getPrismContext()); + delta.revive(getPrismContext()); } //quick fix for now (MID-1910), maybe it should be somewhere in model.. diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageAccount.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageAccount.java index 161c2b915b3..66e374ef5dd 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageAccount.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/content/PageAccount.java @@ -198,8 +198,9 @@ private void savePerformed(AjaxRequestTarget target) { LOGGER.debug("Saving account changes."); OperationResult result = new OperationResult(OPERATION_SAVE_ACCOUNT); - ObjectWrapper wrapper = accountModel.getObject(); try { + WebMiscUtil.revive(accountModel, getPrismContext()); + ObjectWrapper wrapper = accountModel.getObject(); ObjectDelta delta = wrapper.getObjectDelta(); if (delta == null) { return; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java index 781d9d68876..54fd226b447 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java @@ -294,6 +294,8 @@ protected void onSubmit(AjaxRequestTarget target, Form form){ private void savePerformed(AjaxRequestTarget target){ OperationResult result = new OperationResult(OPERATION_SAVE_ROLE); try { + WebMiscUtil.revive(model, getPrismContext()); + ModelService modelService = getModelService(); PrismObject newRole = model.getObject(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java index 699543cb08e..2fd44cd72ad 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java @@ -445,6 +445,7 @@ private boolean isOrgParent(OrgType unit, List parentList){ private void savePerformed(AjaxRequestTarget target) { OperationResult result = new OperationResult(SAVE_UNIT); try { + reviveModels(); ObjectDelta delta = null; if (!isEditing()) { PrismObject newOrgUnit = buildUnitFromModel(null); @@ -575,4 +576,10 @@ private List loadParentOrgUnits() { return parentList; } + private void reviveModels() throws SchemaException { + WebMiscUtil.revive(orgModel, getPrismContext()); + WebMiscUtil.revive(parentOrgUnitsModel, getPrismContext()); + } + + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java index 22b216f9165..fea28df47c8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java @@ -25,19 +25,13 @@ import com.evolveum.midpoint.prism.query.*; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.RetrieveOption; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ObjectResolver; -import com.evolveum.midpoint.schema.util.ShadowUtil; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; @@ -46,7 +40,6 @@ import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.AjaxSubmitButton; -import com.evolveum.midpoint.web.component.data.ObjectDataProvider; import com.evolveum.midpoint.web.component.menu.cog.InlineMenu; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction; @@ -1110,7 +1103,7 @@ private void removeResourceFromAccConstruction(AssignmentType assignment) { } private ReferenceDelta prepareUserAccountsDeltaForModify(PrismReferenceDefinition refDef) throws SchemaException { - ReferenceDelta refDelta = new ReferenceDelta(refDef); + ReferenceDelta refDelta = new ReferenceDelta(refDef, getPrismContext()); List accounts = accountsModel.getObject(); for (UserAccountDto accDto : accounts) { @@ -1151,7 +1144,7 @@ private ReferenceDelta prepareUserAccountsDeltaForModify(PrismReferenceDefinitio private ContainerDelta handleAssignmentDeltas(ObjectDelta userDelta, PrismContainerDefinition def) throws SchemaException { - ContainerDelta assDelta = new ContainerDelta(new ItemPath(), UserType.F_ASSIGNMENT, def); + ContainerDelta assDelta = new ContainerDelta(new ItemPath(), UserType.F_ASSIGNMENT, def, getPrismContext()); PrismObject user = userModel.getObject().getObject(); PrismObjectDefinition userDef = user.getDefinition(); @@ -1270,11 +1263,12 @@ private void savePerformed(AjaxRequestTarget target) { // try { try { + reviveModels(); + delta = userWrapper.getObjectDelta(); if (userWrapper.getOldDelta() != null) { delta = ObjectDelta.summarize(userWrapper.getOldDelta(), delta); } - delta.setPrismContext(getPrismContext()); if (LOGGER.isTraceEnabled()) { LOGGER.trace("User delta computed from form:\n{}", new Object[]{delta.debugDump(3)}); } @@ -1397,6 +1391,13 @@ private void savePerformed(AjaxRequestTarget target) { } + private void reviveModels() throws SchemaException { + WebMiscUtil.revive(userModel, getPrismContext()); + WebMiscUtil.revive(accountsModel, getPrismContext()); + WebMiscUtil.revive(assignmentsModel, getPrismContext()); + WebMiscUtil.revive(summaryUser, getPrismContext()); + } + private boolean executeForceDelete(ObjectWrapper userWrapper, Task task, ModelExecuteOptions options, OperationResult parentResult) { if (executeOptionsModel.getObject().isForce()) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java index 36030ff9881..44acdeab065 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java @@ -758,8 +758,9 @@ private void savePerformed(AjaxRequestTarget target, boolean decision) { OperationResult result = new OperationResult(OPERATION_SAVE_WORK_ITEM); - ObjectWrapper rsWrapper = requestSpecificModel.getObject(); try { + reviveModels(); + ObjectWrapper rsWrapper = requestSpecificModel.getObject(); PrismObject object = rsWrapper.getObject(); ObjectDelta delta = rsWrapper.getObjectDelta(); delta.applyTo(object); @@ -828,4 +829,14 @@ private void releasePerformed(AjaxRequestTarget target) { public PageBase reinitialize() { return new PageWorkItem(parameters, getPreviousPage(), true); } + + private void reviveModels() throws SchemaException { + WebMiscUtil.revive(requesterModel, getPrismContext()); + WebMiscUtil.revive(objectOldModel, getPrismContext()); + WebMiscUtil.revive(objectNewModel, getPrismContext()); + WebMiscUtil.revive(requestSpecificModel, getPrismContext()); + WebMiscUtil.revive(trackingDataModel, getPrismContext()); + WebMiscUtil.revive(additionalDataModel, getPrismContext()); + } + } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDto.java index 5f02be0fc9c..ddf6ff0da0c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/ProcessInstanceDto.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.web.component.util.Selectable; +import com.evolveum.midpoint.web.component.wf.processes.itemApproval.ItemApprovalPanel; import com.evolveum.midpoint.web.util.WebMiscUtil; import com.evolveum.midpoint.wf.util.ApprovalUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; @@ -125,4 +126,9 @@ public ProcessInstanceState getInstanceState() { public String getShadowTaskOid() { return processInstanceState.getShadowTaskOid(); } + + public void reviveIfNeeded(ItemApprovalPanel component) { + WebMiscUtil.reviveIfNeeded(processInstance, component); + WebMiscUtil.reviveIfNeeded(processInstanceState, component); + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/WebMiscUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/WebMiscUtil.java index f1887eb8f29..2cca07e37c9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/WebMiscUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/WebMiscUtil.java @@ -35,13 +35,17 @@ import com.evolveum.midpoint.security.api.Authorization; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.security.api.MidPointPrincipal; +import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.data.BaseSortableDataProvider; import com.evolveum.midpoint.web.component.data.TablePanel; import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; +import com.evolveum.midpoint.web.component.prism.ObjectWrapper; +import com.evolveum.midpoint.web.component.util.LoadableModel; import com.evolveum.midpoint.web.component.util.Selectable; +import com.evolveum.midpoint.web.component.wf.processes.itemApproval.ItemApprovalPanel; import com.evolveum.midpoint.web.page.PageBase; import com.evolveum.midpoint.web.security.MidPointApplication; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -554,4 +558,47 @@ public void component(final Component component, final IVisit visit) { } }); } + + /* + * Methods used for providing prismContext into various objects. + */ + public static void revive(LoadableModel loadableModel, PrismContext prismContext) throws SchemaException { + if (loadableModel != null) { + loadableModel.revive(prismContext); + } + } + + public static void revive(IModel model, PrismContext prismContext) throws SchemaException { + if (model != null && model.getObject() != null) { + reviveObject(model.getObject(), prismContext); + } + } + + public static void reviveObject(Object object, PrismContext prismContext) throws SchemaException { + if (object == null) { + return; + } + if (object instanceof Collection) { + for (Object item : (Collection) object) { + reviveObject(item, prismContext); + } + } else if (object instanceof Revivable) { + ((Revivable) object).revive(prismContext); + } + } + + // useful for components other than those inheriting from PageBase + public static PrismContext getPrismContext(Component component) { + return ((MidPointApplication) component.getApplication()).getPrismContext(); + } + + public static void reviveIfNeeded(ObjectType objectType, Component component) { + if (objectType != null && objectType.asPrismObject().getPrismContext() == null) { + try { + objectType.asPrismObject().revive(getPrismContext(component)); + } catch (SchemaException e) { + throw new SystemException("Couldn't revive " + objectType + " because of schema exception", e); + } + } + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java index 28495ceb727..8da9bf40bb7 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ComplexTypeDefinition.java @@ -244,7 +244,7 @@ public void merge(ComplexTypeDefinition otherComplexTypeDef) { } @Override - void revive(PrismContext prismContext) { + public void revive(PrismContext prismContext) { if (this.prismContext != null) { return; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java index 711f635d62a..cce88b41b1e 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Definition.java @@ -53,7 +53,7 @@ * @author Radovan Semancik * */ -public abstract class Definition implements Serializable, DebugDumpable { +public abstract class Definition implements Serializable, DebugDumpable, Revivable { private static final long serialVersionUID = -2643332934312107274L; protected QName typeName; @@ -79,6 +79,9 @@ public abstract class Definition implements Serializable, DebugDumpable { if (typeName == null) { throw new IllegalArgumentException("Type name can't be null."); } + if (prismContext == null) { + throw new IllegalArgumentException("prismContext can't be null."); + } this.typeName = typeName; this.prismContext = prismContext; } @@ -235,7 +238,7 @@ public Class getTypeClass() { return XsdTypeMapper.toJavaType(getTypeName()); } - abstract void revive(PrismContext prismContext); + public abstract void revive(PrismContext prismContext); public abstract Definition clone(); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java index 0735ace6f98..95a4b4e67e6 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/Item.java @@ -50,7 +50,7 @@ * * @author Radovan Semancik */ -public abstract class Item implements Itemable, DebugDumpable, Visitable, PathVisitable, Serializable { +public abstract class Item implements Itemable, DebugDumpable, Visitable, PathVisitable, Serializable, Revivable { private static final long serialVersionUID = 510000191615288733L; @@ -63,7 +63,7 @@ public abstract class Item implements Itemable, DebugDumpa private List values = new ArrayList(); private transient Map userData = new HashMap<>();; - protected transient PrismContext prismContext; + protected transient PrismContext prismContext; // beware, this one can easily be null /** * This is used for definition-less construction, e.g. in JAXB beans. @@ -76,6 +76,13 @@ public abstract class Item implements Itemable, DebugDumpa this.elementName = elementName; } + Item(QName elementName, PrismContext prismContext) { + super(); + this.elementName = elementName; + this.prismContext = prismContext; + } + + /** * The constructors should be used only occasionally (if used at all). * Use the factory methods in the ResourceObjectDefintion instead. @@ -553,8 +560,7 @@ public void applyDefinition(ItemDefinition definition, boolean force) throws Sch } public void revive(PrismContext prismContext) throws SchemaException { - // TODO cleanup this method; currently, it can be expected there is no Item without prismContext - // (but it is necessary to do e.g. PolyString recomputation even if PrismContext is set!) + // it is necessary to do e.g. PolyString recomputation even if PrismContext is set if (this.prismContext == null) { this.prismContext = prismContext; if (definition != null) { @@ -599,11 +605,14 @@ public static Collection resetParentCollection(Collection return items; } - public static T createNewDefinitionlessItem(QName name, Class type) { + public static T createNewDefinitionlessItem(QName name, Class type, PrismContext prismContext) { T item = null; try { Constructor constructor = type.getConstructor(QName.class); item = constructor.newInstance(name); + if (prismContext != null) { + item.revive(prismContext); + } } catch (Exception e) { throw new SystemException("Error creating new definitionless "+type.getSimpleName()+": "+e.getClass().getName()+" "+e.getMessage(),e); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java index dfd1f595313..1b2f3b76f9d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/ItemDefinition.java @@ -301,7 +301,7 @@ protected void copyDefinitionData(ItemDefinition clone) { } @Override - void revive(PrismContext prismContext) { + public void revive(PrismContext prismContext) { if (this.prismContext != null) { return; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index d10ce8f0de4..dd10201418d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -64,7 +64,11 @@ public class PrismContainer extends Item compileTimeClass) { super(name); if (Modifier.isAbstract(compileTimeClass.getModifiers())) { @@ -113,7 +117,7 @@ public PrismContainerValue getValue() { if (getDefinition().isSingleValue()) { // Insert first empty value. This simulates empty single-valued container. It the container exists // it is clear that it has at least one value (and that value is empty). - PrismContainerValue pValue = new PrismContainerValue(null, null, this, null, null); + PrismContainerValue pValue = new PrismContainerValue(null, null, this, null, null, prismContext); try { add(pValue); } catch (SchemaException e) { @@ -127,7 +131,7 @@ public PrismContainerValue getValue() { } else { // Insert first empty value. This simulates empty single-valued container. It the container exists // it is clear that it has at least one value (and that value is empty). - PrismContainerValue pValue = new PrismContainerValue(null, null, this, null, null); + PrismContainerValue pValue = new PrismContainerValue(null, null, this, null, null, prismContext); try { add(pValue); } catch (SchemaException e) { @@ -205,7 +209,7 @@ public void add(Item item) throws SchemaException { } public PrismContainerValue createNewValue() { - PrismContainerValue pValue = new PrismContainerValue(); + PrismContainerValue pValue = new PrismContainerValue(prismContext); try { add(pValue); } catch (SchemaException e) { @@ -569,12 +573,12 @@ void addItemPathsToList(ItemPath basePath, Collection list) { @Override public ContainerDelta createDelta() { - return new ContainerDelta(getPath(), getDefinition()); + return new ContainerDelta(getPath(), getDefinition(), getPrismContext()); } @Override public ContainerDelta createDelta(ItemPath path) { - return new ContainerDelta(path, getDefinition()); + return new ContainerDelta(path, getDefinition(), getPrismContext()); } public boolean isEmpty() { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java index f434c96218d..6671394ddae 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerDefinition.java @@ -144,7 +144,7 @@ public boolean isWildcard() { } @Override - void revive(PrismContext prismContext) { + public void revive(PrismContext prismContext) { if (this.prismContext != null) { return; } @@ -331,7 +331,7 @@ public PrismContainer instantiate(QName elementName) { @Override public ContainerDelta createEmptyDelta(ItemPath path) { - return new ContainerDelta(path, this); + return new ContainerDelta(path, this, prismContext); } /** @@ -485,7 +485,7 @@ public PrismContainerDefinition createContainerDefinition(QName name, Complex } public PrismContainerValue createValue() { - return new PrismContainerValue(); + return new PrismContainerValue(prismContext); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java index f92a887d721..dd13172edeb 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainerValue.java @@ -41,6 +41,8 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; @@ -49,7 +51,9 @@ * */ public class PrismContainerValue extends PrismValue implements DebugDumpable { - + + private static final Trace LOGGER = TraceManager.getTrace(PrismContainerValue.class); + // This is list. We need to maintain the order internally to provide consistent // output in DOM and other ordering-sensitive representations private List> items = null; @@ -81,23 +85,48 @@ public class PrismContainerValue extends PrismValue imp private PrismContainerDefinition concreteTypeDefinition = null; // lazily evaluated + transient private PrismContext prismContext; + public PrismContainerValue() { super(); // Nothing to do } - - public PrismContainerValue(T containerable) { + + public PrismContainerValue(PrismContext prismContext) { + this(); + setPrismContext(prismContext); + } + + private void setPrismContext(PrismContext prismContext) { + //Validate.notNull(prismContext, "No prismContext in PrismContainerValue"); // not yet + //if (prismContext == null) { + // LOGGER.warn("No prismContext in PrismContainerValue"); + //} + this.prismContext = prismContext; + } + + private PrismContainerValue(T containerable) { super(); this.containerable = containerable; } + + public PrismContainerValue(T containerable, PrismContext prismContext) { + this(containerable); + this.prismContext = prismContext; + } - public PrismContainerValue(OriginType type, Objectable source, PrismContainerable container, Long id, QName concreteType) { + private PrismContainerValue(OriginType type, Objectable source, PrismContainerable container, Long id, QName concreteType) { super(type, source, container); this.id = id; this.concreteType = concreteType; } - /** + public PrismContainerValue(OriginType type, Objectable source, PrismContainerable container, Long id, QName concreteType, PrismContext prismContext) { + this(type, source, container, id, concreteType); + setPrismContext(prismContext); + } + + /** * Returns a set of items that the property container contains. The items may be properties or inner property containers. *

* The set may be null. In case there are no properties an empty set is @@ -109,7 +138,7 @@ public PrismContainerValue(OriginType type, Objectable source, PrismContainerabl */ public List> getItems() { - return items; + return items; } public Item getNextItem(Item referenceItem) { @@ -725,7 +754,7 @@ private > I createSubItem(QName name, Class type, ItemDefin throw new IllegalStateException("PrismObject instantiated as a subItem in "+this+" from definition "+itemDefinition); } } else { - newItem = Item.createNewDefinitionlessItem(name, type); + newItem = Item.createNewDefinitionlessItem(name, type, prismContext); if (newItem instanceof PrismObject) { throw new IllegalStateException("PrismObject instantiated as a subItem in "+this+" as definitionless instance of class "+type); } @@ -815,7 +844,7 @@ public PrismProperty createProperty(QName propertyName) throws SchemaExce PrismProperty property = null; if (propertyDefinition == null) { // Definitionless - property = new PrismProperty(propertyName); + property = new PrismProperty(propertyName, prismContext); } else { property = propertyDefinition.instantiate(); } @@ -875,9 +904,12 @@ > void removeItem(ItemPath propPath, Class itemType) { } } - public void setPropertyRealValue(QName propertyName, Object realValue) throws SchemaException { + public void setPropertyRealValue(QName propertyName, Object realValue, PrismContext prismContext) throws SchemaException { PrismProperty property = findOrCreateProperty(propertyName); property.setRealValue(realValue); + if (property.getPrismContext() == null) { + property.setPrismContext(prismContext); + } } public T getPropertyRealValue(QName propertyName, Class type) { @@ -1076,7 +1108,7 @@ private PrismContainerValue parseRawElementsToNewValue(PrismContainerValue List origRawElements = origCVal.rawElements; if (origRawElements != null) { - PrismContainerValue newCVal = new PrismContainerValue(); + PrismContainerValue newCVal = new PrismContainerValue(prismContext); for (Object rawElement: origRawElements) { Item subitem = parseRawElement(rawElement, definition); newCVal.merge(subitem); @@ -1186,6 +1218,9 @@ private ItemDefinition determineItemDefinition(QName itemName, PrismContainerDef @Override public void revive(PrismContext prismContext) throws SchemaException { + if (this.prismContext == null) { + this.prismContext = prismContext; + } super.revive(prismContext); if (items != null) { for (Item item: items) { @@ -1263,7 +1298,7 @@ public void assertDefinitions(boolean tolerateRaw, String sourceDescription) thr } public PrismContainerValue clone() { - PrismContainerValue clone = new PrismContainerValue(getOriginType(), getOriginObject(), getParent(), getId(), this.concreteType); + PrismContainerValue clone = new PrismContainerValue(getOriginType(), getOriginObject(), getParent(), getId(), this.concreteType, this.prismContext); copyValues(clone); return clone; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index f0faa39be34..aba41dd476c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -470,8 +470,12 @@ public void adopt(PrismObject object) throws SchemaExc public void adopt(Objectable objectable) throws SchemaException { adopt(objectable.asPrismObject(), objectable.getClass()); } - - public void adopt(ObjectDelta delta) throws SchemaException { + + public void adopt(Containerable containerable) throws SchemaException { + containerable.asPrismContainerValue().revive(this); + } + + public void adopt(ObjectDelta delta) throws SchemaException { delta.revive(this); getSchemaRegistry().applyDefinition(delta, delta.getObjectTypeClass(), false); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java index 2a2439d240e..5115b55fb3b 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismProperty.java @@ -66,6 +66,10 @@ public PrismProperty(QName name) { super(name); } + public PrismProperty(QName name, PrismContext prismContext) { + super(name, prismContext); + } + protected PrismProperty(QName name, PrismPropertyDefinition definition, PrismContext prismContext) { super(name, definition, prismContext); } @@ -336,12 +340,12 @@ public Class getValueClass() { @Override public PropertyDelta createDelta() { - return new PropertyDelta(getPath(), getDefinition()); + return new PropertyDelta(getPath(), getDefinition(), prismContext); } @Override public PropertyDelta createDelta(ItemPath path) { - return new PropertyDelta(path, getDefinition()); + return new PropertyDelta(path, getDefinition(), prismContext); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java index b751fa141f9..f293dc5e59d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismPropertyDefinition.java @@ -122,7 +122,7 @@ public PrismProperty instantiate(QName name) { @Override public PropertyDelta createEmptyDelta(ItemPath path) { - return new PropertyDelta(path, this); + return new PropertyDelta(path, this, prismContext); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java index 308ca69aee2..d598d31beab 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReference.java @@ -188,12 +188,12 @@ public PartiallyResolvedValue findPartial(ItemPath pat @Override public ReferenceDelta createDelta() { - return new ReferenceDelta(getPath(), getDefinition()); + return new ReferenceDelta(getPath(), getDefinition(), prismContext); } @Override public ReferenceDelta createDelta(ItemPath path) { - return new ReferenceDelta(path, getDefinition()); + return new ReferenceDelta(path, getDefinition(), prismContext); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java index 972465e6ecc..eac5ffd6a79 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceDefinition.java @@ -111,7 +111,7 @@ public PrismReference instantiate(QName name) { @Override public ItemDelta createEmptyDelta(ItemPath path) { - return new ReferenceDelta(path, this); + return new ReferenceDelta(path, this, prismContext); } @Override diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java index 7d7b52dafae..a225bc9336d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismValue.java @@ -34,7 +34,7 @@ * @author semancik * */ -public abstract class PrismValue implements Visitable, PathVisitable, Serializable, DebugDumpable { +public abstract class PrismValue implements Visitable, PathVisitable, Serializable, DebugDumpable, Revivable { private OriginType originType; private Objectable originObject; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ContainerDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ContainerDelta.java index b5e07678ee6..8f2741f31bc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ContainerDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ContainerDelta.java @@ -41,24 +41,24 @@ public class ContainerDelta extends ItemDelta> implements PrismContainerable { - public ContainerDelta(PrismContainerDefinition itemDefinition) { - super(itemDefinition); + public ContainerDelta(PrismContainerDefinition itemDefinition, PrismContext prismContext) { + super(itemDefinition, prismContext); } - public ContainerDelta(ItemPath propertyPath, PrismContainerDefinition itemDefinition) { - super(propertyPath, itemDefinition); + public ContainerDelta(ItemPath propertyPath, PrismContainerDefinition itemDefinition, PrismContext prismContext) { + super(propertyPath, itemDefinition, prismContext); } - public ContainerDelta(ItemPath parentPath, QName name, PrismContainerDefinition itemDefinition) { - super(parentPath, name, itemDefinition); + public ContainerDelta(ItemPath parentPath, QName name, PrismContainerDefinition itemDefinition, PrismContext prismContext) { + super(parentPath, name, itemDefinition, prismContext); // Extra check. It makes no sense to create container delta with object definition if (itemDefinition instanceof PrismObjectDefinition) { throw new IllegalArgumentException("Cannot apply "+definition+" to container delta"); } } - public ContainerDelta(QName name, PrismContainerDefinition itemDefinition) { - super(name, itemDefinition); + public ContainerDelta(QName name, PrismContainerDefinition itemDefinition, PrismContext prismContext) { + super(name, itemDefinition, prismContext); // Extra check. It makes no sense to create container delta with object definition if (itemDefinition instanceof PrismObjectDefinition) { throw new IllegalArgumentException("Cannot apply "+definition+" to container delta"); @@ -220,7 +220,7 @@ public void expand(PrismObject object) throws SchemaEx @Override public ContainerDelta clone() { - ContainerDelta clone = new ContainerDelta(getElementName(), getDefinition()); + ContainerDelta clone = new ContainerDelta(getElementName(), getDefinition(), getPrismContext()); copyValues(clone); return clone; } @@ -251,7 +251,7 @@ public static ContainerDelta c if (containerDefinition == null) { throw new IllegalArgumentException("No definition for "+containerPath+" in "+objectDefinition); } - ContainerDelta delta = new ContainerDelta(containerPath, containerDefinition); + ContainerDelta delta = new ContainerDelta(containerPath, containerDefinition, objectDefinition.getPrismContext()); return delta; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java index 5c581df665a..5a630076a71 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java @@ -49,6 +49,7 @@ import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; +import org.apache.commons.lang.Validate; /** * @author Radovan Semancik @@ -70,28 +71,39 @@ public abstract class ItemDelta implements Itemable, Debug protected Collection valuesToAdd = null; protected Collection valuesToDelete = null; - public ItemDelta(ItemDefinition itemDefinition) { + transient private PrismContext prismContext; + + protected ItemDelta(ItemDefinition itemDefinition, PrismContext prismContext) { if (itemDefinition == null) { - throw new IllegalArgumentException("Attempt to create item delta wihout a definition"); + throw new IllegalArgumentException("Attempt to create item delta without a definition"); } + checkPrismContext(prismContext, itemDefinition); + this.prismContext = prismContext; this.elementName = itemDefinition.getName(); this.parentPath = new ItemPath(); this.definition = itemDefinition; } - public ItemDelta(QName elementName, ItemDefinition itemDefinition) { + protected ItemDelta(QName elementName, ItemDefinition itemDefinition, PrismContext prismContext) { + checkPrismContext(prismContext, itemDefinition); + this.prismContext = prismContext; this.elementName = elementName; this.parentPath = new ItemPath(); this.definition = itemDefinition; - } + } - public ItemDelta(ItemPath parentPath, QName elementName, ItemDefinition itemDefinition) { + protected ItemDelta(ItemPath parentPath, QName elementName, ItemDefinition itemDefinition, PrismContext prismContext) { + checkPrismContext(prismContext, itemDefinition); + this.prismContext = prismContext; this.elementName = elementName; this.parentPath = parentPath; this.definition = itemDefinition; - } + } + + protected ItemDelta(ItemPath path, ItemDefinition itemDefinition, PrismContext prismContext) { + checkPrismContext(prismContext, itemDefinition); + this.prismContext = prismContext; - public ItemDelta(ItemPath path, ItemDefinition itemDefinition) { if (path == null) { throw new IllegalArgumentException("Null path specified while creating item delta"); } @@ -108,6 +120,12 @@ public ItemDelta(ItemPath path, ItemDefinition itemDefinition) { this.definition = itemDefinition; } + private void checkPrismContext(PrismContext prismContext, ItemDefinition itemDefinition) { + if (prismContext == null) { + throw new IllegalStateException("No prismContext in delta for " + itemDefinition); + } + } + public QName getElementName() { return elementName; } @@ -247,11 +265,7 @@ public boolean hasCompleteDefinition() { public PrismContext getPrismContext() { - if (definition == null) { - // This may happen e.g. in case of raw elements - return null; - } - return definition.getPrismContext(); + return prismContext; } public abstract Class getItemClass(); @@ -1211,16 +1225,19 @@ private Boolean isRawSet(Collection set) { return true; } - public void revive(PrismContext prismContext) { + public void revive(PrismContext prismContext) throws SchemaException { + this.prismContext = prismContext; reviveSet(valuesToAdd, prismContext); + reviveSet(valuesToDelete, prismContext); + reviveSet(valuesToReplace, prismContext); } - private void reviveSet(Collection set, PrismContext prismContext) { + private void reviveSet(Collection set, PrismContext prismContext) throws SchemaException { if (set == null) { return; } for (V val: set) { - // TODO: nothing to do ??????????? + val.revive(prismContext); } } @@ -1230,6 +1247,8 @@ public void applyDefinition(ItemDefinition itemDefinition, boolean force) throws } this.definition = itemDefinition; applyDefinitionSet(valuesToAdd, itemDefinition, force); + applyDefinitionSet(valuesToReplace, itemDefinition, force); + applyDefinitionSet(valuesToDelete, itemDefinition, force); } private void applyDefinitionSet(Collection set, ItemDefinition itemDefinition, boolean force) throws SchemaException { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java index a79380c54ae..5396e7970e0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java @@ -100,6 +100,7 @@ public class ObjectDelta implements DebugDumpable, Visitab public ObjectDelta(Class objectTypeClass, ChangeType changeType, PrismContext prismContext) { Validate.notNull(objectTypeClass,"No objectTypeClass"); Validate.notNull(changeType,"No changeType"); + Validate.notNull(prismContext, "No prismContext"); this.changeType = changeType; this.objectTypeClass = objectTypeClass; @@ -327,11 +328,11 @@ private D createEmptyDelta(ItemPath proper Class deltaType, Class itemType) { if (PrismProperty.class.isAssignableFrom(itemType)) { - return (D) new PropertyDelta(propertyPath, (PrismPropertyDefinition)itemDef); + return (D) new PropertyDelta(propertyPath, (PrismPropertyDefinition)itemDef, prismContext); } else if (PrismContainer.class.isAssignableFrom(itemType)) { - return (D) new ContainerDelta(propertyPath, (PrismContainerDefinition)itemDef); + return (D) new ContainerDelta(propertyPath, (PrismContainerDefinition)itemDef, prismContext); } else if (PrismReference.class.isAssignableFrom(itemType)) { - return (D) new ReferenceDelta(propertyPath, (PrismReferenceDefinition)itemDef); + return (D) new ReferenceDelta(propertyPath, (PrismReferenceDefinition)itemDef, prismContext); } else { throw new IllegalArgumentException("Unknown item type "+itemType); } @@ -694,7 +695,7 @@ private Collection> createEmptyModifications() { } public PropertyDelta createPropertyModification(QName name, PrismPropertyDefinition propertyDefinition) { - PropertyDelta propertyDelta = new PropertyDelta(name, propertyDefinition); + PropertyDelta propertyDelta = new PropertyDelta(name, propertyDefinition, prismContext); addModification(propertyDelta); return propertyDelta; } @@ -706,14 +707,14 @@ public PropertyDelta createPropertyModification(ItemPath path) { } public PropertyDelta createPropertyModification(ItemPath path, PrismPropertyDefinition propertyDefinition) { - PropertyDelta propertyDelta = new PropertyDelta(path, propertyDefinition); + PropertyDelta propertyDelta = new PropertyDelta(path, propertyDefinition, prismContext); // No point in adding the modification to this delta. It will get merged anyway and it may disappear // it is not reliable and therefore it is better not to add it now. return propertyDelta; } public ReferenceDelta createReferenceModification(QName name, PrismReferenceDefinition referenceDefinition) { - ReferenceDelta referenceDelta = new ReferenceDelta(name, referenceDefinition); + ReferenceDelta referenceDelta = new ReferenceDelta(name, referenceDefinition, prismContext); addModification(referenceDelta); return referenceDelta; } @@ -725,7 +726,7 @@ public ContainerDelta createContainerModification(I } public ContainerDelta createContainerModification(ItemPath path, PrismContainerDefinition containerDefinition) { - ContainerDelta containerDelta = new ContainerDelta(path, containerDefinition); + ContainerDelta containerDelta = new ContainerDelta(path, containerDefinition, prismContext); addModification(containerDelta); return containerDelta; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PropertyDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PropertyDelta.java index 7447468401a..8b167100780 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PropertyDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/PropertyDelta.java @@ -52,20 +52,20 @@ */ public class PropertyDelta extends ItemDelta> { - public PropertyDelta(PrismPropertyDefinition propertyDefinition) { - super(propertyDefinition); + public PropertyDelta(PrismPropertyDefinition propertyDefinition, PrismContext prismContext) { + super(propertyDefinition, prismContext); } - public PropertyDelta(QName name, PrismPropertyDefinition propertyDefinition) { - super(name, propertyDefinition); + public PropertyDelta(QName name, PrismPropertyDefinition propertyDefinition, PrismContext prismContext) { + super(name, propertyDefinition, prismContext); } - public PropertyDelta(ItemPath parentPath, QName name, PrismPropertyDefinition propertyDefinition) { - super(parentPath, name, propertyDefinition); + public PropertyDelta(ItemPath parentPath, QName name, PrismPropertyDefinition propertyDefinition, PrismContext prismContext) { + super(parentPath, name, propertyDefinition, prismContext); } - public PropertyDelta(ItemPath propertyPath, PrismPropertyDefinition propertyDefinition) { - super(propertyPath, propertyDefinition); + public PropertyDelta(ItemPath propertyPath, PrismPropertyDefinition propertyDefinition, PrismContext prismContext) { + super(propertyPath, propertyDefinition, prismContext); } PrismPropertyDefinition getPropertyDefinition() { @@ -141,7 +141,7 @@ public void applyTo(Item item) throws SchemaException { @Override public PropertyDelta clone() { - PropertyDelta clone = new PropertyDelta(getElementName(), getPropertyDefinition()); + PropertyDelta clone = new PropertyDelta(getElementName(), getPropertyDefinition(), getPrismContext()); copyValues(clone); return clone; } @@ -158,7 +158,7 @@ public static PropertyDelta createReplaceDelta(Pris if (propertyDefinition == null) { throw new IllegalArgumentException("No definition for "+propertyName+" in "+containerDefinition); } - PropertyDelta delta = new PropertyDelta(propertyName, propertyDefinition); + PropertyDelta delta = new PropertyDelta(propertyName, propertyDefinition, containerDefinition.getPrismContext()); // hoping the prismContext is there Collection> valuesToReplace = delta.getValuesToReplace(); if (valuesToReplace == null) valuesToReplace = new ArrayList>(realValues.length); @@ -175,7 +175,7 @@ public static PropertyDelta createReplaceDelta(Pris if (propertyDefinition == null) { throw new IllegalArgumentException("No definition for "+propertyName+" in "+containerDefinition); } - PropertyDelta delta = new PropertyDelta(propertyName, propertyDefinition); + PropertyDelta delta = new PropertyDelta(propertyName, propertyDefinition, containerDefinition.getPrismContext()); // hoping the prismContext is there Collection> valuesToReplace = new ArrayList>(pValues.length); for (PrismPropertyValue pVal: pValues) { valuesToReplace.add(pVal); @@ -190,7 +190,7 @@ public static PropertyDelta createAddDelta(PrismContainer if (propertyDefinition == null) { throw new IllegalArgumentException("No definition for "+propertyName+" in "+containerDefinition); } - PropertyDelta delta = new PropertyDelta(propertyName, propertyDefinition); + PropertyDelta delta = new PropertyDelta(propertyName, propertyDefinition, containerDefinition.getPrismContext()); // hoping the prismContext is there for (Object realVal: realValues) { delta.addValueToAdd(new PrismPropertyValue(realVal)); } @@ -203,7 +203,7 @@ public static PropertyDelta createDeleteDelta(PrismContai if (propertyDefinition == null) { throw new IllegalArgumentException("No definition for "+propertyName+" in "+containerDefinition); } - PropertyDelta delta = new PropertyDelta(propertyName, propertyDefinition); + PropertyDelta delta = new PropertyDelta(propertyName, propertyDefinition, containerDefinition.getPrismContext()); // hoping the prismContext is there for (Object realVal: realValues) { delta.addValueToDelete(new PrismPropertyValue(realVal)); } @@ -219,7 +219,7 @@ public static PropertyDelta createReplaceEmptyDelta(Prism if (propertyDefinition == null) { throw new IllegalArgumentException("No definition for "+propertyName+" in "+objectDefinition); } - PropertyDelta delta = new PropertyDelta(propertyName, propertyDefinition); + PropertyDelta delta = new PropertyDelta(propertyName, propertyDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there delta.setValuesToReplace(new ArrayList()); return delta; } @@ -288,7 +288,7 @@ public static PropertyDelta createDelta(QName proper public static PropertyDelta createDelta(ItemPath propertyPath, PrismObjectDefinition objectDefinition) { PrismPropertyDefinition propDef = objectDefinition.findPropertyDefinition(propertyPath); - return new PropertyDelta(propertyPath, propDef); + return new PropertyDelta(propertyPath, propDef, objectDefinition.getPrismContext()); // hoping the prismContext is there } public static PropertyDelta createDelta(QName propertyName, Class compileTimeClass, PrismContext prismContext) { @@ -298,7 +298,7 @@ public static PropertyDelta createDelta(QName proper public static PropertyDelta createDelta(ItemPath propertyPath, Class compileTimeClass, PrismContext prismContext) { PrismObjectDefinition objectDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(compileTimeClass); PrismPropertyDefinition propDef = objectDefinition.findPropertyDefinition(propertyPath); - return new PropertyDelta(propertyPath, propDef); + return new PropertyDelta(propertyPath, propDef, prismContext); } public static PropertyDelta createModificationReplaceProperty(QName propertyName, PrismObjectDefinition objectDefinition, @@ -313,7 +313,7 @@ public static PropertyDelta createModificationReplaceProperty(QName prope public static PropertyDelta createModificationReplaceProperty(ItemPath propertyPath, PrismObjectDefinition objectDefinition, T... propertyValues) { PrismPropertyDefinition propDef = objectDefinition.findPropertyDefinition(propertyPath); - PropertyDelta propertyDelta = new PropertyDelta(propertyPath, propDef); + PropertyDelta propertyDelta = new PropertyDelta(propertyPath, propDef, objectDefinition.getPrismContext()); // hoping the prismContext is there Collection> pValues = new ArrayList>(propertyValues.length); for (T val: propertyValues) { pValues.add(new PrismPropertyValue(val)); @@ -324,7 +324,7 @@ public static PropertyDelta createModificationReplaceProperty(ItemPath pr public static PropertyDelta createModificationReplaceProperty(ItemPath propertyPath, PrismPropertyDefinition propertyDefinition, T... propertyValues) { - PropertyDelta propertyDelta = new PropertyDelta(propertyPath, propertyDefinition); + PropertyDelta propertyDelta = new PropertyDelta(propertyPath, propertyDefinition, propertyDefinition.getPrismContext()); // hoping the prismContext is there Collection> pValues = new ArrayList>(propertyValues.length); for (T val: propertyValues) { pValues.add(new PrismPropertyValue(val)); @@ -335,7 +335,7 @@ public static PropertyDelta createModificationReplaceProperty(ItemPath pr public static PropertyDelta createModificationAddProperty(ItemPath propertyPath, PrismPropertyDefinition propertyDefinition, T... propertyValues) { - PropertyDelta propertyDelta = new PropertyDelta(propertyPath, propertyDefinition); + PropertyDelta propertyDelta = new PropertyDelta(propertyPath, propertyDefinition, propertyDefinition.getPrismContext()); // hoping the prismContext is there Collection> pValues = new ArrayList>(propertyValues.length); for (T val: propertyValues) { pValues.add(new PrismPropertyValue(val)); @@ -346,7 +346,7 @@ public static PropertyDelta createModificationAddProperty(ItemPath proper public static PropertyDelta createModificationDeleteProperty(ItemPath propertyPath, PrismPropertyDefinition propertyDefinition, T... propertyValues) { - PropertyDelta propertyDelta = new PropertyDelta(propertyPath, propertyDefinition); + PropertyDelta propertyDelta = new PropertyDelta(propertyPath, propertyDefinition, propertyDefinition.getPrismContext()); // hoping the prismContext is there Collection> pValues = new ArrayList>(propertyValues.length); for (T val: propertyValues) { pValues.add(new PrismPropertyValue(val)); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java index e9943612ee3..0fa4e113d90 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ReferenceDelta.java @@ -39,20 +39,20 @@ */ public class ReferenceDelta extends ItemDelta { - public ReferenceDelta(PrismReferenceDefinition itemDefinition) { - super(itemDefinition); + public ReferenceDelta(PrismReferenceDefinition itemDefinition, PrismContext prismContext) { + super(itemDefinition, prismContext); } - public ReferenceDelta(ItemPath propertyPath, PrismReferenceDefinition itemDefinition) { - super(propertyPath, itemDefinition); + public ReferenceDelta(ItemPath propertyPath, PrismReferenceDefinition itemDefinition, PrismContext prismContext) { + super(propertyPath, itemDefinition, prismContext); } - public ReferenceDelta(ItemPath parentPath, QName name, PrismReferenceDefinition itemDefinition) { - super(parentPath, name, itemDefinition); + public ReferenceDelta(ItemPath parentPath, QName name, PrismReferenceDefinition itemDefinition, PrismContext prismContext) { + super(parentPath, name, itemDefinition, prismContext); } - public ReferenceDelta(QName name, PrismReferenceDefinition itemDefinition) { - super(name, itemDefinition); + public ReferenceDelta(QName name, PrismReferenceDefinition itemDefinition, PrismContext prismContext) { + super(name, itemDefinition, prismContext); } @Override @@ -86,7 +86,7 @@ public void applyTo(Item item) throws SchemaException { @Override public ReferenceDelta clone() { - ReferenceDelta clone = new ReferenceDelta(getPath(), (PrismReferenceDefinition)getDefinition()); + ReferenceDelta clone = new ReferenceDelta(getPath(), (PrismReferenceDefinition)getDefinition(), getPrismContext()); copyValues(clone); return clone; } @@ -118,7 +118,7 @@ public static ReferenceDelta createModificationReplace(ItemPath path, PrismObjec public static ReferenceDelta createModificationReplace(ItemPath path, PrismObjectDefinition objectDefinition, PrismReferenceValue refValue) { PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(path, PrismReferenceDefinition.class); - ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition); + ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there referenceDelta.setValueToReplace(refValue); return referenceDelta; } @@ -126,7 +126,7 @@ public static ReferenceDelta createModificationReplace(ItemPath path, PrismObjec public static ReferenceDelta createModificationReplace(ItemPath path, PrismObjectDefinition objectDefinition, Collection refValues) { PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(path, PrismReferenceDefinition.class); - ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition); + ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there referenceDelta.setValuesToReplace(refValues); return referenceDelta; } @@ -134,7 +134,7 @@ public static ReferenceDelta createModificationReplace(ItemPath path, PrismObjec public static ReferenceDelta createModificationReplace(QName refName, PrismObjectDefinition objectDefinition, PrismReferenceValue refValue) { PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(refName, PrismReferenceDefinition.class); - ReferenceDelta referenceDelta = new ReferenceDelta(refName, referenceDefinition); + ReferenceDelta referenceDelta = new ReferenceDelta(refName, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there referenceDelta.setValueToReplace(refValue); return referenceDelta; } @@ -164,7 +164,7 @@ public static ReferenceDelta createModificationAdd(ItemPath path, PrismObjectDef public static ReferenceDelta createModificationAdd(QName refName, PrismObjectDefinition objectDefinition, PrismReferenceValue refValue) { PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(refName, PrismReferenceDefinition.class); - ReferenceDelta referenceDelta = new ReferenceDelta(refName, referenceDefinition); + ReferenceDelta referenceDelta = new ReferenceDelta(refName, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there referenceDelta.addValueToAdd(refValue); return referenceDelta; } @@ -172,7 +172,7 @@ public static ReferenceDelta createModificationAdd(QName refName, PrismObjectDef public static ReferenceDelta createModificationAdd(ItemPath path, PrismObjectDefinition objectDefinition, PrismReferenceValue refValue) { PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(path, PrismReferenceDefinition.class); - ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition); + ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there referenceDelta.addValueToAdd(refValue); return referenceDelta; } @@ -180,7 +180,7 @@ public static ReferenceDelta createModificationAdd(ItemPath path, PrismObjectDef public static ReferenceDelta createModificationAdd(ItemPath path, PrismObjectDefinition objectDefinition, Collection refValues) { PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(path, PrismReferenceDefinition.class); - ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition); + ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there referenceDelta.addValuesToAdd(refValues); return referenceDelta; } @@ -230,7 +230,7 @@ public static Collection createModificationDeleteCollection public static ReferenceDelta createModificationDelete(ItemPath path, PrismObjectDefinition objectDefinition, Collection refValues) { PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(path, PrismReferenceDefinition.class); - ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition); + ReferenceDelta referenceDelta = new ReferenceDelta(path, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there referenceDelta.addValuesToDelete(refValues); return referenceDelta; } @@ -250,7 +250,7 @@ public static ReferenceDelta createModificationDelete(QName refName, PrismObject public static ReferenceDelta createModificationDelete(QName refName, PrismObjectDefinition objectDefinition, PrismReferenceValue refValue) { PrismReferenceDefinition referenceDefinition = objectDefinition.findItemDefinition(refName, PrismReferenceDefinition.class); - ReferenceDelta referenceDelta = new ReferenceDelta(refName, referenceDefinition); + ReferenceDelta referenceDelta = new ReferenceDelta(refName, referenceDefinition, objectDefinition.getPrismContext()); // hoping the prismContext is there referenceDelta.addValueToDelete(refValue); return referenceDelta; } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessor.java index d9d45de7fb3..36a43fce4cc 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/json/PrismJasonProcessor.java @@ -395,7 +395,7 @@ private PrismObject parseObject(JsonNode jsonObject, Q private PrismContainer parsePrismContainer(JsonNode jsonObject, QName itemName, String defaultNamespace, PrismContainerDefinition containerDefinition) throws SchemaException, JsonParseException, JsonMappingException, IOException { PrismContainer container = containerDefinition.instantiate(itemName); - PrismContainerValue pval = new PrismContainerValue(null, null, container, null, null); // TODO set concreteType (if this code would be really used) + PrismContainerValue pval = new PrismContainerValue(null, null, container, null, null, prismContext); // TODO set concreteType (if this code would be really used) Collection newContainerItems = parsePrismContainerItems(jsonObject, containerDefinition, defaultNamespace); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java index 521f6e544b9..90eaecd1f3d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/QueryConvertor.java @@ -500,7 +500,7 @@ private static QName determineMatchingRule(MapXNode xmap) throws SchemaException private static Item parseItem(XNode valueXnode, QName itemName, ItemDefinition itemDefinition, PrismContext prismContext) throws SchemaException{ Item item; if (prismContext == null) { - item = (Item)XNodeProcessor.parsePrismPropertyRaw(valueXnode, itemName); + item = (Item)XNodeProcessor.parsePrismPropertyRaw(valueXnode, itemName, prismContext); } else { item = prismContext.getXnodeProcessor().parseItem(valueXnode, itemName, itemDefinition); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java index c57e288339b..1b200e18f0c 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/parser/XNodeProcessor.java @@ -275,7 +275,7 @@ public PrismContainerValue parsePrismContainerValue private PrismContainerValue parsePrismContainerValueFromMap(MapXNode xmap, PrismContainerDefinition containerDef, Collection ignoredItems) throws SchemaException { Long id = getContainerId(xmap); - PrismContainerValue cval = new PrismContainerValue(null, null, null, id, xmap.getTypeQName()); + PrismContainerValue cval = new PrismContainerValue(null, null, null, id, xmap.getTypeQName(), prismContext); for (Entry xentry: xmap.entrySet()) { QName itemQName = xentry.getKey(); if (QNameUtil.match(itemQName, XNode.KEY_CONTAINER_ID)) { @@ -564,21 +564,21 @@ private ItemPathType parseItemPathType(PrimitiveXNode itemPath) throws SchemaExc // // } - public static PrismProperty parsePrismPropertyRaw(XNode xnode, QName itemName) + public static PrismProperty parsePrismPropertyRaw(XNode xnode, QName itemName, PrismContext prismContext) throws SchemaException { if (xnode instanceof ListXNode) { - return parsePrismPropertyRaw((ListXNode)xnode, itemName); + return parsePrismPropertyRaw((ListXNode)xnode, itemName, prismContext); } else { - PrismProperty property = new PrismProperty(itemName); + PrismProperty property = new PrismProperty(itemName, prismContext); PrismPropertyValue pval = PrismPropertyValue.createRaw(xnode); property.add(pval); return property; } } - private static PrismProperty parsePrismPropertyRaw(ListXNode xlist, QName itemName) + private static PrismProperty parsePrismPropertyRaw(ListXNode xlist, QName itemName, PrismContext prismContext) throws SchemaException { - PrismProperty property = new PrismProperty(itemName); + PrismProperty property = new PrismProperty(itemName, prismContext); for (XNode xsubnode : xlist) { PrismPropertyValue pval = PrismPropertyValue.createRaw(xsubnode); property.add(pval); @@ -872,7 +872,7 @@ public Item parseItem(XNode xnode, QName itemName, Ite throws SchemaException { if (itemDef == null) { // Assume property in a container with runtime definition - return (Item) parsePrismPropertyRaw(xnode, itemName); + return (Item) parsePrismPropertyRaw(xnode, itemName, prismContext); } if (itemDef instanceof PrismObjectDefinition) { return parseObject(xnode, itemName, (PrismObjectDefinition) itemDef); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java index 9034343ed45..e28b56d8606 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/util/RawTypeUtil.java @@ -53,9 +53,17 @@ public static Item getParsedItem(ItemDefinition itemDe parsedValues.add(parsed); } } + + PrismContext prismContext = null; + if (containerDef != null) { + prismContext = containerDef.getPrismContext(); + } + if (prismContext == null && itemDefinition != null) { + prismContext = itemDefinition.getPrismContext(); + } if (itemDefinition == null){ - PrismProperty property = new PrismProperty(elementQName); + PrismProperty property = new PrismProperty(elementQName, prismContext); property.addAll(PrismValue.cloneCollection(parsedValues)); return property; } diff --git a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java index 78e1901a410..a830b947b72 100644 --- a/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java +++ b/infra/prism/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/RawType.java @@ -96,7 +96,7 @@ public V getParsedValue(ItemDefinition itemDefinition, QN Item subItem = PrismUtil.getXnodeProcessor(prismContext).parseItem(xnode, itemName, itemDefinition); value = subItem.getValue(0); } else { - PrismProperty subItem = XNodeProcessor.parsePrismPropertyRaw(xnode, itemName); + PrismProperty subItem = XNodeProcessor.parsePrismPropertyRaw(xnode, itemName, prismContext); value = (V) subItem.getValue(); } xnode = null; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestCompare.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestCompare.java index 210aa5d5712..18fc4027c18 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestCompare.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestCompare.java @@ -276,7 +276,7 @@ public void testEqualsBrokenAssignmentActivation() throws Exception { PrismContainer brokenAssignment = goodAssignment.clone(); assertEquals("Not equals after clone", goodAssignment, brokenAssignment); // lets break one of these ... - PrismContainerValue emptyValue = new PrismContainerValue(); + PrismContainerValue emptyValue = new PrismContainerValue(PrismTestUtil.getPrismContext()); brokenAssignment.add(emptyValue); // WHEN diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDelta.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDelta.java index a1623fd0f1d..973d655bddb 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDelta.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDelta.java @@ -65,27 +65,27 @@ public void testDeltaPaths() throws Exception { PrismPropertyDefinition descDefinition = new PrismPropertyDefinition<>(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(descDefinition); + PropertyDelta delta1 = new PropertyDelta(descDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToAdd(new PrismPropertyValue("add1")); assertPath(delta1, new ItemPath(UserType.F_DESCRIPTION)); PrismReferenceDefinition referenceDefinition = new PrismReferenceDefinition(UserType.F_PARENT_ORG_REF, OBJECT_REFERENCE_TYPE_QNAME, PrismTestUtil.getPrismContext()); - ReferenceDelta delta2 = new ReferenceDelta(referenceDefinition); + ReferenceDelta delta2 = new ReferenceDelta(referenceDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismReferenceValue("oid1")); assertPath(delta2, new ItemPath(UserType.F_PARENT_ORG_REF)); - PrismContainerValue assignmentValue1 = new PrismContainerValue(); + PrismContainerValue assignmentValue1 = new PrismContainerValue(PrismTestUtil.getPrismContext()); // The value id is null - assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta assObjDelta1 = ObjectDelta.createModificationAddContainer(UserType.class, USER_FOO_OID, UserType.F_ASSIGNMENT, PrismTestUtil.getPrismContext(), assignmentValue1); ItemDelta assDelta1 = assObjDelta1.getModifications().iterator().next(); assertPath(assDelta1, new ItemPath(UserType.F_ASSIGNMENT)); - PrismContainerValue assignmentValue2 = new PrismContainerValue(); + PrismContainerValue assignmentValue2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assignmentValue1.setId(USER_ASSIGNMENT_1_ID); - assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta assObjDelta2 = ObjectDelta.createModificationAddContainer(UserType.class, USER_FOO_OID, UserType.F_ASSIGNMENT, PrismTestUtil.getPrismContext(), assignmentValue2); ItemDelta assDelta2 = assObjDelta2.getModifications().iterator().next(); @@ -94,14 +94,14 @@ public void testDeltaPaths() throws Exception { PrismPropertyDefinition assDescDefinition = new PrismPropertyDefinition<>(AssignmentType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); ItemPath itemPathAssDescNoId = new ItemPath(UserType.F_ASSIGNMENT, AssignmentType.F_DESCRIPTION); - PropertyDelta propDelta2 = new PropertyDelta(itemPathAssDescNoId, descDefinition); + PropertyDelta propDelta2 = new PropertyDelta(itemPathAssDescNoId, descDefinition, PrismTestUtil.getPrismContext()); assertPath(propDelta2, itemPathAssDescNoId); ItemPath itemPathAssDesc1Id = new ItemPath( new NameItemPathSegment(UserType.F_ASSIGNMENT), new IdItemPathSegment(USER_ASSIGNMENT_1_ID), new NameItemPathSegment(AssignmentType.F_DESCRIPTION)); - PropertyDelta propDelta3 = new PropertyDelta(itemPathAssDesc1Id, descDefinition); + PropertyDelta propDelta3 = new PropertyDelta(itemPathAssDesc1Id, descDefinition, PrismTestUtil.getPrismContext()); assertPath(propDelta3, itemPathAssDesc1Id); } @@ -118,10 +118,10 @@ public void testPropertyDeltaMerge01() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToAdd(new PrismPropertyValue("add1")); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismPropertyValue("add2")); // WHEN @@ -144,10 +144,10 @@ public void testPropertyDeltaMerge02() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToDelete(new PrismPropertyValue("del1")); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToDelete(new PrismPropertyValue("del2")); // WHEN @@ -170,11 +170,11 @@ public void testPropertyDeltaMerge03() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToAdd(new PrismPropertyValue("add1")); delta1.addValueToDelete(new PrismPropertyValue("del1")); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismPropertyValue("add2")); delta2.addValueToDelete(new PrismPropertyValue("del2")); @@ -198,11 +198,11 @@ public void testPropertyDeltaMerge04() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToAdd(new PrismPropertyValue("add1")); delta1.addValueToDelete(new PrismPropertyValue("del1")); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismPropertyValue("add2")); delta2.addValueToDelete(new PrismPropertyValue("add1")); @@ -226,10 +226,10 @@ public void testPropertyDeltaMerge05() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToAdd(new PrismPropertyValue("add1")); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismPropertyValue("add2")); delta2.addValueToDelete(new PrismPropertyValue("add1")); @@ -253,11 +253,11 @@ public void testPropertyDeltaMerge06() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToAdd(new PrismPropertyValue("add1")); delta1.addValueToDelete(new PrismPropertyValue("del1")); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismPropertyValue("del1")); // WHEN @@ -280,10 +280,10 @@ public void testPropertyDeltaMerge10() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.setValuesToReplace(new PrismPropertyValue("r1x"), new PrismPropertyValue("r1y")); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismPropertyValue("add2")); // WHEN @@ -306,10 +306,10 @@ public void testPropertyDeltaMerge11() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.setValuesToReplace(new PrismPropertyValue("r1x"), new PrismPropertyValue("r1y")); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismPropertyValue("add2")); delta2.addValueToDelete(new PrismPropertyValue("r1y")); @@ -333,10 +333,10 @@ public void testPropertyDeltaMerge12() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.setValuesToReplace(new PrismPropertyValue("r1x"), new PrismPropertyValue("r1y")); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismPropertyValue("add2")); delta2.addValueToDelete(new PrismPropertyValue("del2")); @@ -360,11 +360,11 @@ public void testPropertyDeltaMerge20() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToAdd(new PrismPropertyValue("add1")); delta1.addValueToDelete(new PrismPropertyValue("del1")); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.setValuesToReplace(new PrismPropertyValue("r2x"), new PrismPropertyValue("r2y")); // WHEN @@ -387,13 +387,13 @@ public void testPropertyDeltaSwallow01() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToAdd(new PrismPropertyValue("add1")); ObjectDelta objectDelta = new ObjectDelta(UserType.class, ChangeType.MODIFY, PrismTestUtil.getPrismContext()); objectDelta.addModification(delta1); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismPropertyValue("add2")); // WHEN @@ -418,13 +418,13 @@ public void testSummarize01() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToAdd(new PrismPropertyValue("add1")); ObjectDelta objectDelta1 = new ObjectDelta(UserType.class, ChangeType.MODIFY, PrismTestUtil.getPrismContext()); objectDelta1.addModification(delta1); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismPropertyValue("add2")); ObjectDelta objectDelta2 = new ObjectDelta(UserType.class, ChangeType.MODIFY, PrismTestUtil.getPrismContext()); @@ -452,13 +452,13 @@ public void testSummarize02() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToDelete(new PrismPropertyValue("del1")); ObjectDelta objectDelta1 = new ObjectDelta(UserType.class, ChangeType.MODIFY, PrismTestUtil.getPrismContext()); objectDelta1.addModification(delta1); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToDelete(new PrismPropertyValue("del2")); ObjectDelta objectDelta2 = new ObjectDelta(UserType.class, ChangeType.MODIFY, PrismTestUtil.getPrismContext()); @@ -486,14 +486,14 @@ public void testSummarize05() throws Exception { PrismPropertyDefinition propertyDefinition = new PrismPropertyDefinition(UserType.F_DESCRIPTION, DOMUtil.XSD_STRING, PrismTestUtil.getPrismContext()); - PropertyDelta delta1 = new PropertyDelta(propertyDefinition); + PropertyDelta delta1 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); // Let's complicate the things a bit with origin. This should work even though origins do not match. delta1.addValueToAdd(new PrismPropertyValue("add1", OriginType.OUTBOUND, null)); ObjectDelta objectDelta1 = new ObjectDelta(UserType.class, ChangeType.MODIFY, PrismTestUtil.getPrismContext()); objectDelta1.addModification(delta1); - PropertyDelta delta2 = new PropertyDelta(propertyDefinition); + PropertyDelta delta2 = new PropertyDelta(propertyDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismPropertyValue("add2")); delta2.addValueToDelete(new PrismPropertyValue("add1")); ObjectDelta objectDelta2 = new ObjectDelta(UserType.class, ChangeType.MODIFY, @@ -522,13 +522,13 @@ public void testSummarize06() throws Exception { PrismReferenceDefinition referenceDefinition = new PrismReferenceDefinition(UserType.F_PARENT_ORG_REF, OBJECT_REFERENCE_TYPE_QNAME, PrismTestUtil.getPrismContext()); - ReferenceDelta delta1 = new ReferenceDelta(referenceDefinition); + ReferenceDelta delta1 = new ReferenceDelta(referenceDefinition, PrismTestUtil.getPrismContext()); delta1.addValueToAdd(new PrismReferenceValue("oid1")); ObjectDelta objectDelta1 = new ObjectDelta(UserType.class, ChangeType.MODIFY, PrismTestUtil.getPrismContext()); objectDelta1.addModification(delta1); - ReferenceDelta delta2 = new ReferenceDelta(referenceDefinition); + ReferenceDelta delta2 = new ReferenceDelta(referenceDefinition, PrismTestUtil.getPrismContext()); delta2.addValueToAdd(new PrismReferenceValue("oid1")); // here we add the same value ObjectDelta objectDelta2 = new ObjectDelta(UserType.class, ChangeType.MODIFY, PrismTestUtil.getPrismContext()); @@ -580,9 +580,9 @@ public void testAddAssignmentSameNullIdApplyToObject() throws Exception { PrismObject user = createUser(); //Delta - PrismContainerValue assignmentValue = new PrismContainerValue(); + PrismContainerValue assignmentValue = new PrismContainerValue(PrismTestUtil.getPrismContext()); // The value id is null - assignmentValue.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta userDelta = ObjectDelta.createModificationAddContainer(UserType.class, USER_FOO_OID, UserType.F_ASSIGNMENT, PrismTestUtil.getPrismContext(), assignmentValue); @@ -606,17 +606,17 @@ public void testAddAssignmentSameNullIdSwallow() throws Exception { // GIVEN //Delta 1 - PrismContainerValue assignmentValue1 = new PrismContainerValue(); + PrismContainerValue assignmentValue1 = new PrismContainerValue(PrismTestUtil.getPrismContext()); // The value id is null - assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta userDelta1 = ObjectDelta.createModificationAddContainer(UserType.class, USER_FOO_OID, UserType.F_ASSIGNMENT, PrismTestUtil.getPrismContext(), assignmentValue1); //Delta 2 - PrismContainerValue assignmentValue2 = new PrismContainerValue(); + PrismContainerValue assignmentValue2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); // The value id is null - assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ContainerDelta containerDelta2 = ContainerDelta.createDelta(UserType.F_ASSIGNMENT,getUserTypeDefinition()); containerDelta2.addValueToAdd(assignmentValue2); @@ -642,17 +642,17 @@ public void testAddAssignmentDifferentNullIdSwallow() throws Exception { // GIVEN //Delta 1 - PrismContainerValue assignmentValue1 = new PrismContainerValue(); + PrismContainerValue assignmentValue1 = new PrismContainerValue(PrismTestUtil.getPrismContext()); // The value id is null - assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta userDelta1 = ObjectDelta.createModificationAddContainer(UserType.class, USER_FOO_OID, UserType.F_ASSIGNMENT, PrismTestUtil.getPrismContext(), assignmentValue1); //Delta 2 - PrismContainerValue assignmentValue2 = new PrismContainerValue(); + PrismContainerValue assignmentValue2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); // The value id is null - assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra"); + assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra", PrismTestUtil.getPrismContext()); ContainerDelta containerDelta2 = ContainerDelta.createDelta(UserType.F_ASSIGNMENT,getUserTypeDefinition()); containerDelta2.addValueToAdd(assignmentValue2); @@ -679,17 +679,17 @@ public void testAddAssignmentDifferentFirstIdSwallow() throws Exception { // GIVEN //Delta 1 - PrismContainerValue assignmentValue1 = new PrismContainerValue(); + PrismContainerValue assignmentValue1 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assignmentValue1.setId(USER_ASSIGNMENT_1_ID); - assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta userDelta1 = ObjectDelta.createModificationAddContainer(UserType.class, USER_FOO_OID, UserType.F_ASSIGNMENT, PrismTestUtil.getPrismContext(), assignmentValue1); //Delta 2 - PrismContainerValue assignmentValue2 = new PrismContainerValue(); + PrismContainerValue assignmentValue2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); // The value id is null - assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra"); + assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra", PrismTestUtil.getPrismContext()); ContainerDelta containerDelta2 = ContainerDelta.createDelta(UserType.F_ASSIGNMENT, getUserTypeDefinition()); containerDelta2.addValueToAdd(assignmentValue2); @@ -716,17 +716,17 @@ public void testAddAssignmentDifferentSecondIdSwallow() throws Exception { // GIVEN //Delta 1 - PrismContainerValue assignmentValue1 = new PrismContainerValue(); + PrismContainerValue assignmentValue1 = new PrismContainerValue(PrismTestUtil.getPrismContext()); // The value id is null - assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta userDelta1 = ObjectDelta.createModificationAddContainer(UserType.class, USER_FOO_OID, UserType.F_ASSIGNMENT, PrismTestUtil.getPrismContext(), assignmentValue1); //Delta 2 - PrismContainerValue assignmentValue2 = new PrismContainerValue(); + PrismContainerValue assignmentValue2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assignmentValue2.setId(USER_ASSIGNMENT_2_ID); - assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra"); + assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra", PrismTestUtil.getPrismContext()); ContainerDelta containerDelta2 = ContainerDelta.createDelta(UserType.F_ASSIGNMENT,getUserTypeDefinition()); containerDelta2.addValueToAdd(assignmentValue2); @@ -753,17 +753,17 @@ public void testAddAssignmentDifferentTwoIdsSwallow() throws Exception { // GIVEN //Delta 1 - PrismContainerValue assignmentValue1 = new PrismContainerValue(); + PrismContainerValue assignmentValue1 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assignmentValue1.setId(USER_ASSIGNMENT_1_ID); - assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta userDelta1 = ObjectDelta.createModificationAddContainer(UserType.class, USER_FOO_OID, UserType.F_ASSIGNMENT, PrismTestUtil.getPrismContext(), assignmentValue1); //Delta 2 - PrismContainerValue assignmentValue2 = new PrismContainerValue(); + PrismContainerValue assignmentValue2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assignmentValue2.setId(USER_ASSIGNMENT_2_ID); - assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra"); + assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra", PrismTestUtil.getPrismContext()); ContainerDelta containerDelta2 = ContainerDelta.createDelta(UserType.F_ASSIGNMENT,getUserTypeDefinition()); containerDelta2.addValueToAdd(assignmentValue2); @@ -790,17 +790,17 @@ public void testAddAssignmentDifferentIdSameSwallow() throws Exception { // GIVEN //Delta 1 - PrismContainerValue assignmentValue1 = new PrismContainerValue(); + PrismContainerValue assignmentValue1 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assignmentValue1.setId(USER_ASSIGNMENT_1_ID); - assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta userDelta1 = ObjectDelta.createModificationAddContainer(UserType.class, USER_FOO_OID, UserType.F_ASSIGNMENT, PrismTestUtil.getPrismContext(), assignmentValue1); //Delta 2 - PrismContainerValue assignmentValue2 = new PrismContainerValue(); + PrismContainerValue assignmentValue2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assignmentValue2.setId(USER_ASSIGNMENT_1_ID); - assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ContainerDelta containerDelta2 = ContainerDelta.createDelta(UserType.F_ASSIGNMENT,getUserTypeDefinition()); containerDelta2.addValueToAdd(assignmentValue2); @@ -827,17 +827,17 @@ public void testAddAssignmentDifferentIdConflictSwallow() throws Exception { // GIVEN //Delta 1 - PrismContainerValue assignmentValue1 = new PrismContainerValue(); + PrismContainerValue assignmentValue1 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assignmentValue1.setId(USER_ASSIGNMENT_1_ID); - assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue1.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta userDelta1 = ObjectDelta.createModificationAddContainer(UserType.class, USER_FOO_OID, UserType.F_ASSIGNMENT, PrismTestUtil.getPrismContext(), assignmentValue1); //Delta 2 - PrismContainerValue assignmentValue2 = new PrismContainerValue(); + PrismContainerValue assignmentValue2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assignmentValue2.setId(USER_ASSIGNMENT_1_ID); - assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra"); + assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra", PrismTestUtil.getPrismContext()); ContainerDelta containerDelta2 = ContainerDelta.createDelta(UserType.F_ASSIGNMENT, getUserTypeDefinition()); containerDelta2.addValueToAdd(assignmentValue2); @@ -857,9 +857,9 @@ public void testAddDeltaAddAssignmentDifferentNoIdSwallow() throws Exception { ObjectDelta userDelta1 = ObjectDelta.createAddDelta(user); //Delta 2 - PrismContainerValue assignmentValue2 = new PrismContainerValue(); + PrismContainerValue assignmentValue2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); // null container ID - assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra"); + assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra", PrismTestUtil.getPrismContext()); ContainerDelta containerDelta2 = ContainerDelta.createDelta(UserType.F_ASSIGNMENT,getUserTypeDefinition()); containerDelta2.addValueToAdd(assignmentValue2); @@ -893,9 +893,9 @@ public void testAddDeltaNoAssignmentAddAssignmentDifferentNoIdSwallow() throws E ObjectDelta userDelta1 = ObjectDelta.createAddDelta(user); //Delta 2 - PrismContainerValue assignmentValue2 = new PrismContainerValue(); + PrismContainerValue assignmentValue2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); // null container ID - assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra"); + assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra", PrismTestUtil.getPrismContext()); ContainerDelta containerDelta2 = ContainerDelta.createDelta(UserType.F_ASSIGNMENT,getUserTypeDefinition()); containerDelta2.addValueToAdd(assignmentValue2); @@ -925,9 +925,9 @@ public void testAddDeltaNoAssignmentAddAssignmentDifferentIdSwallow() throws Exc ObjectDelta userDelta1 = ObjectDelta.createAddDelta(user); //Delta 2 - PrismContainerValue assignmentValue2 = new PrismContainerValue(); + PrismContainerValue assignmentValue2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assignmentValue2.setId(USER_ASSIGNMENT_2_ID); - assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra"); + assignmentValue2.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "abra kadabra", PrismTestUtil.getPrismContext()); ContainerDelta containerDelta2 = ContainerDelta.createDelta(UserType.F_ASSIGNMENT,getUserTypeDefinition()); containerDelta2.addValueToAdd(assignmentValue2); @@ -956,9 +956,9 @@ public void testAddAssignmentActivationDifferentNullIdApplyToObject() throws Exc PrismObject user = createUser(); //Delta - PrismContainerValue activationValue = new PrismContainerValue(); + PrismContainerValue activationValue = new PrismContainerValue(PrismTestUtil.getPrismContext()); // The value id is null - activationValue.setPropertyRealValue(ActivationType.F_ENABLED, true); + activationValue.setPropertyRealValue(ActivationType.F_ENABLED, true, PrismTestUtil.getPrismContext()); ObjectDelta userDelta = ObjectDelta.createModificationAddContainer(UserType.class, USER_FOO_OID, new ItemPath( @@ -1326,13 +1326,13 @@ public void testDeltaComplex() throws Exception { PrismContainerDefinition assDef = userTypeDefinition.findContainerDefinition(UserType.F_ASSIGNMENT); PrismPropertyDefinition descDef = assDef.findPropertyDefinition(AssignmentType.F_DESCRIPTION); - PrismContainerValue assVal1 = new PrismContainerValue(); + PrismContainerValue assVal1 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assVal1.setId(111L); PrismProperty descProp1 = descDef.instantiate(); descProp1.setRealValue("desc 1"); assVal1.add(descProp1); - PrismContainerValue assVal2 = new PrismContainerValue(); + PrismContainerValue assVal2 = new PrismContainerValue(PrismTestUtil.getPrismContext()); assVal2.setId(222L); PrismProperty descProp2 = descDef.instantiate(); descProp2.setRealValue("desc 2"); @@ -1371,7 +1371,7 @@ private PrismObject createUser() throws SchemaException { PrismContainer assignment = user.findOrCreateContainer(UserType.F_ASSIGNMENT); PrismContainerValue assignmentValue = assignment.createNewValue(); assignmentValue.setId(123L); - assignmentValue.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); return user; } diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDiff.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDiff.java index beef4f9673f..8567962ff86 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDiff.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestDiff.java @@ -173,11 +173,11 @@ public void testContainerSimpleDiffNoChange() throws Exception { PrismContainer ass1 = assignmentContDef.instantiate(); PrismContainerValue ass1cval = ass1.createNewValue(); - ass1cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah"); + ass1cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah", PrismTestUtil.getPrismContext()); PrismContainer ass2 = assignmentContDef.instantiate(); PrismContainerValue ass2cval = ass2.createNewValue(); - ass2cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah"); + ass2cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah", PrismTestUtil.getPrismContext()); // WHEN Collection modifications = ass1.diff(ass2); @@ -200,12 +200,12 @@ public void testContainerDiffDesciption() throws Exception { PrismContainer ass1 = assignmentContDef.instantiate(); PrismContainerValue ass1cval = ass1.createNewValue(); ass1cval.setId(1L); - ass1cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah"); + ass1cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah", PrismTestUtil.getPrismContext()); PrismContainer ass2 = assignmentContDef.instantiate(); PrismContainerValue ass2cval = ass2.createNewValue(); ass2cval.setId(1L); - ass2cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "chamalalia patlama paprtala"); + ass2cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "chamalalia patlama paprtala", PrismTestUtil.getPrismContext()); // WHEN Collection modifications = ass1.diff(ass2); @@ -234,11 +234,11 @@ public void testContainerValueDiffDesciptionNoPath() throws Exception { PrismContainer ass1 = assignmentContDef.instantiate(); PrismContainerValue ass1cval = ass1.createNewValue(); - ass1cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah"); + ass1cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "blah blah", PrismTestUtil.getPrismContext()); PrismContainer ass2 = assignmentContDef.instantiate(); PrismContainerValue ass2cval = ass2.createNewValue(); - ass2cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "chamalalia patlama paprtala"); + ass2cval.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "chamalalia patlama paprtala", PrismTestUtil.getPrismContext()); // WHEN Collection modifications = ass1cval.diff(ass2cval); diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java index 6e9b6ef9ad0..a3eb93cae04 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java @@ -28,6 +28,7 @@ import javax.xml.validation.Schema; import javax.xml.validation.Validator; +import com.evolveum.midpoint.prism.util.PrismTestUtil; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.w3c.dom.Document; @@ -53,7 +54,7 @@ public class TestPrismObjectConstruction { @BeforeSuite - public void setupDebug() { + public void setupDebug() throws SAXException, IOException, SchemaException { PrettyPrinter.setDefaultNamespacePrefix(DEFAULT_NAMESPACE_PREFIX); } @@ -73,7 +74,7 @@ public void testConstructionWithSchema() throws Exception { // WHEN PrismObject user = userDefinition.instantiate(); // Fill-in object values, checking presence of definition while doing so - fillInUserDrake(user, true); + fillInUserDrake(user, true, ctx); // THEN System.out.println("User:"); @@ -92,18 +93,18 @@ public void testDefinitionlessConstruction() throws Exception { PrismInternalTestUtil.displayTestTitle(TEST_NAME); // GIVEN - // No context needed + PrismContext ctx = constructInitializedPrismContext(); // we need this context to do even basic object operations (mergeValue in this case) // WHEN PrismObject user = new PrismObject(USER_QNAME, UserType.class); + user.revive(ctx); // there is no definition yet // Fill-in object values, no schema checking - fillInUserDrake(user, false); + fillInUserDrake(user, false, ctx); // THEN System.out.println("User:"); System.out.println(user.debugDump()); // Check if the values are correct, no schema checking - PrismContext ctx = constructInitializedPrismContext(); assertUserDrake(user, false, ctx); } @@ -117,12 +118,11 @@ public void testDefinitionlessConstructionAndSchemaApplication() throws Exceptio PrismInternalTestUtil.displayTestTitle(TEST_NAME); // GIVEN - // No context needed (yet) PrismObject user = new PrismObject(USER_QNAME, UserType.class); + PrismContext ctx = constructInitializedPrismContext(); // Fill-in object values, no schema checking - fillInUserDrake(user, false); + fillInUserDrake(user, false, ctx); // Make sure the object is OK - PrismContext ctx = constructInitializedPrismContext(); assertUserDrake(user, false, ctx); @@ -150,7 +150,7 @@ public void testClone() throws Exception { PrismContext ctx = constructInitializedPrismContext(); PrismObjectDefinition userDefinition = getFooSchema(ctx).findObjectDefinitionByElementName(new QName(NS_FOO,"user")); PrismObject user = userDefinition.instantiate(); - fillInUserDrake(user, true); + fillInUserDrake(user, true, ctx); // precondition assertUserDrake(user, true, ctx); @@ -173,7 +173,7 @@ public void testCloneEquals() throws Exception { PrismContext ctx = constructInitializedPrismContext(); PrismObjectDefinition userDefinition = getFooSchema(ctx).findObjectDefinitionByElementName(new QName(NS_FOO,"user")); PrismObject user = userDefinition.instantiate(); - fillInUserDrake(user, true); + fillInUserDrake(user, true, ctx); PrismObject clone = user.clone(); // WHEN, THEN @@ -182,7 +182,7 @@ public void testCloneEquals() throws Exception { } - private void fillInUserDrake(PrismObject user, boolean assertDefinitions) throws SchemaException { + private void fillInUserDrake(PrismObject user, boolean assertDefinitions, PrismContext prismContext) throws SchemaException { user.setOid(USER_OID); // fullName @@ -226,7 +226,7 @@ private void fillInUserDrake(PrismObject user, boolean assertDefinitio assertEquals("Wrong number of assignment values (empty)", 0, assignmentContainer.getValues().size()); // assignment values: construct assignment value as a new container "out of the blue" and then add it. - PrismContainer assBlueContainer = new PrismContainer(USER_ASSIGNMENT_QNAME); + PrismContainer assBlueContainer = new PrismContainer(USER_ASSIGNMENT_QNAME, prismContext); PrismProperty assBlueDescriptionProperty = assBlueContainer.findOrCreateProperty(USER_DESCRIPTION_QNAME); assBlueDescriptionProperty.addValue(new PrismPropertyValue("Assignment created out of the blue")); PrismAsserts.assertParentConsistency(user); @@ -235,7 +235,7 @@ private void fillInUserDrake(PrismObject user, boolean assertDefinitio PrismAsserts.assertParentConsistency(user); // assignment values: construct assignment value as a new container value "out of the blue" and then add it. - PrismContainerValue assCyanContainerValue = new PrismContainerValue(); + PrismContainerValue assCyanContainerValue = new PrismContainerValue(prismContext); PrismProperty assCyanDescriptionProperty = assCyanContainerValue.findOrCreateProperty(USER_DESCRIPTION_QNAME); assCyanDescriptionProperty.addValue(new PrismPropertyValue("Assignment created out of the cyan")); assignmentContainer.mergeValue(assCyanContainerValue); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java index 458be97e447..2bede8e2c74 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java @@ -44,11 +44,13 @@ public void setup() throws SchemaException, SAXException, IOException { } @Test - public void testUserSimplePropertyDiff() { + public void testUserSimplePropertyDiff() throws SchemaException { UserType userType1 = new UserType(); userType1.setName(PrismTestUtil.createPolyStringType("test name")); UserType userType2 = new UserType(); userType2.setName(PrismTestUtil.createPolyStringType("test name")); + PrismTestUtil.getPrismContext().adopt(userType1); + PrismTestUtil.getPrismContext().adopt(userType2); ObjectDelta delta = userType1.asPrismObject().diff(userType2.asPrismObject()); assertNotNull(delta); @@ -62,11 +64,13 @@ public void testUserSimplePropertyDiff() { } @Test - public void testUserListSimpleDiff() { + public void testUserListSimpleDiff() throws SchemaException { UserType u1 = new UserType(); u1.setName(PrismTestUtil.createPolyStringType("test name")); UserType u2 = new UserType(); u2.setName(PrismTestUtil.createPolyStringType("test name")); + PrismTestUtil.getPrismContext().adopt(u1); + PrismTestUtil.getPrismContext().adopt(u2); ObjectDelta delta = u1.asPrismObject().diff(u2.asPrismObject()); assertNotNull(delta); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java index 26ce13be3e1..75be2169ce5 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestJaxbConstruction.java @@ -162,12 +162,14 @@ public void testUserConstruction() throws JAXBException, SchemaException { // assertEquals("Difference filter", filterElement, prismFilter); ShadowType accountShadowType = new ShadowType(); + prismContext.adopt(accountShadowType); accountShadowType.setOid(USER_ACCOUNT_REF_1_OID); userType.getLink().add(accountShadowType); //value still should be only one... (reference was only resolved) assertEquals("2/ Wrong accountRef values", 1, user.findReference(UserType.F_LINK_REF).getValues().size()); accountShadowType = new ShadowType(); + prismContext.adopt(accountShadowType); accountShadowType.setOid(USER_ACCOUNT_REF_2_OID); userType.getLink().add(accountShadowType); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaDelta.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaDelta.java index 3f1ba7f52d9..8944f97b82e 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaDelta.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestSchemaDelta.java @@ -59,9 +59,9 @@ public void testAssignmentSameNullIdApplyToObject() throws Exception { PrismObject user = PrismTestUtil.parseObject(USER_JACK_FILE); //Delta - PrismContainerValue assignmentValue = new PrismContainerValue(); + PrismContainerValue assignmentValue = new PrismContainerValue(PrismTestUtil.getPrismContext()); // The value id is null - assignmentValue.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + assignmentValue.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta userDelta = ObjectDelta.createModificationAddContainer(UserType.class, USER_JACK_OID, UserType.F_ASSIGNMENT, PrismTestUtil.getPrismContext(), assignmentValue); @@ -88,9 +88,9 @@ public void testAddInducementConstructionSameNullIdApplyToObject() throws Except PrismObject role = PrismTestUtil.parseObject(ROLE_CONSTRUCTION_FILE); //Delta - PrismContainerValue inducementValue = new PrismContainerValue(); + PrismContainerValue inducementValue = new PrismContainerValue(PrismTestUtil.getPrismContext()); // The value id is null - inducementValue.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala"); + inducementValue.setPropertyRealValue(AssignmentType.F_DESCRIPTION, "jamalalicha patlama paprtala", PrismTestUtil.getPrismContext()); ObjectDelta roleDelta = ObjectDelta.createModificationAddContainer(RoleType.class, ROLE_CONSTRUCTION_OID, RoleType.F_INDUCEMENT, PrismTestUtil.getPrismContext(), inducementValue); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java index ec1cd86ccec..452c1ab527b 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java @@ -106,13 +106,15 @@ public class ImportAccountsFromResourceTaskHandler extends AbstractSearchIterati public ImportAccountsFromResourceTaskHandler() { super(ShadowType.class, "Import from resource", OperationConstants.IMPORT_ACCOUNTS_FROM_RESOURCE); - objectclassPropertyDefinition = new PrismPropertyDefinition(ModelConstants.OBJECTCLASS_PROPERTY_NAME, - DOMUtil.XSD_QNAME, prismContext); setLogFinishInfo(true); } @PostConstruct private void initialize() { + // this call must not be in the constructor, because prismContext is not yet initialized at that moment + objectclassPropertyDefinition = new PrismPropertyDefinition<>(ModelConstants.OBJECTCLASS_PROPERTY_NAME, + DOMUtil.XSD_QNAME, prismContext); + taskManager.registerHandler(HANDLER_URI, this); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java index d22952e0dae..eaaece0ed65 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java @@ -76,12 +76,12 @@ public class ImportObjectsFromFileTaskHandler implements TaskHandler { public ImportObjectsFromFileTaskHandler() { super(); //handlers = new HashMap(); - filenamePropertyDefinition = new PrismPropertyDefinition(ModelConstants.FILENAME_PROPERTY_NAME, - DOMUtil.XSD_STRING, prismContext); } @PostConstruct private void initialize() { + filenamePropertyDefinition = new PrismPropertyDefinition(ModelConstants.FILENAME_PROPERTY_NAME, + DOMUtil.XSD_STRING, prismContext); // must not be in the constructor, because prismContext is null at that time taskManager.registerHandler(HANDLER_URI, this); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java index 205ebeda828..147955fb237 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/AssignmentProcessor.java @@ -1189,7 +1189,7 @@ private Collection> getExecutionWav } private ContainerDelta createEmptyAssignmentDelta(LensFocusContext focusContext) { - return new ContainerDelta(getAssignmentContainerDefinition(focusContext)); + return new ContainerDelta(getAssignmentContainerDefinition(focusContext), prismContext); } private PrismContainerDefinition getAssignmentContainerDefinition(LensFocusContext focusContext) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java index b13636b74a7..8bdbb3d805a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/CredentialsProcessor.java @@ -201,7 +201,7 @@ public StringPolicyType resolve() { LOGGER.trace("Credentials 'password' expression resulted in null, skipping credentials processing for {}", rat); return; } - PropertyDelta accountPasswordDeltaNew = new PropertyDelta(SchemaConstants.PATH_PASSWORD_VALUE, accountPasswordPropertyDefinition); + PropertyDelta accountPasswordDeltaNew = new PropertyDelta(SchemaConstants.PATH_PASSWORD_VALUE, accountPasswordPropertyDefinition, prismContext); accountPasswordDeltaNew.setValuesToReplace(accountPasswordNew.getClonedValues()); LOGGER.trace("Adding new password delta for account {}", rat); accCtx.swallowToSecondaryDelta(accountPasswordDeltaNew); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/InboundProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/InboundProcessor.java index cfeb20f8601..a1ebb74ad20 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/InboundProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/InboundProcessor.java @@ -381,7 +381,7 @@ private PropertyDelta evaluateInboundMapping(final throw new SchemaException("No definition for focus property "+targetFocusPropertyPath+", cannot process inbound expression in "+resource); } - PropertyDelta outputUserPropertydelta = new PropertyDelta(targetFocusPropertyPath, targetPropertyDef); + PropertyDelta outputUserPropertydelta = new PropertyDelta(targetFocusPropertyPath, targetPropertyDef, prismContext); LensUtil.evaluateMapping(mapping, context, task, result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ReconciliationProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ReconciliationProcessor.java index 615de2ea5dc..dfb676a6773 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ReconciliationProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ReconciliationProcessor.java @@ -589,7 +589,7 @@ private void recordDelta(ValueMatcher valueMatcher, LensProjectionContext ac value }); PropertyDelta attrDelta = new PropertyDelta(SchemaConstants.PATH_ATTRIBUTES, attrDef.getName(), - attrDef); + attrDef, prismContext); PrismPropertyValue pValue = new PrismPropertyValue(value, OriginType.RECONCILIATION, originObject); if (changeType == ModificationType.ADD) { @@ -622,7 +622,7 @@ private void recordAssociationDelta(ValueMatcher valueMatcher, LensProjectionCon PrismContainerDefinition associationDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(ShadowType.class) .findContainerDefinition(ShadowType.F_ASSOCIATION); - ContainerDelta assocDelta = new ContainerDelta(SchemaConstants.PATH_ASSOCIATION, associationDefinition); + ContainerDelta assocDelta = new ContainerDelta(SchemaConstants.PATH_ASSOCIATION, associationDefinition, prismContext); PrismContainerValue cValue = value.asPrismContainerValue().clone(); cValue.setOriginType(OriginType.RECONCILIATION); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractScannerTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractScannerTaskHandler.java index 9364fa14ce8..00a76f3bbd4 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractScannerTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractScannerTaskHandler.java @@ -86,7 +86,7 @@ protected void finish(H handler, TaskRunResult runResult, Task task, OperationRe SchemaConstants.MODEL_EXTENSION_LAST_SCAN_TIMESTAMP_PROPERTY_NAME, DOMUtil.XSD_DATETIME, prismContext); PropertyDelta lastScanTimestampDelta = new PropertyDelta( - new ItemPath(TaskType.F_EXTENSION, SchemaConstants.MODEL_EXTENSION_LAST_SCAN_TIMESTAMP_PROPERTY_NAME), lastScanTimestampDef); + new ItemPath(TaskType.F_EXTENSION, SchemaConstants.MODEL_EXTENSION_LAST_SCAN_TIMESTAMP_PROPERTY_NAME), lastScanTimestampDef, prismContext); lastScanTimestampDelta.setValueToReplace(new PrismPropertyValue(handler.getThisScanTimestamp())); task.modifyExtension(lastScanTimestampDelta); } diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/AbstractInternalModelIntegrationTest.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/AbstractInternalModelIntegrationTest.java index 2da19139ec3..d48394bfa51 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/AbstractInternalModelIntegrationTest.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/AbstractInternalModelIntegrationTest.java @@ -411,7 +411,7 @@ protected ObjectDelta createAccountDelta(LensProjectionContext a RefinedAttributeDefinition attrDef = refinedAccountDefinition.findAttributeDefinition(attrQName); assertNotNull("No definition of attribute "+attrQName+" in account def "+refinedAccountDefinition, attrDef); ObjectDelta accountDelta = ObjectDelta.createEmptyModifyDelta(ShadowType.class, accountOid, prismContext); - PropertyDelta attrDelta = new PropertyDelta(attrPath, attrDef); + PropertyDelta attrDelta = new PropertyDelta(attrPath, attrDef, prismContext); attrDelta.setValuesToReplace(PrismPropertyValue.createCollection(propertyValues)); accountDelta.addModification(attrDelta); return accountDelta; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMultiResource.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMultiResource.java index f7ffdff084a..6d735650f53 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMultiResource.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMultiResource.java @@ -1789,7 +1789,7 @@ public void test440DavidAndGoliathAssignRoleAndCreateUserInOneStep() throws Exce PrismObject userBefore = createUser(USER_WORLD_NAME, USER_WORLD_FULL_NAME, true); userBefore.asObjectable().getOrganizationalUnit().add(PrismTestUtil.createPolyStringType("stone")); - PrismContainerValue cval = new PrismContainerValue(); + PrismContainerValue cval = new PrismContainerValue(prismContext); PrismReference targetRef = cval.findOrCreateReference(AssignmentType.F_TARGET_REF); targetRef.getValue().setOid(ROLE_FIGHT_OID); targetRef.getValue().setTargetType(RoleType.COMPLEX_TYPE); diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index 4b90237ba5b..aaf526e438e 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -737,7 +737,7 @@ protected void unassignAllRoles(String userOid) throws ObjectNotFoundException, if (targetRef != null) { if (targetRef.getType().equals(RoleType.COMPLEX_TYPE)) { ContainerDelta assignmentDelta = ContainerDelta.createDelta(UserType.F_ASSIGNMENT, getUserDefinition()); - PrismContainerValue cval = new PrismContainerValue(); + PrismContainerValue cval = new PrismContainerValue(prismContext); cval.setId(assignment.getId()); assignmentDelta.addValueToDelete(cval); modifications.add(assignmentDelta); @@ -815,7 +815,7 @@ protected void unassignAll(String userOid, Task task, OperationResult result) protected ContainerDelta createAssignmentModification(String roleOid, QName refType, QName relation, PrismContainer extension, ActivationType activationType, boolean add) throws SchemaException { ContainerDelta assignmentDelta = ContainerDelta.createDelta(UserType.F_ASSIGNMENT, getUserDefinition()); - PrismContainerValue cval = new PrismContainerValue(); + PrismContainerValue cval = new PrismContainerValue(prismContext); if (add) { assignmentDelta.addValueToAdd(cval); } else { @@ -894,7 +894,7 @@ protected ConstructionType createAccountConstruction(String resourceOid, String protected ObjectDelta createReplaceAccountConstructionUserDelta(String userOid, Long id, ConstructionType newValue) throws SchemaException { PrismContainerDefinition pcd = getAssignmentDefinition().findContainerDefinition(AssignmentType.F_CONSTRUCTION); - ContainerDelta acDelta = new ContainerDelta(new ItemPath(new NameItemPathSegment(UserType.F_ASSIGNMENT), new IdItemPathSegment(id), new NameItemPathSegment(AssignmentType.F_CONSTRUCTION)), pcd); + ContainerDelta acDelta = new ContainerDelta(new ItemPath(new NameItemPathSegment(UserType.F_ASSIGNMENT), new IdItemPathSegment(id), new NameItemPathSegment(AssignmentType.F_CONSTRUCTION)), pcd, prismContext); // ContainerDelta.createDelta(prismContext, ConstructionType.class, AssignmentType.F_CONSTRUCTION); acDelta.setValueToReplace(newValue.asPrismContainerValue()); // PropertyDelta.createModificationReplaceProperty( @@ -1586,7 +1586,7 @@ protected void breakAssignmentDelta(ObjectDelta userDel assignmentDeltaValue = assignmentDelta.getValuesToDelete().iterator().next(); } PrismContainer activationContainer = assignmentDeltaValue.findOrCreateContainer(AssignmentType.F_ACTIVATION); - PrismContainerValue emptyValue = new PrismContainerValue(); + PrismContainerValue emptyValue = new PrismContainerValue(prismContext); activationContainer.add(emptyValue); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/user/AddRoleAssignmentAspect.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/user/AddRoleAssignmentAspect.java index be38ce7fd42..939658a1603 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/user/AddRoleAssignmentAspect.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/user/AddRoleAssignmentAspect.java @@ -252,7 +252,7 @@ private ObjectDelta assignmentToDelta(ModelContext mode PrismObject user = (PrismObject) modelContext.getFocusContext().getObjectNew(); PrismContainerDefinition prismContainerDefinition = user.getDefinition().findContainerDefinition(UserType.F_ASSIGNMENT); - ItemDelta> addRoleDelta = new ContainerDelta<>(new ItemPath(), UserType.F_ASSIGNMENT, prismContainerDefinition); + ItemDelta> addRoleDelta = new ContainerDelta<>(new ItemPath(), UserType.F_ASSIGNMENT, prismContainerDefinition, prismContext); PrismContainerValue assignmentValue = approvalRequest.getItemToApprove().asPrismContainerValue().clone(); addRoleDelta.addValueToAdd(assignmentValue); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java index 64d885d921a..b8048733e5f 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceManager.java @@ -487,7 +487,7 @@ private ContainerDelta createSchemaUpdateDelta(PrismObject schemaContainerDelta = ContainerDelta.createDelta( ResourceType.F_SCHEMA, ResourceType.class, prismContext); - PrismContainerValue cval = new PrismContainerValue(); + PrismContainerValue cval = new PrismContainerValue(prismContext); schemaContainerDelta.setValueToReplace(cval); PrismProperty cachingMetadataProperty = cval .createProperty(XmlSchemaType.F_CACHING_METADATA); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java index e6897814b5f..a5f87737508 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java @@ -1532,7 +1532,7 @@ public Set modifyObject(ObjectClassComplexTypeDef private PropertyDelta createUidDelta(Uid uid, ResourceAttributeDefinition uidDefinition) { QName attributeName = icfNameMapper.convertAttributeNameToQName(uid.getName(), getSchemaNamespace()); PropertyDelta uidDelta = new PropertyDelta(new ItemPath(ShadowType.F_ATTRIBUTES, attributeName), - uidDefinition); + uidDefinition, prismContext); uidDelta.setValueToReplace(new PrismPropertyValue(uid.getUidValue())); return uidDelta; } diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/ucf/TestUcfOpenDj.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/ucf/TestUcfOpenDj.java index 90821a42f08..7907332031e 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/ucf/TestUcfOpenDj.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/ucf/TestUcfOpenDj.java @@ -416,7 +416,7 @@ private PropertyModificationOperation createReplaceAttributeChange(String proper PrismProperty property = createProperty(propertyName, propertyValue); ItemPath propertyPath = new ItemPath(ShadowType.F_ATTRIBUTES, new QName(ResourceTypeUtil.getResourceNamespace(resourceType), propertyName)); - PropertyDelta delta = new PropertyDelta(propertyPath, property.getDefinition()); + PropertyDelta delta = new PropertyDelta(propertyPath, property.getDefinition(), prismContext); delta.setValueToReplace(new PrismPropertyValue(propertyValue)); PropertyModificationOperation attributeModification = new PropertyModificationOperation(delta); return attributeModification; @@ -426,7 +426,7 @@ private PropertyModificationOperation createAddAttributeChange(String propertyNa PrismProperty property = createProperty(propertyName, propertyValue); ItemPath propertyPath = new ItemPath(ShadowType.F_ATTRIBUTES, new QName(ResourceTypeUtil.getResourceNamespace(resourceType), propertyName)); - PropertyDelta delta = new PropertyDelta(propertyPath, property.getDefinition()); + PropertyDelta delta = new PropertyDelta(propertyPath, property.getDefinition(), prismContext); delta.addValueToAdd(new PrismPropertyValue(propertyValue)); PropertyModificationOperation attributeModification = new PropertyModificationOperation(delta); return attributeModification; @@ -436,7 +436,7 @@ private PropertyModificationOperation createDeleteAttributeChange(String propert PrismProperty property = createProperty(propertyName, propertyValue); ItemPath propertyPath = new ItemPath(ShadowType.F_ATTRIBUTES, new QName(ResourceTypeUtil.getResourceNamespace(resourceType), propertyName)); - PropertyDelta delta = new PropertyDelta(propertyPath, property.getDefinition()); + PropertyDelta delta = new PropertyDelta(propertyPath, property.getDefinition(), prismContext); delta.addValueToDelete(new PrismPropertyValue(propertyValue)); PropertyModificationOperation attributeModification = new PropertyModificationOperation(delta); return attributeModification; diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ConcurrencyTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ConcurrencyTest.java index 62eebd0306d..f5c55584a89 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ConcurrencyTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ConcurrencyTest.java @@ -39,6 +39,7 @@ import com.evolveum.midpoint.repo.sql.testing.SqlRepoTestUtil; import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -261,7 +262,9 @@ public void execute(Connection connection) throws SQLException { } for (ModifierThread mt : modifierThreads) { - AssertJUnit.assertTrue("Modifier thread " + mt.id + " finished with an exception: " + mt.threadResult, mt.threadResult == null); + if (mt.threadResult != null) { + throw new AssertionError("Modifier thread " + mt.id + " finished with an exception: " + mt.threadResult, mt.threadResult); + } } } @@ -314,7 +317,7 @@ public void run() { } } - public void runOnce() { + public void runOnce() throws SchemaException { OperationResult result = new OperationResult("run"); @@ -328,7 +331,7 @@ public void runOnce() { if (propertyDefinition1 == null) { throw new IllegalArgumentException("No definition for " + attribute1 + " in " + userPrismDefinition); } - PropertyDelta delta1 = new PropertyDelta(attribute1, propertyDefinition1); + PropertyDelta delta1 = new PropertyDelta(attribute1, propertyDefinition1, prismContext); delta1.setValueToReplace(new PrismPropertyValue(poly ? new PolyString(dataWritten) : dataWritten)); List deltas = new ArrayList(); deltas.add(delta1); @@ -342,9 +345,9 @@ public void runOnce() { ItemDelta delta2 = null; if (propertyDefinition2.getClass().isAssignableFrom(PrismContainerDefinition.class)){ - delta2 = new ContainerDelta(attribute2, (PrismContainerDefinition) propertyDefinition2); + delta2 = new ContainerDelta(attribute2, (PrismContainerDefinition) propertyDefinition2, prismContext); } else{ - delta2 = new PropertyDelta(attribute2, (PrismPropertyDefinition) propertyDefinition2); + delta2 = new PropertyDelta(attribute2, (PrismPropertyDefinition) propertyDefinition2, prismContext); } if (ConstructionType.COMPLEX_TYPE.equals(propertyDefinition2.getTypeName())) { ConstructionType act = new ConstructionType(); 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 7e0b6b40a8d..90c7c526b31 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 @@ -243,7 +243,7 @@ public void test032ModifyTaskObjectRef() throws Exception { PrismReferenceDefinition def = objectDef.findReferenceDefinition(TaskType.F_OBJECT_REF); System.out.println("MODIFY"); ObjectReferenceType objectRef = null; - ReferenceDelta delta = new ReferenceDelta(def); + ReferenceDelta delta = new ReferenceDelta(def, prismContext); delta.addValueToAdd(new PrismReferenceValue("1", ResourceType.COMPLEX_TYPE)); modifications.add(delta); repositoryService.modifyObject(TaskType.class, taskOid, modifications, result); @@ -259,7 +259,7 @@ public void test032ModifyTaskObjectRef() throws Exception { checkReference(taskOid); System.out.println("MODIFY"); modifications.clear(); - delta = new ReferenceDelta(def); + delta = new ReferenceDelta(def, prismContext); delta.addValueToDelete(new PrismReferenceValue("1", ResourceType.COMPLEX_TYPE)); delta.addValueToAdd(new PrismReferenceValue("2", ResourceType.COMPLEX_TYPE)); modifications.add(delta); @@ -277,7 +277,7 @@ public void test032ModifyTaskObjectRef() throws Exception { lastVersion = getTask.getVersion(); modifications.clear(); - delta = new ReferenceDelta(def); + delta = new ReferenceDelta(def, prismContext); delta.addValueToDelete(new PrismReferenceValue("2", ResourceType.COMPLEX_TYPE)); delta.addValueToAdd(new PrismReferenceValue("1", ResourceType.COMPLEX_TYPE)); modifications.add(delta); @@ -470,7 +470,7 @@ public void testExtensionModify() throws Exception { Collection modifications = new ArrayList(); ItemPath path = new ItemPath(UserType.F_EXTENSION, QNAME_LOOT); PrismProperty loot = user.findProperty(path); - PropertyDelta lootDelta = new PropertyDelta(path, loot.getDefinition()); + PropertyDelta lootDelta = new PropertyDelta(path, loot.getDefinition(), prismContext); lootDelta.setValueToReplace(new PrismPropertyValue(456)); modifications.add(lootDelta); diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java index 9ced681ff50..26f7b9d8e26 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java @@ -1719,22 +1719,22 @@ public void setExtensionPropertyImmediate(PrismProperty property, OperationRe } private ItemDelta setExtensionPropertyAndPrepareDelta(QName itemName, PrismPropertyDefinition definition, Collection values) throws SchemaException { - ItemDelta delta = new PropertyDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition); + ItemDelta delta = new PropertyDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition, getPrismContext()); return setExtensionItemAndPrepareDeltaCommon(delta, values); } private ItemDelta setExtensionReferenceAndPrepareDelta(QName itemName, PrismReferenceDefinition definition, Collection values) throws SchemaException { - ItemDelta delta = new ReferenceDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition); + ItemDelta delta = new ReferenceDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition, getPrismContext()); return setExtensionItemAndPrepareDeltaCommon(delta, values); } private ItemDelta addExtensionReferenceAndPrepareDelta(QName itemName, PrismReferenceDefinition definition, Collection values) throws SchemaException { - ItemDelta delta = new ReferenceDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition); + ItemDelta delta = new ReferenceDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition, getPrismContext()); return addExtensionItemAndPrepareDeltaCommon(delta, values); } private ItemDelta setExtensionContainerAndPrepareDelta(QName itemName, PrismContainerDefinition definition, Collection values) throws SchemaException { - ItemDelta delta = new ContainerDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition); + ItemDelta delta = new ContainerDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition, getPrismContext()); return setExtensionItemAndPrepareDeltaCommon(delta, values); } @@ -1772,7 +1772,7 @@ private ItemDelta modifyExtensionAndPrepareDelta(ItemDelta delta) throws S } private ItemDelta addExtensionPropertyAndPrepareDelta(QName itemName, PrismPropertyDefinition definition, Collection values) throws SchemaException { - ItemDelta delta = new PropertyDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition); + ItemDelta delta = new PropertyDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition, getPrismContext()); delta.addValuesToAdd(values); @@ -1784,7 +1784,7 @@ private ItemDelta addExtensionPropertyAndPrepareDelta(QName itemName, PrismPr } private ItemDelta deleteExtensionPropertyAndPrepareDelta(QName itemName, PrismPropertyDefinition definition, Collection values) throws SchemaException { - ItemDelta delta = new PropertyDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition); + ItemDelta delta = new PropertyDelta(new ItemPath(TaskType.F_EXTENSION, itemName), definition, getPrismContext()); delta.addValuesToDelete(values); diff --git a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java index 61bcf3d5228..93b9420a8c1 100644 --- a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java +++ b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestQuartzTaskManagerContract.java @@ -392,7 +392,7 @@ public void test004TaskProperties() throws Exception { PrismProperty property = (PrismProperty) delayDefinition.instantiate(); property.setRealValue(100); - PropertyDelta delta = new PropertyDelta(new ItemPath(TaskType.F_EXTENSION, property.getElementName()), property.getDefinition()); + PropertyDelta delta = new PropertyDelta(new ItemPath(TaskType.F_EXTENSION, property.getElementName()), property.getDefinition(), prismContext); //delta.addV(property.getValues()); delta.setValuesToReplace(PrismValue.cloneCollection(property.getValues())); diff --git a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java index 969d7fb5a59..c3a3ed2925d 100644 --- a/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java +++ b/testing/sanity/src/test/java/com/evolveum/midpoint/testing/sanity/TestSanity.java @@ -2330,7 +2330,7 @@ public void test055ModifyAccount() throws Exception { ItemPath employeeTypePath = new ItemPath(ShadowType.F_ATTRIBUTES, employeeTypeQName); PrismProperty item = shadow.findProperty(employeeTypePath); - PropertyDelta deleteDelta = new PropertyDelta(new ItemPath(ShadowType.F_ATTRIBUTES), item.getDefinition().getName(), item.getDefinition()); + PropertyDelta deleteDelta = new PropertyDelta(new ItemPath(ShadowType.F_ATTRIBUTES), item.getDefinition().getName(), item.getDefinition(), prismContext); // PropertyDelta deleteDelta = PropertyDelta.createDelta(employeeTypePath, shadow.getDefinition()); // PrismPropertyValue valToDelte = new PrismPropertyValue("A"); // valToDelte.setParent(deleteDelta); From 7eb897d6c12e3eda3105832f6c35ebf4b2a9346f Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 10 Jul 2014 15:18:49 +0200 Subject: [PATCH 05/12] Demo/test of how is prism functionality limited when there's no prismContext. --- .../midpoint/schema/TestDiffEquals.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java index 2bede8e2c74..f37bec5e6a4 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java @@ -16,11 +16,15 @@ package com.evolveum.midpoint.schema; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.MidPointConstants; +import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import org.testng.annotations.BeforeSuite; @@ -30,6 +34,7 @@ import java.io.IOException; import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNotNull; /** @@ -82,4 +87,53 @@ public void testUserListSimpleDiff() throws SchemaException { assertNotNull(delta); assertEquals("Delta should be empty, nothing changed.", 0, delta.getModifications().size()); } + + @Test + public void testContextlessEquals() throws Exception { + AssignmentType a1 = new AssignmentType(); // no prismContext here + a1.setDescription("descr1"); + + AssignmentType a2 = new AssignmentType(); // no prismContext here + a2.setDescription("descr2"); + + // assertFalse(a1.equals(a2)); // this DOES NOT work without prismContext + + PrismContext prismContext = PrismTestUtil.getPrismContext(); + prismContext.adopt(a1); + prismContext.adopt(a2); + assertFalse(a1.equals(a2)); // now it should work + } + + @Test + public void testContextlessEquals2() throws Exception { + + // (1) user without prismContext - the functionality is radically reduced + + UserType user = new UserType(); + + // user.asPrismObject().createDelta(); // this fails (no prismContext) + + AssignmentType a1 = new AssignmentType(); // no prismContext here + a1.setDescription("descr1"); + user.getAssignment().add(a1); + AssignmentType a2 = new AssignmentType(); // no prismContext here + a2.setDescription("descr2"); + //user.getAssignment().add(a2); // this fails without prismContext (there's hidden equals there) + + // (2) user with prismContext + + UserType userWithContext = new UserType(); + PrismContext prismContext = PrismTestUtil.getPrismContext(); + prismContext.adopt(userWithContext); + + AssignmentType b1 = new AssignmentType(); // no prismContext here + b1.setDescription("descr1"); + userWithContext.getAssignment().add(b1); + AssignmentType b2 = new AssignmentType(); // no prismContext here + b2.setDescription("descr2"); + userWithContext.getAssignment().add(b2); // this works, because there's already prismContext in userWithContext + + userWithContext.asPrismObject().createDelta(); // this works as well + } + } From f557768d635421b6bc0ac8446b6b9e1761a091eb Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 10 Jul 2014 15:39:33 +0200 Subject: [PATCH 06/12] Auto-adoption of PCVs when added to PrismContainer. --- .../java/com/evolveum/midpoint/prism/PrismContainer.java | 9 +++++++++ .../java/com/evolveum/midpoint/prism/PrismContext.java | 4 ++++ .../com/evolveum/midpoint/schema/TestDiffEquals.java | 5 +++++ 3 files changed, 18 insertions(+) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index dd10201418d..c20a5f0ed84 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -155,6 +155,15 @@ public void setValue(PrismContainerValue value) throws SchemaException { add(value); } } + + @Override + public boolean add(PrismContainerValue newValue) throws SchemaException { + // when a context-less item is added to a contextful container, it is automatically adopted + if (newValue.getPrismContext() == null && this.prismContext != null) { + prismContext.adopt(newValue); + } + return super.add(newValue); + } @Override public PrismContainerValue getPreviousValue(PrismValue value) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index aba41dd476c..64c47fa59bf 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -475,6 +475,10 @@ public void adopt(Containerable containerable) throws SchemaException { containerable.asPrismContainerValue().revive(this); } + public void adopt(PrismContainerValue value) throws SchemaException { + value.revive(this); + } + public void adopt(ObjectDelta delta) throws SchemaException { delta.revive(this); getSchemaRegistry().applyDefinition(delta, delta.getObjectTypeClass(), false); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java index f37bec5e6a4..937cf9fb02a 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java @@ -133,6 +133,11 @@ public void testContextlessEquals2() throws Exception { b2.setDescription("descr2"); userWithContext.getAssignment().add(b2); // this works, because there's already prismContext in userWithContext + // b1 and b2 obtain context when they are added to the container + assertNotNull(b1.asPrismContainerValue().getPrismContext()); + assertNotNull(b2.asPrismContainerValue().getPrismContext()); + assertFalse(b1.equals(b2)); + userWithContext.asPrismObject().createDelta(); // this works as well } From e42ad83fd42343df53362bd814758ee6f81f2036 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Thu, 10 Jul 2014 17:38:19 +0200 Subject: [PATCH 07/12] PrismContext-aware constructors for prism objects and containers. --- .../midpoint/prism/PrismContainer.java | 8 +- .../evolveum/midpoint/prism/PrismObject.java | 6 +- .../schema/xjc/clone/CloneProcessor.java | 2 +- .../schema/xjc/schema/SchemaProcessor.java | 75 ++++++++++++++++++- 4 files changed, 84 insertions(+), 7 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index c20a5f0ed84..15607542b5f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -76,7 +76,13 @@ public PrismContainer(QName name, Class compileTimeClass) { } this.compileTimeClass = compileTimeClass; } - + + public PrismContainer(QName name, Class compileTimeClass, PrismContext prismContext) { + this(name, compileTimeClass); + this.prismContext = prismContext; + } + + protected PrismContainer(QName name, PrismContainerDefinition definition, PrismContext prismContext) { super(name, definition, prismContext); } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java index 0d311b466cc..84c46549910 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismObject.java @@ -61,7 +61,11 @@ public PrismObject(QName name, Class compileTimeClass) { super(name, compileTimeClass); } - public PrismObject(QName name, PrismObjectDefinition definition, PrismContext prismContext) { + public PrismObject(QName name, Class compileTimeClass, PrismContext prismContext) { + super(name, compileTimeClass, prismContext); + } + + public PrismObject(QName name, PrismObjectDefinition definition, PrismContext prismContext) { super(name, definition, prismContext); } diff --git a/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/clone/CloneProcessor.java b/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/clone/CloneProcessor.java index 8f74ffd4a9e..a4289ed667e 100644 --- a/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/clone/CloneProcessor.java +++ b/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/clone/CloneProcessor.java @@ -83,7 +83,7 @@ private void removeConstructors(ClassOutline classOutline) { while (constructors.hasNext()) { JMethod constructor = constructors.next(); if (constructor.hasSignature(new JType[]{impl}) - || constructor.hasSignature(new JType[]{})) { + /* || constructor.hasSignature(new JType[]{}) */) { // default constructor has to be kept there! constructors.remove(); } } diff --git a/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/schema/SchemaProcessor.java b/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/schema/SchemaProcessor.java index 3f12fae713c..19b2bf21ee8 100644 --- a/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/schema/SchemaProcessor.java +++ b/tools/xjc-plugin/src/main/java/com/evolveum/midpoint/schema/xjc/schema/SchemaProcessor.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReference; import com.evolveum.midpoint.prism.PrismReferenceValue; @@ -258,6 +259,9 @@ private void updateObjectReferenceType(Outline outline) { JDefinedClass definedClass = objectReferenceOutline.implClass; definedClass._implements(CLASS_MAP.get(Referencable.class)); + + createDefaultConstructor(definedClass); + //add prism reference and get/set method for it JVar reference = definedClass.field(JMod.PRIVATE, PrismReferenceValue.class, REFERENCE_VALUE_FIELD_NAME); JMethod getReference = definedClass.method(JMod.PUBLIC, PrismReferenceValue.class, METHOD_AS_REFERENCE_VALUE); @@ -377,6 +381,7 @@ private Set updatePrismContainer(Outline outline) { Set> set = outline.getModel().beans().entrySet(); for (Map.Entry entry : set) { ClassOutline classOutline = outline.getClazz(entry.getValue()); + QName qname = getCClassInfoQName(entry.getValue()); if (qname == null || !hasAnnotation(classOutline, A_PRISM_CONTAINER)) { continue; @@ -392,11 +397,19 @@ private Set updatePrismContainer(Outline outline) { //inserting MidPointObject field into ObjectType class JVar containerValue = definedClass.field(JMod.PRIVATE, PrismContainerValue.class, CONTAINER_VALUE_FIELD_NAME); + + // default constructor + createDefaultConstructor(definedClass); + //create asPrismContainer // createAsPrismContainer(classOutline, containerValue); createAsPrismContainerValue(definedClass, containerValue); + //create setContainer - createSetContainerValueMethod(definedClass, containerValue); + JMethod setupContainerMethod = createSetContainerValueMethod(definedClass, containerValue); + + // constructor with prismContext + createPrismContextContainerableConstructor(definedClass, setupContainerMethod); // System.out.println("Creating toString, equals, hashCode methods."); //create toString, equals, hashCode @@ -416,6 +429,41 @@ private Set updatePrismContainer(Outline outline) { return containers; } + private JMethod createDefaultConstructor(JDefinedClass definedClass) { + JMethod constructor = definedClass.constructor(JMod.PUBLIC); + constructor.body().invoke("super").invoke("aaa"); + return constructor; + } + + private JMethod createPrismContextContainerableConstructor(JDefinedClass definedClass, JMethod setupContainerMethod) { + JMethod constructor = definedClass.constructor(JMod.PUBLIC); + constructor.param(PrismContext.class, "prismContext"); + + JBlock body = constructor.body(); + body.invoke(setupContainerMethod).arg(JExpr._new(CLASS_MAP.get(PrismContainerValue.class)).arg(constructor.params().get(0))); + return constructor; + } + + /* + public UserType(PrismContext prismContext) { + setupContainer(new PrismObject(_getContainerName(), this.getClass(), prismContext)); + } + */ + + private JMethod createPrismContextObjectableConstructor(JDefinedClass definedClass) { + JMethod constructor = definedClass.constructor(JMod.PUBLIC); + constructor.param(PrismContext.class, "prismContext"); + + JBlock body = constructor.body(); + body.invoke("setupContainer") + .arg(JExpr._new(CLASS_MAP.get(PrismObject.class)) + .arg(JExpr.invoke("_getContainerName")) + .arg(JExpr.invoke("getClass")) + .arg(constructor.params().get(0))); + return constructor; + } + + // private void createAsPrismContainer(JDefinedClass definedClass) { // JMethod getContainer = definedClass.method(JMod.PUBLIC, CLASS_MAP.get(PrismContainer.class), // METHOD_AS_PRISM_CONTAINER); @@ -454,11 +502,27 @@ private Set updatePrismObject(Outline outline) { for (Map.Entry entry : set) { ClassOutline classOutline = outline.getClazz(entry.getValue()); QName qname = getCClassInfoQName(entry.getValue()); - if (qname == null || !hasAnnotation(classOutline, A_PRISM_OBJECT)) { + + if (qname == null) { + continue; + } + + boolean isDirectPrismObject = hasAnnotation(classOutline, A_PRISM_OBJECT); + boolean isIndirectPrismObject = hasParentAnnotation(classOutline, A_PRISM_OBJECT); + + if (!isIndirectPrismObject) { continue; } JDefinedClass definedClass = classOutline.implClass; + + createDefaultConstructor(definedClass); + createPrismContextObjectableConstructor(definedClass); + + if (!isDirectPrismObject) { + continue; + } + definedClass._implements(CLASS_MAP.get(Objectable.class)); containers.add(definedClass); @@ -469,6 +533,7 @@ private Set updatePrismObject(Outline outline) { // createGetContainerMethod(classOutline, container); //create setContainer createSetContainerMethod(definedClass, container); + //create asPrismObject() createAsPrismObject(definedClass); createAsPrismContainer(classOutline, container); @@ -770,7 +835,7 @@ private void createToStringMethod(JDefinedClass definedClass, String baseMethod) body._return(invocation); } - private void createSetContainerValueMethod(JDefinedClass definedClass, JVar container) { + private JMethod createSetContainerValueMethod(JDefinedClass definedClass, JVar container) { JMethod setContainer = definedClass.method(JMod.PUBLIC, void.class, METHOD_SETUP_CONTAINER_VALUE); JVar methodContainer = setContainer.param(PrismContainerValue.class, "containerValue"); //create method body @@ -798,6 +863,7 @@ private void createSetContainerValueMethod(JDefinedClass definedClass, JVar cont // then._throw(exception); body.assign(JExpr._this().ref(container), methodContainer); + return setContainer; } private void createSetContainerValueMethodInObject(JDefinedClass definedClass, JVar container) { @@ -830,7 +896,7 @@ private void createAsPrismContainer(ClassOutline classOutline, JVar container) { body._return(container); } - private void createSetContainerMethod(JDefinedClass definedClass, JVar container) { + private JMethod createSetContainerMethod(JDefinedClass definedClass, JVar container) { JMethod setContainer = definedClass.method(JMod.PUBLIC, void.class, METHOD_SETUP_CONTAINER); JVar methodContainer = setContainer.param(PrismObject.class, "container"); //create method body @@ -854,6 +920,7 @@ private void createSetContainerMethod(JDefinedClass definedClass, JVar container // then._throw(exception); body.assign(JExpr._this().ref(container), methodContainer); + return setContainer; } private QName getCClassInfoQName(CClassInfo info) { From 675777b7502190eb9a35a3c7078a0a52554c0c74 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Thu, 10 Jul 2014 18:11:20 +0200 Subject: [PATCH 08/12] Fixing lockout support +test --- .../icf/dummy/connector/DummyConnector.java | 31 ++++-- .../icf/dummy/resource/DummyAccount.java | 10 ++ .../midpoint/schema/CapabilityUtil.java | 15 +++ .../schema/constants/SchemaConstants.java | 1 + .../schema/util/ResourceTypeUtil.java | 22 ++++ .../impl/ResourceObjectConverter.java | 27 ++++- .../ucf/api/AttributesToReturn.java | 9 ++ .../ucf/impl/ConnectorInstanceIcfImpl.java | 29 ++++- .../provisioning/util/ProvisioningUtil.java | 11 +- .../provisioning/test/impl/TestDummy.java | 104 ++++++++++++++++-- .../test/impl/TestDummyNoActivation.java | 61 +++++++++- 11 files changed, 294 insertions(+), 26 deletions(-) diff --git a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java index ee103cba321..717cb7223ea 100644 --- a/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java +++ b/icf-connectors/dummy-connector/src/main/java/com/evolveum/icf/dummy/connector/DummyConnector.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * 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. @@ -282,13 +282,16 @@ public Uid update(ObjectClass objectClass, Uid uid, Set replaceAttrib changePassword(account,attr); } else if (attr.is(OperationalAttributes.ENABLE_NAME)) { - account.setEnabled(getEnable(attr)); + account.setEnabled(getBoolean(attr)); } else if (attr.is(OperationalAttributes.ENABLE_DATE_NAME)) { account.setValidFrom(getDate(attr)); } else if (attr.is(OperationalAttributes.DISABLE_DATE_NAME)) { account.setValidTo(getDate(attr)); + + } else if (attr.is(OperationalAttributes.LOCK_OUT_NAME)) { + account.setLockout(getBoolean(attr)); } else { String name = attr.getName(); @@ -333,7 +336,7 @@ public Uid update(ObjectClass objectClass, Uid uid, Set replaceAttrib throw new IllegalArgumentException("Attempt to change password on group"); } else if (attr.is(OperationalAttributes.ENABLE_NAME)) { - group.setEnabled(getEnable(attr)); + group.setEnabled(getBoolean(attr)); } else { String name = attr.getName(); @@ -750,6 +753,8 @@ private ObjectClassInfoBuilder createCommonObjectClassBuilder(String typeName, objClassBuilder.addAttributeInfo(OperationalAttributeInfos.ENABLE_DATE); objClassBuilder.addAttributeInfo(OperationalAttributeInfos.DISABLE_DATE); } + + objClassBuilder.addAttributeInfo(OperationalAttributeInfos.LOCK_OUT); } // __NAME__ will be added by default @@ -1091,6 +1096,10 @@ private ConnectorObject convertToConnectorObject(DummyAccount account, Collectio GuardedString gs = new GuardedString(account.getPassword().toCharArray()); builder.addAttribute(OperationalAttributes.PASSWORD_NAME,gs); } + + if (account.isLockout() != null) { + builder.addAttribute(OperationalAttributes.LOCK_OUT_NAME, account.isLockout()); + } return builder.build(); } @@ -1126,7 +1135,7 @@ private DummyAccount convertToAccount(Set createAttributes) throws Co changePassword(newAccount,attr); } else if (attr.is(OperationalAttributeInfos.ENABLE.getName())) { - enabled = getEnable(attr); + enabled = getBoolean(attr); newAccount.setEnabled(enabled); } else if (attr.is(OperationalAttributeInfos.ENABLE_DATE.getName())) { @@ -1141,7 +1150,11 @@ private DummyAccount convertToAccount(Set createAttributes) throws Co newAccount.setValidTo(getDate(attr)); } else { throw new IllegalArgumentException("DISABLE_DATE specified in the account attributes while not supporting it"); - } + } + + } else if (attr.is(OperationalAttributeInfos.LOCK_OUT.getName())) { + Boolean lockout = getBoolean(attr); + newAccount.setLockout(lockout); } else { String name = attr.getName(); @@ -1179,7 +1192,7 @@ private DummyGroup convertToGroup(Set createAttributes) throws Connec throw new IllegalArgumentException("Password specified for a group"); } else if (attr.is(OperationalAttributeInfos.ENABLE.getName())) { - enabled = getEnable(attr); + enabled = getBoolean(attr); newGroup.setEnabled(enabled); } else if (attr.is(OperationalAttributeInfos.ENABLE_DATE.getName())) { @@ -1240,13 +1253,13 @@ private DummyPrivilege convertToPriv(Set createAttributes) throws Con return newPriv; } - private boolean getEnable(Attribute attr) { + private boolean getBoolean(Attribute attr) { if (attr.getValue() == null || attr.getValue().isEmpty()) { - throw new IllegalArgumentException("Empty enable attribute was provided"); + throw new IllegalArgumentException("Empty "+attr.getName()+" attribute was provided"); } Object object = attr.getValue().get(0); if (!(object instanceof Boolean)) { - throw new IllegalArgumentException("Enable attribute was provided as "+object.getClass().getName()+" while expecting boolean"); + throw new IllegalArgumentException("Attribute "+attr.getName()+" was provided as "+object.getClass().getName()+" while expecting boolean"); } return ((Boolean)object).booleanValue(); } diff --git a/icf-connectors/dummy-resource/src/main/java/com/evolveum/icf/dummy/resource/DummyAccount.java b/icf-connectors/dummy-resource/src/main/java/com/evolveum/icf/dummy/resource/DummyAccount.java index 0a4f520a11e..a6bffeb440c 100644 --- a/icf-connectors/dummy-resource/src/main/java/com/evolveum/icf/dummy/resource/DummyAccount.java +++ b/icf-connectors/dummy-resource/src/main/java/com/evolveum/icf/dummy/resource/DummyAccount.java @@ -40,6 +40,7 @@ public class DummyAccount extends DummyObject { public static final String ATTR_PRIVILEGES_NAME = "privileges"; private String password = null; + private Boolean lockout = null; public DummyAccount() { super(); @@ -57,6 +58,14 @@ public void setPassword(String password) { this.password = password; } + public Boolean isLockout() { + return lockout; + } + + public void setLockout(boolean lockout) { + this.lockout = lockout; + } + @Override protected DummyObjectClass getObjectClass() throws ConnectException, FileNotFoundException { return resource.getAccountObjectClass(); @@ -80,6 +89,7 @@ public String debugDump() { @Override protected void extendDebugDump(StringBuilder sb, int indent) { DebugUtil.debugDumpWithLabelToStringLn(sb, "Password", password, indent + 1); + DebugUtil.debugDumpWithLabelToStringLn(sb, "Lockout", lockout, indent + 1); } } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/CapabilityUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/CapabilityUtil.java index 1ca36ef39c6..e6a9112315d 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/CapabilityUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/CapabilityUtil.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.util.JAXBUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ActivationCapabilityType; +import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ActivationLockoutStatusCapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ActivationStatusCapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CredentialsCapabilityType; @@ -157,4 +158,18 @@ public static boolean isActivationStatusReturnedByDefault(ActivationCapabilityTy } return statusCap.isReturnedByDefault(); } + + public static boolean isActivationLockoutStatusReturnedByDefault(ActivationCapabilityType capability) { + if (capability == null) { + return false; + } + ActivationLockoutStatusCapabilityType statusCap = capability.getLockoutStatus(); + if (statusCap == null) { + return false; + } + if (statusCap.isReturnedByDefault() == null) { + return true; + } + return statusCap.isReturnedByDefault(); + } } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java index c3640aa7fbb..a667d93a5a7 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java @@ -133,6 +133,7 @@ public abstract class SchemaConstants { public static final ItemPath PATH_ACTIVATION_VALID_FROM = new ItemPath(C_ACTIVATION, ActivationType.F_VALID_FROM); public static final ItemPath PATH_ACTIVATION_VALID_TO = new ItemPath(C_ACTIVATION, ActivationType.F_VALID_TO); public static final ItemPath PATH_ACTIVATION_DISABLE_REASON = new ItemPath(ShadowType.F_ACTIVATION, ActivationType.F_DISABLE_REASON); + public static final ItemPath PATH_ACTIVATION_LOCKOUT_STATUS = new ItemPath(C_ACTIVATION, ActivationType.F_LOCKOUT_STATUS); public static final ItemPath PATH_ATTRIBUTES = new ItemPath(C_ATTRIBUTES); public static final ItemPath PATH_ASSOCIATION = new ItemPath(C_ASSOCIATION); public static final ItemPath PATH_TRIGGER = new ItemPath(ObjectType.F_TRIGGER); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ResourceTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ResourceTypeUtil.java index f90bc8c350e..01dd78fb8d3 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ResourceTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ResourceTypeUtil.java @@ -26,6 +26,7 @@ + import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -57,6 +58,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.midpoint.xml.ns._public.common.common_3.XmlSchemaType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ActivationCapabilityType; +import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ActivationLockoutStatusCapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CreateCapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CredentialsCapabilityType; @@ -331,6 +333,26 @@ public static boolean hasResourceNativeActivationCapability(ResourceType resourc return true; } + public static boolean hasResourceNativeActivationLockoutCapability(ResourceType resource) { + ActivationCapabilityType activationCapability = null; + // check resource native capabilities. if resource cannot do + // activation, it sholud be null.. + if (resource.getCapabilities() != null && resource.getCapabilities().getNative() != null) { + activationCapability = CapabilityUtil.getCapability(resource.getCapabilities().getNative().getAny(), + ActivationCapabilityType.class); + } + if (activationCapability == null) { + return false; + } + + ActivationLockoutStatusCapabilityType lockoutStatus = activationCapability.getLockoutStatus(); + if (lockoutStatus == null) { + return false; + } + + return true; + } + public static boolean hasResourceConfiguredActivationCapability(ResourceType resource) { if (resource.getCapabilities() == null) { return false; diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java index 75eaa0d2121..c73d7eeec50 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * 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. @@ -87,6 +87,7 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LockoutStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationProvisioningScriptType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationProvisioningScriptsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvisioningOperationTypeType; @@ -821,6 +822,30 @@ private Collection determineActivationChange(ShadowType shadow, Colle } } + PropertyDelta lockoutPropertyDelta = PropertyDelta.findPropertyDelta(objectChange, + SchemaConstants.PATH_ACTIVATION_LOCKOUT_STATUS); + if (lockoutPropertyDelta != null) { + if (activationCapabilityType == null) { + throw new SchemaException("Attempt to change activation lockoutStatus on "+resource+" which does not have the capability"); + } + LockoutStatusType status = lockoutPropertyDelta.getPropertyNew().getRealValue(); + LOGGER.trace("Found activation lockoutStatus change to: {}", status); + + // TODO: simulated + if (ResourceTypeUtil.hasResourceNativeActivationLockoutCapability(resource)) { + // Native lockout, need to check if there is not also change to simulated activation which may be in conflict +// checkSimulatedActivation(objectChange, status, shadow, resource, objectClassDefinition); + operations.add(new PropertyModificationOperation(lockoutPropertyDelta)); + } else { + // Try to simulate activation capability + + // TODO +// PropertyModificationOperation activationAttribute = convertToSimulatedActivationAttribute(lockoutPropertyDelta, shadow, resource, +// status, objectClassDefinition); +// operations.add(activationAttribute); + } + } + return operations; } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/AttributesToReturn.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/AttributesToReturn.java index 7fc7d16d253..ed266016bc6 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/AttributesToReturn.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/api/AttributesToReturn.java @@ -30,6 +30,7 @@ public class AttributesToReturn implements Serializable { private boolean returnDefaultAttributes = true; private boolean returnPasswordExplicit = false; private boolean returnAdministrativeStatusExplicit = false; + private boolean returnLockoutStatusExplicit = false; Collection attributesToReturn = null; public boolean isReturnDefaultAttributes() { @@ -64,6 +65,14 @@ public void setReturnAdministrativeStatusExplicit(boolean returnAdministrativeSt this.returnAdministrativeStatusExplicit = returnAdministrativeStatusExplicit; } + public boolean isReturnLockoutStatusExplicit() { + return returnLockoutStatusExplicit; + } + + public void setReturnLockoutStatusExplicit(boolean returnLockoutStatusExplicit) { + this.returnLockoutStatusExplicit = returnLockoutStatusExplicit; + } + @Override public String toString() { return "AttributesToReturn(returnDefaultAttributes=" + returnDefaultAttributes + ", returnPasswordExplicit=" diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java index 4f21087dbe0..0487e4c4f31 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/ConnectorInstanceIcfImpl.java @@ -148,6 +148,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ActivationCapabilityType; +import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ActivationLockoutStatusCapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ActivationStatusCapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.ActivationValidityCapabilityType; import com.evolveum.midpoint.xml.ns._public.resource.capabilities_3.CreateCapabilityType; @@ -505,7 +506,7 @@ public Collection fetchCapabilities(OperationResult parentResult) throws // Result type for this operation OperationResult result = parentResult.createMinorSubresult(ConnectorInstance.class.getName() - + ".getCapabilities"); + + ".fetchCapabilities"); result.addContext("connector", connectorType); try { @@ -584,6 +585,7 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects AttributeInfo enableAttributeInfo = null; AttributeInfo enableDateAttributeInfo = null; AttributeInfo disableDateAttributeInfo = null; + AttributeInfo lockoutAttributeInfo = null; // New instance of midPoint schema object resourceSchema = new ResourceSchema(getSchemaNamespace(), prismContext); @@ -655,6 +657,12 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects // Skip this attribute, capability is sufficient continue; } + + if (OperationalAttributes.LOCK_OUT_NAME.equals(attributeInfo.getName())) { + lockoutAttributeInfo = attributeInfo; + // Skip this attribute, capability is sufficient + continue; + } QName attrXsdName = icfNameMapper.convertAttributeNameToQName(attributeInfo.getName(), getSchemaNamespace()); QName attrXsdType = icfTypeToXsdType(attributeInfo.getType(), false); @@ -760,6 +768,17 @@ private void parseResourceSchema(org.identityconnectors.framework.common.objects capValidTo.setReturnedByDefault(false); } } + + if (lockoutAttributeInfo != null) { + if (capAct == null) { + capAct = new ActivationCapabilityType(); + } + ActivationLockoutStatusCapabilityType capActStatus = new ActivationLockoutStatusCapabilityType(); + capAct.setLockoutStatus(capActStatus); + if (!lockoutAttributeInfo.isReturnedByDefault()) { + capActStatus.setReturnedByDefault(false); + } + } if (capAct != null) { capabilities.add(capabilityObjectFactory.createActivation(capAct)); @@ -1035,6 +1054,10 @@ private String[] convertToIcfAttrsToGet(ObjectClassComplexTypeDefinition objectC || (attributesToReturn.isReturnDefaultAttributes() && enabledReturnedByDefault())) { icfAttrsToGet.add(OperationalAttributes.ENABLE_NAME); } + if (attributesToReturn.isReturnLockoutStatusExplicit() + || (attributesToReturn.isReturnDefaultAttributes() && lockoutReturnedByDefault())) { + icfAttrsToGet.add(OperationalAttributes.LOCK_OUT_NAME); + } if (attrs != null) { for (ResourceAttributeDefinition attrDef: attrs) { String attrName = icfNameMapper.convertAttributeNameToIcf(attrDef.getName(), getSchemaNamespace()); @@ -1056,6 +1079,10 @@ private boolean enabledReturnedByDefault() { return CapabilityUtil.isActivationStatusReturnedByDefault(capability); } + private boolean lockoutReturnedByDefault() { + ActivationCapabilityType capability = CapabilityUtil.getCapability(capabilities, ActivationCapabilityType.class); + return CapabilityUtil.isActivationLockoutStatusReturnedByDefault(capability); + } @Override public Collection> addObject(PrismObject object, diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java index d561912bf33..172f4b4aae6 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Evolveum + * 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. @@ -281,6 +281,15 @@ public static AttributesToReturn createAttributesToReturn(RefinedObjectClassDefi } } + if (CapabilityUtil.isActivationLockoutStatusReturnedByDefault(activationCapabilityType)) { + // There resource is capable of returning lockout flag but it does not do it by default + AttributeFetchStrategyType statusFetchStrategy = objectClassDefinition.getActivationFetchStrategy(ActivationType.F_LOCKOUT_STATUS); + if (statusFetchStrategy == AttributeFetchStrategyType.EXPLICIT) { + attributesToReturn.setReturnLockoutStatusExplicit(true); + apply = true; + } + } + if (apply) { return attributesToReturn; } else { diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java index 53465972881..9857445012a 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummy.java @@ -126,6 +126,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.CapabilitiesType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CapabilityCollectionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LockoutStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationProvisioningScriptsType; @@ -1934,8 +1935,8 @@ public void test150DisableAccount() throws Exception { } @Test - public void test152EnableAccount() throws Exception { - final String TEST_NAME = "test152EnableAccount"; + public void test151EnableAccount() throws Exception { + final String TEST_NAME = "test151EnableAccount"; TestUtil.displayTestTile(TEST_NAME); // GIVEN @@ -1978,8 +1979,8 @@ public void test152EnableAccount() throws Exception { } @Test - public void test155SetValidFrom() throws Exception { - final String TEST_NAME = "test155SetValidFrom"; + public void test152SetValidFrom() throws Exception { + final String TEST_NAME = "test152SetValidFrom"; TestUtil.displayTestTile(TEST_NAME); // GIVEN @@ -2025,8 +2026,8 @@ public void test155SetValidFrom() throws Exception { } @Test - public void test156SetValidTo() throws Exception { - final String TEST_NAME = "test156SetValidTo"; + public void test153SetValidTo() throws Exception { + final String TEST_NAME = "test153SetValidTo"; TestUtil.displayTestTile(TEST_NAME); // GIVEN @@ -2071,10 +2072,94 @@ public void test156SetValidTo() throws Exception { assertSteadyResource(); } + + @Test + public void test155GetLockedoutAccount() throws Exception { + final String TEST_NAME = "test155GetLockedoutAccount"; + TestUtil.displayTestTile(TEST_NAME); + // GIVEN + OperationResult result = new OperationResult(TestDummy.class.getName() + + "." + TEST_NAME); + + DummyAccount dummyAccount = getDummyAccountAssert(ACCOUNT_WILL_USERNAME, willIcfUid); + dummyAccount.setLockout(true); + + // WHEN + PrismObject shadow = provisioningService.getObject(ShadowType.class, ACCOUNT_WILL_OID, null, null, result); + ShadowType shadowType = shadow.asObjectable(); + + // THEN + result.computeStatus(); + display("getObject result", result); + TestUtil.assertSuccess(result); + + display("Retrieved account shadow", shadowType); + + assertNotNull("No dummy account", shadowType); + + if (supportsActivation()) { + PrismAsserts.assertPropertyValue(shadow, SchemaConstants.PATH_ACTIVATION_LOCKOUT_STATUS, + LockoutStatusType.LOCKED); + } else { + PrismAsserts.assertNoItem(shadow, SchemaConstants.PATH_ACTIVATION_LOCKOUT_STATUS); + } + + checkAccountWill(shadowType, result); + + checkConsistency(shadowType.asPrismObject()); + + assertSteadyResource(); + } + + @Test + public void test156UnlockAccount() throws Exception { + final String TEST_NAME = "test156UnlockAccount"; + TestUtil.displayTestTile(TEST_NAME); + // GIVEN + + Task task = taskManager.createTaskInstance(TestDummy.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + + ShadowType accountType = provisioningService.getObject(ShadowType.class, ACCOUNT_WILL_OID, null, task, + result).asObjectable(); + assertNotNull(accountType); + display("Retrieved account shadow", accountType); + + DummyAccount dummyAccount = getDummyAccountAssert(ACCOUNT_WILL_USERNAME, willIcfUid); + assertTrue("Account is not locked", dummyAccount.isLockout()); + + syncServiceMock.reset(); + + ObjectDelta delta = ObjectDelta.createModificationReplaceProperty(ShadowType.class, + ACCOUNT_WILL_OID, SchemaConstants.PATH_ACTIVATION_LOCKOUT_STATUS, prismContext, + LockoutStatusType.NORMAL); + display("ObjectDelta", delta); + delta.checkConsistence(); + + // WHEN + TestUtil.displayWhen(TEST_NAME); + provisioningService.modifyObject(ShadowType.class, delta.getOid(), delta.getModifications(), + new OperationProvisioningScriptsType(), null, task, result); + + // THEN + TestUtil.displayThen(TEST_NAME); + result.computeStatus(); + display("modifyObject result", result); + TestUtil.assertSuccess(result); + + delta.checkConsistence(); + // check if activation was changed + dummyAccount = getDummyAccountAssert(ACCOUNT_WILL_USERNAME, willIcfUid); + assertFalse("Dummy account "+ACCOUNT_WILL_USERNAME+" is locked, expected unlocked", dummyAccount.isLockout()); + + syncServiceMock.assertNotifySuccessOnly(); + + assertSteadyResource(); + } @Test - public void test158GetAccount() throws Exception { - final String TEST_NAME = "test158GetAccount"; + public void test159GetAccount() throws Exception { + final String TEST_NAME = "test159GetAccount"; TestUtil.displayTestTile(TEST_NAME); // GIVEN OperationResult result = new OperationResult(TestDummy.class.getName() @@ -2096,8 +2181,11 @@ public void test158GetAccount() throws Exception { if (supportsActivation()) { PrismAsserts.assertPropertyValue(shadow, SchemaConstants.PATH_ACTIVATION_ADMINISTRATIVE_STATUS, ActivationStatusType.ENABLED); + PrismAsserts.assertPropertyValue(shadow, SchemaConstants.PATH_ACTIVATION_LOCKOUT_STATUS, + LockoutStatusType.NORMAL); } else { PrismAsserts.assertNoItem(shadow, SchemaConstants.PATH_ACTIVATION_ADMINISTRATIVE_STATUS); + PrismAsserts.assertNoItem(shadow, SchemaConstants.PATH_ACTIVATION_LOCKOUT_STATUS); } checkAccountWill(shadowType, result); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyNoActivation.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyNoActivation.java index 4bbda2ead09..2f599b72c6c 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyNoActivation.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/test/impl/TestDummyNoActivation.java @@ -40,6 +40,7 @@ import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LockoutStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationProvisioningScriptsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; @@ -125,8 +126,8 @@ public void test150DisableAccount() throws Exception { @Test @Override - public void test152EnableAccount() throws Exception { - final String TEST_NAME = "test152EnableAccount"; + public void test151EnableAccount() throws Exception { + final String TEST_NAME = "test151EnableAccount"; TestUtil.displayTestTile(TEST_NAME); // GIVEN @@ -169,8 +170,8 @@ public void test152EnableAccount() throws Exception { @Test @Override - public void test155SetValidFrom() throws Exception { - final String TEST_NAME = "test155SetValidFrom"; + public void test152SetValidFrom() throws Exception { + final String TEST_NAME = "test152SetValidFrom"; TestUtil.displayTestTile(TEST_NAME); // GIVEN @@ -215,8 +216,8 @@ public void test155SetValidFrom() throws Exception { @Test @Override - public void test156SetValidTo() throws Exception { - final String TEST_NAME = "test156SetValidTo"; + public void test153SetValidTo() throws Exception { + final String TEST_NAME = "test153SetValidTo"; TestUtil.displayTestTile(TEST_NAME); // GIVEN @@ -259,4 +260,52 @@ public void test156SetValidTo() throws Exception { assertSteadyResource(); } + @Test + @Override + public void test155GetLockedoutAccount() throws Exception { + // Not relevant + } + + @Test + @Override + public void test156UnlockAccount() throws Exception { + final String TEST_NAME = "test156UnlockAccount"; + TestUtil.displayTestTile(TEST_NAME); + // GIVEN + + Task task = taskManager.createTaskInstance(TestDummy.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + + syncServiceMock.reset(); + + ObjectDelta delta = ObjectDelta.createModificationReplaceProperty(ShadowType.class, + ACCOUNT_WILL_OID, SchemaConstants.PATH_ACTIVATION_LOCKOUT_STATUS, prismContext, + LockoutStatusType.NORMAL); + display("ObjectDelta", delta); + delta.checkConsistence(); + + try { + // WHEN + provisioningService.modifyObject(ShadowType.class, delta.getOid(), + delta.getModifications(), new OperationProvisioningScriptsType(), null, task, result); + + AssertJUnit.fail("Unexpected success"); + } catch (SchemaException e) { + // This is expected + } + + + // THEN + TestUtil.displayThen(TEST_NAME); + result.computeStatus(); + display("modifyObject result", result); + TestUtil.assertFailure(result); + + delta.checkConsistence(); + + syncServiceMock.assertNotifyFailureOnly(); + + assertSteadyResource(); + } + } From 392fa1dedf22048877a555216d0f87cdde4e33f4 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 11 Jul 2014 07:12:36 +0200 Subject: [PATCH 09/12] Making prismContext optional in deltas. --- .../midpoint/prism/delta/ItemDelta.java | 19 ++-- .../midpoint/prism/delta/ObjectDelta.java | 2 +- .../prism/TestPrismObjectConstruction.java | 26 ++--- .../midpoint/schema/DeltaConvertor.java | 106 +++++------------- .../midpoint/schema/TestDiffEquals.java | 36 ++++-- 5 files changed, 83 insertions(+), 106 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java index 5a630076a71..f26ff5bbc15 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ItemDelta.java @@ -77,7 +77,7 @@ protected ItemDelta(ItemDefinition itemDefinition, PrismContext prismContext) { if (itemDefinition == null) { throw new IllegalArgumentException("Attempt to create item delta without a definition"); } - checkPrismContext(prismContext, itemDefinition); + //checkPrismContext(prismContext, itemDefinition); this.prismContext = prismContext; this.elementName = itemDefinition.getName(); this.parentPath = new ItemPath(); @@ -85,7 +85,7 @@ protected ItemDelta(ItemDefinition itemDefinition, PrismContext prismContext) { } protected ItemDelta(QName elementName, ItemDefinition itemDefinition, PrismContext prismContext) { - checkPrismContext(prismContext, itemDefinition); + //checkPrismContext(prismContext, itemDefinition); this.prismContext = prismContext; this.elementName = elementName; this.parentPath = new ItemPath(); @@ -93,7 +93,7 @@ protected ItemDelta(QName elementName, ItemDefinition itemDefinition, PrismConte } protected ItemDelta(ItemPath parentPath, QName elementName, ItemDefinition itemDefinition, PrismContext prismContext) { - checkPrismContext(prismContext, itemDefinition); + //checkPrismContext(prismContext, itemDefinition); this.prismContext = prismContext; this.elementName = elementName; this.parentPath = parentPath; @@ -101,7 +101,7 @@ protected ItemDelta(ItemPath parentPath, QName elementName, ItemDefinition itemD } protected ItemDelta(ItemPath path, ItemDefinition itemDefinition, PrismContext prismContext) { - checkPrismContext(prismContext, itemDefinition); + //checkPrismContext(prismContext, itemDefinition); this.prismContext = prismContext; if (path == null) { @@ -120,11 +120,12 @@ protected ItemDelta(ItemPath path, ItemDefinition itemDefinition, PrismContext p this.definition = itemDefinition; } - private void checkPrismContext(PrismContext prismContext, ItemDefinition itemDefinition) { - if (prismContext == null) { - throw new IllegalStateException("No prismContext in delta for " + itemDefinition); - } - } + // currently unused; we allow deltas without prismContext, except for some operations (e.g. serialization to ItemDeltaType) +// private void checkPrismContext(PrismContext prismContext, ItemDefinition itemDefinition) { +// if (prismContext == null) { +// throw new IllegalStateException("No prismContext in delta for " + itemDefinition); +// } +// } public QName getElementName() { return elementName; diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java index 5396e7970e0..1b74698191f 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/delta/ObjectDelta.java @@ -100,7 +100,7 @@ public class ObjectDelta implements DebugDumpable, Visitab public ObjectDelta(Class objectTypeClass, ChangeType changeType, PrismContext prismContext) { Validate.notNull(objectTypeClass,"No objectTypeClass"); Validate.notNull(changeType,"No changeType"); - Validate.notNull(prismContext, "No prismContext"); + //Validate.notNull(prismContext, "No prismContext"); this.changeType = changeType; this.objectTypeClass = objectTypeClass; diff --git a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java index a3eb93cae04..6e9b6ef9ad0 100644 --- a/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java +++ b/infra/prism/src/test/java/com/evolveum/midpoint/prism/TestPrismObjectConstruction.java @@ -28,7 +28,6 @@ import javax.xml.validation.Schema; import javax.xml.validation.Validator; -import com.evolveum.midpoint.prism.util.PrismTestUtil; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.w3c.dom.Document; @@ -54,7 +53,7 @@ public class TestPrismObjectConstruction { @BeforeSuite - public void setupDebug() throws SAXException, IOException, SchemaException { + public void setupDebug() { PrettyPrinter.setDefaultNamespacePrefix(DEFAULT_NAMESPACE_PREFIX); } @@ -74,7 +73,7 @@ public void testConstructionWithSchema() throws Exception { // WHEN PrismObject user = userDefinition.instantiate(); // Fill-in object values, checking presence of definition while doing so - fillInUserDrake(user, true, ctx); + fillInUserDrake(user, true); // THEN System.out.println("User:"); @@ -93,18 +92,18 @@ public void testDefinitionlessConstruction() throws Exception { PrismInternalTestUtil.displayTestTitle(TEST_NAME); // GIVEN - PrismContext ctx = constructInitializedPrismContext(); // we need this context to do even basic object operations (mergeValue in this case) + // No context needed // WHEN PrismObject user = new PrismObject(USER_QNAME, UserType.class); - user.revive(ctx); // there is no definition yet // Fill-in object values, no schema checking - fillInUserDrake(user, false, ctx); + fillInUserDrake(user, false); // THEN System.out.println("User:"); System.out.println(user.debugDump()); // Check if the values are correct, no schema checking + PrismContext ctx = constructInitializedPrismContext(); assertUserDrake(user, false, ctx); } @@ -118,11 +117,12 @@ public void testDefinitionlessConstructionAndSchemaApplication() throws Exceptio PrismInternalTestUtil.displayTestTitle(TEST_NAME); // GIVEN + // No context needed (yet) PrismObject user = new PrismObject(USER_QNAME, UserType.class); - PrismContext ctx = constructInitializedPrismContext(); // Fill-in object values, no schema checking - fillInUserDrake(user, false, ctx); + fillInUserDrake(user, false); // Make sure the object is OK + PrismContext ctx = constructInitializedPrismContext(); assertUserDrake(user, false, ctx); @@ -150,7 +150,7 @@ public void testClone() throws Exception { PrismContext ctx = constructInitializedPrismContext(); PrismObjectDefinition userDefinition = getFooSchema(ctx).findObjectDefinitionByElementName(new QName(NS_FOO,"user")); PrismObject user = userDefinition.instantiate(); - fillInUserDrake(user, true, ctx); + fillInUserDrake(user, true); // precondition assertUserDrake(user, true, ctx); @@ -173,7 +173,7 @@ public void testCloneEquals() throws Exception { PrismContext ctx = constructInitializedPrismContext(); PrismObjectDefinition userDefinition = getFooSchema(ctx).findObjectDefinitionByElementName(new QName(NS_FOO,"user")); PrismObject user = userDefinition.instantiate(); - fillInUserDrake(user, true, ctx); + fillInUserDrake(user, true); PrismObject clone = user.clone(); // WHEN, THEN @@ -182,7 +182,7 @@ public void testCloneEquals() throws Exception { } - private void fillInUserDrake(PrismObject user, boolean assertDefinitions, PrismContext prismContext) throws SchemaException { + private void fillInUserDrake(PrismObject user, boolean assertDefinitions) throws SchemaException { user.setOid(USER_OID); // fullName @@ -226,7 +226,7 @@ private void fillInUserDrake(PrismObject user, boolean assertDefinitio assertEquals("Wrong number of assignment values (empty)", 0, assignmentContainer.getValues().size()); // assignment values: construct assignment value as a new container "out of the blue" and then add it. - PrismContainer assBlueContainer = new PrismContainer(USER_ASSIGNMENT_QNAME, prismContext); + PrismContainer assBlueContainer = new PrismContainer(USER_ASSIGNMENT_QNAME); PrismProperty assBlueDescriptionProperty = assBlueContainer.findOrCreateProperty(USER_DESCRIPTION_QNAME); assBlueDescriptionProperty.addValue(new PrismPropertyValue("Assignment created out of the blue")); PrismAsserts.assertParentConsistency(user); @@ -235,7 +235,7 @@ private void fillInUserDrake(PrismObject user, boolean assertDefinitio PrismAsserts.assertParentConsistency(user); // assignment values: construct assignment value as a new container value "out of the blue" and then add it. - PrismContainerValue assCyanContainerValue = new PrismContainerValue(prismContext); + PrismContainerValue assCyanContainerValue = new PrismContainerValue(); PrismProperty assCyanDescriptionProperty = assCyanContainerValue.findOrCreateProperty(USER_DESCRIPTION_QNAME); assCyanDescriptionProperty.addValue(new PrismPropertyValue("Assignment created out of the cyan")); assignmentContainer.mergeValue(assCyanContainerValue); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java index 75b2bbf83fb..7193a360cac 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/DeltaConvertor.java @@ -19,12 +19,10 @@ import java.util.Collection; import java.util.List; -import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; -import org.w3c.dom.Document; -import org.w3c.dom.Element; +import org.apache.commons.lang.Validate; import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemDefinition; @@ -34,7 +32,6 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ItemDelta; @@ -42,13 +39,9 @@ import com.evolveum.midpoint.prism.parser.XNodeSerializer; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.RawTypeUtil; -import com.evolveum.midpoint.prism.util.ValueSerializationUtil; -import com.evolveum.midpoint.prism.xnode.MapXNode; -import com.evolveum.midpoint.prism.xnode.RootXNode; import com.evolveum.midpoint.prism.xnode.XNode; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectDeltaListType; @@ -72,6 +65,7 @@ public class DeltaConvertor { public static ObjectDelta createObjectDelta(ObjectModificationType objectModification, Class type, PrismContext prismContext) throws SchemaException { + Validate.notNull(prismContext, "No prismContext in DeltaConvertor.createObjectDelta call"); PrismObjectDefinition objectDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(type); if (objectDefinition == null) { throw new SchemaException("No object definition for class "+type); @@ -94,8 +88,9 @@ public static ObjectDelta createObjectDelta(ObjectModi public static ObjectDelta createObjectDelta(ObjectDeltaType objectDeltaType, PrismContext prismContext) throws SchemaException { - - QName objectType = objectDeltaType.getObjectType(); + + Validate.notNull(prismContext, "No prismContext in DeltaConvertor.createObjectDelta call"); + QName objectType = objectDeltaType.getObjectType(); if (objectType == null) { throw new SchemaException("No objectType specified"); } @@ -139,7 +134,8 @@ public static ObjectDeltaOperation createObjectDeltaOperation(ObjectDeltaOperati public static Collection toModifications(ObjectModificationType objectModification, Class type, PrismContext prismContext) throws SchemaException { - PrismObjectDefinition objectDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(type); + Validate.notNull(prismContext, "No prismContext in DeltaConvertor.toModifications call"); + PrismObjectDefinition objectDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(type); if (objectDefinition == null) { throw new SchemaException("No object definition for class "+type); } @@ -184,6 +180,7 @@ public static ObjectModificationType toObjectModification } public static ObjectDeltaType toObjectDeltaType(ObjectDelta objectDelta) throws SchemaException { + Validate.notNull(objectDelta.getPrismContext(), "ObjectDelta without prismContext cannot be converted to ObjectDeltaType"); ObjectDeltaType objectDeltaType = new ObjectDeltaType(); objectDeltaType.setChangeType(convertChangeType(objectDelta.getChangeType())); Class type = objectDelta.getObjectTypeClass(); @@ -232,10 +229,9 @@ public static ObjectDeltaType toObjectDeltaType(ObjectDelta delta) throws SchemaException, JAXBException { + Validate.notNull(delta.getPrismContext(), "ObjectDelta without prismContext cannot be converted to XML"); ObjectDeltaType objectDeltaType = toObjectDeltaType(delta); return delta.getPrismContext().serializeAtomicValue(objectDeltaType, SchemaConstants.T_OBJECT_DELTA, PrismContext.LANG_XML); -// Element element = delta.getPrismContext().getJaxbDomHack().marshalJaxbObjectToDom(objectDeltaType, SchemaConstants.T_OBJECT_DELTA); -// return DOMUtil.serializeDOMToString(element); } @@ -269,6 +265,7 @@ private static ChangeTypeType convertChangeType(ChangeType changeType) { */ public static ItemDelta createItemDelta(ItemDeltaType propMod, Class objectType, PrismContext prismContext) throws SchemaException { + Validate.notNull("No prismContext in DeltaConvertor.createItemDelta call"); PrismObjectDefinition objectDefinition = prismContext.getSchemaRegistry(). findObjectDefinitionByCompileTimeClass(objectType); return createItemDelta(propMod, objectDefinition); @@ -276,7 +273,6 @@ public static ItemDelta createItemDelta(ItemDeltaType public static ItemDelta createItemDelta(ItemDeltaType propMod, PrismContainerDefinition pcDef) throws SchemaException { -// XPathHolder xpath = new XPathHolder(propMod.getPath()); ItemPathType parentPathType = propMod.getPath(); ItemPath parentPath = null; if (parentPathType != null){ @@ -315,17 +311,17 @@ public static ItemDelta createItemDelta(ItemDeltaType */ public static Collection toPropertyModificationTypes(ItemDelta delta) throws SchemaException { delta.checkConsistence(); - Collection mods = new ArrayList(); -// XPathHolder xpath = new XPathHolder(delta.getParentPath()); - Document document = DOMUtil.getDocument(); + if (delta.isEmpty() && delta.getPrismContext() == null) { + throw new IllegalStateException("Non-empty ItemDelta with no prismContext cannot be converted to ItemDeltaType."); + } + Collection mods = new ArrayList<>(); ItemPathType path = new ItemPathType(delta.getPath()); -// Element xpathElement = xpath.toElement(PATH_ELEMENT_NAME, document); if (delta.getValuesToReplace() != null) { ItemDeltaType mod = new ItemDeltaType(); mod.setPath(path); mod.setModificationType(ModificationTypeType.REPLACE); try { - addModValues(delta, mod, delta.getValuesToReplace(), document); + addModValues(delta, mod, delta.getValuesToReplace()); } catch (SchemaException e) { throw new SchemaException(e.getMessage() + " while converting property " + delta.getElementName(), e); } @@ -336,7 +332,7 @@ public static Collection toPropertyModificationTypes(ItemDelta de mod.setPath(path); mod.setModificationType(ModificationTypeType.ADD); try { - addModValues(delta, mod, delta.getValuesToAdd(), document); + addModValues(delta, mod, delta.getValuesToAdd()); } catch (SchemaException e) { throw new SchemaException(e.getMessage() + " while converting property " + delta.getElementName(), e); } @@ -347,7 +343,7 @@ public static Collection toPropertyModificationTypes(ItemDelta de mod.setPath(path); mod.setModificationType(ModificationTypeType.DELETE); try { - addModValues(delta, mod, delta.getValuesToDelete(), document); + addModValues(delta, mod, delta.getValuesToDelete()); } catch (SchemaException e) { throw new SchemaException(e.getMessage() + " while converting property " + delta.getElementName(), e); } @@ -356,30 +352,13 @@ public static Collection toPropertyModificationTypes(ItemDelta de return mods; } - private static void addModValues(ItemDelta delta, ItemDeltaType mod, Collection values, - Document document) throws SchemaException { -// QName elementName = delta.getElementName(); + // requires delta.prismContext to be set + private static void addModValues(ItemDelta delta, ItemDeltaType mod, Collection values) throws SchemaException { if (values == null || values.isEmpty()) { - // We need to create "nil" element otherwise the element name will be lost - // (and this is different from empty element) -// Element nilValueElement = DOMUtil.createElement(elementName); -// DOMUtil.setNill(nilValueElement); - //FIXME : DOM?? vs Xnode?? - - //modValue.setXnode(null); - RawType modValue = new RawType(delta.getPrismContext()); mod.getValue().add(modValue); - } else { for (PrismValue value : values) { - //System.out.println("value: " + value.debugDump()); - //FIXME: serilaize to XNode instead of dom?? -// Object xmlValue = toAny(delta, value, document); -// System.out.println("xmlValue " + xmlValue); -// RawType modValue = new RawType(); -// modValue.getContent().add(xmlValue); -// mod.getValue().add(modValue); XNode xnode = toXNode(delta, value); RawType modValue = new RawType(xnode, value.getPrismContext()); mod.getValue().add(modValue); @@ -388,46 +367,23 @@ private static void addModValues(ItemDelta delta, ItemDeltaType mod, Collection< } private static XNode toXNode(ItemDelta delta, PrismValue value) throws SchemaException{ - PrismContext prismContext = delta.getPrismContext(); - - if (prismContext != null) { -// delta.getItemNew() -// TODO: swhich to the value serialization util - -// return ValueSerializationUtil.serializeItemValue(ItemDeltaType.F_VALUE, delta.getDefinition(), value, prismContext, PrismContext.LANG_XML); - XNodeSerializer serializer = prismContext.getXnodeProcessor().createSerializer(); - XNode node = serializer.serializeItemValue(value, delta.getDefinition()); -// return delta.getPrismContext().getXnodeProcessor().serializeItem() - return node; - } - throw new IllegalStateException("ItemDelta without prismContext"); + XNodeSerializer serializer = delta.getPrismContext().getXnodeProcessor().createSerializer(); + XNode node = serializer.serializeItemValue(value, delta.getDefinition()); + return node; + } + +// private static Object toAny(ItemDelta delta, PrismValue value, Document document) throws SchemaException { +// PrismContext prismContext = delta.getPrismContext(); +// if (prismContext != null) { +// return RawTypeUtil.toAny(value, document, prismContext); +// } // if (value instanceof PrismPropertyValue) { // PrismPropertyValue pval = (PrismPropertyValue)value; -// Object raw = pval.getRawElement(); -// if (XNode.class.isAssignableFrom(raw.getClass())){ -// return (XNode) pval.getRawElement(); -// } -//// return ; -// throw new SystemException("something strange happened. There is a raw element, but it is not XNode"+value); +// return pval.getRawElement(); // } else { // throw new SystemException("Null prism context in "+value+" in "+delta); // } - - } - - private static Object toAny(ItemDelta delta, PrismValue value, Document document) throws SchemaException { - PrismContext prismContext = delta.getPrismContext(); - if (prismContext != null) { - return RawTypeUtil.toAny(value, document, prismContext); -// return delta.getPrismContext().getJaxbDomHack().toAny(value); - } - if (value instanceof PrismPropertyValue) { - PrismPropertyValue pval = (PrismPropertyValue)value; - return pval.getRawElement(); - } else { - throw new SystemException("Null prism context in "+value+" in "+delta); - } - } +// } public static Collection createObjectDeltas(ObjectDeltaListType deltaList, PrismContext prismContext) throws SchemaException { List retval = new ArrayList<>(); diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java index 937cf9fb02a..f465ee6b78c 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java @@ -18,6 +18,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.MidPointConstants; @@ -27,6 +28,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.prism.xml.ns._public.types_3.ChangeTypeType; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.xml.sax.SAXException; @@ -36,6 +38,8 @@ import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNotNull; +import static org.testng.AssertJUnit.assertNull; +import static org.testng.AssertJUnit.assertTrue; /** * @author lazyman @@ -96,29 +100,40 @@ public void testContextlessEquals() throws Exception { AssignmentType a2 = new AssignmentType(); // no prismContext here a2.setDescription("descr2"); - // assertFalse(a1.equals(a2)); // this DOES NOT work without prismContext + AssignmentType a3 = new AssignmentType(); // no prismContext here + a3.setDescription("descr1"); + + assertFalse(a1.equals(a2)); // this should work even without prismContext + assertTrue(a1.equals(a3)); // this should work even without prismContext PrismContext prismContext = PrismTestUtil.getPrismContext(); prismContext.adopt(a1); prismContext.adopt(a2); - assertFalse(a1.equals(a2)); // now it should work + prismContext.adopt(a3); + assertFalse(a1.equals(a2)); // this should work as well + assertTrue(a1.equals(a3)); } @Test public void testContextlessEquals2() throws Exception { - // (1) user without prismContext - the functionality is radically reduced + // (1) user without prismContext - the functionality is reduced UserType user = new UserType(); - // user.asPrismObject().createDelta(); // this fails (no prismContext) - AssignmentType a1 = new AssignmentType(); // no prismContext here a1.setDescription("descr1"); user.getAssignment().add(a1); AssignmentType a2 = new AssignmentType(); // no prismContext here a2.setDescription("descr2"); - //user.getAssignment().add(a2); // this fails without prismContext (there's hidden equals there) + user.getAssignment().add(a2); + + AssignmentType a2identical = new AssignmentType(); + a2identical.setDescription("descr2"); + assertTrue(user.getAssignment().contains(a2identical)); + + ObjectDelta delta1 = user.asPrismObject().createDelta(ChangeType.DELETE); // delta1 is without prismContext + assertNull(delta1.getPrismContext()); // (2) user with prismContext @@ -131,14 +146,19 @@ public void testContextlessEquals2() throws Exception { userWithContext.getAssignment().add(b1); AssignmentType b2 = new AssignmentType(); // no prismContext here b2.setDescription("descr2"); - userWithContext.getAssignment().add(b2); // this works, because there's already prismContext in userWithContext + userWithContext.getAssignment().add(b2); + + AssignmentType b2identical = new AssignmentType(); + b2identical.setDescription("descr2"); + assertTrue(user.getAssignment().contains(b2identical)); // b1 and b2 obtain context when they are added to the container assertNotNull(b1.asPrismContainerValue().getPrismContext()); assertNotNull(b2.asPrismContainerValue().getPrismContext()); assertFalse(b1.equals(b2)); - userWithContext.asPrismObject().createDelta(); // this works as well + ObjectDelta delta2 = userWithContext.asPrismObject().createDelta(ChangeType.DELETE); + assertNotNull(delta2.getPrismContext()); } } From ffcc7d4ca4a12ac3430d5f9401872bc306e5f21a Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Fri, 11 Jul 2014 08:37:35 +0200 Subject: [PATCH 10/12] Temporarily fixed failed tests. --- .../common/refinery/RefinedObjectClassDefinition.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java index 0089103bfe7..5cc3d3b8db8 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java @@ -732,7 +732,11 @@ public ResourceBidirectionalMappingType getActivationBidirectionalMappingType(QN return activationSchemaHandling.getValidFrom(); } else if (QNameUtil.match(ActivationType.F_VALID_TO, propertyName)) { return activationSchemaHandling.getValidTo(); - } else { + } else if (QNameUtil.match(ActivationType.F_LOCKOUT_STATUS, propertyName)) { + return null; // todo implement this + } else if (QNameUtil.match(ActivationType.F_LOCKOUT_EXPIRATION_TIMESTAMP, propertyName)) { + return null; // todo implement this + } else { throw new IllegalArgumentException("Unknown activation property "+propertyName); } } From d83052f5af12b13907dad5abecca09f9c3d48a30 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Fri, 11 Jul 2014 10:26:59 +0200 Subject: [PATCH 11/12] Lockout intests --- .../midpoint/model/intest/TestActivation.java | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java index 3b44b807bcf..15c8697d291 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java @@ -15,6 +15,7 @@ */ package com.evolveum.midpoint.model.intest; +import static org.testng.AssertJUnit.assertFalse; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; @@ -45,6 +46,7 @@ import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PropertyDelta; +import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.ObjectDeltaOperation; @@ -61,6 +63,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LockoutStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; @@ -932,6 +935,85 @@ public void test160ModifyUserJackAssignAccountKhaki() throws Exception { } assertTrue("Shadow delta not found", found); } + + @Test + public void test170GetAccountUnlocked() throws Exception { + final String TEST_NAME = "test170GetAccountUnlocked"; + TestUtil.displayTestTile(this, TEST_NAME); + + // GIVEN + Task task = taskManager.createTaskInstance(TestActivation.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL); + + // WHEN + PrismObject shadow = modelService.getObject(ShadowType.class, accountOid, null, task, result); + + // THEN + result.computeStatus(); + TestUtil.assertSuccess("executeChanges result", result); + + PrismAsserts.assertNoItem(shadow, SchemaConstants.PATH_ACTIVATION_LOCKOUT_STATUS); + } + + @Test + public void test172GetAccountLocked() throws Exception { + final String TEST_NAME = "test172GetAccountLocked"; + TestUtil.displayTestTile(this, TEST_NAME); + + // GIVEN + Task task = taskManager.createTaskInstance(TestActivation.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL); + + DummyAccount dummyAccount = getDummyAccount(null, ACCOUNT_JACK_DUMMY_USERNAME); + dummyAccount.setLockout(true); + + // WHEN + PrismObject shadow = modelService.getObject(ShadowType.class, accountOid, null, task, result); + + // THEN + result.computeStatus(); + TestUtil.assertSuccess("executeChanges result", result); + + PrismAsserts.assertPropertyValue(shadow, SchemaConstants.PATH_ACTIVATION_LOCKOUT_STATUS, + LockoutStatusType.LOCKED); + } + + @Test + public void test174ModifyAccountUnlock() throws Exception { + final String TEST_NAME = "test174ModifyAccountUnlock"; + TestUtil.displayTestTile(this, TEST_NAME); + + // GIVEN + Task task = taskManager.createTaskInstance(TestActivation.class.getName() + "." + TEST_NAME); + OperationResult result = task.getResult(); + assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL); + + // WHEN + ObjectDelta dummyDelta = createModifyAccountShadowReplaceDelta(accountOid, null, + SchemaConstants.PATH_ACTIVATION_LOCKOUT_STATUS, LockoutStatusType.NORMAL); + Collection> deltas = MiscSchemaUtil.createCollection(dummyDelta); + + modelService.executeChanges(deltas, null, task, result); + + // THEN + result.computeStatus(); + TestUtil.assertSuccess("executeChanges result", result); + + DummyAccount dummyAccount = getDummyAccount(null, ACCOUNT_JACK_DUMMY_USERNAME); + assertFalse("Dummy account was not unlocked", dummyAccount.isLockout()); + + PrismObject userJack = getUser(USER_JACK_OID); + display("User after change execution", userJack); + assertUserJack(userJack); + + PrismObject shadow = modelService.getObject(ShadowType.class, accountOid, null, task, result); + PrismAsserts.assertPropertyValue(shadow, SchemaConstants.PATH_ACTIVATION_LOCKOUT_STATUS, + LockoutStatusType.NORMAL); + + checkAdminStatusFor15x(userJack, true, true, true); + } @Test From f1cb0f6937b98d06f2f6848da42c2ccf634be353 Mon Sep 17 00:00:00 2001 From: Erik Suta Date: Fri, 11 Jul 2014 12:10:53 +0200 Subject: [PATCH 12/12] fix for MID-1978 --- .../web/component/input/DatePanel.java | 2 +- .../util/XmlGregorianCalendarModel.java | 26 ------------------- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DatePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DatePanel.java index 24d03acf565..515026a54e2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DatePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DatePanel.java @@ -34,7 +34,7 @@ public class DatePanel extends InputPanel { public DatePanel(String id, IModel model) { super(id); - DateInput date = new DateInput(ID_INPUT, new XmlGregorianCalendarModel(model, true)); + DateInput date = new DateInput(ID_INPUT, new XmlGregorianCalendarModel(model)); add(date); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/XmlGregorianCalendarModel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/XmlGregorianCalendarModel.java index 46edc876742..f4bc18cfb8e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/XmlGregorianCalendarModel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/XmlGregorianCalendarModel.java @@ -31,15 +31,9 @@ public class XmlGregorianCalendarModel extends Model { private IModel model; - private boolean copyTime; public XmlGregorianCalendarModel(IModel model) { - this(model, true); - } - - public XmlGregorianCalendarModel(IModel model, boolean copyTime) { this.model = model; - this.copyTime = copyTime; } @Override @@ -56,27 +50,7 @@ public void setObject(Date object) { if (object == null) { model.setObject(null); } else { - if (copyTime) { - Date d = getObject(); - object = copyTime(d, object); - } model.setObject(MiscUtil.asXMLGregorianCalendar(object)); } } - - private Date copyTime(Date from, Date to) { - if (from == null || to == null) { - return to; - } - - Calendar calendar = Calendar.getInstance(); - calendar.setTime(from); - - to = DateUtils.setHours(to, calendar.get(Calendar.HOUR_OF_DAY)); - to = DateUtils.setMinutes(to, calendar.get(Calendar.MINUTE)); - to = DateUtils.setSeconds(to, calendar.get(Calendar.SECOND)); - to = DateUtils.setMilliseconds(to, calendar.get(Calendar.MILLISECOND)); - - return to; - } }