Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Apr 1, 2022
2 parents 81fbff4 + ca5db59 commit b672b76
Show file tree
Hide file tree
Showing 7 changed files with 167 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
import com.evolveum.midpoint.util.ClassPathUtil;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.application.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
Expand All @@ -45,6 +47,8 @@
@Component
public class DefaultGuiConfigurationCompiler implements GuiProfileCompilable {

private static final Trace LOGGER = TraceManager.getTrace(DefaultGuiConfigurationCompiler.class);

@Autowired private GuiProfileCompilerRegistry registry;
@Autowired private PrismContext prismContext;
@Autowired private AdminGuiConfigurationMergeManager adminGuiConfigurationMergeManager;
Expand Down Expand Up @@ -106,7 +110,7 @@ private static synchronized Collection<Class<?>> getCollectionClasses() {
}

private Collection<Class<?>> getPanelInstanceClasses() {
Collection<Class<?>> result = new ArrayList<>();
Collection<Class<?>> result = new HashSet<>();
result.addAll(getClassesForAnnotation(PanelInstance.class, additionalPackagesToScan));
result.addAll(getClassesForAnnotation(PanelInstances.class, additionalPackagesToScan));

Expand Down Expand Up @@ -205,22 +209,42 @@ private List<CompiledObjectCollectionView> compileDefaultCollectionViews(Collect
return compiledObjectCollectionViews;
}

private List<PanelInstance> getPanelInstancesAnnotations(Class<?> clazz) {
List<PanelInstance> instances = new ArrayList<>();
if (clazz == null) {
return instances;
}

PanelInstance i = clazz.getAnnotation(PanelInstance.class);
if (i != null) {
instances.add(i);
}

PanelInstances pis = clazz.getAnnotation(PanelInstances.class);
if (pis != null) {
instances.addAll(Arrays.asList(pis.value()));
}

return instances;
}

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

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

if (compiledGuiProfile.getObjectDetails() == null) {
Expand Down Expand Up @@ -306,13 +330,8 @@ private Set<Class<? extends Containerable>> findSupportedContainerables() {
Set<Class<? extends Containerable>> containerables = new HashSet<>();

for (Class<?> clazz : getPanelInstanceClasses()) {
PanelInstances pis = clazz.getAnnotation(PanelInstances.class);
if (pis != null) {
Arrays.asList(pis.value()).forEach(pi -> addSupportedContainerable(containerables, pi));
}

PanelInstance pi = clazz.getAnnotation(PanelInstance.class);
addSupportedContainerable(containerables, pi);
List<PanelInstance> pis = getPanelInstancesAnnotations(clazz);
pis.forEach(pi -> addSupportedContainerable(containerables, pi));
}

return containerables;
Expand Down Expand Up @@ -364,13 +383,8 @@ private List<ContainerPanelConfigurationType> getPanelsFor(Class<? extends Conta
List<ContainerPanelConfigurationType> panels = new ArrayList<>();

for (Class<?> clazz : getPanelInstanceClasses()) {
PanelInstances pis = clazz.getAnnotation(PanelInstances.class);
if (pis != null) {
Arrays.asList(pis.value()).forEach(pi -> addPanelsFor(panels, containerable, clazz, pi));
}

PanelInstance pi = clazz.getAnnotation(PanelInstance.class);
addPanelsFor(panels, containerable, clazz, pi);
List<PanelInstance> pis = getPanelInstancesAnnotations(clazz);
pis.forEach(pi -> addPanelsFor(panels, containerable, clazz, pi));
}

MiscSchemaUtil.sortDetailsPanels(panels);
Expand Down Expand Up @@ -493,20 +507,21 @@ private void compileDisplay(PanelInstance panelInstance, ContainerPanelConfigura
private List<ContainerPanelConfigurationType> processChildren(Class<? extends Containerable> containerable, Class<?> parentClass) {
List<ContainerPanelConfigurationType> configs = new ArrayList<>();
for (Class<?> clazz : getPanelInstanceClasses()) {
PanelInstance panelInstance = clazz.getAnnotation(PanelInstance.class);
if (isNotApplicableFor(containerable, panelInstance)) {
continue;
}
if (!isSubPanel(panelInstance)) {
continue;
}
for (PanelInstance panelInstance : getPanelInstancesAnnotations(clazz)) {
if (isNotApplicableFor(containerable, panelInstance)) {
continue;
}
if (!isSubPanel(panelInstance)) {
continue;
}

if (!panelInstance.childOf().equals(parentClass)) {
continue;
}
if (!panelInstance.childOf().equals(parentClass)) {
continue;
}

ContainerPanelConfigurationType config = compileContainerPanelConfiguration(clazz, containerable, panelInstance);
configs.add(config);
ContainerPanelConfigurationType config = compileContainerPanelConfiguration(clazz, containerable, panelInstance);
configs.add(config);
}
}

MiscSchemaUtil.sortDetailsPanels(configs);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -409,25 +409,38 @@ private boolean isApplicableForOperation(ContainerPanelConfigurationType configu

private void initMainPanel(ContainerPanelConfigurationType panelConfig, MidpointForm form) {
if (panelConfig == null) {
WebMarkupContainer panel = new MessagePanel(ID_MAIN_PANEL, MessagePanel.MessagePanelType.WARN,
createStringResource("AbstractPageObjectDetails.noPanels"), false);
panel.add(AttributeAppender.append("style", "margin-top: 20px;"));

form.addOrReplace(panel);
addErrorPanel(false, form, MessagePanel.MessagePanelType.WARN,"AbstractPageObjectDetails.noPanels");
return;
}

getSessionStorage().setObjectDetailsStorage("details" + getType().getSimpleName(), panelConfig);
String panelType = panelConfig.getPanelType();
if (panelType == null) {
addErrorPanel(false, form, MessagePanel.MessagePanelType.ERROR,"AbstractPageObjectDetails.panelTypeUndefined", panelConfig.getIdentifier());
return;
}
Class<? extends Panel> panelClass = findObjectPanel(panelConfig.getPanelType());

Class<? extends Panel> panelClass = findObjectPanel(panelType);
Panel panel = WebComponentUtil.createPanel(panelClass, ID_MAIN_PANEL, objectDetailsModels, panelConfig);
form.addOrReplace(panel);
if (panel != null) {
form.addOrReplace(panel);
return;
}

addErrorPanel(true, form, MessagePanel.MessagePanelType.ERROR, "AbstractPageObjectDetails.panelErrorInitialization", panelConfig.getIdentifier(), panelType);
}

private void addErrorPanel(boolean force, MidpointForm form, MessagePanel.MessagePanelType type, String message, Object... params) {
if (!force && form.get(ID_MAIN_PANEL) != null) {
return;
}

WebMarkupContainer panel = new MessagePanel(ID_MAIN_PANEL, type,
createStringResource(message, params), false);
panel.add(AttributeAppender.append("style", "margin-top: 20px;"));

form.addOrReplace(panel);
}

private DetailsNavigationPanel initNavigation() {
return createNavigationPanel(getPanelConfigurations());
Expand Down Expand Up @@ -457,7 +470,7 @@ public void replacePanel(ContainerPanelConfigurationType config, AjaxRequestTarg
LOGGER.debug("Can't instantiate panel based on config\n {}", config.debugDump(), e);
}

error("Cannot instantiate panel, " + e.getMessage() + " (" + e.getClass().getSimpleName() + ").");
error(getString("AbstractPageObjectDetails.replacePanelException", e.getMessage(), e.getClass().getSimpleName()));
target.add(getFeedbackPanel());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ protected IModel<Boolean> getObjectSelectCheckBoxEnableModel(IModel<SelectableBe
if (rowModel == null) {
return Model.of(false);
}
List selectedObjects = getSelectedObjectsList();
List selectedObjects = getPreselectedObjects();
return Model.of(selectedObjects == null || selectedObjects.size() == 0
|| (rowModel.getObject() != null && rowModel.getObject().isSelected()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
import java.util.ArrayList;
import java.util.List;

import com.evolveum.midpoint.web.component.util.EnableBehaviour;

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
Expand Down Expand Up @@ -38,6 +41,9 @@
import com.evolveum.midpoint.web.page.admin.users.component.ExecuteChangeOptionsDto;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TracingProfileType;

import org.apache.wicket.util.visit.IVisit;
import org.apache.wicket.util.visit.IVisitor;

/**
* @author lazyman
*/
Expand Down Expand Up @@ -107,9 +113,18 @@ protected void populateMenuItem(String componentId, ListItem<InlineMenuItem> men

@Override
public void onUpdate(AjaxRequestTarget target) {
getOptionsButtonPanel().visitChildren(new IVisitor<Component, Object>() {
@Override
public void component(Component component, IVisit<Object> objectIVisit) {
if (component instanceof CheckBoxPanel) {
target.add(component);
}
}
});
// checkboxMenuItem.getCheckBoxModel().setObject(!checkboxMenuItem.getCheckBoxModel().getObject());
}
};
panel.add(new EnableBehaviour(() -> isOptionEnabled(model, checkboxMenuItem)));
panel.setOutputMarkupId(true);
menuItem.add(panel);
}
Expand All @@ -133,6 +148,33 @@ protected String getSpecialLabelClass() {
dropdownButtonPanel.setOutputMarkupId(true);
}

private DropdownButtonPanel getOptionsButtonPanel() {
return (DropdownButtonPanel) get(ID_OPTIONS);
}

private boolean isOptionEnabled(DropdownButtonDto dropdownButtonDto, CheckboxMenuItem checkboxMenuItem) {
if (!(checkboxMenuItem.getLabel().getObject().equals(createStringResource(KEEP_DISPLAYING_RESULTS_LABEL).getString())) &&
!(checkboxMenuItem.getLabel().getObject().equals(createStringResource(ID_SAVE_IN_BACKGROUND_CONTAINER).getString()))) {
return true;
}
List<InlineMenuItem> items = dropdownButtonDto.getMenuItems();
if (checkboxMenuItem.getLabel().getObject().equals(createStringResource(KEEP_DISPLAYING_RESULTS_LABEL).getString())) {
for (InlineMenuItem item : items) {
if (item.getLabel().getObject().equals(createStringResource(ID_SAVE_IN_BACKGROUND_CONTAINER).getString())) {
return !Boolean.TRUE.equals(((CheckboxMenuItem)item).getCheckBoxModel().getObject());
}
}
}
if (checkboxMenuItem.getLabel().getObject().equals(createStringResource(ID_SAVE_IN_BACKGROUND_CONTAINER).getString())) {
for (InlineMenuItem item : items) {
if (item.getLabel().getObject().equals(createStringResource(KEEP_DISPLAYING_RESULTS_LABEL).getString())) {
return !Boolean.TRUE.equals(((CheckboxMenuItem)item).getCheckBoxModel().getObject());
}
}
}
return true;
}

private void createTracingOptionsPanel() {
List<InlineMenuItem> items = new ArrayList<>();
items.add(new InlineMenuItem(createStringResource("Tracing")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

package com.evolveum.midpoint.gui.impl.page.admin.systemconfiguration.component;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper;
import com.evolveum.midpoint.gui.impl.component.MultivalueContainerDetailsPanel;
Expand All @@ -18,15 +19,18 @@
import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn;
import com.evolveum.midpoint.web.model.PrismContainerWrapperModel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ContainerPanelConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.IconType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RichHyperlinkType;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.model.IModel;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;

/**
* Created by Viliam Repan (lazyman).
Expand All @@ -38,7 +42,7 @@ public abstract class RichHyperlinkListContentPanel extends MultivalueContainerL
public RichHyperlinkListContentPanel(String id, AssignmentHolderDetailsModel model, ContainerPanelConfigurationType configurationType, ItemPath containerRealPath) {
super(id, RichHyperlinkType.class, configurationType);

this.model = PrismContainerWrapperModel.fromContainerWrapper(model.getObjectWrapperModel(), containerRealPath);
this.model = PrismContainerWrapperModel.fromContainerWrapper(model.getObjectWrapperModel(), containerRealPath, (Supplier<PageBase> & Serializable)() -> getPageBase());
}

@Override
Expand All @@ -58,7 +62,7 @@ protected void onClick(AjaxRequestTarget target, IModel<PrismContainerValueWrapp
}
},
new PrismPropertyWrapperColumn<>(getContainerModel(), RichHyperlinkType.F_TARGET_URL, AbstractItemWrapperColumn.ColumnType.STRING, getPageBase()),
new PrismPropertyWrapperColumn<>(getContainerModel(), RichHyperlinkType.F_ICON, AbstractItemWrapperColumn.ColumnType.STRING, getPageBase()),
new PrismPropertyWrapperColumn<>(getContainerModel(), ItemPath.create(RichHyperlinkType.F_ICON, IconType.F_CSS_CLASS), AbstractItemWrapperColumn.ColumnType.STRING, getPageBase()),
new PrismPropertyWrapperColumn<>(getContainerModel(), RichHyperlinkType.F_COLOR, AbstractItemWrapperColumn.ColumnType.STRING, getPageBase())
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,11 @@

import java.util.*;

import com.evolveum.midpoint.authentication.api.authorization.PageDescriptor;

import com.evolveum.midpoint.authentication.api.authorization.Url;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;

import com.evolveum.midpoint.authentication.api.authorization.PageDescriptor;
import com.evolveum.midpoint.authentication.api.authorization.Url;
import com.evolveum.midpoint.util.ClassPathUtil;
import com.evolveum.midpoint.util.DebugDumpable;
import com.evolveum.midpoint.util.DebugUtil;
Expand Down Expand Up @@ -84,6 +82,8 @@ public void loadData(MidPointApplication application) {
LOGGER.debug("Loading data from descriptor files.");

try {
urlClassMap.clear();

scanPackagesForPages(application);

if (LOGGER.isTraceEnabled()) {
Expand All @@ -99,22 +99,16 @@ public void loadData(MidPointApplication application) {
private void scanPackagesForPages(MidPointApplication application)
throws InstantiationException, IllegalAccessException {

for (String pac : PACKAGES_TO_SCAN) {
LOGGER.debug("Scanning package {} for page annotations", pac);

Set<Class<?>> classes = ClassPathUtil.listClasses(pac);
for (Class<?> clazz : classes) {
if (!WebPage.class.isAssignableFrom(clazz)) {
continue;
}

PageDescriptor descriptor = clazz.getAnnotation(PageDescriptor.class);
if (descriptor == null) {
continue;
}
LOGGER.debug("Scanning packages for page annotations");

mountPage(descriptor, clazz, application);
Collection<Class<?>> classes = ClassPathUtil.scanClasses(PageDescriptor.class, PACKAGES_TO_SCAN);
for (Class<?> clazz : classes) {
if (!WebPage.class.isAssignableFrom(clazz)) {
continue;
}

PageDescriptor descriptor = clazz.getAnnotation(PageDescriptor.class);
mountPage(descriptor, clazz, application);
}
}

Expand All @@ -128,7 +122,12 @@ private void mountPage(PageDescriptor descriptor, Class clazz, MidPointApplicati
clazz.getName(), url, encoder.getClass().getSimpleName());

application.mount(new ExactMatchMountedMapper(url.mountUrl(), clazz, encoder));
urlClassMap.put(url.mountUrl(), clazz);
String mountUrl = url.mountUrl();
if (urlClassMap.containsKey(mountUrl)) {
throw new IllegalStateException("Mount url '" + mountUrl + "' is already used by '" + urlClassMap.get(mountUrl).getName()
+ "'. Attempting to add another class '" + clazz.getName() + "'");
}
urlClassMap.put(mountUrl, clazz);
}
}

Expand Down

0 comments on commit b672b76

Please sign in to comment.