Skip to content

Commit

Permalink
better support for configuring shadow panels
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed Sep 24, 2021
1 parent f665e4b commit caaf183
Show file tree
Hide file tree
Showing 22 changed files with 723 additions and 111 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -100,16 +100,53 @@ public void postProcess(CompiledGuiProfile compiledGuiProfile) {
GuiObjectDetailsSetType defaultDetailsPages = compileDefaultGuiObjectDetailsSetType(classes);
List<GuiObjectDetailsPageType> detailsPages = defaultDetailsPages.getObjectDetailsPage();
for (GuiObjectDetailsPageType defaultDetailsPage : detailsPages) {

//objects
GuiObjectDetailsPageType compiledPageType = compiledGuiProfile.findObjectDetailsConfiguration(defaultDetailsPage.getType());
GuiObjectDetailsPageType mergedDetailsPage = adminGuiConfigurationMergeManager.mergeObjectDetailsPageConfiguration(defaultDetailsPage, compiledPageType);

if (compiledGuiProfile.getObjectDetails() == null) {
compiledGuiProfile.setObjectDetails(new GuiObjectDetailsSetType(prismContext));
} else {
compiledGuiProfile.getObjectDetails().getObjectDetailsPage().removeIf(p -> QNameUtil.match(p.getType(), defaultDetailsPage.getType()));
}
compiledGuiProfile.getObjectDetails().getObjectDetailsPage().removeIf(p -> QNameUtil.match(p.getType(), defaultDetailsPage.getType()));
compiledGuiProfile.getObjectDetails().getObjectDetailsPage().add(mergedDetailsPage.cloneWithoutId());
}

processShadowPanels(classes, compiledGuiProfile);

}

private void processShadowPanels(Set<Class<?>> classes, CompiledGuiProfile compiledGuiProfile) {
List<ContainerPanelConfigurationType> shadowPanels = new ArrayList<>();
for (Class<?> clazz : classes) {
PanelInstance instance = clazz.getAnnotation(PanelInstance.class);
if (instance == null) {
continue;
}
if (!instance.applicableForType().equals(ShadowType.class)) {
continue;
}

if (compiledGuiProfile.getObjectDetails() == null) {
compiledGuiProfile.setObjectDetails(new GuiObjectDetailsSetType());
}
ContainerPanelConfigurationType shadowPanel = compileContainerPanelConfiguration(clazz, ShadowType.class, classes, instance);
shadowPanels.add(shadowPanel);
}

if (compiledGuiProfile.getObjectDetails() == null) {
compiledGuiProfile.setObjectDetails(new GuiObjectDetailsSetType(prismContext));
}

if (compiledGuiProfile.getObjectDetails().getShadowDetailsPage().isEmpty()) {
compiledGuiProfile.getObjectDetails().getShadowDetailsPage().add(new GuiShadowDetailsPageType());
}

for (GuiShadowDetailsPageType shadowDetailsPage : compiledGuiProfile.getObjectDetails().getShadowDetailsPage()) {
List<ContainerPanelConfigurationType> mergedPanels = adminGuiConfigurationMergeManager.mergeContainerPanelConfigurationType(shadowPanels, shadowDetailsPage.getPanel());
shadowDetailsPage.getPanel().clear();
shadowDetailsPage.getPanel().addAll(mergedPanels);
}
}

