From 19b55c6a9706b6858a3b8f72b0e09d19a8011424 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Mon, 20 Jun 2016 12:06:16 +0200 Subject: [PATCH] Fixing handling of readonly flag in wrappers (MID-3126) +tests +interface comments --- .../web/component/prism/ContainerWrapper.java | 28 ++- .../web/component/prism/ItemWrapper.java | 20 ++- .../web/component/prism/ObjectWrapper.java | 2 + .../component/prism/ObjectWrapperFactory.java | 3 + .../TestIntegrationObjectWrapperFactory.java | 161 ++++++++++++++++-- .../role-prop-read-all-modify-some-user.xml | 50 ++++++ .../role-prop-read-some-modify-some-user.xml | 55 ++++++ .../src/test/resources/wrapper/user.xml | 138 --------------- 8 files changed, 286 insertions(+), 171 deletions(-) create mode 100644 gui/admin-gui/src/test/resources/wrapper/role-prop-read-all-modify-some-user.xml create mode 100644 gui/admin-gui/src/test/resources/wrapper/role-prop-read-some-modify-some-user.xml delete mode 100644 gui/admin-gui/src/test/resources/wrapper/user.xml 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 a6fb9133bee..1426cfb79d6 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 @@ -64,7 +64,7 @@ public class ContainerWrapper implements ItemWrapper, S private PrismContainerDefinition containerDefinition; - public ContainerWrapper(ObjectWrapper objectWrapper, PrismContainer container, ContainerStatus status, ItemPath path) { + ContainerWrapper(ObjectWrapper objectWrapper, PrismContainer container, ContainerStatus status, ItemPath path) { Validate.notNull(container, "container must not be null."); Validate.notNull(status, "Container status must not be null."); @@ -72,14 +72,14 @@ public ContainerWrapper(ObjectWrapper objectWrapper, PrismContainer container this.container = container; this.status = status; this.path = path; - main = path == null; - readonly = objectWrapper.isReadonly(); // [pm] this is quite questionable - showInheritedObjectAttributes = objectWrapper.isShowInheritedObjectAttributes(); + this.main = path == null; + this.readonly = objectWrapper.isReadonly(); // [pm] this is quite questionable + this.showInheritedObjectAttributes = objectWrapper.isShowInheritedObjectAttributes(); // have to be after setting "main" property - containerDefinition = getItemDefinition(); + this.containerDefinition = getItemDefinition(); } - public ContainerWrapper(PrismContainer container, ContainerStatus status, ItemPath path, boolean readOnly) { + ContainerWrapper(PrismContainer container, ContainerStatus status, ItemPath path, boolean readOnly) { Validate.notNull(container, "container must not be null."); Validate.notNull(container.getDefinition(), "container definition must not be null."); Validate.notNull(status, "Container status must not be null."); @@ -88,9 +88,9 @@ public ContainerWrapper(PrismContainer container, ContainerStatus status, Ite this.containerDefinition = container.getDefinition(); this.status = status; this.path = path; - main = path == null; + this.main = path == null; this.readonly = readOnly; - showInheritedObjectAttributes = false; + this.showInheritedObjectAttributes = false; } public void revive(PrismContext prismContext) throws SchemaException { @@ -325,15 +325,9 @@ private boolean skipProperty(PrismPropertyDefinition def) { } public boolean isReadonly() { - PrismContainerDefinition def = getItemDefinition(); - if (readonly) { - return true; - } - if (def != null) { - // todo take into account the containing object status (adding vs. modifying) - return (def.canRead() && !def.canAdd() && !def.canModify()); - } - return false; + // readonly flag in container is an override. Do not get the value from definition + // otherwise it will be propagated to items and overrides the item definition. + return readonly; } public void setReadonly(boolean readonly) { 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 b87dc4a1a48..19ec8abc3dc 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015 Evolveum + * Copyright (c) 2010-2016 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,8 +38,17 @@ public interface ItemWrapper extends I getItem(); + /** + * Item definition. + * The definition defines how the item will be displayed (type, read-only, read-write or + * not displayed at all). This behavior can be overriden by readonly and visible flags. + */ ID getItemDefinition(); + /** + * Read only flag. This is an override of the default behavior given by the definition. + * If set to TRUE then it overrides the value from the definition. + */ boolean isReadonly(); boolean isEmpty(); @@ -47,9 +56,16 @@ public interface ItemWrapper extends boolean hasChanged(); public List getValues(); - + + /** + * Visibility flag. This is an override of the default behavior given by the definition. + * TODO: when it overrides? If set to FALSE? + */ public boolean isVisible(); + /** + * Used to display the form elements with stripe in every other line. + */ public boolean isStripe(); void setStripe(boolean isStripe); 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 5adcc34d4e5..b7d58b6bdee 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 @@ -73,6 +73,8 @@ public class ObjectWrapper implements Serializable, Reviva private boolean showAssignments = false; // whether to show name and description properties and metadata container private boolean showInheritedObjectAttributes = true; + + // readolny flag is an override. false means "do not override" private boolean readonly = false; private Collection> loadOptions; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java index 0866ba46f7c..14592697986 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java @@ -91,6 +91,9 @@ public ObjectWrapper createObjectWrapper(String displa PrismObjectDefinition objectDefinitionForEditing = modelServiceLocator.getModelInteractionService() .getEditObjectDefinition(object, AuthorizationPhaseType.REQUEST, result); + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("Edit definition for {}:\n{}", object, objectDefinitionForEditing.debugDump(1)); + } RefinedObjectClassDefinition objectClassDefinitionForEditing = null; if (isShadow(object)) { PrismReference resourceRef = object.findReference(ShadowType.F_RESOURCE_REF); diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestIntegrationObjectWrapperFactory.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestIntegrationObjectWrapperFactory.java index d8403f6d668..9acc2252008 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestIntegrationObjectWrapperFactory.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestIntegrationObjectWrapperFactory.java @@ -15,16 +15,18 @@ */ package com.evolveum.midpoint.web; -import static org.testng.AssertJUnit.assertNotNull; -import static org.testng.AssertJUnit.assertNull; +import static com.evolveum.midpoint.test.IntegrationTestTools.display; +import static com.evolveum.midpoint.web.AdminGuiTestConstants.RESOURCE_DUMMY_ASSOCIATION_GROUP_QNAME; +import static com.evolveum.midpoint.web.AdminGuiTestConstants.ROLE_MAPMAKER_OID; +import static com.evolveum.midpoint.web.AdminGuiTestConstants.USER_JACK_FULL_NAME; +import static com.evolveum.midpoint.web.AdminGuiTestConstants.USER_JACK_OID; +import static com.evolveum.midpoint.web.AdminGuiTestConstants.USER_JACK_USERNAME; import static org.testng.AssertJUnit.assertEquals; -import static org.testng.AssertJUnit.assertFalse; +import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; -import static com.evolveum.midpoint.test.IntegrationTestTools.display; -import static com.evolveum.midpoint.web.AdminGuiTestConstants.*; -import static com.evolveum.midpoint.test.IntegrationTestTools.display; -import java.util.Arrays; +import java.io.File; +import java.io.IOException; import java.util.List; import javax.xml.namespace.QName; @@ -32,26 +34,29 @@ import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; -import org.testng.AssertJUnit; import org.testng.annotations.Test; import com.evolveum.icf.dummy.resource.DummyGroup; -import com.evolveum.midpoint.gui.api.util.ModelServiceLocator; -import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.model.api.PolicyViolationException; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.test.DummyResourceContoller; import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.util.TestUtil; +import com.evolveum.midpoint.util.exception.CommunicationException; +import com.evolveum.midpoint.util.exception.ConfigurationException; +import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; +import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; +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.web.component.prism.AssociationWrapper; import com.evolveum.midpoint.web.component.prism.ContainerStatus; import com.evolveum.midpoint.web.component.prism.ContainerWrapper; @@ -62,8 +67,7 @@ import com.evolveum.midpoint.web.component.prism.ValueWrapper; 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.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAssociationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowIdentifiersType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; @@ -77,6 +81,14 @@ @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestIntegrationObjectWrapperFactory extends AbstractInitializedGuiIntegrationTest { + public static final File TEST_DIR = new File("src/test/resources/wrapper"); + + protected static final File ROLE_PROP_READ_ALL_MODIFY_SOME_USER_FILE = new File(TEST_DIR, "role-prop-read-all-modify-some-user.xml"); + protected static final String ROLE_PROP_READ_ALL_MODIFY_SOME_USER_OID = "00000000-0000-0000-0000-00000000ae05"; + + protected static final File ROLE_PROP_READ_SOME_MODIFY_SOME_USER_FILE = new File(TEST_DIR, "role-prop-read-some-modify-some-user.xml"); + protected static final String ROLE_PROP_READ_SOME_MODIFY_SOME_USER_OID = "00000000-0000-0000-0000-00000000ae08"; + private static final String USER_WALLY_NAME = "wally"; private static final String USER_WALLY_FULLNAME = "Wally B. Feed"; @@ -84,6 +96,15 @@ public class TestIntegrationObjectWrapperFactory extends AbstractInitializedGuiI private String userWallyOid; private String accountWallyOid; + @Override + public void initSystem(Task initTask, OperationResult initResult) throws Exception { + super.initSystem(initTask, initResult); + + repoAddObjectFromFile(ROLE_PROP_READ_ALL_MODIFY_SOME_USER_FILE, RoleType.class, initResult); + repoAddObjectFromFile(ROLE_PROP_READ_SOME_MODIFY_SOME_USER_FILE, RoleType.class, initResult); + + } + @Test public void test100CreateWrapperUser() throws Exception { final String TEST_NAME = "test100CreateWrapperUser"; @@ -231,5 +252,117 @@ public void test220AssignRoleLandluberToWally() throws Exception { PrismAsserts.assertPropertyValue(groupAssociationUidProp, GROUP_DUMMY_MAPMAKERS_NAME); } + + /** + * MID-3126 + */ + @Test + public void test800EditSchemaJackPropReadAllModifySomeUser() throws Exception { + final String TEST_NAME = "test800EditSchemaJackPropReadAllModifySomeUser"; + TestUtil.displayTestTile(this, TEST_NAME); + // GIVEN + cleanupAutzTest(USER_JACK_OID); + assignRole(USER_JACK_OID, ROLE_PROP_READ_ALL_MODIFY_SOME_USER_OID); + login(USER_JACK_USERNAME); + ObjectWrapperFactory factory = new ObjectWrapperFactory(getServiceLocator()); + PrismObject user = getUser(USER_JACK_OID); + display("user before", user); + + // WHEN + TestUtil.displayWhen(TEST_NAME); + + ObjectWrapper objectWrapper = factory.createObjectWrapper("user display name", "user description", user, + ContainerStatus.MODIFYING); + + // THEN + TestUtil.displayThen(TEST_NAME); + + IntegrationTestTools.display("Wrapper after", objectWrapper); + assertEquals("Wrong object wrapper readOnly", Boolean.FALSE, (Boolean)objectWrapper.isReadonly()); + + ContainerWrapper mainContainerWrapper = objectWrapper.findMainContainerWrapper(); + assertEquals("Wrong main container wrapper readOnly", Boolean.FALSE, (Boolean)mainContainerWrapper.isReadonly()); + + ItemWrapper nameWrapper = mainContainerWrapper.findPropertyWrapper(UserType.F_NAME); + assertEquals("Wrong name readOnly", Boolean.TRUE, (Boolean)nameWrapper.isReadonly()); + assertEquals("Wrong name visible", Boolean.TRUE, (Boolean)nameWrapper.isVisible()); + assertEquals("Wrong name definition.canRead", Boolean.TRUE, (Boolean)nameWrapper.getItemDefinition().canRead()); + assertEquals("Wrong name definition.canAdd", Boolean.FALSE, (Boolean)nameWrapper.getItemDefinition().canAdd()); + assertEquals("Wrong name definition.canModify", Boolean.FALSE, (Boolean)nameWrapper.getItemDefinition().canModify()); + + ItemWrapper givenNameWrapper = mainContainerWrapper.findPropertyWrapper(UserType.F_GIVEN_NAME); + assertEquals("Wrong givenName readOnly", Boolean.TRUE, (Boolean)givenNameWrapper.isReadonly()); + assertEquals("Wrong givenName visible", Boolean.TRUE, (Boolean)givenNameWrapper.isVisible()); + assertEquals("Wrong givenName definition.canRead", Boolean.TRUE, (Boolean)givenNameWrapper.getItemDefinition().canRead()); + assertEquals("Wrong givenName definition.canAdd", Boolean.FALSE, (Boolean)givenNameWrapper.getItemDefinition().canAdd()); + assertEquals("Wrong givenName definition.canModify", Boolean.FALSE, (Boolean)givenNameWrapper.getItemDefinition().canModify()); + + ItemWrapper fullNameWrapper = mainContainerWrapper.findPropertyWrapper(UserType.F_FULL_NAME); + assertEquals("Wrong fullName readOnly", Boolean.FALSE, (Boolean)fullNameWrapper.isReadonly()); + assertEquals("Wrong fullName visible", Boolean.TRUE, (Boolean)givenNameWrapper.isVisible()); + assertEquals("Wrong fullName definition.canRead", Boolean.TRUE, (Boolean)fullNameWrapper.getItemDefinition().canRead()); + assertEquals("Wrong fullName definition.canAdd", Boolean.FALSE, (Boolean)fullNameWrapper.getItemDefinition().canAdd()); + assertEquals("Wrong fullName definition.canModify", Boolean.TRUE, (Boolean)fullNameWrapper.getItemDefinition().canModify()); + + } + + /** + * MID-3126 + */ + @Test + public void test802EditSchemaJackPropReadSomeModifySomeUser() throws Exception { + final String TEST_NAME = "test800EditSchemaJackPropReadAllModifySomeUser"; + TestUtil.displayTestTile(this, TEST_NAME); + // GIVEN + cleanupAutzTest(USER_JACK_OID); + assignRole(USER_JACK_OID, ROLE_PROP_READ_SOME_MODIFY_SOME_USER_OID); + login(USER_JACK_USERNAME); + + ObjectWrapperFactory factory = new ObjectWrapperFactory(getServiceLocator()); + PrismObject user = getUser(USER_JACK_OID); + display("user before", user); + + // WHEN + TestUtil.displayWhen(TEST_NAME); + + ObjectWrapper objectWrapper = factory.createObjectWrapper("user display name", "user description", user, + ContainerStatus.MODIFYING); + + // THEN + TestUtil.displayThen(TEST_NAME); + + IntegrationTestTools.display("Wrapper after", objectWrapper); + assertEquals("Wrong object wrapper readOnly", Boolean.FALSE, (Boolean)objectWrapper.isReadonly()); + + ContainerWrapper mainContainerWrapper = objectWrapper.findMainContainerWrapper(); + assertEquals("Wrong main container wrapper readOnly", Boolean.FALSE, (Boolean)mainContainerWrapper.isReadonly()); + + ItemWrapper nameWrapper = mainContainerWrapper.findPropertyWrapper(UserType.F_NAME); + assertEquals("Wrong name readOnly", Boolean.TRUE, (Boolean)nameWrapper.isReadonly()); + assertEquals("Wrong name visible", Boolean.TRUE, (Boolean)nameWrapper.isVisible()); + assertEquals("Wrong name definition.canRead", Boolean.TRUE, (Boolean)nameWrapper.getItemDefinition().canRead()); + assertEquals("Wrong name definition.canAdd", Boolean.FALSE, (Boolean)nameWrapper.getItemDefinition().canAdd()); + assertEquals("Wrong name definition.canModify", Boolean.FALSE, (Boolean)nameWrapper.getItemDefinition().canModify()); + + ItemWrapper givenNameWrapper = mainContainerWrapper.findPropertyWrapper(UserType.F_GIVEN_NAME); + assertEquals("Wrong givenName readOnly", Boolean.TRUE, (Boolean)givenNameWrapper.isReadonly()); + assertEquals("Wrong givenName visible", Boolean.TRUE, (Boolean)givenNameWrapper.isVisible()); + assertEquals("Wrong givenName definition.canRead", Boolean.FALSE, (Boolean)givenNameWrapper.getItemDefinition().canRead()); + assertEquals("Wrong givenName definition.canAdd", Boolean.FALSE, (Boolean)givenNameWrapper.getItemDefinition().canAdd()); + assertEquals("Wrong givenName definition.canModify", Boolean.FALSE, (Boolean)givenNameWrapper.getItemDefinition().canModify()); + + ItemWrapper fullNameWrapper = mainContainerWrapper.findPropertyWrapper(UserType.F_FULL_NAME); + assertEquals("Wrong fullName readOnly", Boolean.FALSE, (Boolean)fullNameWrapper.isReadonly()); + assertEquals("Wrong fullName visible", Boolean.TRUE, (Boolean)fullNameWrapper.isVisible()); + assertEquals("Wrong fullName definition.canRead", Boolean.TRUE, (Boolean)fullNameWrapper.getItemDefinition().canRead()); + assertEquals("Wrong fullName definition.canAdd", Boolean.FALSE, (Boolean)fullNameWrapper.getItemDefinition().canAdd()); + assertEquals("Wrong fullName definition.canModify", Boolean.TRUE, (Boolean)fullNameWrapper.getItemDefinition().canModify()); + + } + + private void cleanupAutzTest(String userOid) throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, ObjectAlreadyExistsException, PolicyViolationException, SecurityViolationException, IOException { + login(userAdministrator); + unassignAllRoles(userOid); + } } diff --git a/gui/admin-gui/src/test/resources/wrapper/role-prop-read-all-modify-some-user.xml b/gui/admin-gui/src/test/resources/wrapper/role-prop-read-all-modify-some-user.xml new file mode 100644 index 00000000000..11ca0909a29 --- /dev/null +++ b/gui/admin-gui/src/test/resources/wrapper/role-prop-read-all-modify-some-user.xml @@ -0,0 +1,50 @@ + + + Prop Read All Modify Some User + + read all + http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#read + + UserType + + + employeeType + CAPTAIN + + + + + + modify some + http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#modify + + UserType + + + employeeType + CAPTAIN + + + + fullName + description + + diff --git a/gui/admin-gui/src/test/resources/wrapper/role-prop-read-some-modify-some-user.xml b/gui/admin-gui/src/test/resources/wrapper/role-prop-read-some-modify-some-user.xml new file mode 100644 index 00000000000..bfdc24ad3d2 --- /dev/null +++ b/gui/admin-gui/src/test/resources/wrapper/role-prop-read-some-modify-some-user.xml @@ -0,0 +1,55 @@ + + + Prop Read Some Modify Some User + + read some + http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#read + + UserType + + + employeeType + CAPTAIN + + + + c:name + fullName + activation/administrativeStatus + assignment + + + modify some + http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#modify + + UserType + + + employeeType + CAPTAIN + + + + fullName + additionalName + description + + diff --git a/gui/admin-gui/src/test/resources/wrapper/user.xml b/gui/admin-gui/src/test/resources/wrapper/user.xml deleted file mode 100644 index 7357350271a..00000000000 --- a/gui/admin-gui/src/test/resources/wrapper/user.xml +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - 1003 - 1003 - - - - 2013-05-29T13:12:36.371+02:00 - - http://midpoint.evolveum.com/xml/ns/public/provisioning/channels-3#import - 2013-05-29T13:14:25.854+02:00 - - http://midpoint.evolveum.com/xml/ns/public/provisioning/channels-3#import - - - - - - - disabled - disabled - 2013-05-21T14:57:50.759+02:00 - 2013-12-31T22:59:00.000+01:00 - in - 2013-05-29T13:12:35.925+02:00 - 2013-05-29T13:14:25.697+02:00 - - - Viliama Repanova - viliama repanova - - - Viliama - viliama - - - Repanova - repanova - - - Mgr. - mgr - - - - - - - <orig xmlns="http://prism.evolveum.com/xml/ns/public/types-3">Pizza man</orig> - <norm xmlns="http://prism.evolveum.com/xml/ns/public/types-3">pizza man</norm> - - 1003 - A - - Lemešany - lemesany - - - - - - - - 4HXeUejV93Vd3JuIZz7sbs5bVko= - - - f4XlP9TFaPky72VGpaTsvurn36elAtlHRGMAgC8CtNgtg46Vjcq0uWnGFBgb7GB5 - - - - - - \ No newline at end of file