diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/PersonaProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/PersonaProcessor.java index e5ac922ae84..d563750aca2 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/PersonaProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/PersonaProcessor.java @@ -202,7 +202,7 @@ public void after(PersonaKey key, String desc, if (existingPersona == null) { personaAdd(context, key, construction, task, result); } else { - personaModify(context, key, construction, existingPersona, task, result); + personaModify(context, key, construction, existingPersona.asPrismObject(), task, result); } } @@ -260,10 +260,11 @@ private boolean personaMatches(FocusType persona, PersonaKey key) { return true; } - public void personaAdd(LensContext context, PersonaKey key, PersonaConstruction construction, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, PolicyViolationException, ObjectAlreadyExistsException, CommunicationException, ConfigurationException, SecurityViolationException { - LOGGER.info("PERSONA ADD: {} - {}", key, construction); - + public void personaAdd(LensContext context, PersonaKey key, PersonaConstruction construction, + Task task, OperationResult result) + throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, PolicyViolationException, ObjectAlreadyExistsException, CommunicationException, ConfigurationException, SecurityViolationException { PrismObject focus = context.getFocusContext().getObjectNew(); + LOGGER.debug("Adding persona {} for {} using construction {}", key, focus, construction); PersonaConstructionType constructionType = construction.getConstructionType(); ObjectReferenceType objectMappingRef = constructionType.getObjectMappingRef(); ObjectTemplateType objectMappingType = objectResolver.resolve(objectMappingRef, ObjectTemplateType.class, null, "object mapping in persona construction in "+focus, task, result); @@ -299,14 +300,37 @@ public void personaAdd(LensContext link(context, target.asObjectable(), result); } - public void personaModify(LensContext context, PersonaKey key, PersonaConstruction construction, FocusType existingPersona, Task task, OperationResult result) { - LOGGER.info("PERSONA MODIFY: {} - {}", key, construction); - // TODO: exec + public void personaModify(LensContext context, PersonaKey key, PersonaConstruction construction, + PrismObject existingPersona, Task task, OperationResult result) + throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, PolicyViolationException, ObjectAlreadyExistsException, CommunicationException, ConfigurationException, SecurityViolationException { + PrismObject focus = context.getFocusContext().getObjectNew(); + LOGGER.debug("Modifying persona {} for {} using construction {}", key, focus, construction); + PersonaConstructionType constructionType = construction.getConstructionType(); + ObjectReferenceType objectMappingRef = constructionType.getObjectMappingRef(); + ObjectTemplateType objectMappingType = objectResolver.resolve(objectMappingRef, ObjectTemplateType.class, null, "object mapping in persona construction in "+focus, task, result); + + ObjectDeltaObject focusOdo = context.getFocusContext().getObjectDeltaObject(); + String contextDesc = "object mapping "+objectMappingType+ " for persona construction for "+focus; + XMLGregorianCalendar now = clock.currentTimeXMLGregorianCalendar(); + + Collection> itemDeltas = objectTemplateProcessor.processObjectMapping(context, objectMappingType, + focusOdo, existingPersona, null, contextDesc, now, task, result); + + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("itemDeltas:\n{}", DebugUtil.debugDump(itemDeltas)); + } + + ObjectDelta targetDelta = existingPersona.createModifyDelta(); + for (ItemDelta itemDelta: itemDeltas) { + targetDelta.addModification(itemDelta); + } + + modelService.executeChanges(MiscSchemaUtil.createCollection(targetDelta), null, task, result); } - public void personaDelete(LensContext context, PersonaKey key, FocusType existingPersona, Task task, OperationResult result) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { - LOGGER.info("PERSONA DELETE: {}", existingPersona); - + public void personaDelete(LensContext context, PersonaKey key, FocusType existingPersona, Task task, OperationResult result) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { + PrismObject focus = context.getFocusContext().getObjectOld(); + LOGGER.debug("Deleting persona {} for {}: ", key, focus, existingPersona); ObjectDelta delta = existingPersona.asPrismObject().createDeleteDelta(); modelService.executeChanges(MiscSchemaUtil.createCollection(delta), null, task, result); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPersona.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPersona.java index 6ad019d74a3..048d129f646 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPersona.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPersona.java @@ -114,6 +114,8 @@ public class TestPersona extends AbstractInitializedModelIntegrationTest { protected static final File ROLE_PERSONA_ADMIN_FILE = new File(TEST_DIR, "role-persona-admin.xml"); protected static final String ROLE_PERSONA_ADMIN_OID = "16813ae6-2c0a-11e7-91fc-8333c244329e"; + private static final String USER_JACK_GIVEN_NAME_NEW = "Jackie"; + String userJackAdminPersonaOid; @Override @@ -149,7 +151,6 @@ public void test100AssignRolePersonaAdminToJack() throws Exception { displayThen(TEST_NAME); assertSuccess(result); - // Check accountRef PrismObject userAfter = getUser(USER_JACK_OID); display("User after", userAfter); assertUserJack(userAfter); @@ -160,18 +161,146 @@ public void test100AssignRolePersonaAdminToJack() throws Exception { display("Persona", persona); userJackAdminPersonaOid = persona.getOid(); // Full name is computed by using ordinary user template - assertUser(persona, userJackAdminPersonaOid, "a-"+USER_JACK_USERNAME, USER_JACK_FULL_NAME, USER_JACK_GIVEN_NAME, USER_JACK_FAMILY_NAME); + assertUser(persona, userJackAdminPersonaOid, toAdminPersonaUsername(USER_JACK_USERNAME), USER_JACK_FULL_NAME, USER_JACK_GIVEN_NAME, USER_JACK_FAMILY_NAME); assertSubtype(persona, "admin"); assertSteadyResources(); } - // TODO: modify + @Test + public void test102RecomputeUserJack() throws Exception { + final String TEST_NAME = "test102RecomputeUserJack"; + displayTestTile(TEST_NAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + // WHEN + displayWhen(TEST_NAME); + recomputeUser(USER_JACK_OID, task, result); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + + assertUserJack11x(); + } + + @Test + public void test103ReconcileUserJack() throws Exception { + final String TEST_NAME = "test103ReconcileUserJack"; + displayTestTile(TEST_NAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + // WHEN + displayWhen(TEST_NAME); + reconcileUser(USER_JACK_OID, task, result); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + + assertUserJack11x(); + } + + @Test + public void test104RecomputeJackAdminPersona() throws Exception { + final String TEST_NAME = "test104RecomputeJackAdminPersona"; + displayTestTile(TEST_NAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + // WHEN + displayWhen(TEST_NAME); + recomputeUser(userJackAdminPersonaOid, task, result); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + + assertUserJack11x(); + } + + @Test + public void test105ReconcileJackAdminPersona() throws Exception { + final String TEST_NAME = "test105ReconcileJackAdminPersona"; + displayTestTile(TEST_NAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + // WHEN + displayWhen(TEST_NAME); + reconcileUser(userJackAdminPersonaOid, task, result); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + + assertUserJack11x(); + } + + private void assertUserJack11x() throws Exception { + PrismObject userAfter = getUser(USER_JACK_OID); + display("User after", userAfter); + assertUserJack(userAfter); + + assertLinks(userAfter, 0); + assertPersonaLinks(userAfter, 1); + PrismObject persona = assertLinkedPersona(userAfter, UserType.class, "admin"); + display("Persona", persona); + assertUser(persona, userJackAdminPersonaOid, toAdminPersonaUsername(USER_JACK_USERNAME), USER_JACK_FULL_NAME, USER_JACK_GIVEN_NAME, USER_JACK_FAMILY_NAME); + assertSubtype(persona, "admin"); + + assertSteadyResources(); + } + + @Test + public void test120ModifyJackGivenName() throws Exception { + final String TEST_NAME = "test120ModifyJackGivenName"; + displayTestTile(TEST_NAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + // WHEN + displayWhen(TEST_NAME); + modifyUserReplace(USER_JACK_OID, UserType.F_GIVEN_NAME, task, result, createPolyString(USER_JACK_GIVEN_NAME_NEW)); + assignRole(USER_JACK_OID, ROLE_PERSONA_ADMIN_OID, task, result); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + + PrismObject userAfter = getUser(USER_JACK_OID); + display("User after", userAfter); + assertUser(userAfter, USER_JACK_OID, USER_JACK_USERNAME, USER_JACK_FULL_NAME, USER_JACK_GIVEN_NAME_NEW, USER_JACK_FAMILY_NAME); + + assertLinks(userAfter, 0); + assertPersonaLinks(userAfter, 1); + PrismObject persona = assertLinkedPersona(userAfter, UserType.class, "admin"); + display("Persona", persona); + // Full name mapping in ordinary user template is weak, fullname is not changed + assertUser(persona, userJackAdminPersonaOid, toAdminPersonaUsername(USER_JACK_USERNAME), USER_JACK_FULL_NAME, USER_JACK_GIVEN_NAME_NEW, USER_JACK_FAMILY_NAME); + assertSubtype(persona, "admin"); + + assertSteadyResources(); + } // TODO: recompute, reconcile (both user and persona) // TODO: assign some accouts/roles to user and persona, make sure they are independent + // TODO: independent change in the persona + @Test public void test199UnassignRolePersonaAdminFromJack() throws Exception { final String TEST_NAME = "test199UnassignRolePersonaAdminFromJack"; @@ -189,10 +318,9 @@ public void test199UnassignRolePersonaAdminFromJack() throws Exception { displayThen(TEST_NAME); assertSuccess(result); - // Check accountRef PrismObject userAfter = getUser(USER_JACK_OID); display("User after", userAfter); - assertUserJack(userAfter); + assertUser(userAfter, USER_JACK_OID, USER_JACK_USERNAME, USER_JACK_FULL_NAME, USER_JACK_GIVEN_NAME_NEW, USER_JACK_FAMILY_NAME); assertLinks(userAfter, 0); assertPersonaLinks(userAfter, 0); @@ -201,4 +329,9 @@ public void test199UnassignRolePersonaAdminFromJack() throws Exception { assertSteadyResources(); } + + private String toAdminPersonaUsername(String username) { + return "a-"+username; + } + }