private void fillInPanelsMap(Set<Class<?>> classes) {
Expand Down Expand Up @@ -157,6 +194,9 @@ private GuiObjectDetailsSetType compileDefaultGuiObjectDetailsSetType(Set<Class<
GuiObjectDetailsSetType guiObjectDetailsSetType = new GuiObjectDetailsSetType();
for (ObjectTypes objectType : ObjectTypes.values()) {
GuiObjectDetailsPageType detailsPageType = compileDefaultGuiObjectDetailsPage(objectType, scannedClasses);
if (QNameUtil.match(detailsPageType.getType(), ShadowType.COMPLEX_TYPE)) {
continue;
}
guiObjectDetailsSetType.getObjectDetailsPage().add(detailsPageType);
}
return guiObjectDetailsSetType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

import com.evolveum.midpoint.gui.impl.page.admin.org.PageOrg;

import com.evolveum.midpoint.gui.impl.page.admin.resource.PageShadow;
import com.evolveum.midpoint.schema.util.task.TaskTypeUtil;

import org.apache.commons.collections4.CollectionUtils;
Expand Down Expand Up @@ -255,7 +256,7 @@ public final class WebComponentUtil {
OBJECT_DETAILS_PAGE_MAP_NEW.put(ValuePolicyType.class, PageValuePolicy.class);
OBJECT_DETAILS_PAGE_MAP_NEW.put(CaseType.class, com.evolveum.midpoint.gui.impl.page.admin.cases.PageCase.class);
OBJECT_DETAILS_PAGE_MAP_NEW.put(ArchetypeType.class, com.evolveum.midpoint.gui.impl.page.admin.archetype.PageArchetype.class);
OBJECT_DETAILS_PAGE_MAP_NEW.put(ShadowType.class, PageAccount.class);
OBJECT_DETAILS_PAGE_MAP_NEW.put(ShadowType.class, PageShadow.class);
OBJECT_DETAILS_PAGE_MAP_NEW.put(ObjectCollectionType.class, com.evolveum.midpoint.gui.impl.page.admin.objectcollection.PageObjectCollection.class);
OBJECT_DETAILS_PAGE_MAP_NEW.put(ObjectTemplateType.class, com.evolveum.midpoint.gui.impl.page.admin.objecttemplate.PageObjectTemplate.class);
}
Expand Down Expand Up @@ -2570,6 +2571,9 @@ public static boolean hasDetailsPage(PrismObject<?> object) {
}

public static boolean hasDetailsPage(Class<?> clazz) {
if (isNewDesignEnabled()) {
return OBJECT_DETAILS_PAGE_MAP_NEW.containsKey(clazz);
}
return OBJECT_DETAILS_PAGE_MAP.containsKey(clazz);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1046,7 +1046,9 @@ protected boolean isCollectionViewPanelForCompiledView() {
}

protected boolean isCollectionViewPanel() {
return isCollectionViewPanelForCompiledView() || isCollectionViewPanelForWidget() || defaultCollectionExists() || getCompiledCollectionViewFromPanelConfiguration() != null;
return isCollectionViewPanelForCompiledView() || isCollectionViewPanelForWidget()
|| defaultCollectionExists() || getCompiledCollectionViewFromPanelConfiguration() != null
|| getObjectCollectionView() != null;
}

private boolean defaultCollectionExists() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
@PanelType(name = "basic", defaultContainerPath = "empty")
@PanelInstances(instances = {
@PanelInstance(identifier = "basic",
applicableForType = FocusType.class,
applicableForType = AssignmentHolderType.class,
excludeTypes = {TaskType.class, ResourceType.class},
defaultPanel = true,
display = @PanelDisplay(label = "pageAdminFocus.basic", icon = GuiStyleConstants.CLASS_CIRCLE_FULL, order = 10)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,21 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.page.admin.AbstractObjectMainPanel;
import com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.FocusDetailsModels;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.ResourceShadowDiscriminator;
import com.evolveum.midpoint.schema.SelectorOptions;

import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.web.application.*;

import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;

import org.apache.commons.lang3.BooleanUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
Expand Down Expand Up @@ -195,12 +200,6 @@ protected List<IColumn<PrismContainerValueWrapper<ShadowType>, String>> createDe
@Override
protected List<InlineMenuItem> createInlineMenu() {
return createShadowMenu();
// columns.add(new InlineMenuButtonColumn(createShadowMenu(), getPageBase()) {
// @Override
// public String getCssClass() {
// return "col-xs-1";
// }
// });
}

@Override
Expand Down Expand Up @@ -391,7 +390,8 @@ protected DisplayNamePanel<ShadowType> createDisplayNamePanel(String displayName
tabs.add(new PanelTab(createStringResource("ShadowType.basic")) {
@Override
public WebMarkupContainer createPanel(String panelId) {
ShadowPanel shadowPanel = new ShadowPanel(panelId, getParentModel(getModel()));
ContainerPanelConfigurationType config = getBasicShadowPanelConfiguration(getModelObject().getRealValue());
ShadowPanel shadowPanel = new ShadowPanel(panelId, getParentModel(getModel()), config);
return shadowPanel;
}
});
Expand All @@ -401,6 +401,29 @@ public WebMarkupContainer createPanel(String panelId) {
return detailsPanel;
}

private ContainerPanelConfigurationType getBasicShadowPanelConfiguration(ShadowType shadowType) {
GuiShadowDetailsPageType detailsPageType = findShadowDetailsPageConfiguration(shadowType);
if (detailsPageType == null) {
return null;
}

List<ContainerPanelConfigurationType> basicPanelConfig = detailsPageType.getPanel().stream().filter(p -> p.getIdentifier().equals("shadowBasic")).collect(Collectors.toList());
if (basicPanelConfig.size() == 1) {
return basicPanelConfig.get(0);
}

//TODO at least log unexpected situation
return null;
}

private GuiShadowDetailsPageType findShadowDetailsPageConfiguration(ShadowType shadowType) {
return getPageBase().getCompiledGuiProfile().findShadowDetailsConfiguration(createResourceShadowDiscriminator(shadowType));
}

private ResourceShadowDiscriminator createResourceShadowDiscriminator(ShadowType shadow) {
return new ResourceShadowDiscriminator(shadow.getResourceRef().getOid(), shadow.getKind(), shadow.getIntent(), null, false);
}

private IModel<ShadowWrapper> getParentModel(IModel<PrismContainerValueWrapper<ShadowType>> model) {
return new PropertyModel<>(model, "parent");
}
Expand Down Expand Up @@ -943,6 +966,7 @@ public ShadowWrapper loadShadowWrapper(PrismObject<ShadowType> projection, Task
PrismObjectWrapperFactory<ShadowType> factory = getPageBase().findObjectWrapperFactory(projection.getDefinition());
WrapperContext context = new WrapperContext(task, result);
context.setCreateIfEmpty(false);
context.setDetailsPageTypeConfiguration(findShadowDetailsPageConfiguration(projection.asObjectable()));
ShadowWrapper wrapper = (ShadowWrapper) factory.createObjectWrapper(projection, ItemStatus.NOT_CHANGED, context);
wrapper.setProjectionStatus(UserDtoStatus.MODIFY);
return wrapper;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<!--
~ Copyright (c) 2021 Evolveum
~
~ This work is dual-licensed under the Apache License 2.0
~ and European Union Public License. See LICENSE file for details.
-->
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:extend>
<wicket:child />
</wicket:extend>
</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
/*
* Copyright (c) 2010-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.gui.impl.page.admin.resource;

import com.evolveum.midpoint.gui.api.component.tabs.PanelTab;
import com.evolveum.midpoint.gui.api.factory.wrapper.PrismObjectWrapperFactory;
import com.evolveum.midpoint.gui.api.factory.wrapper.WrapperContext;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.prism.ItemStatus;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.ShadowWrapper;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.gui.impl.page.admin.AbstractPageObjectDetails;
import com.evolveum.midpoint.gui.impl.page.admin.ObjectDetailsModels;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.task.api.Task;
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;
import com.evolveum.midpoint.web.application.AuthorizationAction;
import com.evolveum.midpoint.web.application.PageDescriptor;
import com.evolveum.midpoint.web.application.Url;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.AjaxSubmitButton;
import com.evolveum.midpoint.web.component.AjaxTabbedPanel;
import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel;
import com.evolveum.midpoint.web.component.form.MidpointForm;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.PageAdmin;
import com.evolveum.midpoint.web.page.admin.configuration.PageDebugView;
import com.evolveum.midpoint.web.page.admin.resources.PageResources;
import com.evolveum.midpoint.web.page.admin.resources.ShadowDetailsTabPanel;
import com.evolveum.midpoint.web.page.admin.resources.ShadowSummaryPanel;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
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;

import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
* @author lazyman
*/
//TODO unify with PageAdminObjectDetails!
@PageDescriptor(
urls = {
@Url(mountUrl = "/admin/resources/shadow")
},
encoder = OnePageParameterEncoder.class, action = {
@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_RESOURCES_ALL_URL,
label = "PageAdminResources.auth.resourcesAll.label",
description = "PageAdminResources.auth.resourcesAll.description"),
@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_RESOURCES_ACCOUNT_URL,
label = "PageAccount.auth.resourcesAccount.label",
description = "PageAccount.auth.resourcesAccount.description")})
public class PageShadow extends AbstractPageObjectDetails<ShadowType, ShadowDetailsModel> {

public PageShadow(PageParameters parameters) {
super(parameters);
}

@Override
protected Collection<SelectorOptions<GetOperationOptions>> getOperationOptions() {
return getOperationOptionsBuilder()
.item(ShadowType.F_RESOURCE_REF).resolve()
.build();
}

@Override
protected Class<ShadowType> getType() {
return ShadowType.class;
}

@Override
protected Panel createSummaryPanel(String id, LoadableModel<ShadowType> summaryModel) {
return new ShadowSummaryPanel(id, summaryModel, this);
}

@Override
protected ShadowDetailsModel createObjectDetailsModels(PrismObject<ShadowType> object) {
return new ShadowDetailsModel(createPrismObejctModel(object), this);
}

@Override
protected IModel<String> createPageTitleModel() {
return new LoadableModel<>(false) {

private static final long serialVersionUID = 1L;

@Override
protected String load() {
ShadowType account = getObjectDetailsModels().getObjectType();
String accName = WebComponentUtil.getName(account);

ResourceType resource = (ResourceType) account.getResourceRef().asReferenceValue().getObject().asObjectable();
String name = WebComponentUtil.getName(resource);

//TODO: refactor
return createStringResourceStatic(PageShadow.this, "PageAccount.title", accName, name).getString();
}
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright (c) 2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.gui.impl.page.admin.resource;

import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
import com.evolveum.midpoint.gui.impl.page.admin.ObjectDetailsModels;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.ResourceShadowDiscriminator;
import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectDetailsPageType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;

public class ShadowDetailsModel extends ObjectDetailsModels<ShadowType> {

public ShadowDetailsModel(LoadableModel<PrismObject<ShadowType>> prismObjectModel, ModelServiceLocator serviceLocator) {
super(prismObjectModel, serviceLocator);
}

protected GuiObjectDetailsPageType loadDetailsPageConfiguration(PrismObject<ShadowType> prismObject) {
return getModelServiceLocator().getCompiledGuiProfile().findShadowDetailsConfiguration(createResourceShadowDiscriminator(prismObject.asObjectable()));
}

private ResourceShadowDiscriminator createResourceShadowDiscriminator(ShadowType shadow) {
return new ResourceShadowDiscriminator(shadow.getResourceRef().getOid(), shadow.getKind(), shadow.getIntent(), null, false);
}

}

0 comments on commit caaf183

Please sign in to comment.