This is an automated email from the ASF dual-hosted git repository. ilgrosso pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/syncope.git
commit ac55c571f5ca4ea3ca118b626246fb4d5f1dbaea Author: Francesco Chicchiriccò <ilgro...@apache.org> AuthorDate: Wed May 18 16:53:08 2022 +0200 Improving Realms page extendability --- .../client/console/SyncopeConsoleSession.java | 10 +- .../client/console/commons/RealmsUtils.java | 2 +- .../syncope/client/console/pages/Realms.java | 180 +++++++------ .../syncope/client/console/panels/AnyPanel.java | 2 +- .../syncope/client/console/panels/Realm.java | 211 +++++++++------- .../client/console/panels/RealmChoicePanel.java | 277 ++++++++++----------- .../client/console/panels/RealmDetails.java | 12 +- .../client/console/panels/RealmWizardBuilder.java | 3 +- .../client/console/rest/RealmRestClient.java | 4 +- .../console/wicket/markup/html/form/Action.java | 2 +- .../wicket/markup/html/form/ActionsPanel.java | 10 + .../client/console/widgets/NumberWidget.java | 10 +- .../client/console/panels/RealmChoicePanel.html | 2 +- .../syncope/core/logic/ReconciliationLogic.java | 2 +- .../java/data/RealmDataBinderImpl.java | 3 +- .../apache/syncope/fit/console/RealmsITCase.java | 8 +- 16 files changed, 396 insertions(+), 342 deletions(-) diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java index 3292c2c667..e0f1c3ecc3 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java @@ -292,9 +292,13 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession implements Ba : roots.stream().sorted().collect(Collectors.toList()); } - public Optional<String> getRootRealm() { - List<String> roots = getSearchableRealms(); - return roots.isEmpty() ? Optional.empty() : roots.stream().findFirst(); + public Optional<String> getRootRealm(final String initial) { + List<String> searchable = getSearchableRealms(); + return searchable.isEmpty() + ? Optional.empty() + : initial != null && searchable.stream().anyMatch(initial::startsWith) + ? Optional.of(initial) + : searchable.stream().findFirst(); } public boolean owns(final String entitlements, final String... realms) { diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/RealmsUtils.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/RealmsUtils.java index bfef5acc9d..1553337c36 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/RealmsUtils.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/commons/RealmsUtils.java @@ -48,7 +48,7 @@ public final class RealmsUtils { public static boolean isSearchEnabled(final List<String> realms) { return realms.isEmpty() ? false - : new RealmRestClient().search( + : RealmRestClient.search( new RealmQuery.Builder().keyword( realms.contains(SyncopeConstants.ROOT_REALM) ? SyncopeConstants.ROOT_REALM diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java index 1f2b18b653..706fd73d62 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java @@ -20,6 +20,7 @@ package org.apache.syncope.client.console.pages; import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal; import java.io.Serializable; +import java.util.List; import org.apache.syncope.client.console.SyncopeConsoleSession; import org.apache.syncope.client.console.panels.Realm; import org.apache.syncope.client.console.panels.RealmChoicePanel; @@ -30,13 +31,16 @@ import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.Bas import org.apache.syncope.client.ui.commons.wizards.AjaxWizard; import org.apache.syncope.client.console.wizards.any.ResultPage; import org.apache.syncope.client.console.BookmarkablePageLinkBuilder; +import org.apache.syncope.client.console.rest.AnyTypeRestClient; import org.apache.syncope.client.ui.commons.Constants; import org.apache.syncope.client.ui.commons.pages.BaseWebPage; import org.apache.syncope.client.ui.commons.panels.WizardModalPanel; import org.apache.syncope.common.lib.to.AnyTO; +import org.apache.syncope.common.lib.to.AnyTypeTO; import org.apache.syncope.common.lib.to.ProvisioningResult; import org.apache.syncope.common.lib.to.RealmTO; import org.apache.syncope.common.lib.to.TemplatableTO; +import org.apache.wicket.PageReference; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.event.Broadcast; import org.apache.wicket.event.IEvent; @@ -51,15 +55,19 @@ public class Realms extends BasePage { private static final long serialVersionUID = -1100228004207271270L; - private final TemplatesTogglePanel templates; + public static final String SELECTED_INDEX = "selectedIndex"; - private final RealmChoicePanel realmChoicePanel; + public static final String INITIAL_REALM = "initialRealm"; - private final WebMarkupContainer content; + protected final TemplatesTogglePanel templates; - private final BaseModal<RealmTO> modal; + protected final RealmChoicePanel realmChoicePanel; - private final BaseModal<Serializable> templateModal; + protected final WebMarkupContainer content; + + protected final BaseModal<RealmTO> modal; + + protected final BaseModal<Serializable> templateModal; public Realms(final PageParameters parameters) { super(parameters); @@ -82,8 +90,7 @@ public class Realms extends BasePage { content = new WebMarkupContainer("content"); - realmChoicePanel = new RealmChoicePanel("realmChoicePanel", getPageReference()); - realmChoicePanel.setOutputMarkupId(true); + realmChoicePanel = buildRealmChoicePanel(parameters.get(INITIAL_REALM).toOptionalString(), getPageReference()); content.add(realmChoicePanel); content.add(new Label("body", "Root realm")); @@ -120,7 +127,17 @@ public class Realms extends BasePage { templateModal.show(false); }); - updateRealmContent(realmChoicePanel.getCurrentRealm(), parameters.get("selectedIndex").toInt(0)); + updateRealmContent(realmChoicePanel.getCurrentRealm(), parameters.get(SELECTED_INDEX).toInt(0)); + } + + protected RealmChoicePanel buildRealmChoicePanel(final String initialRealm, final PageReference pageRef) { + RealmChoicePanel panel = new RealmChoicePanel("realmChoicePanel", initialRealm, pageRef); + panel.setOutputMarkupId(true); + return panel; + } + + public RealmChoicePanel getRealmChoicePanel() { + return realmChoicePanel; } @Override @@ -156,88 +173,89 @@ public class Realms extends BasePage { } } - private WebMarkupContainer updateRealmContent(final RealmTO realmTO, final int selectedIndex) { - if (realmTO == null) { - return content; + protected WebMarkupContainer updateRealmContent(final RealmTO realmTO, final int selectedIndex) { + if (realmTO != null) { + content.addOrReplace(new Content(realmTO, AnyTypeRestClient.listAnyTypes(), selectedIndex)); } - content.addOrReplace(new Realm("body", realmTO, Realms.this.getPageReference(), selectedIndex) { + return content; + } - private static final long serialVersionUID = 8221398624379357183L; + protected class Content extends Realm { - @Override - protected void onClickTemplate(final AjaxRequestTarget target) { - templates.setTargetObject(realmTO); - templates.toggle(target, true); - } + private static final long serialVersionUID = 8221398624379357183L; - @Override - protected void setWindowClosedReloadCallback(final BaseModal<?> modal) { - modal.setWindowClosedCallback(target -> { - if (modal.getContent() instanceof ResultPage) { - Serializable result = ResultPage.class.cast(modal.getContent()).getResult(); - - RealmTO newRealmTO = RealmTO.class.cast(ProvisioningResult.class.cast(result).getEntity()); - // reload realmChoicePanel label too - SYNCOPE-1151 - target.add(realmChoicePanel.reloadRealmTree(target, Model.of(newRealmTO))); - realmChoicePanel.setCurrentRealm(newRealmTO); - send(Realms.this, Broadcast.DEPTH, new ChosenRealm<>(newRealmTO, target)); - } else { - target.add(realmChoicePanel.reloadRealmTree(target)); - } - target.add(content); - modal.show(false); - }); - } - - @Override - protected void onClickCreate(final AjaxRequestTarget target) { - this.wizardBuilder.setParentPath(realmChoicePanel.getCurrentRealm().getFullPath()); - send(this, Broadcast.EXACT, new AjaxWizard.NewItemActionEvent<RealmTO>(new RealmTO(), target) { - - @Override - public String getEventDescription() { - return "realm.new"; - } - }); - } + protected Content(final RealmTO realmTO, final List<AnyTypeTO> anyTypes, final int selectedIndex) { + super("body", realmTO, anyTypes, selectedIndex, Realms.this.getPageReference()); + } - @Override - protected void onClickEdit(final AjaxRequestTarget target, final RealmTO realmTO) { - this.wizardBuilder.setParentPath(realmTO.getFullPath()); - send(this, Broadcast.EXACT, new AjaxWizard.EditItemActionEvent<RealmTO>(realmTO, target) { - - @Override - public String getEventDescription() { - return "realm.edit"; - } - }); - } + @Override + protected void onClickTemplate(final AjaxRequestTarget target) { + templates.setTargetObject(realmTO); + templates.toggle(target, true); + } - @Override - protected void onClickDelete(final AjaxRequestTarget target, final RealmTO realmTO) { - try { - if (realmTO.getKey() == null) { - throw new Exception("Root realm cannot be deleted"); - } - RealmRestClient.delete(realmTO.getFullPath()); - RealmTO parent = realmChoicePanel.moveToParentRealm(realmTO.getKey()); + @Override + protected void setWindowClosedReloadCallback(final BaseModal<?> modal) { + modal.setWindowClosedCallback(target -> { + if (modal.getContent() instanceof ResultPage) { + Serializable result = ResultPage.class.cast(modal.getContent()).getResult(); + + RealmTO newRealmTO = RealmTO.class.cast(ProvisioningResult.class.cast(result).getEntity()); + // reload realmChoicePanel label too - SYNCOPE-1151 + target.add(realmChoicePanel.reloadRealmTree(target, Model.of(newRealmTO))); + realmChoicePanel.setCurrentRealm(newRealmTO); + send(Realms.this, Broadcast.DEPTH, new ChosenRealm<>(newRealmTO, target)); + } else { target.add(realmChoicePanel.reloadRealmTree(target)); + } + target.add(content); + modal.show(false); + }); + } - SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED)); - updateRealmContent(parent, selectedIndex); - target.add(content); - } catch (Exception e) { - LOG.error("While deleting realm", e); - // Escape line breaks - SyncopeConsoleSession.get().error(e.getMessage().replace("\n", " ")); + @Override + protected void onClickCreate(final AjaxRequestTarget target) { + this.wizardBuilder.setParentPath(realmChoicePanel.getCurrentRealm().getFullPath()); + send(this, Broadcast.EXACT, new AjaxWizard.NewItemActionEvent<RealmTO>(new RealmTO(), target) { + + @Override + public String getEventDescription() { + return "realm.new"; } - ((BaseWebPage) Realms.this.getPage()).getNotificationPanel().refresh(target); - } - }); - return content; - } + }); + } - public RealmChoicePanel getRealmChoicePanel() { - return realmChoicePanel; + @Override + protected void onClickEdit(final AjaxRequestTarget target, final RealmTO realmTO) { + this.wizardBuilder.setParentPath(realmTO.getFullPath()); + send(this, Broadcast.EXACT, new AjaxWizard.EditItemActionEvent<RealmTO>(realmTO, target) { + + @Override + public String getEventDescription() { + return "realm.edit"; + } + }); + } + + @Override + protected void onClickDelete(final AjaxRequestTarget target, final RealmTO realmTO) { + try { + if (realmTO.getKey() == null) { + throw new Exception("Root realm cannot be deleted"); + } + RealmRestClient.delete(realmTO.getFullPath()); + RealmTO parent = realmChoicePanel.moveToParentRealm(realmTO.getKey()); + target.add(realmChoicePanel.reloadRealmTree(target)); + + SyncopeConsoleSession.get().success(getString(Constants.OPERATION_SUCCEEDED)); + updateRealmContent(parent, selectedIndex); + target.add(content); + } catch (Exception e) { + LOG.error("While deleting realm", e); + // Escape line breaks + SyncopeConsoleSession.get().error(e.getMessage().replace("\n", " ")); + } + ((BaseWebPage) Realms.this.getPage()).getNotificationPanel().refresh(target); + } } } diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java index efb5b91e68..ec9590ab6a 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/AnyPanel.java @@ -83,7 +83,7 @@ public class AnyPanel extends Panel implements ModalPanel { PageReference pageRef); } - protected static DirectoryPanelSupplier DEFAULT_DIRECTORYPANEL_SUPPLIER = + protected static final DirectoryPanelSupplier DEFAULT_DIRECTORYPANEL_SUPPLIER = (id, anyTypeTO, realmTO, anyLayout, pageRef) -> { Panel panel; diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java index 625d2bc423..8ce7769914 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java @@ -33,7 +33,6 @@ import org.apache.syncope.client.console.commons.ITabComponent; import org.apache.syncope.client.ui.commons.status.StatusUtils; import org.apache.syncope.client.console.layout.AnyLayout; import org.apache.syncope.client.console.layout.AnyLayoutUtils; -import org.apache.syncope.client.console.rest.AnyTypeRestClient; import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink; import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel; import org.apache.syncope.client.console.wizards.WizardMgtPanel; @@ -41,7 +40,6 @@ import org.apache.syncope.client.console.wizards.any.ConnObjectPanel; import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.to.AnyTypeTO; import org.apache.syncope.common.lib.to.ConnObjectTO; -import org.apache.syncope.common.lib.to.EntityTO; import org.apache.syncope.common.lib.to.PropagationStatus; import org.apache.syncope.common.lib.to.ProvisioningResult; import org.apache.syncope.common.lib.to.RealmTO; @@ -55,7 +53,6 @@ import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -66,24 +63,32 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> { protected static final Logger LOG = LoggerFactory.getLogger(Realm.class); - private final RealmTO realmTO; + protected final RealmTO realmTO; - private final List<AnyTypeTO> anyTypes; + protected final List<AnyTypeTO> anyTypes; + + protected final int selectedIndex; protected final RealmWizardBuilder wizardBuilder; - public Realm(final String id, final RealmTO realmTO, final PageReference pageRef, final int selectedIndex) { + public Realm( + final String id, + final RealmTO realmTO, + final List<AnyTypeTO> anyTypes, + final int selectedIndex, + final PageReference pageRef) { + super(id, true); this.realmTO = realmTO; - this.anyTypes = AnyTypeRestClient.listAnyTypes(); + this.anyTypes = anyTypes; + this.selectedIndex = selectedIndex; setPageRef(pageRef); - AjaxBootstrapTabbedPanel<ITab> tabbedPanel = - new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageRef)); - tabbedPanel.setSelectedTab(selectedIndex); - addInnerObject(tabbedPanel); - this.wizardBuilder = new RealmWizardBuilder(pageRef); + addInnerObject(new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageRef)). + setSelectedTab(selectedIndex)); + + this.wizardBuilder = buildNewItemPanelBuilder(pageRef); addNewItemPanelBuilder(this.wizardBuilder, false); setShowResultPage(true); @@ -92,81 +97,25 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> { setWindowClosedReloadCallback(modal); } + protected RealmWizardBuilder buildNewItemPanelBuilder(final PageReference pageRef) { + return new RealmWizardBuilder(pageRef); + } + public RealmTO getRealmTO() { return realmTO; } - private List<ITab> buildTabList(final PageReference pageRef) { + protected List<ITab> buildTabList(final PageReference pageRef) { List<ITab> tabs = new ArrayList<>(); - tabs.add(new ITabComponent(new Model<>("DETAILS"), - IdRepoEntitlement.REALM_CREATE, IdRepoEntitlement.REALM_UPDATE, IdRepoEntitlement.REALM_DELETE) { - - private static final long serialVersionUID = -5861786415855103549L; - - @Override - public Panel getPanel(final String panelId) { - final ActionsPanel<RealmTO> actionPanel = new ActionsPanel<>("actions", null); - - if (StringUtils.startsWith(realmTO.getFullPath(), SyncopeConstants.ROOT_REALM)) { - actionPanel.add(new ActionLink<>(realmTO) { - - private static final long serialVersionUID = 2802988981431379827L; - - @Override - public void onClick(final AjaxRequestTarget target, final RealmTO ignore) { - onClickCreate(target); - } - }, ActionLink.ActionType.CREATE, IdRepoEntitlement.REALM_CREATE).hideLabel(); - - actionPanel.add(new ActionLink<>(realmTO) { - - private static final long serialVersionUID = 2802988981431379828L; - - @Override - public void onClick(final AjaxRequestTarget target, final RealmTO ignore) { - onClickEdit(target, realmTO); - } - }, ActionLink.ActionType.EDIT, IdRepoEntitlement.REALM_UPDATE).hideLabel(); - - actionPanel.add(new ActionLink<>(realmTO) { - - private static final long serialVersionUID = 2802988981431379827L; - - @Override - public void onClick(final AjaxRequestTarget target, final RealmTO ignore) { - onClickTemplate(target); - } - }, ActionLink.ActionType.TEMPLATE, IdRepoEntitlement.REALM_UPDATE).hideLabel(); - - actionPanel.add(new ActionLink<>(realmTO) { - - private static final long serialVersionUID = 2802988981431379829L; - - @Override - public void onClick(final AjaxRequestTarget target, final RealmTO ignore) { - onClickDelete(target, realmTO); - } - }, ActionLink.ActionType.DELETE, IdRepoEntitlement.REALM_DELETE, true).hideLabel(); - } - - RealmDetails panel = new RealmDetails(panelId, realmTO, actionPanel, false); - panel.setContentEnabled(false); - actionPanel.setEnabled(true); - return panel; - } - - @Override - public boolean isVisible() { - return SyncopeWebApplication.get().getSecuritySettings().getAuthorizationStrategy(). - isActionAuthorized(this, RENDER); - } - }); + tabs.add(new RealmDetailsTabPanel()); AnyLayout anyLayout = AnyLayoutUtils.fetch( - anyTypes.stream().map(EntityTO::getKey).collect(Collectors.toList())); + anyTypes.stream().map(AnyTypeTO::getKey).collect(Collectors.toList())); for (AnyTypeTO anyType : anyTypes) { - tabs.add(new ITabComponent(new Model<>(anyType.getKey()), String.format("%s_SEARCH", anyType.getKey())) { + tabs.add(new ITabComponent( + new ResourceModel("anyType." + anyType.getKey(), anyType.getKey()), + String.format("%s_SEARCH", anyType.getKey())) { private static final long serialVersionUID = 1169585538404171118L; @@ -194,10 +143,10 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> { throw new IllegalStateException("Unsupported result type"); } - final MultilevelPanel mlp = new MultilevelPanel(panelId); + MultilevelPanel mlp = new MultilevelPanel(panelId); add(mlp); - final PropagationStatus syncope = new PropagationStatus(); + PropagationStatus syncope = new PropagationStatus(); syncope.setStatus(ExecStatus.SUCCESS); syncope.setResource(Constants.SYNCOPE); @@ -205,8 +154,8 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> { propagations.add(syncope); propagations.addAll(((ProvisioningResult) result).getPropagationStatuses()); - ListViewPanel.Builder<PropagationStatus> builder = new ListViewPanel.Builder<>( - PropagationStatus.class, pageRef) { + ListViewPanel.Builder<PropagationStatus> builder = + new ListViewPanel.Builder<>(PropagationStatus.class, pageRef) { private static final long serialVersionUID = -6809736686861678498L; @@ -215,19 +164,21 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> { if ("afterObj".equalsIgnoreCase(key)) { ConnObjectTO afterObj = bean.getAfterObj(); String remoteId = afterObj == null - || afterObj.getAttrs().isEmpty() - || afterObj.getAttr(ConnIdSpecialName.NAME).isEmpty() - || afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues() == null - || afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues().isEmpty() - ? StringUtils.EMPTY - : afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues().get(0); + || afterObj.getAttrs().isEmpty() + || afterObj.getAttr(ConnIdSpecialName.NAME).isEmpty() + || afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues() == null + || afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues().isEmpty() + ? StringUtils.EMPTY + : afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues().get(0); return new Label("field", remoteId); - } else if ("status".equalsIgnoreCase(key)) { + } + + if ("status".equalsIgnoreCase(key)) { return StatusUtils.getStatusImagePanel("field", bean.getStatus()); - } else { - return super.getValueComponent(key, bean); } + + return super.getValueComponent(key, bean); } }; @@ -244,8 +195,8 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> { @Override protected boolean statusCondition(final PropagationStatus bean) { return !Constants.SYNCOPE.equals(bean.getResource()) - && (ExecStatus.CREATED == bean.getStatus() - || ExecStatus.SUCCESS == bean.getStatus()); + && (ExecStatus.CREATED == bean.getStatus() + || ExecStatus.SUCCESS == bean.getStatus()); } @Override @@ -282,13 +233,13 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> { protected abstract void onClickDelete(AjaxRequestTarget target, RealmTO realmTO); - static class RemoteRealmPanel extends RemoteObjectPanel { + protected static class RemoteRealmPanel extends RemoteObjectPanel { private static final long serialVersionUID = 4303365227411467563L; - private final PropagationStatus bean; + protected final PropagationStatus bean; - RemoteRealmPanel(final PropagationStatus bean) { + protected RemoteRealmPanel(final PropagationStatus bean) { this.bean = bean; add(new ConnObjectPanel( REMOTE_OBJECT_PANEL_ID, @@ -302,4 +253,72 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> { return Pair.of(bean.getBeforeObj(), bean.getAfterObj()); } } + + protected class RealmDetailsTabPanel extends ITabComponent { + + private static final long serialVersionUID = -5861786415855103549L; + + protected RealmDetailsTabPanel() { + super(new ResourceModel("realm.details", "DETAILS"), + IdRepoEntitlement.REALM_CREATE, IdRepoEntitlement.REALM_UPDATE, IdRepoEntitlement.REALM_DELETE); + } + + @Override + public Panel getPanel(final String panelId) { + ActionsPanel<RealmTO> actionPanel = new ActionsPanel<>("actions", null); + + if (StringUtils.startsWith(realmTO.getFullPath(), SyncopeConstants.ROOT_REALM)) { + actionPanel.add(new ActionLink<>(realmTO) { + + private static final long serialVersionUID = 2802988981431379827L; + + @Override + public void onClick(final AjaxRequestTarget target, final RealmTO ignore) { + onClickCreate(target); + } + }, ActionLink.ActionType.CREATE, IdRepoEntitlement.REALM_CREATE).hideLabel(); + + actionPanel.add(new ActionLink<>(realmTO) { + + private static final long serialVersionUID = 2802988981431379828L; + + @Override + public void onClick(final AjaxRequestTarget target, final RealmTO ignore) { + onClickEdit(target, realmTO); + } + }, ActionLink.ActionType.EDIT, IdRepoEntitlement.REALM_UPDATE).hideLabel(); + + actionPanel.add(new ActionLink<>(realmTO) { + + private static final long serialVersionUID = 2802988981431379827L; + + @Override + public void onClick(final AjaxRequestTarget target, final RealmTO ignore) { + onClickTemplate(target); + } + }, ActionLink.ActionType.TEMPLATE, IdRepoEntitlement.REALM_UPDATE).hideLabel(); + + actionPanel.add(new ActionLink<>(realmTO) { + + private static final long serialVersionUID = 2802988981431379829L; + + @Override + public void onClick(final AjaxRequestTarget target, final RealmTO ignore) { + onClickDelete(target, realmTO); + } + }, ActionLink.ActionType.DELETE, IdRepoEntitlement.REALM_DELETE, true).hideLabel(); + } + + RealmDetails panel = new RealmDetails(panelId, realmTO, actionPanel, false); + panel.setContentEnabled(false); + actionPanel.setEnabled(true); + return panel; + } + + @Override + public boolean isVisible() { + return SyncopeWebApplication.get().getSecuritySettings().getAuthorizationStrategy(). + isActionAuthorized(this, RENDER); + } + } } diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java index d4c149d602..da1cbe8636 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java @@ -59,6 +59,7 @@ import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.AbstractLink; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.markup.html.panel.Panel; +import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; @@ -68,34 +69,36 @@ public class RealmChoicePanel extends Panel { private static final long serialVersionUID = -1100228004207271270L; - private static final String SEARCH_REALMS = "searchRealms"; + protected static final String SEARCH_REALMS = "searchRealms"; - private final PageReference pageRef; + protected final PageReference pageRef; - private final LoadableDetachableModel<List<Pair<String, RealmTO>>> realmTree; + protected final LoadableDetachableModel<List<Pair<String, RealmTO>>> realmTree; - private final LoadableDetachableModel<List<DynRealmTO>> dynRealmTree; + protected final LoadableDetachableModel<List<DynRealmTO>> dynRealmTree; - private final WebMarkupContainerNoVeil container; + protected final WebMarkupContainerNoVeil container; - private Model<RealmTO> model; + protected Model<RealmTO> model; - private final Collection<String> availableRealms; + protected final Map<String, Pair<RealmTO, List<RealmTO>>> tree; - private final Map<String, Pair<RealmTO, List<RealmTO>>> tree; + protected final List<AbstractLink> links = new ArrayList<>(); - private final List<AbstractLink> links = new ArrayList<>(); + protected String searchQuery; - private String searchQuery; + protected List<RealmTO> realmsChoices; - private List<RealmTO> realmsChoices; + protected final boolean isSearchEnabled; - private final boolean isSearchEnabled; + protected final Label realmDisplayKey; - public RealmChoicePanel(final String id, final PageReference pageRef) { + protected final Label realmDisplayValue; + + public RealmChoicePanel(final String id, final String initialRealm, final PageReference pageRef) { super(id); this.pageRef = pageRef; - availableRealms = SyncopeConsoleSession.get().getSearchableRealms(); + tree = new HashMap<>(); isSearchEnabled = RealmsUtils.isSearchEnabled(SyncopeConsoleSession.get().getSearchableRealms()); @@ -106,23 +109,18 @@ public class RealmChoicePanel extends Panel { @Override protected List<Pair<String, RealmTO>> load() { Map<String, Pair<RealmTO, List<RealmTO>>> map = reloadRealmParentMap(); - List<Pair<String, RealmTO>> full; + Stream<Pair<String, RealmTO>> full; if (isSearchEnabled) { - full = map.entrySet().stream().map(el -> Pair.of( - el.getKey(), - el.getValue().getLeft())). - collect(Collectors.toList()); + full = map.entrySet().stream(). + map(el -> Pair.of(el.getKey(), el.getValue().getLeft())); } else { full = map.entrySet().stream(). - map(el -> Pair.of( - el.getValue().getLeft().getFullPath(), - el.getValue().getKey())). - sorted(Comparator.comparing(Pair::getLeft)). - collect(Collectors.toList()); + map(el -> Pair.of(el.getValue().getLeft().getFullPath(), el.getValue().getKey())). + sorted(Comparator.comparing(Pair::getLeft)); } - return full.stream().filter(realm -> availableRealms.stream().anyMatch( - availableRealm -> realm.getValue().getFullPath().startsWith(availableRealm))). - collect(Collectors.toList()); + return full.filter(realm -> SyncopeConsoleSession.get().getSearchableRealms().stream().anyMatch( + availableRealm -> realm.getValue().getFullPath().startsWith(availableRealm))). + collect(Collectors.toList()); } }; @@ -132,30 +130,31 @@ public class RealmChoicePanel extends Panel { @Override protected List<DynRealmTO> load() { - List<DynRealmTO> dynRealms = RealmRestClient.listDynReams(); + List<DynRealmTO> dynRealms = RealmRestClient.listDynRealms(); dynRealms.sort((left, right) -> { if (left == null) { return -1; - } else if (right == null) { + } + if (right == null) { return 1; - } else { - return left.getKey().compareTo(right.getKey()); } + return left.getKey().compareTo(right.getKey()); }); - return dynRealms.stream().filter(dynRealm -> availableRealms.stream(). - anyMatch(availableRealm -> SyncopeConstants.ROOT_REALM.equals(availableRealm) + return dynRealms.stream().filter(dynRealm -> SyncopeConsoleSession.get().getSearchableRealms().stream(). + anyMatch(availableRealm -> SyncopeConstants.ROOT_REALM.equals(availableRealm) || dynRealm.getKey().equals(availableRealm))).collect(Collectors.toList()); } }; - RealmTO realmTO = SyncopeConsoleSession.get().getRootRealm().map(rootRealm -> { + RealmTO realm = SyncopeConsoleSession.get().getRootRealm(initialRealm).map(rootRealm -> { String rootRealmName = StringUtils.substringAfterLast(rootRealm, "/"); List<RealmTO> realmTOs = RealmRestClient.search( RealmsUtils.buildQuery(SyncopeConstants.ROOT_REALM.equals(rootRealm) ? SyncopeConstants.ROOT_REALM : rootRealmName)).getResult(); - return realmTOs.stream().filter(realm -> rootRealm.equals(realm.getFullPath())).findFirst(). + return realmTOs.stream(). + filter(r -> rootRealm.equals(r.getFullPath())).findFirst(). orElseGet(() -> { RealmTO placeholder = new RealmTO(); placeholder.setName(rootRealmName); @@ -164,74 +163,88 @@ public class RealmChoicePanel extends Panel { }); }).orElseGet(RealmTO::new); - model = Model.of(realmTO); - searchQuery = realmTO.getName(); + model = Model.of(realm); + searchQuery = realm.getName(); + container = new WebMarkupContainerNoVeil("container", realmTree); - container.setOutputMarkupId(true); - add(container); + add(container.setOutputMarkupId(true)); + + realmDisplayKey = new Label("realmDisplayKey", realmDisplayKeyModel(null)); + container.addOrReplace(realmDisplayKey.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true)); + realmDisplayValue = new Label("realmDisplayValue", realmDisplayValueText()); + container.addOrReplace(realmDisplayValue.setOutputMarkupId(true).setOutputMarkupPlaceholderTag(true)); + reloadRealmTree(); } - public final void reloadRealmTree() { - Label realmLabel = new Label("realmLabel", new Model<>()); - realmLabel.setOutputMarkupId(true); - - container.addOrReplace(realmLabel); + protected IModel<String> realmDisplayKeyModel(final Boolean dynamic) { + return dynamic == null + ? model.getObject().getFullPath().startsWith(SyncopeConstants.ROOT_REALM) + ? new ResourceModel("realmDisplayKey", "Realm") + : new ResourceModel("dynRealmLabel", "Dynamic Realm") + : dynamic + ? new ResourceModel("dynRealmLabel", "Dynamic Realm") + : new ResourceModel("realmDisplayKey", "Realm"); + } - if (StringUtils.startsWith(model.getObject().getFullPath(), SyncopeConstants.ROOT_REALM)) { - realmLabel.setDefaultModel(new ResourceModel("realmLabel", "Realm")); - } else { - realmLabel.setDefaultModel(new ResourceModel("dynRealmLabel", "Dynamic Realm")); - } + protected String realmDisplayValueText() { + return RealmsUtils.getFullPath(model.getObject().getFullPath()); + } - Label label = new Label("realm", RealmsUtils.getFullPath(model.getObject().getFullPath())); - label.setOutputMarkupId(true); - container.addOrReplace(label); + protected void chooseRealm(final RealmTO realm, final AjaxRequestTarget target) { + model.setObject(realm); + realmDisplayValue.setDefaultModelObject(realmDisplayValueText()); + realmDisplayKey.setDefaultModel(realmDisplayKeyModel(false)); + target.add(realmDisplayValue); + send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(realm, target)); + } + public void reloadRealmTree() { if (isSearchEnabled) { realmsChoices = buildRealmChoices(); - final AutoCompleteSettings settings = new AutoCompleteSettings(); + AutoCompleteSettings settings = new AutoCompleteSettings(); settings.setShowCompleteListOnFocusGain(false); settings.setShowListOnEmptyInput(false); - final AutoCompleteTextField<String> searchRealms = - new AutoCompleteTextField<>(SEARCH_REALMS, new Model<>(), settings) { + AutoCompleteTextField<String> searchRealms = + new AutoCompleteTextField<>(SEARCH_REALMS, new Model<>(), settings) { - private static final long serialVersionUID = -6635259975264955783L; + private static final long serialVersionUID = -6635259975264955783L; - @Override - protected Iterator<String> getChoices(final String input) { - searchQuery = input; - realmsChoices = RealmsUtils.checkInput(input) + @Override + protected Iterator<String> getChoices(final String input) { + searchQuery = input; + realmsChoices = RealmsUtils.checkInput(input) ? buildRealmChoices() : List.of(); - return realmsChoices.stream(). - map(RealmTO::getFullPath).sorted().collect(Collectors.toList()).iterator(); - } + return realmsChoices.stream().map(RealmTO::getFullPath).sorted().iterator(); + } - @Override - protected AutoCompleteBehavior<String> newAutoCompleteBehavior( + @Override + protected AutoCompleteBehavior<String> newAutoCompleteBehavior( final IAutoCompleteRenderer<String> renderer, final AutoCompleteSettings settings) { - return super.newAutoCompleteBehavior(new AbstractAutoCompleteRenderer<>() { - private static final long serialVersionUID = -4789925973199139157L; + return super.newAutoCompleteBehavior(new AbstractAutoCompleteRenderer<>() { + + private static final long serialVersionUID = -4789925973199139157L; - @Override - protected void renderChoice( + @Override + protected void renderChoice( final String object, final Response response, final String criteria) { - response.write(object); - } - - @Override - protected String getTextValue(final String object) { - return object; - } - }, settings); - } - }; + + response.write(object); + } + + @Override + protected String getTextValue(final String object) { + return object; + } + }, settings); + } + }; searchRealms.add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) { @@ -239,15 +252,9 @@ public class RealmChoicePanel extends Panel { @Override protected void onUpdate(final AjaxRequestTarget target) { - realmsChoices.stream().filter( - item -> item.getFullPath().equals(searchRealms.getModelObject())). - findFirst().ifPresent(realm -> { - model.setObject(realm); - label.setDefaultModelObject(model.getObject().getFullPath()); - realmLabel.setDefaultModel(new ResourceModel("realmLabel", "Realm")); - target.add(label); - send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(realm, target)); - }); + realmsChoices.stream(). + filter(item -> item.getFullPath().equals(searchRealms.getModelObject())). + findFirst().ifPresent(realm -> chooseRealm(realm, target)); } }); @@ -262,7 +269,7 @@ public class RealmChoicePanel extends Panel { @Override protected List<AbstractLink> newSubMenuButtons(final String buttonMarkupId) { - buildRealmLinks(label, realmLabel); + buildRealmLinks(); return RealmChoicePanel.this.links; } }; @@ -277,13 +284,13 @@ public class RealmChoicePanel extends Panel { } } - private void buildRealmLinks(final Label label, final Label realmLabel) { + protected void buildRealmLinks() { RealmChoicePanel.this.links.clear(); RealmChoicePanel.this.links.add(new BootstrapAjaxLink<>( - ButtonList.getButtonMarkupId(), - new Model<>(), - Buttons.Type.Link, - new ResourceModel("realms", "Realms")) { + ButtonList.getButtonMarkupId(), + new Model<>(), + Buttons.Type.Link, + new ResourceModel("realms", "Realms")) { private static final long serialVersionUID = -7978723352517770744L; @@ -304,36 +311,31 @@ public class RealmChoicePanel extends Panel { realmTree.getObject().forEach(link -> { RealmChoicePanel.this.links.add(new BootstrapAjaxLink<>( - ButtonList.getButtonMarkupId(), - Model.of(link.getRight()), - Buttons.Type.Link, - new Model<>(link.getLeft())) { + ButtonList.getButtonMarkupId(), + Model.of(link.getRight()), + Buttons.Type.Link, + new Model<>(link.getLeft())) { private static final long serialVersionUID = -7978723352517770644L; @Override public void onClick(final AjaxRequestTarget target) { - model.setObject(link.getRight()); - label.setDefaultModelObject(model.getObject().getFullPath()); - realmLabel.setDefaultModel(new ResourceModel("realmLabel", "Realm")); - target.add(label); - send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(link.getRight(), target)); + chooseRealm(link.getRight(), target); } }); }); if (!dynRealmTree.getObject().isEmpty()) { RealmChoicePanel.this.links.add(new BootstrapAjaxLink<>( - ButtonList.getButtonMarkupId(), - new Model<>(), - Buttons.Type.Link, - new ResourceModel("dynrealms", "Dynamic Realms")) { + ButtonList.getButtonMarkupId(), + new Model<>(), + Buttons.Type.Link, + new ResourceModel("dynrealms", "Dynamic Realms")) { private static final long serialVersionUID = -7978723352517770744L; @Override public void onClick(final AjaxRequestTarget target) { - } @Override @@ -348,34 +350,44 @@ public class RealmChoicePanel extends Panel { }); dynRealmTree.getObject().forEach(dynRealmTO -> { - final RealmTO realmTO = new RealmTO(); - realmTO.setKey(dynRealmTO.getKey()); - realmTO.setName(dynRealmTO.getKey()); - realmTO.setFullPath(dynRealmTO.getKey()); + RealmTO realm = new RealmTO(); + realm.setKey(dynRealmTO.getKey()); + realm.setName(dynRealmTO.getKey()); + realm.setFullPath(dynRealmTO.getKey()); RealmChoicePanel.this.links.add(new BootstrapAjaxLink<>( - ButtonList.getButtonMarkupId(), - new Model<>(), - Buttons.Type.Link, - new Model<>(realmTO.getKey())) { + ButtonList.getButtonMarkupId(), + new Model<>(), + Buttons.Type.Link, + new Model<>(realm.getKey())) { private static final long serialVersionUID = -7978723352517770644L; @Override public void onClick(final AjaxRequestTarget target) { - model.setObject(realmTO); - label.setDefaultModelObject(realmTO.getKey()); - realmLabel.setDefaultModel(new ResourceModel("dynRealmLabel", "Dynamic Realm")); - target.add(label); - send(pageRef.getPage(), Broadcast.EXACT, new ChosenRealm<>(realmTO, target)); + chooseRealm(realm, target); } }); }); } } + protected List<RealmTO> buildRealmChoices() { + return Stream.of( + realmTree.getObject().stream().map(Pair::getValue).collect(Collectors.toList()), + dynRealmTree.getObject().stream().map(item -> { + RealmTO realm = new RealmTO(); + realm.setKey(item.getKey()); + realm.setName(item.getKey()); + realm.setFullPath(item.getKey()); + return realm; + }).collect(Collectors.toList())).flatMap(Collection::stream). + collect(Collectors.toList()); + } + public final RealmChoicePanel reloadRealmTree(final AjaxRequestTarget target) { reloadRealmTree(); + chooseRealm(model.getObject(), target); target.add(container); return this; } @@ -386,7 +398,7 @@ public class RealmChoicePanel extends Panel { return this; } - private Map<String, Pair<RealmTO, List<RealmTO>>> reloadRealmParentMap() { + protected Map<String, Pair<RealmTO, List<RealmTO>>> reloadRealmParentMap() { List<RealmTO> realmsToList = isSearchEnabled ? RealmRestClient.search(RealmsUtils.buildQuery(searchQuery)).getResult() : RealmRestClient.list(); @@ -396,7 +408,7 @@ public class RealmChoicePanel extends Panel { collect(Collectors.toList())); } - private Map<String, Pair<RealmTO, List<RealmTO>>> reloadRealmParentMap(final List<RealmTO> realms) { + protected Map<String, Pair<RealmTO, List<RealmTO>>> reloadRealmParentMap(final List<RealmTO> realms) { tree.clear(); Map<String, List<RealmTO>> cache = new HashMap<>(); @@ -421,20 +433,6 @@ public class RealmChoicePanel extends Panel { return tree; } - private List<RealmTO> buildRealmChoices() { - return Stream.of( - realmTree.getObject().stream().map(Pair::getValue).collect(Collectors.toList()), - dynRealmTree.getObject().stream().map( - item -> { - final RealmTO realmTO = new RealmTO(); - realmTO.setKey(item.getKey()); - realmTO.setName(item.getKey()); - realmTO.setFullPath(item.getKey()); - return realmTO; - }).collect(Collectors.toList())).flatMap(Collection::stream). - collect(Collectors.toList()); - } - /** * Gets current selected realm. * @@ -458,14 +456,13 @@ public class RealmChoicePanel extends Panel { } } return null; - } public static class ChosenRealm<T> { - private final AjaxRequestTarget target; + protected final AjaxRequestTarget target; - private final T obj; + protected final T obj; public ChosenRealm(final T obj, final AjaxRequestTarget target) { this.obj = obj; diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java index 9c689f4c30..ccdbe61388 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java @@ -57,7 +57,7 @@ public class RealmDetails extends Panel { @Override protected List<String> load() { return ImplementationRestClient.list(IdRepoImplementationType.LOGIC_ACTIONS).stream(). - map(EntityTO::getKey).sorted().collect(Collectors.toList()); + map(EntityTO::getKey).sorted().collect(Collectors.toList()); } }; @@ -71,6 +71,8 @@ public class RealmDetails extends Panel { } }; + private final ActionsPanel<RealmTO> actionsPanel; + @SpringBean private RealmPolicyProvider realmPolicyProvider; @@ -83,11 +85,13 @@ public class RealmDetails extends Panel { public RealmDetails( final String id, final RealmTO realmTO, - final ActionsPanel<?> actionsPanel, + final ActionsPanel<RealmTO> actionsPanel, final boolean unwrapped) { super(id); + this.actionsPanel = actionsPanel; + container = new WebMarkupContainer("container"); container.setOutputMarkupId(true); container.setRenderBodyOnly(unwrapped); @@ -139,4 +143,8 @@ public class RealmDetails extends Panel { container.setEnabled(enable); return this; } + + public ActionsPanel<RealmTO> getActionsPanel() { + return actionsPanel; + } } diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java index f85ab7b437..edefc3e4d8 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/panels/RealmWizardBuilder.java @@ -32,7 +32,7 @@ public class RealmWizardBuilder extends BaseAjaxWizardBuilder<RealmTO> { private static final long serialVersionUID = 5945391813567245081L; - private String parentPath; + protected String parentPath; /** * Construct. @@ -69,7 +69,6 @@ public class RealmWizardBuilder extends BaseAjaxWizardBuilder<RealmTO> { realmDetail.add(new AttributeAppender("style", "overflow-x:hidden;")); add(realmDetail); } - } public void setParentPath(final String parentPath) { diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java index 1581dd3d84..46d5ca820d 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java @@ -45,11 +45,11 @@ public class RealmRestClient extends BaseRestClient { return getService(RealmService.class).list(SyncopeConstants.ROOT_REALM); } - public static List<DynRealmTO> listDynReams() { + public static List<DynRealmTO> listDynRealms() { return getService(DynRealmService.class).list(); } - public static DynRealmTO readDynReams(final String key) { + public static DynRealmTO readDynRealm(final String key) { return getService(DynRealmService.class).read(key); } diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java index f01a984106..a3979b3fa7 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/Action.java @@ -69,7 +69,7 @@ public final class Action<T extends Serializable> implements Serializable { } public String[] getRealms() { - return realms.toArray(new String[realms.size()]); + return realms.toArray(String[]::new); } public void setRealm(final String realm) { diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java index f34ea520f0..3d598a5151 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionsPanel.java @@ -82,6 +82,16 @@ public final class ActionsPanel<T extends Serializable> extends Panel { return action; } + public Action<T> add(final int index, final Action<T> action) { + actions.add(index, action); + return action; + } + + public Action<T> set(final int index, final Action<T> action) { + actions.set(index, action); + return action; + } + public List<Action<T>> getActions() { return actions; } diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java index e6e577f7a4..1f720a6f32 100644 --- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java +++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/widgets/NumberWidget.java @@ -54,13 +54,13 @@ public class NumberWidget extends BaseWidget { List<String> anyTypes = AnyTypeRestClient.list(); switch (id) { case "totalUsers": - pageParameters.add("selectedIndex", 1); + pageParameters.add(Realms.SELECTED_INDEX, 1); responsePage = Realms.class; isAuthorized = SyncopeConsoleSession.get().owns(IdRepoEntitlement.USER_SEARCH); break; case "totalGroups": - pageParameters.add("selectedIndex", 2); + pageParameters.add(Realms.SELECTED_INDEX, 2); responsePage = Realms.class; isAuthorized = SyncopeConsoleSession.get().owns(IdRepoEntitlement.GROUP_SEARCH); break; @@ -71,7 +71,7 @@ public class NumberWidget extends BaseWidget { for (int i = 0; i < anyTypes.size() && selectedIndex == null; i++) { if (anyTypes.get(i).equals(label)) { selectedIndex = i + 1; - pageParameters.add("selectedIndex", selectedIndex); + pageParameters.add(Realms.SELECTED_INDEX, selectedIndex); } } responsePage = Realms.class; @@ -87,7 +87,7 @@ public class NumberWidget extends BaseWidget { for (int i = 0; i < anyTypes.size() && selectedIndex == null; i++) { if (anyTypes.get(i).equals(label)) { selectedIndex = i + 1; - pageParameters.add("selectedIndex", selectedIndex); + pageParameters.add(Realms.SELECTED_INDEX, selectedIndex); } } responsePage = Realms.class; @@ -95,7 +95,7 @@ public class NumberWidget extends BaseWidget { break; default: - pageParameters.add("selectedIndex", 0); + pageParameters.add(Realms.SELECTED_INDEX, 0); responsePage = Realms.class; } diff --git a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html index 7d14dfc236..0691389902 100644 --- a/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html +++ b/client/idrepo/console/src/main/resources/org/apache/syncope/client/console/panels/RealmChoicePanel.html @@ -20,7 +20,7 @@ under the License. <wicket:panel> <div wicket:id="container" class="realm-header"> <div class="realm-label"> - <label wicket:id="realmLabel"/>: <label wicket:id="realm"/> + <label wicket:id="realmDisplayKey"/>: <label wicket:id="realmDisplayValue"/> </div> <span wicket:id="realmsFragment"></span> diff --git a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java index 1361304553..ef3deee89b 100644 --- a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java +++ b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java @@ -627,7 +627,7 @@ public class ReconciliationLogic extends AbstractTransactionalLogic<EntityTO> { csvSchema(spec), null, os, - columns.toArray(new String[columns.size()]))) { + columns.toArray(String[]::new))) { SyncopeStreamPushExecutor executor = (SyncopeStreamPushExecutor) ApplicationContextProvider.getBeanFactory(). diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java index 43df9c9f6f..df5593da37 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java @@ -310,8 +310,7 @@ public class RealmDataBinderImpl implements RealmDataBinder { if (admin) { realmTO.setAccountPolicy(realm.getAccountPolicy() == null ? null : realm.getAccountPolicy().getKey()); realmTO.setPasswordPolicy(realm.getPasswordPolicy() == null ? null : realm.getPasswordPolicy().getKey()); - realmTO.setAuthPolicy( - realm.getAuthPolicy() == null ? null : realm.getAuthPolicy().getKey()); + realmTO.setAuthPolicy(realm.getAuthPolicy() == null ? null : realm.getAuthPolicy().getKey()); realmTO.setAccessPolicy(realm.getAccessPolicy() == null ? null : realm.getAccessPolicy().getKey()); realmTO.setAttrReleasePolicy( realm.getAttrReleasePolicy() == null ? null : realm.getAttrReleasePolicy().getKey()); diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java index a77eae8cd9..47ee9853ab 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/RealmsITCase.java @@ -73,7 +73,7 @@ public class RealmsITCase extends AbstractConsoleITCase { "body:content:realmChoicePanel:container:realmsFragment:realms:dropdown-menu:buttons:5:button", Constants.ON_CLICK); - TESTER.assertLabel("body:content:realmChoicePanel:container:realm", "/testRealm"); + TESTER.assertLabel("body:content:realmChoicePanel:container:realmDisplayValue", "/testRealm"); TESTER.getRequest().addParameter("confirm", "true"); TESTER.clickLink( @@ -86,7 +86,7 @@ public class RealmsITCase extends AbstractConsoleITCase { "body:content:body:container:content:tabbedPanel:panel:container:policies:1:field-label", "Account Policy"); - TESTER.assertLabel("body:content:realmChoicePanel:container:realm", "/"); + TESTER.assertLabel("body:content:realmChoicePanel:container:realmDisplayValue", "/"); } @Test @@ -116,7 +116,7 @@ public class RealmsITCase extends AbstractConsoleITCase { "body:content:realmChoicePanel:container:realmsFragment:realms:dropdown-menu:buttons:4:button", Constants.ON_CLICK); - TESTER.assertLabel("body:content:realmChoicePanel:container:realm", "/odd"); + TESTER.assertLabel("body:content:realmChoicePanel:container:realmDisplayValue", "/odd"); TESTER.clickLink( "body:content:body:container:content:tabbedPanel:panel:actions:actions:actionRepeater:2:action:action"); @@ -136,7 +136,7 @@ public class RealmsITCase extends AbstractConsoleITCase { assertSuccessMessage(); TESTER.cleanupFeedbackMessages(); - TESTER.assertLabel("body:content:realmChoicePanel:container:realm", "/odd"); + TESTER.assertLabel("body:content:realmChoicePanel:container:realmDisplayValue", "/odd"); TESTER.clickLink( "body:content:body:container:content:tabbedPanel:panel:actions:actions:actionRepeater:2:action:action");