diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java index b97c18c2507..1b91c799193 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java @@ -1851,13 +1851,12 @@ public String getBubbleLabel() { }; addMenuItem(item, "PageAdmin.menu.top.cases.listAll", GuiStyleConstants.EVO_CASE_OBJECT_ICON, PageCases.class); + addCollectionsMenuItems(item.getItems(), CaseType.COMPLEX_TYPE, PageCases.class); + addMenuItem(item, "PageAdmin.menu.top.caseWorkItems.listAll", GuiStyleConstants.CLASS_OBJECT_WORK_ITEM_ICON, PageCaseWorkItemsAll.class); addMenuItem(item, "PageAdmin.menu.top.caseWorkItems.list", PageCaseWorkItemsAllocatedToMe.class); addMenuItem(item, "PageAdmin.menu.top.workItems.listAttorney", PageAttorneySelection.class); - addCollectionsMenuItems(item.getItems(), CaseType.COMPLEX_TYPE, PageCases.class); - - createFocusPageViewMenu(item.getItems(), "PageAdmin.menu.top.caseWorkItems.view", PageCaseWorkItem.class); return item; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/CaseEventWrapperFactoryImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/CaseEventWrapperFactoryImpl.java index 547c7485b65..8ed63e1d601 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/CaseEventWrapperFactoryImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/CaseEventWrapperFactoryImpl.java @@ -24,6 +24,9 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.web.component.prism.ValueStatus; import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseEventType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemCompletionEventType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemDelegationEventType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkItemEventType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -31,14 +34,15 @@ * Created by honchar */ @Component -public class CaseEventWrapperFactoryImpl extends PrismContainerWrapperFactoryImpl { +public class CaseEventWrapperFactoryImpl extends PrismContainerWrapperFactoryImpl { @Autowired private GuiComponentRegistry registry; @Override public boolean match(ItemDefinition def) { - return CaseEventType.COMPLEX_TYPE.equals(def.getTypeName()); + return CaseEventType.COMPLEX_TYPE.equals(def.getTypeName()) || WorkItemEventType.COMPLEX_TYPE.equals(def.getTypeName()) || + WorkItemCompletionEventType.COMPLEX_TYPE.equals(def.getTypeName()) || WorkItemDelegationEventType.COMPLEX_TYPE.equals(def.getTypeName()); } @Override @@ -52,19 +56,19 @@ public int getOrder() { } @Override - protected PrismContainerValue createNewValue(PrismContainer item) { + protected PrismContainerValue createNewValue(PrismContainer item) { throw new UnsupportedOperationException("New case event value should not be created while creating wrappers."); } @Override - protected boolean shouldCreateEmptyValue(PrismContainer item, WrapperContext context) { + protected boolean shouldCreateEmptyValue(PrismContainer item, WrapperContext context) { return false; } @Override - public PrismContainerValueWrapper createValueWrapper(PrismContainerWrapper parent, - PrismContainerValue value, ValueStatus status, WrapperContext context) throws SchemaException { + public PrismContainerValueWrapper createValueWrapper(PrismContainerWrapper parent, + PrismContainerValue value, ValueStatus status, WrapperContext context) throws SchemaException { context.setCreateIfEmpty(false); return super.createValueWrapper(parent, value, status, context); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ItemWrapperFactoryImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ItemWrapperFactoryImpl.java index f7f508644fe..8497fbcfa1d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ItemWrapperFactoryImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/ItemWrapperFactoryImpl.java @@ -19,6 +19,7 @@ import java.util.Collection; import java.util.List; +import com.evolveum.midpoint.prism.*; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -29,10 +30,6 @@ import com.evolveum.midpoint.gui.impl.prism.PrismValueWrapper; import com.evolveum.midpoint.gui.impl.registry.GuiComponentRegistryImpl; import com.evolveum.midpoint.model.api.ModelInteractionService; -import com.evolveum.midpoint.prism.Item; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.path.ItemName; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.util.exception.SchemaException; @@ -136,7 +133,12 @@ private boolean skipCreateWrapper(ItemDefinition def, ItemStatus status, Wrap LOGGER.trace("Skipping creating wrapper for search filter: {}", def.getName()); return false; } - + + if (ItemProcessing.IGNORE == def.getProcessing()) { + LOGGER.trace("Skip creating wrapper for {}, because item processig is set to IGNORE.", def); + return false; + } + if (def.isExperimental() && !WebModelServiceUtils.isEnableExperimentalFeature(modelInteractionService, context.getTask(), context.getResult())) { LOGGER.trace("Skipping creating wrapper for {}, because experimental GUI features are turned off.", def); return false; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/WorkItemOutputWrapperFactoryImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/WorkItemOutputWrapperFactoryImpl.java new file mode 100644 index 00000000000..e88bd05a329 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/WorkItemOutputWrapperFactoryImpl.java @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2010-2019 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.gui.impl.factory; + +import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper; +import com.evolveum.midpoint.gui.api.registry.GuiComponentRegistry; +import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; +import com.evolveum.midpoint.prism.ItemDefinition; +import com.evolveum.midpoint.prism.PrismContainer; +import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.web.component.prism.ValueStatus; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Created by honchar + */ +@Component +public class WorkItemOutputWrapperFactoryImpl extends PrismContainerWrapperFactoryImpl { + + @Autowired + private GuiComponentRegistry registry; + + @Override + public boolean match(ItemDefinition def) { + return AbstractWorkItemOutputType.COMPLEX_TYPE.equals(def.getTypeName()); + } + + @Override + public void register() { + registry.addToRegistry(this); + } + + @Override + public int getOrder() { + return 1000; + } + + @Override + protected PrismContainerValue createNewValue(PrismContainer item) { + throw new UnsupportedOperationException("New work item output value should not be created while creating wrappers."); + } + + + @Override + protected boolean shouldCreateEmptyValue(PrismContainer item, WrapperContext context) { + return false; + } + + @Override + public PrismContainerValueWrapper createValueWrapper(PrismContainerWrapper parent, + PrismContainerValue value, ValueStatus status, WrapperContext context) throws SchemaException { + context.setCreateIfEmpty(false); + return super.createValueWrapper(parent, value, status, context); + } + + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemWrapperImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemWrapperImpl.java index ea2c22b2595..9a718012707 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemWrapperImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/ItemWrapperImpl.java @@ -253,6 +253,7 @@ public String debugDump(int indent) { sb.append("Old item: \n").append(oldItem).append("\n"); sb.append("Values: \n"); for (VW value : values) { + DebugUtil.indentDebugDump(sb, indent + 1); sb.append(value.debugDump()); } return sb.toString(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValueWrapperImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValueWrapperImpl.java index 3d6a6238dab..0f4c476362a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValueWrapperImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismContainerValueWrapperImpl.java @@ -382,7 +382,7 @@ public String debugDump(int indent) { StringBuilder sb = new StringBuilder(super.debugDump(indent)); sb.append("Items:\n"); for (ItemWrapper item: items) { - sb.append(item).append("\n"); + sb.append(item.debugDump(indent + 1)).append("\n"); } return sb.toString(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismObjectValueWrapperImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismObjectValueWrapperImpl.java index 13e4f410e8d..abaf5151516 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismObjectValueWrapperImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismObjectValueWrapperImpl.java @@ -56,5 +56,9 @@ public List> getContainers() public String getDisplayName() { return new StringResourceModel("prismContainer.mainPanelDisplayName").getString(); } - + + @Override + public boolean isExpanded() { + return true; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismValueWrapperImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismValueWrapperImpl.java index 25562eb8cf2..800b38d184c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismValueWrapperImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/PrismValueWrapperImpl.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy; +import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.web.component.prism.ValueStatus; @@ -129,7 +130,7 @@ public void setStatus(ValueStatus status) { @Override public String debugDump(int indent) { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = DebugUtil.createIndentedStringBuilder(indent); sb.append("Status: ").append(status).append("\n"); sb.append("New value: ").append(newValue.debugDump()).append("\n"); sb.append("Old value: ").append(oldValue.debugDump()).append("\n"); diff --git a/gui/admin-gui/src/main/resources/initial-objects/000-system-configuration.xml b/gui/admin-gui/src/main/resources/initial-objects/000-system-configuration.xml index 1171285d105..b1424b4aa85 100644 --- a/gui/admin-gui/src/main/resources/initial-objects/000-system-configuration.xml +++ b/gui/admin-gui/src/main/resources/initial-objects/000-system-configuration.xml @@ -159,8 +159,25 @@ http://midpoint.evolveum.com/xml/ns/public/security/authorization-ui-3#resources + + my-cases + 1000 + CaseType + + + My Cases + + fe fe-case-object + + + + + + + manual-case-view + 1001 CaseType @@ -169,6 +186,7 @@ operation-request-case-view + 1002 CaseType @@ -177,6 +195,7 @@ approval-case-view + 1003 CaseType diff --git a/gui/admin-gui/src/main/resources/initial-objects/330-object-collection-my-cases.xml b/gui/admin-gui/src/main/resources/initial-objects/330-object-collection-my-cases.xml new file mode 100644 index 00000000000..804b1003e35 --- /dev/null +++ b/gui/admin-gui/src/main/resources/initial-objects/330-object-collection-my-cases.xml @@ -0,0 +1,29 @@ + + My cases + CaseType + + + + requestorRef + + + + + + + state + closed + + + + + + + + + diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestIntegrationObjectWrapperFactory.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestIntegrationObjectWrapperFactory.java index bc682b0c5f6..8f19326778b 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestIntegrationObjectWrapperFactory.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestIntegrationObjectWrapperFactory.java @@ -24,7 +24,9 @@ import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper; import com.evolveum.midpoint.gui.impl.prism.PrismObjectValueWrapper; import com.evolveum.midpoint.gui.test.TestMidPointSpringApplication; +import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.ItemProcessing; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; @@ -40,33 +42,29 @@ import com.evolveum.midpoint.web.AbstractInitializedGuiIntegrationTest; import com.evolveum.midpoint.web.AdminGuiTestConstants; import com.evolveum.midpoint.web.WrapperTestUtil; +import com.evolveum.midpoint.web.component.prism.ItemVisibility; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.junit.Test; -import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.testng.annotations.Test; import java.io.File; import java.util.*; import java.util.stream.Collectors; -import static com.evolveum.midpoint.web.AdminGuiTestConstants.*; +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.*; /** * @author semancik * */ -//@ContextConfiguration(locations = {"classpath:ctx-admin-gui-test-main.xml"}) -//@DirtiesContext(classMode = ClassMode.AFTER_CLASS) -//@DirtiesContext(classMode = ClassMode.AFTER_CLASS) +@DirtiesContext(classMode = ClassMode.AFTER_CLASS) @ActiveProfiles("test") @SpringBootTest(classes = TestMidPointSpringApplication.class) -@RunWith(SpringJUnit4ClassRunner.class) public class TestIntegrationObjectWrapperFactory extends AbstractInitializedGuiIntegrationTest { public static final File TEST_DIR = new File("src/test/resources/wrapper"); @@ -89,7 +87,6 @@ public class TestIntegrationObjectWrapperFactory extends AbstractInitializedGuiI private static final String USER_NEWMAN_SHIP = "Nova"; private static final List BASIC_USER_CONTAINERS_PATHS = Arrays.asList( - ItemPath.EMPTY_PATH, UserType.F_EXTENSION, UserType.F_METADATA, UserType.F_ASSIGNMENT, @@ -97,7 +94,6 @@ public class TestIntegrationObjectWrapperFactory extends AbstractInitializedGuiI UserType.F_CREDENTIALS, UserType.F_ADMIN_GUI_CONFIGURATION); private static final List BASIC_SHADOW_CONTAINERS_PATHS = Arrays.asList( - ItemPath.EMPTY_PATH, ShadowType.F_EXTENSION, ShadowType.F_METADATA, ShadowType.F_PENDING_OPERATION, @@ -106,7 +102,6 @@ public class TestIntegrationObjectWrapperFactory extends AbstractInitializedGuiI ShadowType.F_ACTIVATION, ShadowType.F_CREDENTIALS); private static final List BASIC_ORG_CONTAINERS_PATHS = Arrays.asList( - ItemPath.EMPTY_PATH, OrgType.F_EXTENSION, OrgType.F_METADATA, OrgType.F_ASSIGNMENT, @@ -123,6 +118,7 @@ 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); @@ -130,6 +126,10 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti repoAddObjectFromFile(ROLE_PROP_READ_ALL_MODIFY_SOME_USER_FILE, initResult); repoAddObjectFromFile(ROLE_PROP_READ_SOME_MODIFY_SOME_USER_FILE, initResult); + PrismObject systemConfig = parseObject(SYSTEM_CONFIGURATION_FILE); + +// LOGGER.info("adding system config page"); + addObject(systemConfig, ModelExecuteOptions.createOverwrite(), initTask, initResult); } @@ -138,20 +138,18 @@ public void test100CreateWrapperUserJack() throws Exception { final String TEST_NAME = "test100CreateWrapperUserJack"; TestUtil.displayTestTitle(TEST_NAME); Task task = taskManager.createTaskInstance(TEST_NAME); - OperationResult result = task.getResult(); - repoAddObjectFromFile(USER_JACK_FILE, result); - PrismObject user = getUser(USER_JACK_OID); + OperationResult result = task.getResult(); // WHEN displayWhen(TEST_NAME); + assertLoggedInUserOid(USER_ADMINISTRATOR_OID); - + PrismObject user = getUser(USER_JACK_OID); + PrismObject userOld = user.clone(); PrismObjectWrapperFactory factory = getServiceLocator(task).findObjectWrapperFactory(user.getDefinition()); WrapperContext context = new WrapperContext(task, result); - context.setCreateIfEmpty(true); - context.setShowEmpty(true); PrismObjectWrapper objectWrapper = factory.createObjectWrapper(user, ItemStatus.NOT_CHANGED, context); // THEN @@ -159,13 +157,15 @@ public void test100CreateWrapperUserJack() throws Exception { IntegrationTestTools.display("Wrapper after", objectWrapper); - WrapperTestUtil.assertWrapper(objectWrapper, "user display name", "user description", user, ItemStatus.NOT_CHANGED); + WrapperTestUtil.assertWrapper(objectWrapper, "properties", "user description", user, userOld, ItemStatus.NOT_CHANGED); assertContainersPaths(objectWrapper, BASIC_USER_CONTAINERS_PATHS); assertEquals("wrong number of containers in "+objectWrapper, 1, objectWrapper.getValues().size()); PrismObjectValueWrapper mainContainerValueWrapper = objectWrapper.getValue(); WrapperTestUtil.assertPropertyWrapperByName(mainContainerValueWrapper, UserType.F_NAME, PrismTestUtil.createPolyString(USER_JACK_USERNAME)); WrapperTestUtil.assertPropertyWrapperByName(mainContainerValueWrapper, UserType.F_TIMEZONE, null); + Item ship = userOld.findItem(ItemPath.create(UserType.F_EXTENSION, PIRACY_SHIP)); + assertNotNull("Ship is null", ship); WrapperTestUtil.assertPropertyWrapper(mainContainerValueWrapper, extensionPath(PIRACY_SHIP), AdminGuiTestConstants.USER_JACK_SHIP); PrismContainerWrapper activationContainerWrapper = objectWrapper.findContainer(UserType.F_ACTIVATION); @@ -183,13 +183,13 @@ public void test100CreateWrapperUserJack() throws Exception { assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_ADDITIONAL_NAME, false); // not visible, because it is empty assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_LOCALITY, true); - assertItemWrapperProcessing(mainContainerValueWrapper, PIRACY_WEAPON, null); - assertItemWrapperProcessing(mainContainerValueWrapper, PIRACY_COLORS, ItemProcessing.AUTO); - assertItemWrapperProcessing(mainContainerValueWrapper, PIRACY_SECRET, ItemProcessing.IGNORE); - assertItemWrapperProcessing(mainContainerValueWrapper, PIRACY_RANT, ItemProcessing.MINIMAL); + assertItemWrapperProcessing(mainContainerValueWrapper, extensionPath(PIRACY_WEAPON), null); + assertItemWrapperProcessing(mainContainerValueWrapper, extensionPath(PIRACY_COLORS), ItemProcessing.AUTO); + assertItemWrapperProcessing(mainContainerValueWrapper, extensionPath(PIRACY_SECRET), ItemProcessing.IGNORE); + assertItemWrapperProcessing(mainContainerValueWrapper, extensionPath(PIRACY_RANT), ItemProcessing.MINIMAL); // WHEN - objectWrapper.setShowEmpty(true, true); + mainContainerValueWrapper.setShowEmpty(true); // THEN assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_NAME, true); @@ -207,7 +207,11 @@ private void assertContainersPaths(PrismObjectWrapper objectWrapper, Collecti Set expectedUniformPaths = expectedPaths.stream() .map(p -> prismContext.toUniformPath(p)) .collect(Collectors.toSet()); - Set realUniformPaths = objectWrapper.getValue().getItems().stream() + + List containerWrappers = objectWrapper.getValue().getItems().stream() + .filter(w -> w instanceof PrismContainerWrapper).collect(Collectors.toList()); + + Set realUniformPaths = containerWrappers.stream() .map(c -> prismContext.toUniformPath(c.getPath())) .collect(Collectors.toSet()); assertEquals("wrong container paths in "+objectWrapper, expectedUniformPaths, realUniformPaths); @@ -230,6 +234,9 @@ public void test110CreateWrapperUserNewEmpty() throws Exception { PrismObjectWrapperFactory factory = getServiceLocator(task).findObjectWrapperFactory(user.getDefinition()); WrapperContext context = new WrapperContext(task, result); + context.setCreateIfEmpty(true); + context.setShowEmpty(true); + PrismObjectWrapper objectWrapper = factory.createObjectWrapper(user, ItemStatus.ADDED, context); // THEN @@ -237,7 +244,7 @@ public void test110CreateWrapperUserNewEmpty() throws Exception { IntegrationTestTools.display("Wrapper after", objectWrapper); - WrapperTestUtil.assertWrapper(objectWrapper, "user display name", "user description", user, ItemStatus.ADDED); + WrapperTestUtil.assertWrapper(objectWrapper, "properties", "user description", user, getUserDefinition().instantiate(), ItemStatus.ADDED); assertContainersPaths(objectWrapper, BASIC_USER_CONTAINERS_PATHS); assertEquals("wrong number of containers in "+objectWrapper, 1, objectWrapper.getValues().size()); @@ -257,22 +264,22 @@ public void test110CreateWrapperUserNewEmpty() throws Exception { assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_NAME, true); assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_GIVEN_NAME, true); assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_FULL_NAME, true); - assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_ADDITIONAL_NAME, false); // not visible, because it is empty + assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_ADDITIONAL_NAME, true); - assertItemWrapperProcessing(mainContainerValueWrapper, PIRACY_WEAPON, null); - assertItemWrapperProcessing(mainContainerValueWrapper, PIRACY_COLORS, ItemProcessing.AUTO); - assertItemWrapperProcessing(mainContainerValueWrapper, PIRACY_SECRET, ItemProcessing.IGNORE); - assertItemWrapperProcessing(mainContainerValueWrapper, PIRACY_RANT, ItemProcessing.MINIMAL); + assertItemWrapperProcessing(mainContainerValueWrapper, extensionPath(PIRACY_WEAPON), null); + assertItemWrapperProcessing(mainContainerValueWrapper, extensionPath(PIRACY_COLORS), ItemProcessing.AUTO); + assertItemWrapperProcessing(mainContainerValueWrapper, extensionPath(PIRACY_SECRET), ItemProcessing.IGNORE); + assertItemWrapperProcessing(mainContainerValueWrapper, extensionPath(PIRACY_RANT), ItemProcessing.MINIMAL); // WHEN - objectWrapper.setShowEmpty(true, true); + mainContainerValueWrapper.setShowEmpty(false); // THEN assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_NAME, true); assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_GIVEN_NAME, true); // emphasized assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_FULL_NAME, true); // emphasized - assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_ADDITIONAL_NAME, true); // empty - assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_LOCALITY, true); // empty + assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_ADDITIONAL_NAME, false); // empty + assertItemWrapperFullConrol(mainContainerValueWrapper, UserType.F_LOCALITY, false); // empty ObjectDelta objectDelta = objectWrapper.getObjectDelta(); display("Delta", objectDelta); @@ -1017,14 +1024,14 @@ private void assertItemWrapperFullConrol(PrismContaine boolean visible) throws SchemaException { ItemWrapper itemWrapper = containerWrapper.findItem(propName, ItemWrapper.class); assertEquals("Wrong "+propName+" readOnly", Boolean.FALSE, (Boolean)itemWrapper.isReadOnly()); - assertEquals("Wrong "+propName+" visible", visible, itemWrapper.isVisible(containerWrapper.isShowEmpty(), containerWrapper.isExpanded(), null)); + assertEquals("Wrong "+propName+" visible", visible, itemWrapper.isVisible(containerWrapper.isShowEmpty(), containerWrapper.isExpanded(), w -> ItemVisibility.AUTO)); assertEquals("Wrong "+propName+" definition.canRead", Boolean.TRUE, (Boolean)itemWrapper.canRead()); assertEquals("Wrong "+propName+" definition.canAdd", Boolean.TRUE, (Boolean)itemWrapper.canAdd()); assertEquals("Wrong "+propName+" definition.canModify", Boolean.TRUE, (Boolean)itemWrapper.canModify()); } private void assertItemWrapperProcessing(PrismContainerValueWrapper containerWrapper, - ItemName propName, ItemProcessing expectedProcessing) throws SchemaException { + ItemPath propName, ItemProcessing expectedProcessing) throws SchemaException { ItemWrapper itemWrapper = containerWrapper.findItem(propName, ItemWrapper.class); if (expectedProcessing == ItemProcessing.IGNORE) { assertNull("Unexpected ignored item wrapper for "+propName, itemWrapper); diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/test/TestMidPointSpringApplication.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/test/TestMidPointSpringApplication.java index 635b0cf89a1..1842a4b0841 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/test/TestMidPointSpringApplication.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/test/TestMidPointSpringApplication.java @@ -43,11 +43,11 @@ //"classpath:ctx-init.xml", @ImportResource(locations = { "classpath:ctx-common.xml", - "classpath:ctx-configuration.xml", - "classpath*:ctx-repository.xml", + "classpath:ctx-configuration-test.xml", + "classpath*:ctx-repository-test.xml", "classpath:ctx-repo-cache.xml", "classpath:ctx-repo-common.xml", - "classpath:ctx-task.xml", + "classpath*:ctx-task.xml", "classpath:ctx-provisioning.xml", "classpath:ctx-ucf-connid.xml", "classpath:ctx-ucf-builtin.xml", @@ -57,6 +57,7 @@ "classpath:ctx-model.xml", "classpath:ctx-model-test.xml", "classpath:ctx-model-common.xml", + "classpath:ctx-init.xml", "classpath:ctx-report.xml", "classpath*:ctx-workflow.xml", "classpath*:ctx-notifications.xml", diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java index 1511b265bd9..200f2a96318 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java @@ -25,6 +25,7 @@ import static org.testng.AssertJUnit.assertNull; import java.io.File; +import java.io.IOException; import java.lang.reflect.Method; import java.util.Locale; @@ -32,9 +33,18 @@ import javax.servlet.ServletException; import javax.xml.namespace.QName; +import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.gui.impl.factory.PrismObjectWrapperFactory; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.schema.MidPointPrismContextFactory; +import com.evolveum.midpoint.schema.constants.MidPointConstants; +import com.evolveum.midpoint.security.api.MidPointPrincipal; +import com.evolveum.midpoint.util.PrettyPrinter; +import com.evolveum.midpoint.web.page.login.PageLogin; +import com.evolveum.midpoint.web.security.SecurityUtils; import org.apache.wicket.Application; +import org.apache.wicket.RestartResponseException; import org.apache.wicket.ThreadContext; import org.apache.wicket.protocol.http.WicketFilter; import org.apache.wicket.util.tester.WicketTester; @@ -44,10 +54,7 @@ import org.springframework.mock.web.MockFilterConfig; import org.springframework.mock.web.MockServletContext; import org.springframework.web.context.WebApplicationContext; -import org.testng.annotations.AfterClass; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.BeforeMethod; +import org.testng.annotations.*; import com.evolveum.midpoint.common.LocalizationService; import com.evolveum.midpoint.gui.api.registry.GuiComponentRegistry; @@ -85,6 +92,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import org.xml.sax.SAXException; /** * @author lazyman @@ -141,8 +149,6 @@ public abstract class AbstractGuiIntegrationTest extends AbstractModelIntegratio protected static final String SECURITY_POLICY_OID = "00000000-0000-0000-0000-000000000120"; @Autowired private MidPointApplication application; - -// @Autowired private ApplicationContext appContext; @Autowired protected PrismContext prismContext; @Autowired protected ExpressionFactory expressionFactory; @Autowired protected RelationRegistry relationRegistry; @@ -158,15 +164,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti super.initSystem(initTask, initResult); LOGGER.info("after super init"); - WebComponentUtil.setStaticallyProvidedRelationRegistry(relationRegistry); - - PrismObject configuration = repoAddObjectFromFile(SYSTEM_CONFIGURATION_FILE, initResult); - relationRegistry.applyRelationsConfiguration(configuration.asObjectable()); - - repoAddObjectFromFile(SECURITY_POLICY_FILE, initResult); - repoAddObjectFromFile(ROLE_ENDUSER_FILE, initResult); - repoAddObjectFromFile(ROLE_SUPERUSER_FILE, initResult); - repoAddObjectFromFile(USER_ADMINISTRATOR_FILE, initResult); +// WebComponentUtil.setStaticallyProvidedRelationRegistry(relationRegistry); login(USER_ADMINISTRATOR_USERNAME); LOGGER.info("user logged in"); @@ -226,7 +224,11 @@ public DashboardService getDashboardService() { @Override public Task createSimpleTask(String operationName) { - return taskManager.createTaskInstance(operationName); + MidPointPrincipal user = SecurityUtils.getPrincipalUser(); + if (user == null) { + throw new IllegalStateException("No authenticated user"); + } + return WebModelServiceUtils.createSimpleTask(operationName, SchemaConstants.CHANNEL_GUI_USER_URI, user.getUser().asPrismObject(), taskManager); } @Override diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/WrapperTestUtil.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/WrapperTestUtil.java index 73febf43221..be3ce3a7186 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/WrapperTestUtil.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/WrapperTestUtil.java @@ -153,13 +153,15 @@ public static void assertWrapper(PrismContainerWrapper assertEquals("Wrong status in wrapper "+containerWrapper, status, containerWrapper.getStatus()); } - public static void assertWrapper(PrismObjectWrapper objectWrapper, String displayName, String description, PrismObject object, + public static void assertWrapper(PrismObjectWrapper objectWrapper, String displayName, String description, PrismObject object, PrismObject objectOld, ItemStatus status) { assertNotNull("null wrapper", objectWrapper); assertEquals("Wrong object in wrapper "+objectWrapper, object, objectWrapper.getObject()); - assertEquals("Wrong old object in wrapper "+objectWrapper, object, objectWrapper.getObjectOld()); + if (ItemStatus.ADDED != objectWrapper.getStatus()) { + assertEquals("Wrong old object in wrapper " + objectWrapper, objectOld, objectWrapper.getObjectOld()); + } assertFalse("object and old object not clonned in "+objectWrapper, objectWrapper.getObject() == objectWrapper.getObjectOld()); -// assertEquals("Wrong displayName in wrapper "+objectWrapper, displayName, objectWrapper.getDisplayName()); + assertEquals("Wrong displayName in wrapper "+objectWrapper, displayName, objectWrapper.getDisplayName()); // assertEquals("Wrong description in wrapper "+objectWrapper, description, objectWrapper.getDescription()); assertEquals("Wrong status in wrapper "+objectWrapper, status, objectWrapper.getStatus()); // assertNull("Unexpected old delta in "+objectWrapper, objectWrapper.getOldDelta()); diff --git a/gui/admin-gui/src/test/resources/common/user-jack.xml b/gui/admin-gui/src/test/resources/common/user-jack.xml index 2dc663b4214..c914630c4b6 100644 --- a/gui/admin-gui/src/test/resources/common/user-jack.xml +++ b/gui/admin-gui/src/test/resources/common/user-jack.xml @@ -17,15 +17,25 @@ jack Black Pearl - pistol - mouth - 0 + pistol + mouth + 0 enabled diff --git a/gui/admin-gui/testng-integration.xml b/gui/admin-gui/testng-integration.xml index 3e952a9763e..ba712d1cf60 100644 --- a/gui/admin-gui/testng-integration.xml +++ b/gui/admin-gui/testng-integration.xml @@ -19,7 +19,7 @@ - + diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestNullAttribute.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestNullAttribute.java index 664cca76e95..ceeaf5fbb81 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestNullAttribute.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestNullAttribute.java @@ -214,7 +214,7 @@ public void test020UserSmackSetAttribute() throws Exception { @SuppressWarnings("unchecked, raw") Collection> deltas = (Collection) prismContext.deltaFor(UserType.class) - .item(UserType.F_EXTENSION, new QName(NS_PIRACY, "ship")).add("Black Pearl") + .item(NSION, new QName(NS_PIRACY, "ship")).add("Black Pearl") .asObjectDeltas(USER_SMACK_OID); modelService.executeChanges(deltas, null, task, result);